aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-01-17 15:05:31 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-01-17 15:05:31 -0500
commita016af2e70bfca23f2f5de7d8708157b86ea374d (patch)
treebfe3c0c6ea9d52d4ec6ea021b0626a53c83e7d9f
parente535d74bc50df2357d3253f8f3ca48c66d0d892a (diff)
parentc3b1681375dc6e71d89a3ae00cc3ce9e775a8917 (diff)
Merge tag 'sound-4.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound updates from Takashi Iwai: "We've had quite busy weeks in this cycle. Looking at ALSA core, the significant changes are a few fixes wrt timer and sequencer ioctls that have been revealed by fuzzer recently. Other than that, ASoC core got a few updates about DAI link handling, but these are rather straightforward refactoring. In drivers scene, ASoC received quite lots of new drivers in addition to bunch of updates for still ongoing Intel Skylake support and topology API. HD-audio gained a new HDMI/DP hotplug notification via component. FireWire got a pile of code refactoring/updates with SCS.1x driver integration. More highlights are shown below. [ NOTE: this contains also many commits for DRM. This is due to the pull of drm stable branch into sound tree, as the base of i915 audio component work for HD-audio. The highlights below don't contain these DRM changes, as these are supposed to be pulled via drm tree in anyway sooner or later. ] Core: - Handful fixes to harden ALSA timer and sequencer ioctls against races reported by syzkaller fuzzer - Irq description string can be unique to each card; only for HD-audio for now ASoC: - Conversion of the array of DAI links to a list for supporting dynamically adding and removing DAI links - Topology API enhancements to make everything more component based and being able to specify PCM links via topology - Some more fixes for the topology code, though it is still not final and ready for enabling in production; we really need to get to the point where that can be done - A pile of changes for Intel SkyLake drivers which hopefully deliver some useful initial functionality for systems with this chipset, though there is more work still to come - Lots of new features and cleanups for the Renesas drivers - ANC support for WM5110 - New drivers: Imagination Technologies IPs, Atmel class D speaker, Cirrus CS47L24 and WM1831, Dialog DA7128, Realtek RT5659 and RT56156, Rockchip RK3036, TI PC3168A, and AMD ACP - Rename PCM1792a driver to be generic pcm179x HD-Audio: - Use audio component for i915 HDMI/DP hotplug handling - On-demand binding with i915 driver - bdl_pos_adj parameter adjustment for Baytrail controllers - Enable power_save_node for CX20722; this shouldn't lead to regression, hopefully - Kabylake HDMI/DP codec support - Quirks for Lenovo E50-80, Dell Latitude E-series, and other Dell machines - A few code refactoring FireWire: - Lots of code cleanup and refactoring - Integrate the support of SCS.1x devices into snd-oxfw driver; snd-scs1x driver is obsoleted USB-audio: - Fix possible NULL dereference at disconnection - A regression fix for Native Instruments devices Misc: - A few code cleanups of fm801 driver" * tag 'sound-4.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (722 commits) ALSA: timer: Code cleanup ALSA: timer: Harden slave timer list handling ALSA: hda - Add fixup for Dell Latitidue E6540 ALSA: timer: Fix race among timer ioctls ALSA: hda - add codec support for Kabylake display audio codec ALSA: timer: Fix double unlink of active_list ALSA: usb-audio: Fix mixer ctl regression of Native Instrument devices ALSA: hda - fix the headset mic detection problem for a Dell laptop ALSA: hda - Fix white noise on Dell Latitude E5550 ALSA: hda_intel: add card number to irq description ALSA: seq: Fix race at timer setup and close ALSA: seq: Fix missing NULL check at remove_events ioctl ALSA: usb-audio: Avoid calling usb_autopm_put_interface() at disconnect ASoC: hdac_hdmi: remove unused hdac_hdmi_query_pin_connlist ASoC: AMD: Add missing include file ALSA: hda - Fixup inverted internal mic for Lenovo E50-80 ALSA: usb: Add native DSD support for Oppo HA-1 ASoC: Make aux_dev more like a generic component ASoC: bcm2835: cleanup includes by ordering them alphabetically ASoC: AMD: Manage ACP 2.x SRAM banks power ...
-rw-r--r--Documentation/DocBook/gpu.tmpl60
-rw-r--r--Documentation/devicetree/bindings/sound/ak4613.txt10
-rw-r--r--Documentation/devicetree/bindings/sound/atmel-pdmic.txt55
-rw-r--r--Documentation/devicetree/bindings/sound/da7218.txt104
-rw-r--r--Documentation/devicetree/bindings/sound/da7219.txt8
-rw-r--r--Documentation/devicetree/bindings/sound/fsl,asrc.txt5
-rw-r--r--Documentation/devicetree/bindings/sound/fsl,esai.txt5
-rw-r--r--Documentation/devicetree/bindings/sound/fsl,spdif.txt5
-rw-r--r--Documentation/devicetree/bindings/sound/img,i2s-in.txt47
-rw-r--r--Documentation/devicetree/bindings/sound/img,i2s-out.txt51
-rw-r--r--Documentation/devicetree/bindings/sound/img,parallel-out.txt44
-rw-r--r--Documentation/devicetree/bindings/sound/img,pistachio-internal-dac.txt18
-rw-r--r--Documentation/devicetree/bindings/sound/img,spdif-in.txt41
-rw-r--r--Documentation/devicetree/bindings/sound/img,spdif-out.txt44
-rw-r--r--Documentation/devicetree/bindings/sound/inno-rk3036.txt20
-rw-r--r--Documentation/devicetree/bindings/sound/pcm179x.txt (renamed from Documentation/devicetree/bindings/sound/pcm1792a.txt)2
-rw-r--r--Documentation/devicetree/bindings/sound/renesas,rsnd.txt82
-rw-r--r--Documentation/devicetree/bindings/sound/renesas,rsrc-card.txt4
-rw-r--r--Documentation/devicetree/bindings/sound/rockchip-i2s.txt2
-rw-r--r--Documentation/devicetree/bindings/sound/rt5616.txt26
-rw-r--r--Documentation/devicetree/bindings/sound/rt5651.txt41
-rw-r--r--Documentation/devicetree/bindings/sound/rt5659.txt75
-rw-r--r--Documentation/devicetree/bindings/sound/rt5677.txt2
-rw-r--r--Documentation/devicetree/bindings/sound/sun4i-codec.txt3
-rw-r--r--Documentation/devicetree/bindings/sound/ti,pcm3168a.txt48
-rw-r--r--Documentation/devicetree/bindings/sound/wlf,wm8974.txt15
-rw-r--r--Documentation/sound/alsa/img,spdif-in.txt49
-rw-r--r--arch/arm/mach-s3c64xx/dev-audio.c47
-rw-r--r--arch/arm/mach-s3c64xx/include/mach/dma.h52
-rw-r--r--arch/arm/plat-samsung/devs.c23
-rw-r--r--arch/x86/include/asm/platform_sst_audio.h1
-rw-r--r--arch/x86/kernel/early-quirks.c1
-rw-r--r--drivers/dma/Kconfig2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_display.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h2
-rw-r--r--drivers/gpu/drm/armada/armada_fb.c4
-rw-r--r--drivers/gpu/drm/armada/armada_fb.h2
-rw-r--r--drivers/gpu/drm/ast/ast_drv.h3
-rw-r--r--drivers/gpu/drm/ast/ast_fb.c2
-rw-r--r--drivers/gpu/drm/ast/ast_main.c4
-rw-r--r--drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c2
-rw-r--r--drivers/gpu/drm/bochs/bochs.h2
-rw-r--r--drivers/gpu/drm/bochs/bochs_fbdev.c2
-rw-r--r--drivers/gpu/drm/bochs/bochs_mm.c4
-rw-r--r--drivers/gpu/drm/cirrus/cirrus_drv.h3
-rw-r--r--drivers/gpu/drm/cirrus/cirrus_fbdev.c2
-rw-r--r--drivers/gpu/drm/cirrus/cirrus_main.c4
-rw-r--r--drivers/gpu/drm/drm_atomic.c18
-rw-r--r--drivers/gpu/drm/drm_atomic_helper.c252
-rw-r--r--drivers/gpu/drm/drm_crtc.c4
-rw-r--r--drivers/gpu/drm/drm_crtc_helper.c8
-rw-r--r--drivers/gpu/drm/drm_edid.c62
-rw-r--r--drivers/gpu/drm/drm_fb_cma_helper.c4
-rw-r--r--drivers/gpu/drm/drm_fops.c58
-rw-r--r--drivers/gpu/drm/drm_gem.c35
-rw-r--r--drivers/gpu/drm/drm_modes.c35
-rw-r--r--drivers/gpu/drm/drm_modeset_lock.c89
-rw-r--r--drivers/gpu/drm/drm_plane_helper.c4
-rw-r--r--drivers/gpu/drm/drm_probe_helper.c47
-rw-r--r--drivers/gpu/drm/drm_rect.c7
-rw-r--r--drivers/gpu/drm/drm_sysfs.c54
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fb.c4
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fb.h2
-rw-r--r--drivers/gpu/drm/gma500/framebuffer.c18
-rw-r--r--drivers/gpu/drm/gma500/gem.c19
-rw-r--r--drivers/gpu/drm/gma500/gma_display.c13
-rw-r--r--drivers/gpu/drm/gma500/gtt.c1
-rw-r--r--drivers/gpu/drm/gma500/psb_drv.h2
-rw-r--r--drivers/gpu/drm/i915/Kconfig1
-rw-r--r--drivers/gpu/drm/i915/Makefile1
-rw-r--r--drivers/gpu/drm/i915/dvo.h3
-rw-r--r--drivers/gpu/drm/i915/i915_cmd_parser.c37
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c244
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c26
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c170
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h188
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c73
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c12
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c4
-rw-r--r--drivers/gpu/drm/i915/i915_gem_fence.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c58
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.h7
-rw-r--r--drivers/gpu/drm/i915/i915_gem_stolen.c3
-rw-r--r--drivers/gpu/drm/i915/i915_gem_tiling.c4
-rw-r--r--drivers/gpu/drm/i915/i915_gpu_error.c40
-rw-r--r--drivers/gpu/drm/i915/i915_guc_reg.h53
-rw-r--r--drivers/gpu/drm/i915/i915_guc_submission.c16
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c117
-rw-r--r--drivers/gpu/drm/i915/i915_params.c10
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h2742
-rw-r--r--drivers/gpu/drm/i915/i915_sysfs.c3
-rw-r--r--drivers/gpu/drm/i915/i915_trace.h4
-rw-r--r--drivers/gpu/drm/i915/i915_vgpu.c6
-rw-r--r--drivers/gpu/drm/i915/i915_vgpu.h14
-rw-r--r--drivers/gpu/drm/i915/intel_atomic.c3
-rw-r--r--drivers/gpu/drm/i915/intel_atomic_plane.c2
-rw-r--r--drivers/gpu/drm/i915/intel_audio.c102
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c14
-rw-r--r--drivers/gpu/drm/i915/intel_csr.c284
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c142
-rw-r--r--drivers/gpu/drm/i915/intel_display.c798
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c1040
-rw-r--r--drivers/gpu/drm/i915/intel_dp_link_training.c323
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c18
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h159
-rw-r--r--drivers/gpu/drm/i915/intel_dsi.c45
-rw-r--r--drivers/gpu/drm/i915/intel_dsi.h2
-rw-r--r--drivers/gpu/drm/i915/intel_dvo.c27
-rw-r--r--drivers/gpu/drm/i915/intel_fbc.c196
-rw-r--r--drivers/gpu/drm/i915/intel_fbdev.c50
-rw-r--r--drivers/gpu/drm/i915/intel_fifo_underrun.c127
-rw-r--r--drivers/gpu/drm/i915/intel_guc.h8
-rw-r--r--drivers/gpu/drm/i915/intel_guc_fwif.h72
-rw-r--r--drivers/gpu/drm/i915/intel_guc_loader.c105
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c77
-rw-r--r--drivers/gpu/drm/i915/intel_i2c.c31
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c148
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.h19
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c11
-rw-r--r--drivers/gpu/drm/i915/intel_mocs.c61
-rw-r--r--drivers/gpu/drm/i915/intel_opregion.c2
-rw-r--r--drivers/gpu/drm/i915/intel_overlay.c2
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c630
-rw-r--r--drivers/gpu/drm/i915/intel_psr.c77
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c156
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h9
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c492
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c61
-rw-r--r--drivers/gpu/drm/i915/intel_sprite.c28
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c261
-rw-r--r--drivers/gpu/drm/imx/Kconfig9
-rw-r--r--drivers/gpu/drm/imx/imx-drm-core.c12
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_drv.h2
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_fb.c2
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_main.c4
-rw-r--r--drivers/gpu/drm/msm/msm_drv.h4
-rw-r--r--drivers/gpu/drm/msm/msm_fb.c4
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_display.c4
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_display.h2
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fbcon.h1
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.h6
-rw-r--r--drivers/gpu/drm/omapdrm/omap_fb.c4
-rw-r--r--drivers/gpu/drm/qxl/qxl_display.c4
-rw-r--r--drivers/gpu/drm/qxl/qxl_drv.h2
-rw-r--r--drivers/gpu/drm/qxl/qxl_fb.c3
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_fb.c1
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h2
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_kms.c2
-rw-r--r--drivers/gpu/drm/rockchip/rockchip_drm_fb.c6
-rw-r--r--drivers/gpu/drm/rockchip/rockchip_drm_fb.h2
-rw-r--r--drivers/gpu/drm/shmobile/shmob_drm_kms.c2
-rw-r--r--drivers/gpu/drm/tegra/Kconfig12
-rw-r--r--drivers/gpu/drm/tegra/drm.c4
-rw-r--r--drivers/gpu/drm/tegra/drm.h8
-rw-r--r--drivers/gpu/drm/tegra/fb.c16
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_drv.c2
-rw-r--r--drivers/gpu/drm/udl/udl_drv.h2
-rw-r--r--drivers/gpu/drm/udl/udl_fb.c5
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_display.c4
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_drv.h2
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_fb.c1
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_kms.c2
-rw-r--r--drivers/pci/quirks.c4
-rw-r--r--include/drm/drmP.h5
-rw-r--r--include/drm/drm_atomic.h6
-rw-r--r--include/drm/drm_atomic_helper.h8
-rw-r--r--include/drm/drm_crtc.h12
-rw-r--r--include/drm/drm_crtc_helper.h2
-rw-r--r--include/drm/drm_dp_helper.h36
-rw-r--r--include/drm/drm_fb_cma_helper.h2
-rw-r--r--include/drm/drm_gem.h106
-rw-r--r--include/drm/drm_mm.h26
-rw-r--r--include/drm/drm_modes.h2
-rw-r--r--include/drm/drm_modeset_lock.h4
-rw-r--r--include/drm/drm_rect.h3
-rw-r--r--include/drm/i915_component.h83
-rw-r--r--include/drm/i915_pciids.h36
-rw-r--r--include/linux/platform_data/asoc-s3c.h8
-rw-r--r--include/sound/ac97_codec.h3
-rw-r--r--include/sound/compress_driver.h7
-rw-r--r--include/sound/core.h1
-rw-r--r--include/sound/da7218.h109
-rw-r--r--include/sound/da7219.h14
-rw-r--r--include/sound/designware_i2s.h6
-rw-r--r--include/sound/hda_i915.h14
-rw-r--r--include/sound/hda_register.h9
-rw-r--r--include/sound/hdaudio_ext.h21
-rw-r--r--include/sound/i2c.h2
-rw-r--r--include/sound/rawmidi.h2
-rw-r--r--include/sound/rt5659.h49
-rw-r--r--include/sound/soc-dai.h1
-rw-r--r--include/sound/soc-dapm.h4
-rw-r--r--include/sound/soc-topology.h6
-rw-r--r--include/sound/soc.h53
-rw-r--r--include/uapi/drm/i915_drm.h11
-rw-r--r--include/uapi/sound/asoc.h2
-rw-r--r--include/uapi/sound/compress_params.h5
-rw-r--r--kernel/async.c1
-rw-r--r--sound/core/compress_offload.c99
-rw-r--r--sound/core/init.c3
-rw-r--r--sound/core/oss/mixer_oss.c8
-rw-r--r--sound/core/oss/pcm_oss.c10
-rw-r--r--sound/core/pcm_native.c26
-rw-r--r--sound/core/seq/oss/seq_oss.c7
-rw-r--r--sound/core/seq/seq_clientmgr.c2
-rw-r--r--sound/core/seq/seq_queue.c2
-rw-r--r--sound/core/seq/seq_virmidi.c2
-rw-r--r--sound/core/timer.c76
-rw-r--r--sound/drivers/dummy.c4
-rw-r--r--sound/firewire/Kconfig12
-rw-r--r--sound/firewire/Makefile2
-rw-r--r--sound/firewire/dice/dice-transaction.c123
-rw-r--r--sound/firewire/dice/dice.c227
-rw-r--r--sound/firewire/dice/dice.h3
-rw-r--r--sound/firewire/fireworks/fireworks.h4
-rw-r--r--sound/firewire/fireworks/fireworks_midi.c16
-rw-r--r--sound/firewire/fireworks/fireworks_pcm.c28
-rw-r--r--sound/firewire/fireworks/fireworks_stream.c32
-rw-r--r--sound/firewire/oxfw/Makefile4
-rw-r--r--sound/firewire/oxfw/oxfw-scs1x.c406
-rw-r--r--sound/firewire/oxfw/oxfw-spkr.c (renamed from sound/firewire/oxfw/oxfw-control.c)142
-rw-r--r--sound/firewire/oxfw/oxfw.c110
-rw-r--r--sound/firewire/oxfw/oxfw.h23
-rw-r--r--sound/firewire/scs1x.c530
-rw-r--r--sound/hda/ext/hdac_ext_controller.c29
-rw-r--r--sound/hda/ext/hdac_ext_stream.c72
-rw-r--r--sound/hda/hdac_i915.c66
-rw-r--r--sound/i2c/i2c.c2
-rw-r--r--sound/oss/Kconfig2
-rw-r--r--sound/pci/atiixp.c6
-rw-r--r--sound/pci/atiixp_modem.c4
-rw-r--r--sound/pci/azt3328.c2
-rw-r--r--sound/pci/cs5535audio/cs5535audio_pcm.c4
-rw-r--r--sound/pci/fm801.c145
-rw-r--r--sound/pci/hda/hda_controller.c10
-rw-r--r--sound/pci/hda/hda_controller.h14
-rw-r--r--sound/pci/hda/hda_eld.c1
-rw-r--r--sound/pci/hda/hda_generic.c108
-rw-r--r--sound/pci/hda/hda_generic.h5
-rw-r--r--sound/pci/hda/hda_intel.c78
-rw-r--r--sound/pci/hda/hda_tegra.c5
-rw-r--r--sound/pci/hda/patch_conexant.c3
-rw-r--r--sound/pci/hda/patch_hdmi.c245
-rw-r--r--sound/pci/hda/patch_realtek.c14
-rw-r--r--sound/pci/ice1712/delta.c2
-rw-r--r--sound/soc/Kconfig2
-rw-r--r--sound/soc/Makefile2
-rw-r--r--sound/soc/amd/Kconfig4
-rw-r--r--sound/soc/amd/Makefile3
-rw-r--r--sound/soc/amd/acp-pcm-dma.c1043
-rw-r--r--sound/soc/amd/acp.h118
-rw-r--r--sound/soc/amd/include/acp_2_2_d.h609
-rw-r--r--sound/soc/amd/include/acp_2_2_enum.h1068
-rw-r--r--sound/soc/amd/include/acp_2_2_sh_mask.h2292
-rw-r--r--sound/soc/atmel/Kconfig9
-rw-r--r--sound/soc/atmel/Makefile2
-rw-r--r--sound/soc/atmel/atmel-classd.c26
-rw-r--r--sound/soc/atmel/atmel-pdmic.c738
-rw-r--r--sound/soc/atmel/atmel-pdmic.h80
-rw-r--r--sound/soc/atmel/atmel_wm8904.c1
-rw-r--r--sound/soc/bcm/bcm2835-i2s.c12
-rw-r--r--sound/soc/codecs/Kconfig62
-rw-r--r--sound/soc/codecs/Makefile22
-rw-r--r--sound/soc/codecs/ak4613.c118
-rw-r--r--sound/soc/codecs/arizona.c146
-rw-r--r--sound/soc/codecs/arizona.h17
-rw-r--r--sound/soc/codecs/cs47l24.c1148
-rw-r--r--sound/soc/codecs/cs47l24.h23
-rw-r--r--sound/soc/codecs/da7218.c3341
-rw-r--r--sound/soc/codecs/da7218.h1414
-rw-r--r--sound/soc/codecs/da7219.c163
-rw-r--r--sound/soc/codecs/da7219.h9
-rw-r--r--sound/soc/codecs/hdac_hdmi.c697
-rw-r--r--sound/soc/codecs/inno_rk3036.c490
-rw-r--r--sound/soc/codecs/inno_rk3036.h123
-rw-r--r--sound/soc/codecs/max98357a.c10
-rw-r--r--sound/soc/codecs/pcm1792a.c271
-rw-r--r--sound/soc/codecs/pcm179x.c271
-rw-r--r--sound/soc/codecs/pcm179x.h (renamed from sound/soc/codecs/pcm1792a.h)6
-rw-r--r--sound/soc/codecs/pcm3168a-i2c.c66
-rw-r--r--sound/soc/codecs/pcm3168a-spi.c65
-rw-r--r--sound/soc/codecs/pcm3168a.c767
-rw-r--r--sound/soc/codecs/pcm3168a.h100
-rw-r--r--sound/soc/codecs/rt286.c6
-rw-r--r--sound/soc/codecs/rt298.c2
-rw-r--r--sound/soc/codecs/rt5616.c1381
-rw-r--r--sound/soc/codecs/rt5616.h1819
-rw-r--r--sound/soc/codecs/rt5640.c103
-rw-r--r--sound/soc/codecs/rt5640.h17
-rw-r--r--sound/soc/codecs/rt5645.c322
-rw-r--r--sound/soc/codecs/rt5651.c31
-rw-r--r--sound/soc/codecs/rt5659.c4223
-rw-r--r--sound/soc/codecs/rt5659.h1819
-rw-r--r--sound/soc/codecs/rt5677.c13
-rw-r--r--sound/soc/codecs/ssm2518.c2
-rw-r--r--sound/soc/codecs/twl6040.c3
-rw-r--r--sound/soc/codecs/wm5110.c252
-rw-r--r--sound/soc/codecs/wm8903.c2
-rw-r--r--sound/soc/codecs/wm8904.c2
-rw-r--r--sound/soc/codecs/wm8960.c24
-rw-r--r--sound/soc/codecs/wm8962.c3
-rw-r--r--sound/soc/codecs/wm8974.c7
-rw-r--r--sound/soc/codecs/wm8998.c46
-rw-r--r--sound/soc/codecs/wm9713.c296
-rw-r--r--sound/soc/codecs/wm_adsp.c1095
-rw-r--r--sound/soc/codecs/wm_adsp.h28
-rw-r--r--sound/soc/dwc/designware_i2s.c117
-rw-r--r--sound/soc/fsl/fsl-asoc-card.c21
-rw-r--r--sound/soc/fsl/fsl_asrc.c62
-rw-r--r--sound/soc/fsl/fsl_asrc.h9
-rw-r--r--sound/soc/fsl/fsl_esai.c63
-rw-r--r--sound/soc/fsl/fsl_sai.c98
-rw-r--r--sound/soc/fsl/fsl_sai.h3
-rw-r--r--sound/soc/fsl/fsl_spdif.c35
-rw-r--r--sound/soc/fsl/fsl_ssi.c49
-rw-r--r--sound/soc/fsl/imx-pcm-dma.c2
-rw-r--r--sound/soc/fsl/imx-pcm-fiq.c4
-rw-r--r--sound/soc/fsl/imx-wm8962.c10
-rw-r--r--sound/soc/fsl/mpc8610_hpcd.c3
-rw-r--r--sound/soc/fsl/p1022_ds.c3
-rw-r--r--sound/soc/fsl/p1022_rdk.c3
-rw-r--r--sound/soc/generic/simple-card.c12
-rw-r--r--sound/soc/img/Kconfig52
-rw-r--r--sound/soc/img/Makefile7
-rw-r--r--sound/soc/img/img-i2s-in.c516
-rw-r--r--sound/soc/img/img-i2s-out.c565
-rw-r--r--sound/soc/img/img-parallel-out.c327
-rw-r--r--sound/soc/img/img-spdif-in.c806
-rw-r--r--sound/soc/img/img-spdif-out.c441
-rw-r--r--sound/soc/img/pistachio-internal-dac.c287
-rw-r--r--sound/soc/intel/Kconfig58
-rw-r--r--sound/soc/intel/atom/sst-atom-controls.c5
-rw-r--r--sound/soc/intel/atom/sst-atom-controls.h1
-rw-r--r--sound/soc/intel/atom/sst-mfld-platform-pcm.c32
-rw-r--r--sound/soc/intel/atom/sst/sst_acpi.c82
-rw-r--r--sound/soc/intel/atom/sst/sst_stream.c2
-rw-r--r--sound/soc/intel/baytrail/sst-baytrail-pcm.c2
-rw-r--r--sound/soc/intel/boards/Makefile6
-rw-r--r--sound/soc/intel/boards/bytcr_rt5640.c266
-rw-r--r--sound/soc/intel/boards/bytcr_rt5651.c332
-rw-r--r--sound/soc/intel/boards/cht_bsw_max98090_ti.c19
-rw-r--r--sound/soc/intel/boards/cht_bsw_rt5645.c19
-rw-r--r--sound/soc/intel/boards/cht_bsw_rt5672.c19
-rw-r--r--sound/soc/intel/boards/skl_nau88l25_max98357a.c485
-rw-r--r--sound/soc/intel/boards/skl_nau88l25_ssm4567.c536
-rw-r--r--sound/soc/intel/boards/skl_rt286.c128
-rw-r--r--sound/soc/intel/common/Makefile12
-rw-r--r--sound/soc/intel/common/sst-acpi.c41
-rw-r--r--sound/soc/intel/common/sst-acpi.h33
-rw-r--r--sound/soc/intel/common/sst-dsp-priv.h8
-rw-r--r--sound/soc/intel/common/sst-dsp.c2
-rw-r--r--sound/soc/intel/common/sst-dsp.h2
-rw-r--r--sound/soc/intel/common/sst-firmware.c20
-rw-r--r--sound/soc/intel/common/sst-match-acpi.c43
-rw-r--r--sound/soc/intel/haswell/sst-haswell-dsp.c2
-rw-r--r--sound/soc/intel/haswell/sst-haswell-ipc.c31
-rw-r--r--sound/soc/intel/skylake/skl-messages.c280
-rw-r--r--sound/soc/intel/skylake/skl-nhlt.c19
-rw-r--r--sound/soc/intel/skylake/skl-pcm.c310
-rw-r--r--sound/soc/intel/skylake/skl-sst-cldma.c97
-rw-r--r--sound/soc/intel/skylake/skl-sst-dsp.h21
-rw-r--r--sound/soc/intel/skylake/skl-sst-ipc.c123
-rw-r--r--sound/soc/intel/skylake/skl-sst-ipc.h14
-rw-r--r--sound/soc/intel/skylake/skl-sst.c217
-rw-r--r--sound/soc/intel/skylake/skl-topology.c658
-rw-r--r--sound/soc/intel/skylake/skl-topology.h63
-rw-r--r--sound/soc/intel/skylake/skl-tplg-interface.h105
-rw-r--r--sound/soc/intel/skylake/skl.c213
-rw-r--r--sound/soc/intel/skylake/skl.h8
-rw-r--r--sound/soc/mediatek/mtk-afe-common.h1
-rw-r--r--sound/soc/mediatek/mtk-afe-pcm.c59
-rw-r--r--sound/soc/omap/omap-hdmi-audio.c2
-rw-r--r--sound/soc/pxa/brownstone.c3
-rw-r--r--sound/soc/pxa/mioa701_wm9713.c6
-rw-r--r--sound/soc/qcom/lpass-cpu.c1
-rw-r--r--sound/soc/rockchip/rockchip_i2s.c139
-rw-r--r--sound/soc/rockchip/rockchip_max98090.c6
-rw-r--r--sound/soc/rockchip/rockchip_rt5645.c6
-rw-r--r--sound/soc/samsung/Kconfig2
-rw-r--r--sound/soc/samsung/ac97.c29
-rw-r--r--sound/soc/samsung/bells.c40
-rw-r--r--sound/soc/samsung/dma.h6
-rw-r--r--sound/soc/samsung/dmaengine.c20
-rw-r--r--sound/soc/samsung/i2s.c31
-rw-r--r--sound/soc/samsung/littlemill.c32
-rw-r--r--sound/soc/samsung/odroidx2_max98090.c9
-rw-r--r--sound/soc/samsung/pcm.c25
-rw-r--r--sound/soc/samsung/s3c2412-i2s.c16
-rw-r--r--sound/soc/samsung/s3c24xx-i2s.c16
-rw-r--r--sound/soc/samsung/snow.c9
-rw-r--r--sound/soc/samsung/spdif.c17
-rw-r--r--sound/soc/samsung/speyside.c12
-rw-r--r--sound/soc/samsung/tobermory.c21
-rw-r--r--sound/soc/sh/Kconfig1
-rw-r--r--sound/soc/sh/fsi.c11
-rw-r--r--sound/soc/sh/rcar/Makefile2
-rw-r--r--sound/soc/sh/rcar/adg.c118
-rw-r--r--sound/soc/sh/rcar/cmd.c171
-rw-r--r--sound/soc/sh/rcar/core.c586
-rw-r--r--sound/soc/sh/rcar/ctu.c99
-rw-r--r--sound/soc/sh/rcar/dma.c245
-rw-r--r--sound/soc/sh/rcar/dvc.c273
-rw-r--r--sound/soc/sh/rcar/gen.c133
-rw-r--r--sound/soc/sh/rcar/mix.c158
-rw-r--r--sound/soc/sh/rcar/rcar_snd.h117
-rw-r--r--sound/soc/sh/rcar/rsnd.h335
-rw-r--r--sound/soc/sh/rcar/rsrc-card.c129
-rw-r--r--sound/soc/sh/rcar/src.c898
-rw-r--r--sound/soc/sh/rcar/ssi.c755
-rw-r--r--sound/soc/sh/rcar/ssiu.c225
-rw-r--r--sound/soc/soc-ac97.c125
-rw-r--r--sound/soc/soc-compress.c31
-rw-r--r--sound/soc/soc-core.c866
-rw-r--r--sound/soc/soc-dapm.c14
-rw-r--r--sound/soc/soc-ops.c4
-rw-r--r--sound/soc/soc-pcm.c110
-rw-r--r--sound/soc/sti/uniperif_player.c3
-rw-r--r--sound/soc/sunxi/sun4i-codec.c279
-rw-r--r--sound/soc/tegra/tegra_alc5632.c12
-rw-r--r--sound/soc/tegra/tegra_wm8903.c3
-rw-r--r--sound/synth/emux/emux_nrpn.c9
-rw-r--r--sound/usb/card.c2
-rw-r--r--sound/usb/midi.c27
-rw-r--r--sound/usb/misc/ua101.c4
-rw-r--r--sound/usb/mixer_quirks.c2
-rw-r--r--sound/usb/quirks.c1
-rw-r--r--sound/usb/stream.c6
-rw-r--r--sound/usb/usx2y/usbusx2yaudio.c2
430 files changed, 45195 insertions, 10422 deletions
diff --git a/Documentation/DocBook/gpu.tmpl b/Documentation/DocBook/gpu.tmpl
index 201dcd3c2e9d..03f01e76add7 100644
--- a/Documentation/DocBook/gpu.tmpl
+++ b/Documentation/DocBook/gpu.tmpl
@@ -615,18 +615,6 @@ char *date;</synopsis>
615 <function>drm_gem_object_init</function>. Storage for private GEM 615 <function>drm_gem_object_init</function>. Storage for private GEM
616 objects must be managed by drivers. 616 objects must be managed by drivers.
617 </para> 617 </para>
618 <para>
619 Drivers that do not need to extend GEM objects with private information
620 can call the <function>drm_gem_object_alloc</function> function to
621 allocate and initialize a struct <structname>drm_gem_object</structname>
622 instance. The GEM core will call the optional driver
623 <methodname>gem_init_object</methodname> operation after initializing
624 the GEM object with <function>drm_gem_object_init</function>.
625 <synopsis>int (*gem_init_object) (struct drm_gem_object *obj);</synopsis>
626 </para>
627 <para>
628 No alloc-and-init function exists for private GEM objects.
629 </para>
630 </sect3> 618 </sect3>
631 <sect3> 619 <sect3>
632 <title>GEM Objects Lifetime</title> 620 <title>GEM Objects Lifetime</title>
@@ -635,10 +623,10 @@ char *date;</synopsis>
635 acquired and release by <function>calling drm_gem_object_reference</function> 623 acquired and release by <function>calling drm_gem_object_reference</function>
636 and <function>drm_gem_object_unreference</function> respectively. The 624 and <function>drm_gem_object_unreference</function> respectively. The
637 caller must hold the <structname>drm_device</structname> 625 caller must hold the <structname>drm_device</structname>
638 <structfield>struct_mutex</structfield> lock. As a convenience, GEM 626 <structfield>struct_mutex</structfield> lock when calling
639 provides the <function>drm_gem_object_reference_unlocked</function> and 627 <function>drm_gem_object_reference</function>. As a convenience, GEM
640 <function>drm_gem_object_unreference_unlocked</function> functions that 628 provides <function>drm_gem_object_unreference_unlocked</function>
641 can be called without holding the lock. 629 functions that can be called without holding the lock.
642 </para> 630 </para>
643 <para> 631 <para>
644 When the last reference to a GEM object is released the GEM core calls 632 When the last reference to a GEM object is released the GEM core calls
@@ -649,15 +637,9 @@ char *date;</synopsis>
649 </para> 637 </para>
650 <para> 638 <para>
651 <synopsis>void (*gem_free_object) (struct drm_gem_object *obj);</synopsis> 639 <synopsis>void (*gem_free_object) (struct drm_gem_object *obj);</synopsis>
652 Drivers are responsible for freeing all GEM object resources, including 640 Drivers are responsible for freeing all GEM object resources. This includes
653 the resources created by the GEM core. If an mmap offset has been 641 the resources created by the GEM core, which need to be released with
654 created for the object (in which case 642 <function>drm_gem_object_release</function>.
655 <structname>drm_gem_object</structname>::<structfield>map_list</structfield>::<structfield>map</structfield>
656 is not NULL) it must be freed by a call to
657 <function>drm_gem_free_mmap_offset</function>. The shmfs backing store
658 must be released by calling <function>drm_gem_object_release</function>
659 (that function can safely be called if no shmfs backing store has been
660 created).
661 </para> 643 </para>
662 </sect3> 644 </sect3>
663 <sect3> 645 <sect3>
@@ -740,17 +722,10 @@ char *date;</synopsis>
740 DRM identifies the GEM object to be mapped by a fake offset passed 722 DRM identifies the GEM object to be mapped by a fake offset passed
741 through the mmap offset argument. Prior to being mapped, a GEM object 723 through the mmap offset argument. Prior to being mapped, a GEM object
742 must thus be associated with a fake offset. To do so, drivers must call 724 must thus be associated with a fake offset. To do so, drivers must call
743 <function>drm_gem_create_mmap_offset</function> on the object. The 725 <function>drm_gem_create_mmap_offset</function> on the object.
744 function allocates a fake offset range from a pool and stores the
745 offset divided by PAGE_SIZE in
746 <literal>obj-&gt;map_list.hash.key</literal>. Care must be taken not to
747 call <function>drm_gem_create_mmap_offset</function> if a fake offset
748 has already been allocated for the object. This can be tested by
749 <literal>obj-&gt;map_list.map</literal> being non-NULL.
750 </para> 726 </para>
751 <para> 727 <para>
752 Once allocated, the fake offset value 728 Once allocated, the fake offset value
753 (<literal>obj-&gt;map_list.hash.key &lt;&lt; PAGE_SHIFT</literal>)
754 must be passed to the application in a driver-specific way and can then 729 must be passed to the application in a driver-specific way and can then
755 be used as the mmap offset argument. 730 be used as the mmap offset argument.
756 </para> 731 </para>
@@ -836,10 +811,11 @@ char *date;</synopsis>
836 abstracted from the client in libdrm. 811 abstracted from the client in libdrm.
837 </para> 812 </para>
838 </sect3> 813 </sect3>
839 <sect3> 814 </sect2>
840 <title>GEM Function Reference</title> 815 <sect2>
816 <title>GEM Function Reference</title>
841!Edrivers/gpu/drm/drm_gem.c 817!Edrivers/gpu/drm/drm_gem.c
842 </sect3> 818!Iinclude/drm/drm_gem.h
843 </sect2> 819 </sect2>
844 <sect2> 820 <sect2>
845 <title>VMA Offset Manager</title> 821 <title>VMA Offset Manager</title>
@@ -4201,17 +4177,21 @@ int num_ioctls;</synopsis>
4201 </sect2> 4177 </sect2>
4202 </sect1> 4178 </sect1>
4203 <sect1> 4179 <sect1>
4204 <title>GuC-based Command Submission</title> 4180 <title>GuC</title>
4205 <sect2> 4181 <sect2>
4206 <title>GuC</title> 4182 <title>GuC-specific firmware loader</title>
4207!Pdrivers/gpu/drm/i915/intel_guc_loader.c GuC-specific firmware loader 4183!Pdrivers/gpu/drm/i915/intel_guc_loader.c GuC-specific firmware loader
4208!Idrivers/gpu/drm/i915/intel_guc_loader.c 4184!Idrivers/gpu/drm/i915/intel_guc_loader.c
4209 </sect2> 4185 </sect2>
4210 <sect2> 4186 <sect2>
4211 <title>GuC Client</title> 4187 <title>GuC-based command submission</title>
4212!Pdrivers/gpu/drm/i915/i915_guc_submission.c GuC-based command submissison 4188!Pdrivers/gpu/drm/i915/i915_guc_submission.c GuC-based command submission
4213!Idrivers/gpu/drm/i915/i915_guc_submission.c 4189!Idrivers/gpu/drm/i915/i915_guc_submission.c
4214 </sect2> 4190 </sect2>
4191 <sect2>
4192 <title>GuC Firmware Layout</title>
4193!Pdrivers/gpu/drm/i915/intel_guc_fwif.h GuC Firmware Layout
4194 </sect2>
4215 </sect1> 4195 </sect1>
4216 4196
4217 <sect1> 4197 <sect1>
diff --git a/Documentation/devicetree/bindings/sound/ak4613.txt b/Documentation/devicetree/bindings/sound/ak4613.txt
index 15a919522b42..1783f9ef0930 100644
--- a/Documentation/devicetree/bindings/sound/ak4613.txt
+++ b/Documentation/devicetree/bindings/sound/ak4613.txt
@@ -7,6 +7,16 @@ Required properties:
7- compatible : "asahi-kasei,ak4613" 7- compatible : "asahi-kasei,ak4613"
8- reg : The chip select number on the I2C bus 8- reg : The chip select number on the I2C bus
9 9
10Optional properties:
11- asahi-kasei,in1-single-end : Boolean. Indicate input / output pins are single-ended.
12- asahi-kasei,in2-single-end rather than differential.
13- asahi-kasei,out1-single-end
14- asahi-kasei,out2-single-end
15- asahi-kasei,out3-single-end
16- asahi-kasei,out4-single-end
17- asahi-kasei,out5-single-end
18- asahi-kasei,out6-single-end
19
10Example: 20Example:
11 21
12&i2c { 22&i2c {
diff --git a/Documentation/devicetree/bindings/sound/atmel-pdmic.txt b/Documentation/devicetree/bindings/sound/atmel-pdmic.txt
new file mode 100644
index 000000000000..e0875f17c229
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/atmel-pdmic.txt
@@ -0,0 +1,55 @@
1* Atmel PDMIC driver under ALSA SoC architecture
2
3Required properties:
4- compatible
5 Should be "atmel,sama5d2-pdmic".
6- reg
7 Should contain PDMIC registers location and length.
8- interrupts
9 Should contain the IRQ line for the PDMIC.
10- dmas
11 One DMA specifiers as described in atmel-dma.txt and dma.txt files.
12- dma-names
13 Must be "rx".
14- clock-names
15 Required elements:
16 - "pclk" peripheral clock
17 - "gclk" generated clock
18- clocks
19 Must contain an entry for each required entry in clock-names.
20 Please refer to clock-bindings.txt.
21- atmel,mic-min-freq
22 The minimal frequency that the micphone supports.
23- atmel,mic-max-freq
24 The maximal frequency that the micphone supports.
25
26Optional properties:
27- pinctrl-names, pinctrl-0
28 Please refer to pinctrl-bindings.txt.
29- atmel,model
30 The user-visible name of this sound card.
31 The default value is "PDMIC".
32- atmel,mic-offset
33 The offset that should be added.
34 The range is from -32768 to 32767.
35 The default value is 0.
36
37Example:
38 pdmic@f8018000 {
39 compatible = "atmel,sama5d2-pdmic";
40 reg = <0xf8018000 0x124>;
41 interrupts = <48 IRQ_TYPE_LEVEL_HIGH 7>;
42 dmas = <&dma0
43 (AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1)
44 | AT91_XDMAC_DT_PERID(50))>;
45 dma-names = "rx";
46 clocks = <&pdmic_clk>, <&pdmic_gclk>;
47 clock-names = "pclk", "gclk";
48
49 pinctrl-names = "default";
50 pinctrl-0 = <&pinctrl_pdmic_default>;
51 atmel,model = "PDMIC @ sama5d2_xplained";
52 atmel,mic-min-freq = <1000000>;
53 atmel,mic-max-freq = <3246000>;
54 atmel,mic-offset = <0x0>;
55 };
diff --git a/Documentation/devicetree/bindings/sound/da7218.txt b/Documentation/devicetree/bindings/sound/da7218.txt
new file mode 100644
index 000000000000..5ca5a709b6aa
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/da7218.txt
@@ -0,0 +1,104 @@
1Dialog Semiconductor DA7218 Audio Codec bindings
2
3DA7218 is an audio codec with HP detect feature.
4
5======
6
7Required properties:
8- compatible : Should be "dlg,da7217" or "dlg,da7218"
9- reg: Specifies the I2C slave address
10
11- VDD-supply: VDD power supply for the device
12- VDDMIC-supply: VDDMIC power supply for the device
13- VDDIO-supply: VDDIO power supply for the device
14 (See Documentation/devicetree/bindings/regulator/regulator.txt for further
15 information relating to regulators)
16
17Optional properties:
18- interrupt-parent: Specifies the phandle of the interrupt controller to which
19 the IRQs from DA7218 are delivered to.
20- interrupts: IRQ line info for DA7218 chip.
21 (See Documentation/devicetree/bindings/interrupt-controller/interrupts.txt for
22 further information relating to interrupt properties)
23- interrupt-names : Name associated with interrupt line. Should be "wakeup" if
24 interrupt is to be used to wake system, otherwise "irq" should be used.
25- wakeup-source: Flag to indicate this device can wake system (suspend/resume).
26
27- clocks : phandle and clock specifier for codec MCLK.
28- clock-names : Clock name string for 'clocks' attribute, should be "mclk".
29
30- dlg,micbias1-lvl-millivolt : Voltage (mV) for Mic Bias 1
31 [<1200>, <1600>, <1800>, <2000>, <2200>, <2400>, <2600>, <2800>, <3000>]
32- dlg,micbias2-lvl-millivolt : Voltage (mV) for Mic Bias 2
33 [<1200>, <1600>, <1800>, <2000>, <2200>, <2400>, <2600>, <2800>, <3000>]
34- dlg,mic1-amp-in-sel : Mic1 input source type
35 ["diff", "se_p", "se_n"]
36- dlg,mic2-amp-in-sel : Mic2 input source type
37 ["diff", "se_p", "se_n"]
38- dlg,dmic1-data-sel : DMIC1 channel select based on clock edge.
39 ["lrise_rfall", "lfall_rrise"]
40- dlg,dmic1-samplephase : When to sample audio from DMIC1.
41 ["on_clkedge", "between_clkedge"]
42- dlg,dmic1-clkrate-hz : DMic1 clock frequency (Hz).
43 [<1500000>, <3000000>]
44- dlg,dmic2-data-sel : DMic2 channel select based on clock edge.
45 ["lrise_rfall", "lfall_rrise"]
46- dlg,dmic2-samplephase : When to sample audio from DMic2.
47 ["on_clkedge", "between_clkedge"]
48- dlg,dmic2-clkrate-hz : DMic2 clock frequency (Hz).
49 [<1500000>, <3000000>]
50- dlg,hp-diff-single-supply : Boolean flag, use single supply for HP
51 (DA7217 only)
52
53======
54
55Optional Child node - 'da7218_hpldet' (DA7218 only):
56
57Optional properties:
58- dlg,jack-rate-us : Time between jack detect measurements (us)
59 [<5>, <10>, <20>, <40>, <80>, <160>, <320>, <640>]
60- dlg,jack-debounce : Number of debounce measurements taken for jack detect
61 [<0>, <2>, <3>, <4>]
62- dlg,jack-threshold-pct : Threshold level for jack detection (% of VDD)
63 [<84>, <88>, <92>, <96>]
64- dlg,comp-inv : Boolean flag, invert comparator output
65- dlg,hyst : Boolean flag, enable hysteresis
66- dlg,discharge : Boolean flag, auto discharge of Mic Bias on jack removal
67
68======
69
70Example:
71
72 codec: da7218@1a {
73 compatible = "dlg,da7218";
74 reg = <0x1a>;
75 interrupt-parent = <&gpio6>;
76 interrupts = <11 IRQ_TYPE_LEVEL_HIGH>;
77 wakeup-source;
78
79 VDD-supply = <&reg_audio>;
80 VDDMIC-supply = <&reg_audio>;
81 VDDIO-supply = <&reg_audio>;
82
83 clocks = <&clks 201>;
84 clock-names = "mclk";
85
86 dlg,micbias1-lvl-millivolt = <2600>;
87 dlg,micbias2-lvl-millivolt = <2600>;
88 dlg,mic1-amp-in-sel = "diff";
89 dlg,mic2-amp-in-sel = "diff";
90
91 dlg,dmic1-data-sel = "lrise_rfall";
92 dlg,dmic1-samplephase = "on_clkedge";
93 dlg,dmic1-clkrate-hz = <3000000>;
94 dlg,dmic2-data-sel = "lrise_rfall";
95 dlg,dmic2-samplephase = "on_clkedge";
96 dlg,dmic2-clkrate-hz = <3000000>;
97
98 da7218_hpldet {
99 dlg,jack-rate-us = <40>;
100 dlg,jack-debounce = <2>;
101 dlg,jack-threshold-pct = <84>;
102 dlg,hyst;
103 };
104 };
diff --git a/Documentation/devicetree/bindings/sound/da7219.txt b/Documentation/devicetree/bindings/sound/da7219.txt
index 1b7030911a3b..cf61681826b6 100644
--- a/Documentation/devicetree/bindings/sound/da7219.txt
+++ b/Documentation/devicetree/bindings/sound/da7219.txt
@@ -28,13 +28,15 @@ Optional properties:
28- clocks : phandle and clock specifier for codec MCLK. 28- clocks : phandle and clock specifier for codec MCLK.
29- clock-names : Clock name string for 'clocks' attribute, should be "mclk". 29- clock-names : Clock name string for 'clocks' attribute, should be "mclk".
30 30
31- dlg,ldo-lvl : Required internal LDO voltage (mV) level for digital engine
32 [<1050>, <1100>, <1200>, <1400>]
33- dlg,micbias-lvl : Voltage (mV) for Mic Bias 31- dlg,micbias-lvl : Voltage (mV) for Mic Bias
34 [<1800>, <2000>, <2200>, <2400>, <2600>] 32 [<1600>, <1800>, <2000>, <2200>, <2400>, <2600>]
35- dlg,mic-amp-in-sel : Mic input source type 33- dlg,mic-amp-in-sel : Mic input source type
36 ["diff", "se_p", "se_n"] 34 ["diff", "se_p", "se_n"]
37 35
36Deprecated properties:
37- dlg,ldo-lvl : Required internal LDO voltage (mV) level for digital engine
38 (LDO unavailable in production HW so property no longer required).
39
38====== 40======
39 41
40Child node - 'da7219_aad': 42Child node - 'da7219_aad':
diff --git a/Documentation/devicetree/bindings/sound/fsl,asrc.txt b/Documentation/devicetree/bindings/sound/fsl,asrc.txt
index b93362a570be..3e26a9478e57 100644
--- a/Documentation/devicetree/bindings/sound/fsl,asrc.txt
+++ b/Documentation/devicetree/bindings/sound/fsl,asrc.txt
@@ -25,6 +25,11 @@ Required properties:
25 "mem" Peripheral access clock to access registers. 25 "mem" Peripheral access clock to access registers.
26 "ipg" Peripheral clock to driver module. 26 "ipg" Peripheral clock to driver module.
27 "asrck_<0-f>" Clock sources for input and output clock. 27 "asrck_<0-f>" Clock sources for input and output clock.
28 "spba" The spba clock is required when ASRC is placed as a
29 bus slave of the Shared Peripheral Bus and when two
30 or more bus masters (CPU, DMA or DSP) try to access
31 it. This property is optional depending on the SoC
32 design.
28 33
29 - big-endian : If this property is absent, the little endian mode 34 - big-endian : If this property is absent, the little endian mode
30 will be in use as default. Otherwise, the big endian 35 will be in use as default. Otherwise, the big endian
diff --git a/Documentation/devicetree/bindings/sound/fsl,esai.txt b/Documentation/devicetree/bindings/sound/fsl,esai.txt
index d3b6b5f48010..cd3ee5d84f03 100644
--- a/Documentation/devicetree/bindings/sound/fsl,esai.txt
+++ b/Documentation/devicetree/bindings/sound/fsl,esai.txt
@@ -27,6 +27,11 @@ Required properties:
27 derive HCK, SCK and FS. 27 derive HCK, SCK and FS.
28 "fsys" The system clock derived from ahb clock used to 28 "fsys" The system clock derived from ahb clock used to
29 derive HCK, SCK and FS. 29 derive HCK, SCK and FS.
30 "spba" The spba clock is required when ESAI is placed as a
31 bus slave of the Shared Peripheral Bus and when two
32 or more bus masters (CPU, DMA or DSP) try to access
33 it. This property is optional depending on the SoC
34 design.
30 35
31 - fsl,fifo-depth : The number of elements in the transmit and receive 36 - fsl,fifo-depth : The number of elements in the transmit and receive
32 FIFOs. This number is the maximum allowed value for 37 FIFOs. This number is the maximum allowed value for
diff --git a/Documentation/devicetree/bindings/sound/fsl,spdif.txt b/Documentation/devicetree/bindings/sound/fsl,spdif.txt
index b5ee32ee3706..4ca39ddc0417 100644
--- a/Documentation/devicetree/bindings/sound/fsl,spdif.txt
+++ b/Documentation/devicetree/bindings/sound/fsl,spdif.txt
@@ -27,6 +27,11 @@ Required properties:
27 Transceiver Clock Diagram" of SoC reference manual. 27 Transceiver Clock Diagram" of SoC reference manual.
28 It can also be referred to TxClk_Source bit of 28 It can also be referred to TxClk_Source bit of
29 register SPDIF_STC. 29 register SPDIF_STC.
30 "spba" The spba clock is required when SPDIF is placed as a
31 bus slave of the Shared Peripheral Bus and when two
32 or more bus masters (CPU, DMA or DSP) try to access
33 it. This property is optional depending on the SoC
34 design.
30 35
31 - big-endian : If this property is absent, the native endian mode 36 - big-endian : If this property is absent, the native endian mode
32 will be in use as default, or the big endian mode 37 will be in use as default, or the big endian mode
diff --git a/Documentation/devicetree/bindings/sound/img,i2s-in.txt b/Documentation/devicetree/bindings/sound/img,i2s-in.txt
new file mode 100644
index 000000000000..423265cfc3d6
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/img,i2s-in.txt
@@ -0,0 +1,47 @@
1Imagination Technologies I2S Input Controller
2
3Required Properties:
4
5 - compatible : Compatible list, must contain "img,i2s-in"
6
7 - #sound-dai-cells : Must be equal to 0
8
9 - reg : Offset and length of the register set for the device
10
11 - clocks : Contains an entry for each entry in clock-names
12
13 - clock-names : Must include the following entry:
14 "sys" The system clock
15
16 - dmas: Contains an entry for each entry in dma-names.
17
18 - dma-names: Must include the following entry:
19 "rx" Single DMA channel used by all active I2S channels
20
21 - img,i2s-channels : Number of I2S channels instantiated in the I2S in block
22
23Optional Properties:
24
25 - interrupts : Contains the I2S in interrupts. Depending on
26 the configuration, there may be no interrupts, one interrupt,
27 or an interrupt per I2S channel. For the case where there is
28 one interrupt per channel, the interrupts should be listed
29 in ascending channel order
30
31 - resets: Contains a phandle to the I2S in reset signal
32
33 - reset-names: Contains the reset signal name "rst"
34
35Example:
36
37i2s_in: i2s-in@18100800 {
38 compatible = "img,i2s-in";
39 reg = <0x18100800 0x200>;
40 interrupts = <GIC_SHARED 7 IRQ_TYPE_LEVEL_HIGH>;
41 dmas = <&mdc 30 0xffffffff 0>;
42 dma-names = "rx";
43 clocks = <&cr_periph SYS_CLK_I2S_IN>;
44 clock-names = "sys";
45 img,i2s-channels = <6>;
46 #sound-dai-cells = <0>;
47};
diff --git a/Documentation/devicetree/bindings/sound/img,i2s-out.txt b/Documentation/devicetree/bindings/sound/img,i2s-out.txt
new file mode 100644
index 000000000000..0159415b3338
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/img,i2s-out.txt
@@ -0,0 +1,51 @@
1Imagination Technologies I2S Output Controller
2
3Required Properties:
4
5 - compatible : Compatible list, must contain "img,i2s-out"
6
7 - #sound-dai-cells : Must be equal to 0
8
9 - reg : Offset and length of the register set for the device
10
11 - clocks : Contains an entry for each entry in clock-names
12
13 - clock-names : Must include the following entries:
14 "sys" The system clock
15 "ref" The reference clock
16
17 - dmas: Contains an entry for each entry in dma-names.
18
19 - dma-names: Must include the following entry:
20 "tx" Single DMA channel used by all active I2S channels
21
22 - img,i2s-channels : Number of I2S channels instantiated in the I2S out block
23
24 - resets: Contains a phandle to the I2S out reset signal
25
26 - reset-names: Contains the reset signal name "rst"
27
28Optional Properties:
29
30 - interrupts : Contains the I2S out interrupts. Depending on
31 the configuration, there may be no interrupts, one interrupt,
32 or an interrupt per I2S channel. For the case where there is
33 one interrupt per channel, the interrupts should be listed
34 in ascending channel order
35
36Example:
37
38i2s_out: i2s-out@18100A00 {
39 compatible = "img,i2s-out";
40 reg = <0x18100A00 0x200>;
41 interrupts = <GIC_SHARED 13 IRQ_TYPE_LEVEL_HIGH>;
42 dmas = <&mdc 23 0xffffffff 0>;
43 dma-names = "tx";
44 clocks = <&cr_periph SYS_CLK_I2S_OUT>,
45 <&clk_core CLK_I2S>;
46 clock-names = "sys", "ref";
47 img,i2s-channels = <6>;
48 resets = <&pistachio_reset PISTACHIO_RESET_I2S_OUT>;
49 reset-names = "rst";
50 #sound-dai-cells = <0>;
51};
diff --git a/Documentation/devicetree/bindings/sound/img,parallel-out.txt b/Documentation/devicetree/bindings/sound/img,parallel-out.txt
new file mode 100644
index 000000000000..a3015d2a06e0
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/img,parallel-out.txt
@@ -0,0 +1,44 @@
1Imagination Technologies Parallel Output Controller
2
3Required Properties:
4
5 - compatible : Compatible list, must contain "img,parallel-out".
6
7 - #sound-dai-cells : Must be equal to 0
8
9 - reg : Offset and length of the register set for the device.
10
11 - dmas: Contains an entry for each entry in dma-names.
12
13 - dma-names: Must include the following entry:
14 "tx"
15
16 - clocks : Contains an entry for each entry in clock-names.
17
18 - clock-names : Includes the following entries:
19 "sys" The system clock
20 "ref" The reference clock
21
22 - resets: Contains a phandle to the parallel out reset signal
23
24 - reset-names: Contains the reset signal name "rst"
25
26Optional Properties:
27
28 - interrupts : Contains the parallel out interrupt, if present
29
30Example:
31
32parallel_out: parallel-out@18100C00 {
33 compatible = "img,parallel-out";
34 reg = <0x18100C00 0x100>;
35 interrupts = <GIC_SHARED 19 IRQ_TYPE_LEVEL_HIGH>;
36 dmas = <&mdc 16 0xffffffff 0>;
37 dma-names = "tx";
38 clocks = <&cr_periph SYS_CLK_PAUD_OUT>,
39 <&clk_core CLK_AUDIO_DAC>;
40 clock-names = "sys", "ref";
41 resets = <&pistachio_reset PISTACHIO_RESET_PRL_OUT>;
42 reset-names = "rst";
43 #sound-dai-cells = <0>;
44};
diff --git a/Documentation/devicetree/bindings/sound/img,pistachio-internal-dac.txt b/Documentation/devicetree/bindings/sound/img,pistachio-internal-dac.txt
new file mode 100644
index 000000000000..4cc18fc0477e
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/img,pistachio-internal-dac.txt
@@ -0,0 +1,18 @@
1Pistachio internal DAC DT bindings
2
3Required properties:
4
5 - compatible: "img,pistachio-internal-dac"
6
7 - img,cr-top : Must contain a phandle to the top level control syscon
8 node which contains the internal dac control registers
9
10 - VDD-supply : Digital power supply regulator (+1.8V or +3.3V)
11
12Examples:
13
14internal_dac: internal-dac {
15 compatible = "img,pistachio-internal-dac";
16 img,cr-top = <&cr_top>;
17 VDD-supply = <&supply3v3>;
18};
diff --git a/Documentation/devicetree/bindings/sound/img,spdif-in.txt b/Documentation/devicetree/bindings/sound/img,spdif-in.txt
new file mode 100644
index 000000000000..aab9a81f7e13
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/img,spdif-in.txt
@@ -0,0 +1,41 @@
1Imagination Technologies SPDIF Input Controller
2
3Required Properties:
4
5 - compatible : Compatible list, must contain "img,spdif-in"
6
7 - #sound-dai-cells : Must be equal to 0
8
9 - reg : Offset and length of the register set for the device
10
11 - dmas: Contains an entry for each entry in dma-names.
12
13 - dma-names: Must include the following entry:
14 "rx"
15
16 - clocks : Contains an entry for each entry in clock-names
17
18 - clock-names : Includes the following entries:
19 "sys" The system clock
20
21Optional Properties:
22
23 - resets: Should contain a phandle to the spdif in reset signal, if any
24
25 - reset-names: Should contain the reset signal name "rst", if a
26 reset phandle is given
27
28 - interrupts : Contains the spdif in interrupt, if present
29
30Example:
31
32spdif_in: spdif-in@18100E00 {
33 compatible = "img,spdif-in";
34 reg = <0x18100E00 0x100>;
35 interrupts = <GIC_SHARED 20 IRQ_TYPE_LEVEL_HIGH>;
36 dmas = <&mdc 15 0xffffffff 0>;
37 dma-names = "rx";
38 clocks = <&cr_periph SYS_CLK_SPDIF_IN>;
39 clock-names = "sys";
40 #sound-dai-cells = <0>;
41};
diff --git a/Documentation/devicetree/bindings/sound/img,spdif-out.txt b/Documentation/devicetree/bindings/sound/img,spdif-out.txt
new file mode 100644
index 000000000000..470a5191e101
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/img,spdif-out.txt
@@ -0,0 +1,44 @@
1Imagination Technologies SPDIF Output Controller
2
3Required Properties:
4
5 - compatible : Compatible list, must contain "img,spdif-out"
6
7 - #sound-dai-cells : Must be equal to 0
8
9 - reg : Offset and length of the register set for the device
10
11 - dmas: Contains an entry for each entry in dma-names.
12
13 - dma-names: Must include the following entry:
14 "tx"
15
16 - clocks : Contains an entry for each entry in clock-names.
17
18 - clock-names : Includes the following entries:
19 "sys" The system clock
20 "ref" The reference clock
21
22 - resets: Contains a phandle to the spdif out reset signal
23
24 - reset-names: Contains the reset signal name "rst"
25
26Optional Properties:
27
28 - interrupts : Contains the parallel out interrupt, if present
29
30Example:
31
32spdif_out: spdif-out@18100D00 {
33 compatible = "img,spdif-out";
34 reg = <0x18100D00 0x100>;
35 interrupts = <GIC_SHARED 21 IRQ_TYPE_LEVEL_HIGH>;
36 dmas = <&mdc 14 0xffffffff 0>;
37 dma-names = "tx";
38 clocks = <&cr_periph SYS_CLK_SPDIF_OUT>,
39 <&clk_core CLK_SPDIF>;
40 clock-names = "sys", "ref";
41 resets = <&pistachio_reset PISTACHIO_RESET_SPDIF_OUT>;
42 reset-names = "rst";
43 #sound-dai-cells = <0>;
44};
diff --git a/Documentation/devicetree/bindings/sound/inno-rk3036.txt b/Documentation/devicetree/bindings/sound/inno-rk3036.txt
new file mode 100644
index 000000000000..758de8e27561
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/inno-rk3036.txt
@@ -0,0 +1,20 @@
1Inno audio codec for RK3036
2
3Inno audio codec is integrated inside RK3036 SoC.
4
5Required properties:
6- compatible : Should be "rockchip,rk3036-codec".
7- reg : The registers of codec.
8- clock-names : Should be "acodec_pclk".
9- clocks : The clock of codec.
10- rockchip,grf : The phandle of grf device node.
11
12Example:
13
14 acodec: acodec-ana@20030000 {
15 compatible = "rk3036-codec";
16 reg = <0x20030000 0x4000>;
17 rockchip,grf = <&grf>;
18 clock-names = "acodec_pclk";
19 clocks = <&cru ACLK_VCODEC>;
20 };
diff --git a/Documentation/devicetree/bindings/sound/pcm1792a.txt b/Documentation/devicetree/bindings/sound/pcm179x.txt
index 970ba1ed576f..4ae70d3462d6 100644
--- a/Documentation/devicetree/bindings/sound/pcm1792a.txt
+++ b/Documentation/devicetree/bindings/sound/pcm179x.txt
@@ -1,4 +1,4 @@
1Texas Instruments pcm1792a DT bindings 1Texas Instruments pcm179x DT bindings
2 2
3This driver supports the SPI bus. 3This driver supports the SPI bus.
4 4
diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
index c57cbd65736c..8ee0fa91e4a0 100644
--- a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
+++ b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
@@ -7,8 +7,11 @@ Required properties:
7 "renesas,rcar_sound-gen3" if generation3 7 "renesas,rcar_sound-gen3" if generation3
8 Examples with soctypes are: 8 Examples with soctypes are:
9 - "renesas,rcar_sound-r8a7778" (R-Car M1A) 9 - "renesas,rcar_sound-r8a7778" (R-Car M1A)
10 - "renesas,rcar_sound-r8a7779" (R-Car H1)
10 - "renesas,rcar_sound-r8a7790" (R-Car H2) 11 - "renesas,rcar_sound-r8a7790" (R-Car H2)
11 - "renesas,rcar_sound-r8a7791" (R-Car M2-W) 12 - "renesas,rcar_sound-r8a7791" (R-Car M2-W)
13 - "renesas,rcar_sound-r8a7793" (R-Car M2-N)
14 - "renesas,rcar_sound-r8a7794" (R-Car E2)
12 - "renesas,rcar_sound-r8a7795" (R-Car H3) 15 - "renesas,rcar_sound-r8a7795" (R-Car H3)
13- reg : Should contain the register physical address. 16- reg : Should contain the register physical address.
14 required register is 17 required register is
@@ -34,6 +37,8 @@ Required properties:
34 see below for detail. 37 see below for detail.
35- #sound-dai-cells : it must be 0 if your system is using single DAI 38- #sound-dai-cells : it must be 0 if your system is using single DAI
36 it must be 1 if your system is using multi DAI 39 it must be 1 if your system is using multi DAI
40
41Optional properties:
37- #clock-cells : it must be 0 if your system has audio_clkout 42- #clock-cells : it must be 0 if your system has audio_clkout
38 it must be 1 if your system has audio_clkout0/1/2/3 43 it must be 1 if your system has audio_clkout0/1/2/3
39- clock-frequency : for all audio_clkout0/1/2/3 44- clock-frequency : for all audio_clkout0/1/2/3
@@ -244,3 +249,80 @@ rcar_sound: sound@ec500000 {
244 }; 249 };
245 }; 250 };
246}; 251};
252
253Example: simple sound card
254
255 rsnd_ak4643: sound {
256 compatible = "simple-audio-card";
257
258 simple-audio-card,format = "left_j";
259 simple-audio-card,bitclock-master = <&sndcodec>;
260 simple-audio-card,frame-master = <&sndcodec>;
261
262 sndcpu: simple-audio-card,cpu {
263 sound-dai = <&rcar_sound>;
264 };
265
266 sndcodec: simple-audio-card,codec {
267 sound-dai = <&ak4643>;
268 clocks = <&audio_clock>;
269 };
270 };
271
272&rcar_sound {
273 pinctrl-0 = <&sound_pins &sound_clk_pins>;
274 pinctrl-names = "default";
275
276 /* Single DAI */
277 #sound-dai-cells = <0>;
278
279 status = "okay";
280
281 rcar_sound,dai {
282 dai0 {
283 playback = <&ssi0 &src2 &dvc0>;
284 capture = <&ssi1 &src3 &dvc1>;
285 };
286 };
287};
288
289&ssi1 {
290 shared-pin;
291};
292
293Example: simple sound card for TDM
294
295 rsnd_tdm: sound {
296 compatible = "simple-audio-card";
297
298 simple-audio-card,format = "left_j";
299 simple-audio-card,bitclock-master = <&sndcodec>;
300 simple-audio-card,frame-master = <&sndcodec>;
301
302 sndcpu: simple-audio-card,cpu {
303 sound-dai = <&rcar_sound>;
304 dai-tdm-slot-num = <6>;
305 };
306
307 sndcodec: simple-audio-card,codec {
308 sound-dai = <&xxx>;
309 };
310 };
311
312Example: simple sound card for Multi channel
313
314&rcar_sound {
315 pinctrl-0 = <&sound_pins &sound_clk_pins>;
316 pinctrl-names = "default";
317
318 /* Single DAI */
319 #sound-dai-cells = <0>;
320
321 status = "okay";
322
323 rcar_sound,dai {
324 dai0 {
325 playback = <&ssi0 &ssi1 &ssi2 &src0 &dvc0>;
326 };
327 };
328};
diff --git a/Documentation/devicetree/bindings/sound/renesas,rsrc-card.txt b/Documentation/devicetree/bindings/sound/renesas,rsrc-card.txt
index 962748a8d919..2b2caa281ce3 100644
--- a/Documentation/devicetree/bindings/sound/renesas,rsrc-card.txt
+++ b/Documentation/devicetree/bindings/sound/renesas,rsrc-card.txt
@@ -4,8 +4,8 @@ Renesas Sampling Rate Convert Sound Card specifies audio DAI connections of SoC
4 4
5Required properties: 5Required properties:
6 6
7- compatible : "renesas,rsrc-card,<board>" 7- compatible : "renesas,rsrc-card{,<board>}"
8 Examples with soctypes are: 8 Examples with boards are:
9 - "renesas,rsrc-card" 9 - "renesas,rsrc-card"
10 - "renesas,rsrc-card,lager" 10 - "renesas,rsrc-card,lager"
11 - "renesas,rsrc-card,koelsch" 11 - "renesas,rsrc-card,koelsch"
diff --git a/Documentation/devicetree/bindings/sound/rockchip-i2s.txt b/Documentation/devicetree/bindings/sound/rockchip-i2s.txt
index 2267d249ca0e..b7f3a9325ebd 100644
--- a/Documentation/devicetree/bindings/sound/rockchip-i2s.txt
+++ b/Documentation/devicetree/bindings/sound/rockchip-i2s.txt
@@ -19,6 +19,7 @@ Required properties:
19- clock-names: should contain followings: 19- clock-names: should contain followings:
20 - "i2s_hclk": clock for I2S BUS 20 - "i2s_hclk": clock for I2S BUS
21 - "i2s_clk" : clock for I2S controller 21 - "i2s_clk" : clock for I2S controller
22- rockchip,playback-channels: max playback channels, if not set, 8 channels default.
22- rockchip,capture-channels: max capture channels, if not set, 2 channels default. 23- rockchip,capture-channels: max capture channels, if not set, 2 channels default.
23 24
24Example for rk3288 I2S controller: 25Example for rk3288 I2S controller:
@@ -31,5 +32,6 @@ i2s@ff890000 {
31 dma-names = "tx", "rx"; 32 dma-names = "tx", "rx";
32 clock-names = "i2s_hclk", "i2s_clk"; 33 clock-names = "i2s_hclk", "i2s_clk";
33 clocks = <&cru HCLK_I2S0>, <&cru SCLK_I2S0>; 34 clocks = <&cru HCLK_I2S0>, <&cru SCLK_I2S0>;
35 rockchip,playback-channels = <8>;
34 rockchip,capture-channels = <2>; 36 rockchip,capture-channels = <2>;
35}; 37};
diff --git a/Documentation/devicetree/bindings/sound/rt5616.txt b/Documentation/devicetree/bindings/sound/rt5616.txt
new file mode 100644
index 000000000000..efc48c65198d
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/rt5616.txt
@@ -0,0 +1,26 @@
1RT5616 audio CODEC
2
3This device supports I2C only.
4
5Required properties:
6
7- compatible : "realtek,rt5616".
8
9- reg : The I2C address of the device.
10
11Pins on the device (for linking into audio routes) for RT5616:
12
13 * IN1P
14 * IN2P
15 * IN2N
16 * LOUTL
17 * LOUTR
18 * HPOL
19 * HPOR
20
21Example:
22
23codec: rt5616@1b {
24 compatible = "realtek,rt5616";
25 reg = <0x1b>;
26};
diff --git a/Documentation/devicetree/bindings/sound/rt5651.txt b/Documentation/devicetree/bindings/sound/rt5651.txt
new file mode 100644
index 000000000000..3875233095f5
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/rt5651.txt
@@ -0,0 +1,41 @@
1RT5651 audio CODEC
2
3This device supports I2C only.
4
5Required properties:
6
7- compatible : "realtek,rt5651".
8
9- reg : The I2C address of the device.
10
11Optional properties:
12
13- realtek,in2-differential
14 Boolean. Indicate MIC2 input are differential, rather than single-ended.
15
16- realtek,dmic-en
17 Boolean. true if dmic is used.
18
19Pins on the device (for linking into audio routes) for RT5651:
20
21 * DMIC L1
22 * DMIC R1
23 * IN1P
24 * IN2P
25 * IN2N
26 * IN3P
27 * HPOL
28 * HPOR
29 * LOUTL
30 * LOUTR
31 * PDML
32 * PDMR
33
34Example:
35
36codec: rt5651@1a {
37 compatible = "realtek,rt5651";
38 reg = <0x1a>;
39 realtek,dmic-en = "true";
40 realtek,in2-diff = "false";
41};
diff --git a/Documentation/devicetree/bindings/sound/rt5659.txt b/Documentation/devicetree/bindings/sound/rt5659.txt
new file mode 100644
index 000000000000..5f79e7fde032
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/rt5659.txt
@@ -0,0 +1,75 @@
1RT5659/RT5658 audio CODEC
2
3This device supports I2C only.
4
5Required properties:
6
7- compatible : One of "realtek,rt5659" or "realtek,rt5658".
8
9- reg : The I2C address of the device.
10
11- interrupts : The CODEC's interrupt output.
12
13Optional properties:
14
15- realtek,in1-differential
16- realtek,in3-differential
17- realtek,in4-differential
18 Boolean. Indicate MIC1/3/4 input are differential, rather than single-ended.
19
20- realtek,dmic1-data-pin
21 0: dmic1 is not used
22 1: using IN2N pin as dmic1 data pin
23 2: using GPIO5 pin as dmic1 data pin
24 3: using GPIO9 pin as dmic1 data pin
25 4: using GPIO11 pin as dmic1 data pin
26
27- realtek,dmic2-data-pin
28 0: dmic2 is not used
29 1: using IN2P pin as dmic2 data pin
30 2: using GPIO6 pin as dmic2 data pin
31 3: using GPIO10 pin as dmic2 data pin
32 4: using GPIO12 pin as dmic2 data pin
33
34- realtek,jd-src
35 0: No JD is used
36 1: using JD3 as JD source
37
38- realtek,ldo1-en-gpios : The GPIO that controls the CODEC's LDO1_EN pin.
39- realtek,reset-gpios : The GPIO that controls the CODEC's RESET pin.
40
41Pins on the device (for linking into audio routes) for RT5659/RT5658:
42
43 * DMIC L1
44 * DMIC R1
45 * DMIC L2
46 * DMIC R2
47 * IN1P
48 * IN1N
49 * IN2P
50 * IN2N
51 * IN3P
52 * IN3N
53 * IN4P
54 * IN4N
55 * HPOL
56 * HPOR
57 * SPOL
58 * SPOR
59 * LOUTL
60 * LOUTR
61 * MONOOUT
62 * PDML
63 * PDMR
64 * SPDIF
65
66Example:
67
68rt5659 {
69 compatible = "realtek,rt5659";
70 reg = <0x1b>;
71 interrupt-parent = <&gpio>;
72 interrupts = <TEGRA_GPIO(W, 3) GPIO_ACTIVE_HIGH>;
73 realtek,ldo1-en-gpios =
74 <&gpio TEGRA_GPIO(V, 3) GPIO_ACTIVE_HIGH>;
75};
diff --git a/Documentation/devicetree/bindings/sound/rt5677.txt b/Documentation/devicetree/bindings/sound/rt5677.txt
index f07078997f87..1b3c13d206ff 100644
--- a/Documentation/devicetree/bindings/sound/rt5677.txt
+++ b/Documentation/devicetree/bindings/sound/rt5677.txt
@@ -18,7 +18,7 @@ Required properties:
18Optional properties: 18Optional properties:
19 19
20- realtek,pow-ldo2-gpio : The GPIO that controls the CODEC's POW_LDO2 pin. 20- realtek,pow-ldo2-gpio : The GPIO that controls the CODEC's POW_LDO2 pin.
21- realtek,reset-gpio : The GPIO that controls the CODEC's RESET pin. 21- realtek,reset-gpio : The GPIO that controls the CODEC's RESET pin. Active low.
22 22
23- realtek,in1-differential 23- realtek,in1-differential
24- realtek,in2-differential 24- realtek,in2-differential
diff --git a/Documentation/devicetree/bindings/sound/sun4i-codec.txt b/Documentation/devicetree/bindings/sound/sun4i-codec.txt
index c92966bd5488..0dce690f78f5 100644
--- a/Documentation/devicetree/bindings/sound/sun4i-codec.txt
+++ b/Documentation/devicetree/bindings/sound/sun4i-codec.txt
@@ -14,6 +14,9 @@ Required properties:
14 - "apb": the parent APB clock for this controller 14 - "apb": the parent APB clock for this controller
15 - "codec": the parent module clock 15 - "codec": the parent module clock
16 16
17Optional properties:
18- allwinner,pa-gpios: gpio to enable external amplifier
19
17Example: 20Example:
18codec: codec@01c22c00 { 21codec: codec@01c22c00 {
19 #sound-dai-cells = <0>; 22 #sound-dai-cells = <0>;
diff --git a/Documentation/devicetree/bindings/sound/ti,pcm3168a.txt b/Documentation/devicetree/bindings/sound/ti,pcm3168a.txt
new file mode 100644
index 000000000000..5d9cb84c661d
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/ti,pcm3168a.txt
@@ -0,0 +1,48 @@
1Texas Instruments pcm3168a DT bindings
2
3This driver supports both SPI and I2C bus access for this codec
4
5Required properties:
6
7 - compatible: "ti,pcm3168a"
8
9 - clocks : Contains an entry for each entry in clock-names
10
11 - clock-names : Includes the following entries:
12 "scki" The system clock
13
14 - VDD1-supply : Digital power supply regulator 1 (+3.3V)
15
16 - VDD2-supply : Digital power supply regulator 2 (+3.3V)
17
18 - VCCAD1-supply : ADC power supply regulator 1 (+5V)
19
20 - VCCAD2-supply : ADC power supply regulator 2 (+5V)
21
22 - VCCDA1-supply : DAC power supply regulator 1 (+5V)
23
24 - VCCDA2-supply : DAC power supply regulator 2 (+5V)
25
26For required properties on SPI/I2C, consult SPI/I2C device tree documentation
27
28Examples:
29
30i2c0: i2c0@0 {
31
32 ...
33
34 pcm3168a: audio-codec@44 {
35 compatible = "ti,pcm3168a";
36 reg = <0x44>;
37 clocks = <&clk_core CLK_AUDIO>;
38 clock-names = "scki";
39 VDD1-supply = <&supply3v3>;
40 VDD2-supply = <&supply3v3>;
41 VCCAD1-supply = <&supply5v0>;
42 VCCAD2-supply = <&supply5v0>;
43 VCCDA1-supply = <&supply5v0>;
44 VCCDA2-supply = <&supply5v0>;
45 pinctrl-names = "default";
46 pinctrl-0 = <&dac_clk_pin>;
47 };
48};
diff --git a/Documentation/devicetree/bindings/sound/wlf,wm8974.txt b/Documentation/devicetree/bindings/sound/wlf,wm8974.txt
new file mode 100644
index 000000000000..01d3a7c83419
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/wlf,wm8974.txt
@@ -0,0 +1,15 @@
1WM8974 audio CODEC
2
3This device supports both I2C and SPI (configured with pin strapping
4on the board).
5
6Required properties:
7 - compatible: "wlf,wm8974"
8 - reg: the I2C address or SPI chip select number of the device
9
10Examples:
11
12codec: wm8974@1a {
13 compatible = "wlf,wm8974";
14 reg = <0x1a>;
15};
diff --git a/Documentation/sound/alsa/img,spdif-in.txt b/Documentation/sound/alsa/img,spdif-in.txt
new file mode 100644
index 000000000000..8b7505785fa6
--- /dev/null
+++ b/Documentation/sound/alsa/img,spdif-in.txt
@@ -0,0 +1,49 @@
1The Imagination Technologies SPDIF Input controller contains the following
2controls:
3
4name='IEC958 Capture Mask',index=0
5
6This control returns a mask that shows which of the IEC958 status bits
7can be read using the 'IEC958 Capture Default' control.
8
9name='IEC958 Capture Default',index=0
10
11This control returns the status bits contained within the SPDIF stream that
12is being received. The 'IEC958 Capture Mask' shows which bits can be read
13from this control.
14
15name='SPDIF In Multi Frequency Acquire',index=0
16name='SPDIF In Multi Frequency Acquire',index=1
17name='SPDIF In Multi Frequency Acquire',index=2
18name='SPDIF In Multi Frequency Acquire',index=3
19
20This control is used to attempt acquisition of up to four different sample
21rates. The active rate can be obtained by reading the 'SPDIF In Lock Frequency'
22control.
23
24When the value of this control is set to {0,0,0,0}, the rate given to hw_params
25will determine the single rate the block will capture. Else, the rate given to
26hw_params will be ignored, and the block will attempt capture for each of the
27four sample rates set here.
28
29If less than four rates are required, the same rate can be specified more than
30once
31
32name='SPDIF In Lock Frequency',index=0
33
34This control returns the active capture rate, or 0 if a lock has not been
35acquired
36
37name='SPDIF In Lock TRK',index=0
38
39This control is used to modify the locking/jitter rejection characteristics
40of the block. Larger values increase the locking range, but reduce jitter
41rejection.
42
43name='SPDIF In Lock Acquire Threshold',index=0
44
45This control is used to change the threshold at which a lock is acquired.
46
47name='SPDIF In Lock Release Threshold',index=0
48
49This control is used to change the threshold at which a lock is released.
diff --git a/arch/arm/mach-s3c64xx/dev-audio.c b/arch/arm/mach-s3c64xx/dev-audio.c
index ff780a8d8366..b57783371d52 100644
--- a/arch/arm/mach-s3c64xx/dev-audio.c
+++ b/arch/arm/mach-s3c64xx/dev-audio.c
@@ -54,12 +54,13 @@ static int s3c64xx_i2s_cfg_gpio(struct platform_device *pdev)
54 54
55static struct resource s3c64xx_iis0_resource[] = { 55static struct resource s3c64xx_iis0_resource[] = {
56 [0] = DEFINE_RES_MEM(S3C64XX_PA_IIS0, SZ_256), 56 [0] = DEFINE_RES_MEM(S3C64XX_PA_IIS0, SZ_256),
57 [1] = DEFINE_RES_DMA(DMACH_I2S0_OUT),
58 [2] = DEFINE_RES_DMA(DMACH_I2S0_IN),
59}; 57};
60 58
61static struct s3c_audio_pdata i2sv3_pdata = { 59static struct s3c_audio_pdata i2s0_pdata = {
62 .cfg_gpio = s3c64xx_i2s_cfg_gpio, 60 .cfg_gpio = s3c64xx_i2s_cfg_gpio,
61 .dma_filter = pl08x_filter_id,
62 .dma_playback = DMACH_I2S0_OUT,
63 .dma_capture = DMACH_I2S0_IN,
63}; 64};
64 65
65struct platform_device s3c64xx_device_iis0 = { 66struct platform_device s3c64xx_device_iis0 = {
@@ -68,15 +69,20 @@ struct platform_device s3c64xx_device_iis0 = {
68 .num_resources = ARRAY_SIZE(s3c64xx_iis0_resource), 69 .num_resources = ARRAY_SIZE(s3c64xx_iis0_resource),
69 .resource = s3c64xx_iis0_resource, 70 .resource = s3c64xx_iis0_resource,
70 .dev = { 71 .dev = {
71 .platform_data = &i2sv3_pdata, 72 .platform_data = &i2s0_pdata,
72 }, 73 },
73}; 74};
74EXPORT_SYMBOL(s3c64xx_device_iis0); 75EXPORT_SYMBOL(s3c64xx_device_iis0);
75 76
76static struct resource s3c64xx_iis1_resource[] = { 77static struct resource s3c64xx_iis1_resource[] = {
77 [0] = DEFINE_RES_MEM(S3C64XX_PA_IIS1, SZ_256), 78 [0] = DEFINE_RES_MEM(S3C64XX_PA_IIS1, SZ_256),
78 [1] = DEFINE_RES_DMA(DMACH_I2S1_OUT), 79};
79 [2] = DEFINE_RES_DMA(DMACH_I2S1_IN), 80
81static struct s3c_audio_pdata i2s1_pdata = {
82 .cfg_gpio = s3c64xx_i2s_cfg_gpio,
83 .dma_filter = pl08x_filter_id,
84 .dma_playback = DMACH_I2S1_OUT,
85 .dma_capture = DMACH_I2S1_IN,
80}; 86};
81 87
82struct platform_device s3c64xx_device_iis1 = { 88struct platform_device s3c64xx_device_iis1 = {
@@ -85,19 +91,20 @@ struct platform_device s3c64xx_device_iis1 = {
85 .num_resources = ARRAY_SIZE(s3c64xx_iis1_resource), 91 .num_resources = ARRAY_SIZE(s3c64xx_iis1_resource),
86 .resource = s3c64xx_iis1_resource, 92 .resource = s3c64xx_iis1_resource,
87 .dev = { 93 .dev = {
88 .platform_data = &i2sv3_pdata, 94 .platform_data = &i2s1_pdata,
89 }, 95 },
90}; 96};
91EXPORT_SYMBOL(s3c64xx_device_iis1); 97EXPORT_SYMBOL(s3c64xx_device_iis1);
92 98
93static struct resource s3c64xx_iisv4_resource[] = { 99static struct resource s3c64xx_iisv4_resource[] = {
94 [0] = DEFINE_RES_MEM(S3C64XX_PA_IISV4, SZ_256), 100 [0] = DEFINE_RES_MEM(S3C64XX_PA_IISV4, SZ_256),
95 [1] = DEFINE_RES_DMA(DMACH_HSI_I2SV40_TX),
96 [2] = DEFINE_RES_DMA(DMACH_HSI_I2SV40_RX),
97}; 101};
98 102
99static struct s3c_audio_pdata i2sv4_pdata = { 103static struct s3c_audio_pdata i2sv4_pdata = {
100 .cfg_gpio = s3c64xx_i2s_cfg_gpio, 104 .cfg_gpio = s3c64xx_i2s_cfg_gpio,
105 .dma_filter = pl08x_filter_id,
106 .dma_playback = DMACH_HSI_I2SV40_TX,
107 .dma_capture = DMACH_HSI_I2SV40_RX,
101 .type = { 108 .type = {
102 .i2s = { 109 .i2s = {
103 .quirks = QUIRK_PRI_6CHAN, 110 .quirks = QUIRK_PRI_6CHAN,
@@ -142,12 +149,13 @@ static int s3c64xx_pcm_cfg_gpio(struct platform_device *pdev)
142 149
143static struct resource s3c64xx_pcm0_resource[] = { 150static struct resource s3c64xx_pcm0_resource[] = {
144 [0] = DEFINE_RES_MEM(S3C64XX_PA_PCM0, SZ_256), 151 [0] = DEFINE_RES_MEM(S3C64XX_PA_PCM0, SZ_256),
145 [1] = DEFINE_RES_DMA(DMACH_PCM0_TX),
146 [2] = DEFINE_RES_DMA(DMACH_PCM0_RX),
147}; 152};
148 153
149static struct s3c_audio_pdata s3c_pcm0_pdata = { 154static struct s3c_audio_pdata s3c_pcm0_pdata = {
150 .cfg_gpio = s3c64xx_pcm_cfg_gpio, 155 .cfg_gpio = s3c64xx_pcm_cfg_gpio,
156 .dma_filter = pl08x_filter_id,
157 .dma_capture = DMACH_PCM0_RX,
158 .dma_playback = DMACH_PCM0_TX,
151}; 159};
152 160
153struct platform_device s3c64xx_device_pcm0 = { 161struct platform_device s3c64xx_device_pcm0 = {
@@ -163,12 +171,13 @@ EXPORT_SYMBOL(s3c64xx_device_pcm0);
163 171
164static struct resource s3c64xx_pcm1_resource[] = { 172static struct resource s3c64xx_pcm1_resource[] = {
165 [0] = DEFINE_RES_MEM(S3C64XX_PA_PCM1, SZ_256), 173 [0] = DEFINE_RES_MEM(S3C64XX_PA_PCM1, SZ_256),
166 [1] = DEFINE_RES_DMA(DMACH_PCM1_TX),
167 [2] = DEFINE_RES_DMA(DMACH_PCM1_RX),
168}; 174};
169 175
170static struct s3c_audio_pdata s3c_pcm1_pdata = { 176static struct s3c_audio_pdata s3c_pcm1_pdata = {
171 .cfg_gpio = s3c64xx_pcm_cfg_gpio, 177 .cfg_gpio = s3c64xx_pcm_cfg_gpio,
178 .dma_filter = pl08x_filter_id,
179 .dma_playback = DMACH_PCM1_TX,
180 .dma_capture = DMACH_PCM1_RX,
172}; 181};
173 182
174struct platform_device s3c64xx_device_pcm1 = { 183struct platform_device s3c64xx_device_pcm1 = {
@@ -196,13 +205,15 @@ static int s3c64xx_ac97_cfg_gpe(struct platform_device *pdev)
196 205
197static struct resource s3c64xx_ac97_resource[] = { 206static struct resource s3c64xx_ac97_resource[] = {
198 [0] = DEFINE_RES_MEM(S3C64XX_PA_AC97, SZ_256), 207 [0] = DEFINE_RES_MEM(S3C64XX_PA_AC97, SZ_256),
199 [1] = DEFINE_RES_DMA(DMACH_AC97_PCMOUT), 208 [1] = DEFINE_RES_IRQ(IRQ_AC97),
200 [2] = DEFINE_RES_DMA(DMACH_AC97_PCMIN),
201 [3] = DEFINE_RES_DMA(DMACH_AC97_MICIN),
202 [4] = DEFINE_RES_IRQ(IRQ_AC97),
203}; 209};
204 210
205static struct s3c_audio_pdata s3c_ac97_pdata; 211static struct s3c_audio_pdata s3c_ac97_pdata = {
212 .dma_playback = DMACH_AC97_PCMOUT,
213 .dma_filter = pl08x_filter_id,
214 .dma_capture = DMACH_AC97_PCMIN,
215 .dma_capture_mic = DMACH_AC97_MICIN,
216};
206 217
207static u64 s3c64xx_ac97_dmamask = DMA_BIT_MASK(32); 218static u64 s3c64xx_ac97_dmamask = DMA_BIT_MASK(32);
208 219
diff --git a/arch/arm/mach-s3c64xx/include/mach/dma.h b/arch/arm/mach-s3c64xx/include/mach/dma.h
index 096e14073bd9..9c739eafe95c 100644
--- a/arch/arm/mach-s3c64xx/include/mach/dma.h
+++ b/arch/arm/mach-s3c64xx/include/mach/dma.h
@@ -14,38 +14,38 @@
14#define S3C64XX_DMA_CHAN(name) ((unsigned long)(name)) 14#define S3C64XX_DMA_CHAN(name) ((unsigned long)(name))
15 15
16/* DMA0/SDMA0 */ 16/* DMA0/SDMA0 */
17#define DMACH_UART0 S3C64XX_DMA_CHAN("uart0_tx") 17#define DMACH_UART0 "uart0_tx"
18#define DMACH_UART0_SRC2 S3C64XX_DMA_CHAN("uart0_rx") 18#define DMACH_UART0_SRC2 "uart0_rx"
19#define DMACH_UART1 S3C64XX_DMA_CHAN("uart1_tx") 19#define DMACH_UART1 "uart1_tx"
20#define DMACH_UART1_SRC2 S3C64XX_DMA_CHAN("uart1_rx") 20#define DMACH_UART1_SRC2 "uart1_rx"
21#define DMACH_UART2 S3C64XX_DMA_CHAN("uart2_tx") 21#define DMACH_UART2 "uart2_tx"
22#define DMACH_UART2_SRC2 S3C64XX_DMA_CHAN("uart2_rx") 22#define DMACH_UART2_SRC2 "uart2_rx"
23#define DMACH_UART3 S3C64XX_DMA_CHAN("uart3_tx") 23#define DMACH_UART3 "uart3_tx"
24#define DMACH_UART3_SRC2 S3C64XX_DMA_CHAN("uart3_rx") 24#define DMACH_UART3_SRC2 "uart3_rx"
25#define DMACH_PCM0_TX S3C64XX_DMA_CHAN("pcm0_tx") 25#define DMACH_PCM0_TX "pcm0_tx"
26#define DMACH_PCM0_RX S3C64XX_DMA_CHAN("pcm0_rx") 26#define DMACH_PCM0_RX "pcm0_rx"
27#define DMACH_I2S0_OUT S3C64XX_DMA_CHAN("i2s0_tx") 27#define DMACH_I2S0_OUT "i2s0_tx"
28#define DMACH_I2S0_IN S3C64XX_DMA_CHAN("i2s0_rx") 28#define DMACH_I2S0_IN "i2s0_rx"
29#define DMACH_SPI0_TX S3C64XX_DMA_CHAN("spi0_tx") 29#define DMACH_SPI0_TX S3C64XX_DMA_CHAN("spi0_tx")
30#define DMACH_SPI0_RX S3C64XX_DMA_CHAN("spi0_rx") 30#define DMACH_SPI0_RX S3C64XX_DMA_CHAN("spi0_rx")
31#define DMACH_HSI_I2SV40_TX S3C64XX_DMA_CHAN("i2s2_tx") 31#define DMACH_HSI_I2SV40_TX "i2s2_tx"
32#define DMACH_HSI_I2SV40_RX S3C64XX_DMA_CHAN("i2s2_rx") 32#define DMACH_HSI_I2SV40_RX "i2s2_rx"
33 33
34/* DMA1/SDMA1 */ 34/* DMA1/SDMA1 */
35#define DMACH_PCM1_TX S3C64XX_DMA_CHAN("pcm1_tx") 35#define DMACH_PCM1_TX "pcm1_tx"
36#define DMACH_PCM1_RX S3C64XX_DMA_CHAN("pcm1_rx") 36#define DMACH_PCM1_RX "pcm1_rx"
37#define DMACH_I2S1_OUT S3C64XX_DMA_CHAN("i2s1_tx") 37#define DMACH_I2S1_OUT "i2s1_tx"
38#define DMACH_I2S1_IN S3C64XX_DMA_CHAN("i2s1_rx") 38#define DMACH_I2S1_IN "i2s1_rx"
39#define DMACH_SPI1_TX S3C64XX_DMA_CHAN("spi1_tx") 39#define DMACH_SPI1_TX S3C64XX_DMA_CHAN("spi1_tx")
40#define DMACH_SPI1_RX S3C64XX_DMA_CHAN("spi1_rx") 40#define DMACH_SPI1_RX S3C64XX_DMA_CHAN("spi1_rx")
41#define DMACH_AC97_PCMOUT S3C64XX_DMA_CHAN("ac97_out") 41#define DMACH_AC97_PCMOUT "ac97_out"
42#define DMACH_AC97_PCMIN S3C64XX_DMA_CHAN("ac97_in") 42#define DMACH_AC97_PCMIN "ac97_in"
43#define DMACH_AC97_MICIN S3C64XX_DMA_CHAN("ac97_mic") 43#define DMACH_AC97_MICIN "ac97_mic"
44#define DMACH_PWM S3C64XX_DMA_CHAN("pwm") 44#define DMACH_PWM "pwm"
45#define DMACH_IRDA S3C64XX_DMA_CHAN("irda") 45#define DMACH_IRDA "irda"
46#define DMACH_EXTERNAL S3C64XX_DMA_CHAN("external") 46#define DMACH_EXTERNAL "external"
47#define DMACH_SECURITY_RX S3C64XX_DMA_CHAN("sec_rx") 47#define DMACH_SECURITY_RX "sec_rx"
48#define DMACH_SECURITY_TX S3C64XX_DMA_CHAN("sec_tx") 48#define DMACH_SECURITY_TX "sec_tx"
49 49
50enum dma_ch { 50enum dma_ch {
51 DMACH_MAX = 32 51 DMACH_MAX = 32
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c
index 42f6f9cd844c..f39938fa9ef6 100644
--- a/arch/arm/plat-samsung/devs.c
+++ b/arch/arm/plat-samsung/devs.c
@@ -65,6 +65,7 @@
65#include <linux/platform_data/usb-ohci-s3c2410.h> 65#include <linux/platform_data/usb-ohci-s3c2410.h>
66#include <plat/usb-phy.h> 66#include <plat/usb-phy.h>
67#include <plat/regs-spi.h> 67#include <plat/regs-spi.h>
68#include <linux/platform_data/asoc-s3c.h>
68#include <linux/platform_data/spi-s3c64xx.h> 69#include <linux/platform_data/spi-s3c64xx.h>
69 70
70static u64 samsung_device_dma_mask = DMA_BIT_MASK(32); 71static u64 samsung_device_dma_mask = DMA_BIT_MASK(32);
@@ -74,9 +75,15 @@ static u64 samsung_device_dma_mask = DMA_BIT_MASK(32);
74static struct resource s3c_ac97_resource[] = { 75static struct resource s3c_ac97_resource[] = {
75 [0] = DEFINE_RES_MEM(S3C2440_PA_AC97, S3C2440_SZ_AC97), 76 [0] = DEFINE_RES_MEM(S3C2440_PA_AC97, S3C2440_SZ_AC97),
76 [1] = DEFINE_RES_IRQ(IRQ_S3C244X_AC97), 77 [1] = DEFINE_RES_IRQ(IRQ_S3C244X_AC97),
77 [2] = DEFINE_RES_DMA_NAMED(DMACH_PCM_OUT, "PCM out"), 78};
78 [3] = DEFINE_RES_DMA_NAMED(DMACH_PCM_IN, "PCM in"), 79
79 [4] = DEFINE_RES_DMA_NAMED(DMACH_MIC_IN, "Mic in"), 80static struct s3c_audio_pdata s3c_ac97_pdata = {
81#ifdef CONFIG_S3C24XX_DMAC
82 .dma_filter = s3c24xx_dma_filter,
83#endif
84 .dma_playback = (void *)DMACH_PCM_OUT,
85 .dma_capture = (void *)DMACH_PCM_IN,
86 .dma_capture_mic = (void *)DMACH_MIC_IN,
80}; 87};
81 88
82struct platform_device s3c_device_ac97 = { 89struct platform_device s3c_device_ac97 = {
@@ -87,6 +94,7 @@ struct platform_device s3c_device_ac97 = {
87 .dev = { 94 .dev = {
88 .dma_mask = &samsung_device_dma_mask, 95 .dma_mask = &samsung_device_dma_mask,
89 .coherent_dma_mask = DMA_BIT_MASK(32), 96 .coherent_dma_mask = DMA_BIT_MASK(32),
97 .platform_data = &s3c_ac97_pdata,
90 } 98 }
91}; 99};
92#endif /* CONFIG_CPU_S3C2440 */ 100#endif /* CONFIG_CPU_S3C2440 */
@@ -566,6 +574,14 @@ static struct resource s3c_iis_resource[] = {
566 [0] = DEFINE_RES_MEM(S3C24XX_PA_IIS, S3C24XX_SZ_IIS), 574 [0] = DEFINE_RES_MEM(S3C24XX_PA_IIS, S3C24XX_SZ_IIS),
567}; 575};
568 576
577static struct s3c_audio_pdata s3c_iis_platdata = {
578#ifdef CONFIG_S3C24XX_DMAC
579 .dma_filter = s3c24xx_dma_filter,
580#endif
581 .dma_playback = (void *)DMACH_I2S_OUT,
582 .dma_capture = (void *)DMACH_I2S_IN,
583};
584
569struct platform_device s3c_device_iis = { 585struct platform_device s3c_device_iis = {
570 .name = "s3c24xx-iis", 586 .name = "s3c24xx-iis",
571 .id = -1, 587 .id = -1,
@@ -574,6 +590,7 @@ struct platform_device s3c_device_iis = {
574 .dev = { 590 .dev = {
575 .dma_mask = &samsung_device_dma_mask, 591 .dma_mask = &samsung_device_dma_mask,
576 .coherent_dma_mask = DMA_BIT_MASK(32), 592 .coherent_dma_mask = DMA_BIT_MASK(32),
593 .platform_data = &s3c_iis_platdata,
577 } 594 }
578}; 595};
579#endif /* CONFIG_PLAT_S3C24XX */ 596#endif /* CONFIG_PLAT_S3C24XX */
diff --git a/arch/x86/include/asm/platform_sst_audio.h b/arch/x86/include/asm/platform_sst_audio.h
index 7249e6d0902d..5973a2f3db3d 100644
--- a/arch/x86/include/asm/platform_sst_audio.h
+++ b/arch/x86/include/asm/platform_sst_audio.h
@@ -55,6 +55,7 @@ enum sst_audio_device_id_mrfld {
55 PIPE_MEDIA0_IN = 0x8F, 55 PIPE_MEDIA0_IN = 0x8F,
56 PIPE_MEDIA1_IN = 0x90, 56 PIPE_MEDIA1_IN = 0x90,
57 PIPE_MEDIA2_IN = 0x91, 57 PIPE_MEDIA2_IN = 0x91,
58 PIPE_MEDIA3_IN = 0x9C,
58 PIPE_RSVD = 0xFF, 59 PIPE_RSVD = 0xFF,
59}; 60};
60 61
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
index db9a675e751b..bca14c899137 100644
--- a/arch/x86/kernel/early-quirks.c
+++ b/arch/x86/kernel/early-quirks.c
@@ -547,6 +547,7 @@ static const struct pci_device_id intel_stolen_ids[] __initconst = {
547 INTEL_CHV_IDS(&chv_stolen_funcs), 547 INTEL_CHV_IDS(&chv_stolen_funcs),
548 INTEL_SKL_IDS(&gen9_stolen_funcs), 548 INTEL_SKL_IDS(&gen9_stolen_funcs),
549 INTEL_BXT_IDS(&gen9_stolen_funcs), 549 INTEL_BXT_IDS(&gen9_stolen_funcs),
550 INTEL_KBL_IDS(&gen9_stolen_funcs),
550}; 551};
551 552
552static void __init intel_graphics_stolen(int num, int slot, int func) 553static void __init intel_graphics_stolen(int num, int slot, int func)
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 3a8ce67910c2..79b1390f2016 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -444,7 +444,7 @@ config STM32_DMA
444 here. 444 here.
445 445
446config S3C24XX_DMAC 446config S3C24XX_DMAC
447 tristate "Samsung S3C24XX DMA support" 447 bool "Samsung S3C24XX DMA support"
448 depends on ARCH_S3C24XX 448 depends on ARCH_S3C24XX
449 select DMA_ENGINE 449 select DMA_ENGINE
450 select DMA_VIRTUAL_CHANNELS 450 select DMA_VIRTUAL_CHANNELS
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
index 5580d3420c3a..acd066d0a805 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
@@ -518,7 +518,7 @@ static const struct drm_framebuffer_funcs amdgpu_fb_funcs = {
518int 518int
519amdgpu_framebuffer_init(struct drm_device *dev, 519amdgpu_framebuffer_init(struct drm_device *dev,
520 struct amdgpu_framebuffer *rfb, 520 struct amdgpu_framebuffer *rfb,
521 struct drm_mode_fb_cmd2 *mode_cmd, 521 const struct drm_mode_fb_cmd2 *mode_cmd,
522 struct drm_gem_object *obj) 522 struct drm_gem_object *obj)
523{ 523{
524 int ret; 524 int ret;
@@ -535,7 +535,7 @@ amdgpu_framebuffer_init(struct drm_device *dev,
535static struct drm_framebuffer * 535static struct drm_framebuffer *
536amdgpu_user_framebuffer_create(struct drm_device *dev, 536amdgpu_user_framebuffer_create(struct drm_device *dev,
537 struct drm_file *file_priv, 537 struct drm_file *file_priv,
538 struct drm_mode_fb_cmd2 *mode_cmd) 538 const struct drm_mode_fb_cmd2 *mode_cmd)
539{ 539{
540 struct drm_gem_object *obj; 540 struct drm_gem_object *obj;
541 struct amdgpu_framebuffer *amdgpu_fb; 541 struct amdgpu_framebuffer *amdgpu_fb;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
index 093a8c618931..6fcbbcc2e99e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
@@ -45,7 +45,6 @@
45struct amdgpu_fbdev { 45struct amdgpu_fbdev {
46 struct drm_fb_helper helper; 46 struct drm_fb_helper helper;
47 struct amdgpu_framebuffer rfb; 47 struct amdgpu_framebuffer rfb;
48 struct list_head fbdev_list;
49 struct amdgpu_device *adev; 48 struct amdgpu_device *adev;
50}; 49};
51 50
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index 064ebb347074..a53d756672fe 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -556,7 +556,7 @@ int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
556 556
557int amdgpu_framebuffer_init(struct drm_device *dev, 557int amdgpu_framebuffer_init(struct drm_device *dev,
558 struct amdgpu_framebuffer *rfb, 558 struct amdgpu_framebuffer *rfb,
559 struct drm_mode_fb_cmd2 *mode_cmd, 559 const struct drm_mode_fb_cmd2 *mode_cmd,
560 struct drm_gem_object *obj); 560 struct drm_gem_object *obj);
561 561
562int amdgpufb_remove(struct drm_device *dev, struct drm_framebuffer *fb); 562int amdgpufb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
diff --git a/drivers/gpu/drm/armada/armada_fb.c b/drivers/gpu/drm/armada/armada_fb.c
index 1c90969def3e..5fa4bf20b232 100644
--- a/drivers/gpu/drm/armada/armada_fb.c
+++ b/drivers/gpu/drm/armada/armada_fb.c
@@ -35,7 +35,7 @@ static const struct drm_framebuffer_funcs armada_fb_funcs = {
35}; 35};
36 36
37struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev, 37struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
38 struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj) 38 const struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
39{ 39{
40 struct armada_framebuffer *dfb; 40 struct armada_framebuffer *dfb;
41 uint8_t format, config; 41 uint8_t format, config;
@@ -101,7 +101,7 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
101} 101}
102 102
103static struct drm_framebuffer *armada_fb_create(struct drm_device *dev, 103static struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
104 struct drm_file *dfile, struct drm_mode_fb_cmd2 *mode) 104 struct drm_file *dfile, const struct drm_mode_fb_cmd2 *mode)
105{ 105{
106 struct armada_gem_object *obj; 106 struct armada_gem_object *obj;
107 struct armada_framebuffer *dfb; 107 struct armada_framebuffer *dfb;
diff --git a/drivers/gpu/drm/armada/armada_fb.h b/drivers/gpu/drm/armada/armada_fb.h
index ce3f12ebfc53..48073c4f54d8 100644
--- a/drivers/gpu/drm/armada/armada_fb.h
+++ b/drivers/gpu/drm/armada/armada_fb.h
@@ -19,6 +19,6 @@ struct armada_framebuffer {
19#define drm_fb_obj(fb) drm_fb_to_armada_fb(fb)->obj 19#define drm_fb_obj(fb) drm_fb_to_armada_fb(fb)->obj
20 20
21struct armada_framebuffer *armada_framebuffer_create(struct drm_device *, 21struct armada_framebuffer *armada_framebuffer_create(struct drm_device *,
22 struct drm_mode_fb_cmd2 *, struct armada_gem_object *); 22 const struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
23 23
24#endif 24#endif
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index 05f6522c0457..eb5715994ac2 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -256,7 +256,6 @@ struct ast_framebuffer {
256struct ast_fbdev { 256struct ast_fbdev {
257 struct drm_fb_helper helper; 257 struct drm_fb_helper helper;
258 struct ast_framebuffer afb; 258 struct ast_framebuffer afb;
259 struct list_head fbdev_list;
260 void *sysram; 259 void *sysram;
261 int size; 260 int size;
262 struct ttm_bo_kmap_obj mapping; 261 struct ttm_bo_kmap_obj mapping;
@@ -309,7 +308,7 @@ extern void ast_mode_fini(struct drm_device *dev);
309 308
310int ast_framebuffer_init(struct drm_device *dev, 309int ast_framebuffer_init(struct drm_device *dev,
311 struct ast_framebuffer *ast_fb, 310 struct ast_framebuffer *ast_fb,
312 struct drm_mode_fb_cmd2 *mode_cmd, 311 const struct drm_mode_fb_cmd2 *mode_cmd,
313 struct drm_gem_object *obj); 312 struct drm_gem_object *obj);
314 313
315int ast_fbdev_init(struct drm_device *dev); 314int ast_fbdev_init(struct drm_device *dev);
diff --git a/drivers/gpu/drm/ast/ast_fb.c b/drivers/gpu/drm/ast/ast_fb.c
index a37e7ea4a00c..5320f8c57884 100644
--- a/drivers/gpu/drm/ast/ast_fb.c
+++ b/drivers/gpu/drm/ast/ast_fb.c
@@ -163,7 +163,7 @@ static struct fb_ops astfb_ops = {
163}; 163};
164 164
165static int astfb_create_object(struct ast_fbdev *afbdev, 165static int astfb_create_object(struct ast_fbdev *afbdev,
166 struct drm_mode_fb_cmd2 *mode_cmd, 166 const struct drm_mode_fb_cmd2 *mode_cmd,
167 struct drm_gem_object **gobj_p) 167 struct drm_gem_object **gobj_p)
168{ 168{
169 struct drm_device *dev = afbdev->helper.dev; 169 struct drm_device *dev = afbdev->helper.dev;
diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c
index 541a610667ad..9759009d1da3 100644
--- a/drivers/gpu/drm/ast/ast_main.c
+++ b/drivers/gpu/drm/ast/ast_main.c
@@ -309,7 +309,7 @@ static const struct drm_framebuffer_funcs ast_fb_funcs = {
309 309
310int ast_framebuffer_init(struct drm_device *dev, 310int ast_framebuffer_init(struct drm_device *dev,
311 struct ast_framebuffer *ast_fb, 311 struct ast_framebuffer *ast_fb,
312 struct drm_mode_fb_cmd2 *mode_cmd, 312 const struct drm_mode_fb_cmd2 *mode_cmd,
313 struct drm_gem_object *obj) 313 struct drm_gem_object *obj)
314{ 314{
315 int ret; 315 int ret;
@@ -327,7 +327,7 @@ int ast_framebuffer_init(struct drm_device *dev,
327static struct drm_framebuffer * 327static struct drm_framebuffer *
328ast_user_framebuffer_create(struct drm_device *dev, 328ast_user_framebuffer_create(struct drm_device *dev,
329 struct drm_file *filp, 329 struct drm_file *filp,
330 struct drm_mode_fb_cmd2 *mode_cmd) 330 const struct drm_mode_fb_cmd2 *mode_cmd)
331{ 331{
332 struct drm_gem_object *obj; 332 struct drm_gem_object *obj;
333 struct ast_framebuffer *ast_fb; 333 struct ast_framebuffer *ast_fb;
diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
index 244df0a440b7..816895447155 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
@@ -402,7 +402,7 @@ static irqreturn_t atmel_hlcdc_dc_irq_handler(int irq, void *data)
402} 402}
403 403
404static struct drm_framebuffer *atmel_hlcdc_fb_create(struct drm_device *dev, 404static struct drm_framebuffer *atmel_hlcdc_fb_create(struct drm_device *dev,
405 struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd) 405 struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
406{ 406{
407 return drm_fb_cma_create(dev, file_priv, mode_cmd); 407 return drm_fb_cma_create(dev, file_priv, mode_cmd);
408} 408}
diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
index 71f2687fc3cc..19b5adaebe24 100644
--- a/drivers/gpu/drm/bochs/bochs.h
+++ b/drivers/gpu/drm/bochs/bochs.h
@@ -149,7 +149,7 @@ int bochs_dumb_mmap_offset(struct drm_file *file, struct drm_device *dev,
149 149
150int bochs_framebuffer_init(struct drm_device *dev, 150int bochs_framebuffer_init(struct drm_device *dev,
151 struct bochs_framebuffer *gfb, 151 struct bochs_framebuffer *gfb,
152 struct drm_mode_fb_cmd2 *mode_cmd, 152 const struct drm_mode_fb_cmd2 *mode_cmd,
153 struct drm_gem_object *obj); 153 struct drm_gem_object *obj);
154int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr); 154int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr);
155int bochs_bo_unpin(struct bochs_bo *bo); 155int bochs_bo_unpin(struct bochs_bo *bo);
diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c b/drivers/gpu/drm/bochs/bochs_fbdev.c
index 09a0637aab3e..7520bf81fc25 100644
--- a/drivers/gpu/drm/bochs/bochs_fbdev.c
+++ b/drivers/gpu/drm/bochs/bochs_fbdev.c
@@ -34,7 +34,7 @@ static struct fb_ops bochsfb_ops = {
34}; 34};
35 35
36static int bochsfb_create_object(struct bochs_device *bochs, 36static int bochsfb_create_object(struct bochs_device *bochs,
37 struct drm_mode_fb_cmd2 *mode_cmd, 37 const struct drm_mode_fb_cmd2 *mode_cmd,
38 struct drm_gem_object **gobj_p) 38 struct drm_gem_object **gobj_p)
39{ 39{
40 struct drm_device *dev = bochs->dev; 40 struct drm_device *dev = bochs->dev;
diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
index f69e6bf9bb0e..d812ad014da5 100644
--- a/drivers/gpu/drm/bochs/bochs_mm.c
+++ b/drivers/gpu/drm/bochs/bochs_mm.c
@@ -484,7 +484,7 @@ static const struct drm_framebuffer_funcs bochs_fb_funcs = {
484 484
485int bochs_framebuffer_init(struct drm_device *dev, 485int bochs_framebuffer_init(struct drm_device *dev,
486 struct bochs_framebuffer *gfb, 486 struct bochs_framebuffer *gfb,
487 struct drm_mode_fb_cmd2 *mode_cmd, 487 const struct drm_mode_fb_cmd2 *mode_cmd,
488 struct drm_gem_object *obj) 488 struct drm_gem_object *obj)
489{ 489{
490 int ret; 490 int ret;
@@ -502,7 +502,7 @@ int bochs_framebuffer_init(struct drm_device *dev,
502static struct drm_framebuffer * 502static struct drm_framebuffer *
503bochs_user_framebuffer_create(struct drm_device *dev, 503bochs_user_framebuffer_create(struct drm_device *dev,
504 struct drm_file *filp, 504 struct drm_file *filp,
505 struct drm_mode_fb_cmd2 *mode_cmd) 505 const struct drm_mode_fb_cmd2 *mode_cmd)
506{ 506{
507 struct drm_gem_object *obj; 507 struct drm_gem_object *obj;
508 struct bochs_framebuffer *bochs_fb; 508 struct bochs_framebuffer *bochs_fb;
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
index 705061537a27..b774d637a00f 100644
--- a/drivers/gpu/drm/cirrus/cirrus_drv.h
+++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
@@ -153,7 +153,6 @@ struct cirrus_device {
153struct cirrus_fbdev { 153struct cirrus_fbdev {
154 struct drm_fb_helper helper; 154 struct drm_fb_helper helper;
155 struct cirrus_framebuffer gfb; 155 struct cirrus_framebuffer gfb;
156 struct list_head fbdev_list;
157 void *sysram; 156 void *sysram;
158 int size; 157 int size;
159 int x1, y1, x2, y2; /* dirty rect */ 158 int x1, y1, x2, y2; /* dirty rect */
@@ -207,7 +206,7 @@ int cirrus_dumb_create(struct drm_file *file,
207 206
208int cirrus_framebuffer_init(struct drm_device *dev, 207int cirrus_framebuffer_init(struct drm_device *dev,
209 struct cirrus_framebuffer *gfb, 208 struct cirrus_framebuffer *gfb,
210 struct drm_mode_fb_cmd2 *mode_cmd, 209 const struct drm_mode_fb_cmd2 *mode_cmd,
211 struct drm_gem_object *obj); 210 struct drm_gem_object *obj);
212 211
213bool cirrus_check_framebuffer(struct cirrus_device *cdev, int width, int height, 212bool cirrus_check_framebuffer(struct cirrus_device *cdev, int width, int height,
diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
index 589103bcc06c..3b5be7272357 100644
--- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
+++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
@@ -135,7 +135,7 @@ static struct fb_ops cirrusfb_ops = {
135}; 135};
136 136
137static int cirrusfb_create_object(struct cirrus_fbdev *afbdev, 137static int cirrusfb_create_object(struct cirrus_fbdev *afbdev,
138 struct drm_mode_fb_cmd2 *mode_cmd, 138 const struct drm_mode_fb_cmd2 *mode_cmd,
139 struct drm_gem_object **gobj_p) 139 struct drm_gem_object **gobj_p)
140{ 140{
141 struct drm_device *dev = afbdev->helper.dev; 141 struct drm_device *dev = afbdev->helper.dev;
diff --git a/drivers/gpu/drm/cirrus/cirrus_main.c b/drivers/gpu/drm/cirrus/cirrus_main.c
index 055fd86ba717..0907715e90fd 100644
--- a/drivers/gpu/drm/cirrus/cirrus_main.c
+++ b/drivers/gpu/drm/cirrus/cirrus_main.c
@@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs cirrus_fb_funcs = {
29 29
30int cirrus_framebuffer_init(struct drm_device *dev, 30int cirrus_framebuffer_init(struct drm_device *dev,
31 struct cirrus_framebuffer *gfb, 31 struct cirrus_framebuffer *gfb,
32 struct drm_mode_fb_cmd2 *mode_cmd, 32 const struct drm_mode_fb_cmd2 *mode_cmd,
33 struct drm_gem_object *obj) 33 struct drm_gem_object *obj)
34{ 34{
35 int ret; 35 int ret;
@@ -47,7 +47,7 @@ int cirrus_framebuffer_init(struct drm_device *dev,
47static struct drm_framebuffer * 47static struct drm_framebuffer *
48cirrus_user_framebuffer_create(struct drm_device *dev, 48cirrus_user_framebuffer_create(struct drm_device *dev,
49 struct drm_file *filp, 49 struct drm_file *filp,
50 struct drm_mode_fb_cmd2 *mode_cmd) 50 const struct drm_mode_fb_cmd2 *mode_cmd)
51{ 51{
52 struct cirrus_device *cdev = dev->dev_private; 52 struct cirrus_device *cdev = dev->dev_private;
53 struct drm_gem_object *obj; 53 struct drm_gem_object *obj;
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index aeee083c7f95..ef5f7663a718 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -316,8 +316,7 @@ int drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state,
316 if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0) 316 if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0)
317 return 0; 317 return 0;
318 318
319 if (state->mode_blob) 319 drm_property_unreference_blob(state->mode_blob);
320 drm_property_unreference_blob(state->mode_blob);
321 state->mode_blob = NULL; 320 state->mode_blob = NULL;
322 321
323 if (mode) { 322 if (mode) {
@@ -363,8 +362,7 @@ int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state,
363 if (blob == state->mode_blob) 362 if (blob == state->mode_blob)
364 return 0; 363 return 0;
365 364
366 if (state->mode_blob) 365 drm_property_unreference_blob(state->mode_blob);
367 drm_property_unreference_blob(state->mode_blob);
368 state->mode_blob = NULL; 366 state->mode_blob = NULL;
369 367
370 if (blob) { 368 if (blob) {
@@ -419,8 +417,7 @@ int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
419 struct drm_property_blob *mode = 417 struct drm_property_blob *mode =
420 drm_property_lookup_blob(dev, val); 418 drm_property_lookup_blob(dev, val);
421 ret = drm_atomic_set_mode_prop_for_crtc(state, mode); 419 ret = drm_atomic_set_mode_prop_for_crtc(state, mode);
422 if (mode) 420 drm_property_unreference_blob(mode);
423 drm_property_unreference_blob(mode);
424 return ret; 421 return ret;
425 } 422 }
426 else if (crtc->funcs->atomic_set_property) 423 else if (crtc->funcs->atomic_set_property)
@@ -1191,12 +1188,7 @@ void drm_atomic_legacy_backoff(struct drm_atomic_state *state)
1191retry: 1188retry:
1192 drm_modeset_backoff(state->acquire_ctx); 1189 drm_modeset_backoff(state->acquire_ctx);
1193 1190
1194 ret = drm_modeset_lock(&state->dev->mode_config.connection_mutex, 1191 ret = drm_modeset_lock_all_ctx(state->dev, state->acquire_ctx);
1195 state->acquire_ctx);
1196 if (ret)
1197 goto retry;
1198 ret = drm_modeset_lock_all_crtcs(state->dev,
1199 state->acquire_ctx);
1200 if (ret) 1192 if (ret)
1201 goto retry; 1193 goto retry;
1202} 1194}
@@ -1433,7 +1425,7 @@ static int atomic_set_prop(struct drm_atomic_state *state,
1433} 1425}
1434 1426
1435/** 1427/**
1436 * drm_atomic_update_old_fb -- Unset old_fb pointers and set plane->fb pointers. 1428 * drm_atomic_clean_old_fb -- Unset old_fb pointers and set plane->fb pointers.
1437 * 1429 *
1438 * @dev: drm device to check. 1430 * @dev: drm device to check.
1439 * @plane_mask: plane mask for planes that were updated. 1431 * @plane_mask: plane mask for planes that were updated.
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index e5aec45bf985..74a5fc4deef6 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -80,6 +80,27 @@ drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
80 } 80 }
81} 81}
82 82
83static bool
84check_pending_encoder_assignment(struct drm_atomic_state *state,
85 struct drm_encoder *new_encoder,
86 struct drm_connector *new_connector)
87{
88 struct drm_connector *connector;
89 struct drm_connector_state *conn_state;
90 int i;
91
92 for_each_connector_in_state(state, connector, conn_state, i) {
93 if (conn_state->best_encoder != new_encoder)
94 continue;
95
96 /* encoder already assigned and we're trying to re-steal it! */
97 if (connector->state->best_encoder != conn_state->best_encoder)
98 return false;
99 }
100
101 return true;
102}
103
83static struct drm_crtc * 104static struct drm_crtc *
84get_current_crtc_for_encoder(struct drm_device *dev, 105get_current_crtc_for_encoder(struct drm_device *dev,
85 struct drm_encoder *encoder) 106 struct drm_encoder *encoder)
@@ -229,6 +250,13 @@ update_connector_routing(struct drm_atomic_state *state, int conn_idx)
229 return 0; 250 return 0;
230 } 251 }
231 252
253 if (!check_pending_encoder_assignment(state, new_encoder, connector)) {
254 DRM_DEBUG_ATOMIC("Encoder for [CONNECTOR:%d:%s] already assigned\n",
255 connector->base.id,
256 connector->name);
257 return -EINVAL;
258 }
259
232 encoder_crtc = get_current_crtc_for_encoder(state->dev, 260 encoder_crtc = get_current_crtc_for_encoder(state->dev,
233 new_encoder); 261 new_encoder);
234 262
@@ -1342,6 +1370,49 @@ drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state)
1342EXPORT_SYMBOL(drm_atomic_helper_commit_planes_on_crtc); 1370EXPORT_SYMBOL(drm_atomic_helper_commit_planes_on_crtc);
1343 1371
1344/** 1372/**
1373 * drm_atomic_helper_disable_planes_on_crtc - helper to disable CRTC's planes
1374 * @crtc: CRTC
1375 * @atomic: if set, synchronize with CRTC's atomic_begin/flush hooks
1376 *
1377 * Disables all planes associated with the given CRTC. This can be
1378 * used for instance in the CRTC helper disable callback to disable
1379 * all planes before shutting down the display pipeline.
1380 *
1381 * If the atomic-parameter is set the function calls the CRTC's
1382 * atomic_begin hook before and atomic_flush hook after disabling the
1383 * planes.
1384 *
1385 * It is a bug to call this function without having implemented the
1386 * ->atomic_disable() plane hook.
1387 */
1388void drm_atomic_helper_disable_planes_on_crtc(struct drm_crtc *crtc,
1389 bool atomic)
1390{
1391 const struct drm_crtc_helper_funcs *crtc_funcs =
1392 crtc->helper_private;
1393 struct drm_plane *plane;
1394
1395 if (atomic && crtc_funcs && crtc_funcs->atomic_begin)
1396 crtc_funcs->atomic_begin(crtc, NULL);
1397
1398 drm_for_each_plane(plane, crtc->dev) {
1399 const struct drm_plane_helper_funcs *plane_funcs =
1400 plane->helper_private;
1401
1402 if (plane->state->crtc != crtc || !plane_funcs)
1403 continue;
1404
1405 WARN_ON(!plane_funcs->atomic_disable);
1406 if (plane_funcs->atomic_disable)
1407 plane_funcs->atomic_disable(plane, NULL);
1408 }
1409
1410 if (atomic && crtc_funcs && crtc_funcs->atomic_flush)
1411 crtc_funcs->atomic_flush(crtc, NULL);
1412}
1413EXPORT_SYMBOL(drm_atomic_helper_disable_planes_on_crtc);
1414
1415/**
1345 * drm_atomic_helper_cleanup_planes - cleanup plane resources after commit 1416 * drm_atomic_helper_cleanup_planes - cleanup plane resources after commit
1346 * @dev: DRM device 1417 * @dev: DRM device
1347 * @old_state: atomic state object with old state structures 1418 * @old_state: atomic state object with old state structures
@@ -1485,12 +1556,12 @@ retry:
1485 drm_atomic_set_fb_for_plane(plane_state, fb); 1556 drm_atomic_set_fb_for_plane(plane_state, fb);
1486 plane_state->crtc_x = crtc_x; 1557 plane_state->crtc_x = crtc_x;
1487 plane_state->crtc_y = crtc_y; 1558 plane_state->crtc_y = crtc_y;
1488 plane_state->crtc_h = crtc_h;
1489 plane_state->crtc_w = crtc_w; 1559 plane_state->crtc_w = crtc_w;
1560 plane_state->crtc_h = crtc_h;
1490 plane_state->src_x = src_x; 1561 plane_state->src_x = src_x;
1491 plane_state->src_y = src_y; 1562 plane_state->src_y = src_y;
1492 plane_state->src_h = src_h;
1493 plane_state->src_w = src_w; 1563 plane_state->src_w = src_w;
1564 plane_state->src_h = src_h;
1494 1565
1495 if (plane == crtc->cursor) 1566 if (plane == crtc->cursor)
1496 state->legacy_cursor_update = true; 1567 state->legacy_cursor_update = true;
@@ -1609,12 +1680,12 @@ int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
1609 drm_atomic_set_fb_for_plane(plane_state, NULL); 1680 drm_atomic_set_fb_for_plane(plane_state, NULL);
1610 plane_state->crtc_x = 0; 1681 plane_state->crtc_x = 0;
1611 plane_state->crtc_y = 0; 1682 plane_state->crtc_y = 0;
1612 plane_state->crtc_h = 0;
1613 plane_state->crtc_w = 0; 1683 plane_state->crtc_w = 0;
1684 plane_state->crtc_h = 0;
1614 plane_state->src_x = 0; 1685 plane_state->src_x = 0;
1615 plane_state->src_y = 0; 1686 plane_state->src_y = 0;
1616 plane_state->src_h = 0;
1617 plane_state->src_w = 0; 1687 plane_state->src_w = 0;
1688 plane_state->src_h = 0;
1618 1689
1619 return 0; 1690 return 0;
1620} 1691}
@@ -1797,16 +1868,16 @@ int __drm_atomic_helper_set_config(struct drm_mode_set *set,
1797 drm_atomic_set_fb_for_plane(primary_state, set->fb); 1868 drm_atomic_set_fb_for_plane(primary_state, set->fb);
1798 primary_state->crtc_x = 0; 1869 primary_state->crtc_x = 0;
1799 primary_state->crtc_y = 0; 1870 primary_state->crtc_y = 0;
1800 primary_state->crtc_h = vdisplay;
1801 primary_state->crtc_w = hdisplay; 1871 primary_state->crtc_w = hdisplay;
1872 primary_state->crtc_h = vdisplay;
1802 primary_state->src_x = set->x << 16; 1873 primary_state->src_x = set->x << 16;
1803 primary_state->src_y = set->y << 16; 1874 primary_state->src_y = set->y << 16;
1804 if (primary_state->rotation & (BIT(DRM_ROTATE_90) | BIT(DRM_ROTATE_270))) { 1875 if (primary_state->rotation & (BIT(DRM_ROTATE_90) | BIT(DRM_ROTATE_270))) {
1805 primary_state->src_h = hdisplay << 16;
1806 primary_state->src_w = vdisplay << 16; 1876 primary_state->src_w = vdisplay << 16;
1877 primary_state->src_h = hdisplay << 16;
1807 } else { 1878 } else {
1808 primary_state->src_h = vdisplay << 16;
1809 primary_state->src_w = hdisplay << 16; 1879 primary_state->src_w = hdisplay << 16;
1880 primary_state->src_h = vdisplay << 16;
1810 } 1881 }
1811 1882
1812commit: 1883commit:
@@ -1818,6 +1889,161 @@ commit:
1818} 1889}
1819 1890
1820/** 1891/**
1892 * drm_atomic_helper_disable_all - disable all currently active outputs
1893 * @dev: DRM device
1894 * @ctx: lock acquisition context
1895 *
1896 * Loops through all connectors, finding those that aren't turned off and then
1897 * turns them off by setting their DPMS mode to OFF and deactivating the CRTC
1898 * that they are connected to.
1899 *
1900 * This is used for example in suspend/resume to disable all currently active
1901 * functions when suspending.
1902 *
1903 * Note that if callers haven't already acquired all modeset locks this might
1904 * return -EDEADLK, which must be handled by calling drm_modeset_backoff().
1905 *
1906 * Returns:
1907 * 0 on success or a negative error code on failure.
1908 *
1909 * See also:
1910 * drm_atomic_helper_suspend(), drm_atomic_helper_resume()
1911 */
1912int drm_atomic_helper_disable_all(struct drm_device *dev,
1913 struct drm_modeset_acquire_ctx *ctx)
1914{
1915 struct drm_atomic_state *state;
1916 struct drm_connector *conn;
1917 int err;
1918
1919 state = drm_atomic_state_alloc(dev);
1920 if (!state)
1921 return -ENOMEM;
1922
1923 state->acquire_ctx = ctx;
1924
1925 drm_for_each_connector(conn, dev) {
1926 struct drm_crtc *crtc = conn->state->crtc;
1927 struct drm_crtc_state *crtc_state;
1928
1929 if (!crtc || conn->dpms != DRM_MODE_DPMS_ON)
1930 continue;
1931
1932 crtc_state = drm_atomic_get_crtc_state(state, crtc);
1933 if (IS_ERR(crtc_state)) {
1934 err = PTR_ERR(crtc_state);
1935 goto free;
1936 }
1937
1938 crtc_state->active = false;
1939 }
1940
1941 err = drm_atomic_commit(state);
1942
1943free:
1944 if (err < 0)
1945 drm_atomic_state_free(state);
1946
1947 return err;
1948}
1949EXPORT_SYMBOL(drm_atomic_helper_disable_all);
1950
1951/**
1952 * drm_atomic_helper_suspend - subsystem-level suspend helper
1953 * @dev: DRM device
1954 *
1955 * Duplicates the current atomic state, disables all active outputs and then
1956 * returns a pointer to the original atomic state to the caller. Drivers can
1957 * pass this pointer to the drm_atomic_helper_resume() helper upon resume to
1958 * restore the output configuration that was active at the time the system
1959 * entered suspend.
1960 *
1961 * Note that it is potentially unsafe to use this. The atomic state object
1962 * returned by this function is assumed to be persistent. Drivers must ensure
1963 * that this holds true. Before calling this function, drivers must make sure
1964 * to suspend fbdev emulation so that nothing can be using the device.
1965 *
1966 * Returns:
1967 * A pointer to a copy of the state before suspend on success or an ERR_PTR()-
1968 * encoded error code on failure. Drivers should store the returned atomic
1969 * state object and pass it to the drm_atomic_helper_resume() helper upon
1970 * resume.
1971 *
1972 * See also:
1973 * drm_atomic_helper_duplicate_state(), drm_atomic_helper_disable_all(),
1974 * drm_atomic_helper_resume()
1975 */
1976struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev)
1977{
1978 struct drm_modeset_acquire_ctx ctx;
1979 struct drm_atomic_state *state;
1980 int err;
1981
1982 drm_modeset_acquire_init(&ctx, 0);
1983
1984retry:
1985 err = drm_modeset_lock_all_ctx(dev, &ctx);
1986 if (err < 0) {
1987 state = ERR_PTR(err);
1988 goto unlock;
1989 }
1990
1991 state = drm_atomic_helper_duplicate_state(dev, &ctx);
1992 if (IS_ERR(state))
1993 goto unlock;
1994
1995 err = drm_atomic_helper_disable_all(dev, &ctx);
1996 if (err < 0) {
1997 drm_atomic_state_free(state);
1998 state = ERR_PTR(err);
1999 goto unlock;
2000 }
2001
2002unlock:
2003 if (PTR_ERR(state) == -EDEADLK) {
2004 drm_modeset_backoff(&ctx);
2005 goto retry;
2006 }
2007
2008 drm_modeset_drop_locks(&ctx);
2009 drm_modeset_acquire_fini(&ctx);
2010 return state;
2011}
2012EXPORT_SYMBOL(drm_atomic_helper_suspend);
2013
2014/**
2015 * drm_atomic_helper_resume - subsystem-level resume helper
2016 * @dev: DRM device
2017 * @state: atomic state to resume to
2018 *
2019 * Calls drm_mode_config_reset() to synchronize hardware and software states,
2020 * grabs all modeset locks and commits the atomic state object. This can be
2021 * used in conjunction with the drm_atomic_helper_suspend() helper to
2022 * implement suspend/resume for drivers that support atomic mode-setting.
2023 *
2024 * Returns:
2025 * 0 on success or a negative error code on failure.
2026 *
2027 * See also:
2028 * drm_atomic_helper_suspend()
2029 */
2030int drm_atomic_helper_resume(struct drm_device *dev,
2031 struct drm_atomic_state *state)
2032{
2033 struct drm_mode_config *config = &dev->mode_config;
2034 int err;
2035
2036 drm_mode_config_reset(dev);
2037 drm_modeset_lock_all(dev);
2038 state->acquire_ctx = config->acquire_ctx;
2039 err = drm_atomic_commit(state);
2040 drm_modeset_unlock_all(dev);
2041
2042 return err;
2043}
2044EXPORT_SYMBOL(drm_atomic_helper_resume);
2045
2046/**
1821 * drm_atomic_helper_crtc_set_property - helper for crtc properties 2047 * drm_atomic_helper_crtc_set_property - helper for crtc properties
1822 * @crtc: DRM crtc 2048 * @crtc: DRM crtc
1823 * @property: DRM property 2049 * @property: DRM property
@@ -2184,7 +2410,7 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_dpms);
2184 */ 2410 */
2185void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc) 2411void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc)
2186{ 2412{
2187 if (crtc->state && crtc->state->mode_blob) 2413 if (crtc->state)
2188 drm_property_unreference_blob(crtc->state->mode_blob); 2414 drm_property_unreference_blob(crtc->state->mode_blob);
2189 kfree(crtc->state); 2415 kfree(crtc->state);
2190 crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL); 2416 crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL);
@@ -2252,8 +2478,7 @@ EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state);
2252void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc, 2478void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
2253 struct drm_crtc_state *state) 2479 struct drm_crtc_state *state)
2254{ 2480{
2255 if (state->mode_blob) 2481 drm_property_unreference_blob(state->mode_blob);
2256 drm_property_unreference_blob(state->mode_blob);
2257} 2482}
2258EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state); 2483EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state);
2259 2484
@@ -2430,7 +2655,9 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_duplicate_state);
2430 * @ctx: lock acquisition context 2655 * @ctx: lock acquisition context
2431 * 2656 *
2432 * Makes a copy of the current atomic state by looping over all objects and 2657 * Makes a copy of the current atomic state by looping over all objects and
2433 * duplicating their respective states. 2658 * duplicating their respective states. This is used for example by suspend/
2659 * resume support code to save the state prior to suspend such that it can
2660 * be restored upon resume.
2434 * 2661 *
2435 * Note that this treats atomic state as persistent between save and restore. 2662 * Note that this treats atomic state as persistent between save and restore.
2436 * Drivers must make sure that this is possible and won't result in confusion 2663 * Drivers must make sure that this is possible and won't result in confusion
@@ -2442,6 +2669,9 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_duplicate_state);
2442 * Returns: 2669 * Returns:
2443 * A pointer to the copy of the atomic state object on success or an 2670 * A pointer to the copy of the atomic state object on success or an
2444 * ERR_PTR()-encoded error code on failure. 2671 * ERR_PTR()-encoded error code on failure.
2672 *
2673 * See also:
2674 * drm_atomic_helper_suspend(), drm_atomic_helper_resume()
2445 */ 2675 */
2446struct drm_atomic_state * 2676struct drm_atomic_state *
2447drm_atomic_helper_duplicate_state(struct drm_device *dev, 2677drm_atomic_helper_duplicate_state(struct drm_device *dev,
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 24c5434abd1c..32dd134700bd 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -45,7 +45,7 @@
45 45
46static struct drm_framebuffer * 46static struct drm_framebuffer *
47internal_framebuffer_create(struct drm_device *dev, 47internal_framebuffer_create(struct drm_device *dev,
48 struct drm_mode_fb_cmd2 *r, 48 const struct drm_mode_fb_cmd2 *r,
49 struct drm_file *file_priv); 49 struct drm_file *file_priv);
50 50
51/* Avoid boilerplate. I'm tired of typing. */ 51/* Avoid boilerplate. I'm tired of typing. */
@@ -3235,7 +3235,7 @@ static int framebuffer_check(const struct drm_mode_fb_cmd2 *r)
3235 3235
3236static struct drm_framebuffer * 3236static struct drm_framebuffer *
3237internal_framebuffer_create(struct drm_device *dev, 3237internal_framebuffer_create(struct drm_device *dev,
3238 struct drm_mode_fb_cmd2 *r, 3238 const struct drm_mode_fb_cmd2 *r,
3239 struct drm_file *file_priv) 3239 struct drm_file *file_priv)
3240{ 3240{
3241 struct drm_mode_config *config = &dev->mode_config; 3241 struct drm_mode_config *config = &dev->mode_config;
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index ef534758a02c..10d0989db273 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -818,7 +818,7 @@ EXPORT_SYMBOL(drm_helper_connector_dpms);
818 * metadata fields. 818 * metadata fields.
819 */ 819 */
820void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, 820void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
821 struct drm_mode_fb_cmd2 *mode_cmd) 821 const struct drm_mode_fb_cmd2 *mode_cmd)
822{ 822{
823 int i; 823 int i;
824 824
@@ -855,6 +855,12 @@ EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct);
855 * due to slight differences in allocating shared resources when the 855 * due to slight differences in allocating shared resources when the
856 * configuration is restored in a different order than when userspace set it up) 856 * configuration is restored in a different order than when userspace set it up)
857 * need to use their own restore logic. 857 * need to use their own restore logic.
858 *
859 * This function is deprecated. New drivers should implement atomic mode-
860 * setting and use the atomic suspend/resume helpers.
861 *
862 * See also:
863 * drm_atomic_helper_suspend(), drm_atomic_helper_resume()
858 */ 864 */
859void drm_helper_resume_force_mode(struct drm_device *dev) 865void drm_helper_resume_force_mode(struct drm_device *dev)
860{ 866{
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index d5d2c03fd136..c214f1246cb4 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2545,6 +2545,33 @@ cea_mode_alternate_clock(const struct drm_display_mode *cea_mode)
2545 return clock; 2545 return clock;
2546} 2546}
2547 2547
2548static u8 drm_match_cea_mode_clock_tolerance(const struct drm_display_mode *to_match,
2549 unsigned int clock_tolerance)
2550{
2551 u8 mode;
2552
2553 if (!to_match->clock)
2554 return 0;
2555
2556 for (mode = 0; mode < ARRAY_SIZE(edid_cea_modes); mode++) {
2557 const struct drm_display_mode *cea_mode = &edid_cea_modes[mode];
2558 unsigned int clock1, clock2;
2559
2560 /* Check both 60Hz and 59.94Hz */
2561 clock1 = cea_mode->clock;
2562 clock2 = cea_mode_alternate_clock(cea_mode);
2563
2564 if (abs(to_match->clock - clock1) > clock_tolerance &&
2565 abs(to_match->clock - clock2) > clock_tolerance)
2566 continue;
2567
2568 if (drm_mode_equal_no_clocks(to_match, cea_mode))
2569 return mode + 1;
2570 }
2571
2572 return 0;
2573}
2574
2548/** 2575/**
2549 * drm_match_cea_mode - look for a CEA mode matching given mode 2576 * drm_match_cea_mode - look for a CEA mode matching given mode
2550 * @to_match: display mode 2577 * @to_match: display mode
@@ -2609,6 +2636,33 @@ hdmi_mode_alternate_clock(const struct drm_display_mode *hdmi_mode)
2609 return cea_mode_alternate_clock(hdmi_mode); 2636 return cea_mode_alternate_clock(hdmi_mode);
2610} 2637}
2611 2638
2639static u8 drm_match_hdmi_mode_clock_tolerance(const struct drm_display_mode *to_match,
2640 unsigned int clock_tolerance)
2641{
2642 u8 mode;
2643
2644 if (!to_match->clock)
2645 return 0;
2646
2647 for (mode = 0; mode < ARRAY_SIZE(edid_4k_modes); mode++) {
2648 const struct drm_display_mode *hdmi_mode = &edid_4k_modes[mode];
2649 unsigned int clock1, clock2;
2650
2651 /* Make sure to also match alternate clocks */
2652 clock1 = hdmi_mode->clock;
2653 clock2 = hdmi_mode_alternate_clock(hdmi_mode);
2654
2655 if (abs(to_match->clock - clock1) > clock_tolerance &&
2656 abs(to_match->clock - clock2) > clock_tolerance)
2657 continue;
2658
2659 if (drm_mode_equal_no_clocks(to_match, hdmi_mode))
2660 return mode + 1;
2661 }
2662
2663 return 0;
2664}
2665
2612/* 2666/*
2613 * drm_match_hdmi_mode - look for a HDMI mode matching given mode 2667 * drm_match_hdmi_mode - look for a HDMI mode matching given mode
2614 * @to_match: display mode 2668 * @to_match: display mode
@@ -3119,14 +3173,18 @@ static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode)
3119 u8 mode_idx; 3173 u8 mode_idx;
3120 const char *type; 3174 const char *type;
3121 3175
3122 mode_idx = drm_match_cea_mode(mode) - 1; 3176 /*
3177 * allow 5kHz clock difference either way to account for
3178 * the 10kHz clock resolution limit of detailed timings.
3179 */
3180 mode_idx = drm_match_cea_mode_clock_tolerance(mode, 5) - 1;
3123 if (mode_idx < ARRAY_SIZE(edid_cea_modes)) { 3181 if (mode_idx < ARRAY_SIZE(edid_cea_modes)) {
3124 type = "CEA"; 3182 type = "CEA";
3125 cea_mode = &edid_cea_modes[mode_idx]; 3183 cea_mode = &edid_cea_modes[mode_idx];
3126 clock1 = cea_mode->clock; 3184 clock1 = cea_mode->clock;
3127 clock2 = cea_mode_alternate_clock(cea_mode); 3185 clock2 = cea_mode_alternate_clock(cea_mode);
3128 } else { 3186 } else {
3129 mode_idx = drm_match_hdmi_mode(mode) - 1; 3187 mode_idx = drm_match_hdmi_mode_clock_tolerance(mode, 5) - 1;
3130 if (mode_idx < ARRAY_SIZE(edid_4k_modes)) { 3188 if (mode_idx < ARRAY_SIZE(edid_4k_modes)) {
3131 type = "HDMI"; 3189 type = "HDMI";
3132 cea_mode = &edid_4k_modes[mode_idx]; 3190 cea_mode = &edid_4k_modes[mode_idx];
diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
index c19a62561183..b7d5b848d2f8 100644
--- a/drivers/gpu/drm/drm_fb_cma_helper.c
+++ b/drivers/gpu/drm/drm_fb_cma_helper.c
@@ -74,7 +74,7 @@ static struct drm_framebuffer_funcs drm_fb_cma_funcs = {
74}; 74};
75 75
76static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev, 76static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
77 struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj, 77 const const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj,
78 unsigned int num_planes) 78 unsigned int num_planes)
79{ 79{
80 struct drm_fb_cma *fb_cma; 80 struct drm_fb_cma *fb_cma;
@@ -107,7 +107,7 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
107 * checked before calling this function. 107 * checked before calling this function.
108 */ 108 */
109struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev, 109struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
110 struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd) 110 struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
111{ 111{
112 struct drm_fb_cma *fb_cma; 112 struct drm_fb_cma *fb_cma;
113 struct drm_gem_cma_object *objs[4]; 113 struct drm_gem_cma_object *objs[4];
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c
index 6b5625e66119..1ea8790e5090 100644
--- a/drivers/gpu/drm/drm_fops.c
+++ b/drivers/gpu/drm/drm_fops.c
@@ -226,6 +226,8 @@ static int drm_open_helper(struct file *filp, struct drm_minor *minor)
226 init_waitqueue_head(&priv->event_wait); 226 init_waitqueue_head(&priv->event_wait);
227 priv->event_space = 4096; /* set aside 4k for event buffer */ 227 priv->event_space = 4096; /* set aside 4k for event buffer */
228 228
229 mutex_init(&priv->event_read_lock);
230
229 if (drm_core_check_feature(dev, DRIVER_GEM)) 231 if (drm_core_check_feature(dev, DRIVER_GEM))
230 drm_gem_open(dev, priv); 232 drm_gem_open(dev, priv);
231 233
@@ -511,14 +513,28 @@ ssize_t drm_read(struct file *filp, char __user *buffer,
511{ 513{
512 struct drm_file *file_priv = filp->private_data; 514 struct drm_file *file_priv = filp->private_data;
513 struct drm_device *dev = file_priv->minor->dev; 515 struct drm_device *dev = file_priv->minor->dev;
514 ssize_t ret = 0; 516 ssize_t ret;
515 517
516 if (!access_ok(VERIFY_WRITE, buffer, count)) 518 if (!access_ok(VERIFY_WRITE, buffer, count))
517 return -EFAULT; 519 return -EFAULT;
518 520
519 spin_lock_irq(&dev->event_lock); 521 ret = mutex_lock_interruptible(&file_priv->event_read_lock);
522 if (ret)
523 return ret;
524
520 for (;;) { 525 for (;;) {
521 if (list_empty(&file_priv->event_list)) { 526 struct drm_pending_event *e = NULL;
527
528 spin_lock_irq(&dev->event_lock);
529 if (!list_empty(&file_priv->event_list)) {
530 e = list_first_entry(&file_priv->event_list,
531 struct drm_pending_event, link);
532 file_priv->event_space += e->event->length;
533 list_del(&e->link);
534 }
535 spin_unlock_irq(&dev->event_lock);
536
537 if (e == NULL) {
522 if (ret) 538 if (ret)
523 break; 539 break;
524 540
@@ -527,36 +543,36 @@ ssize_t drm_read(struct file *filp, char __user *buffer,
527 break; 543 break;
528 } 544 }
529 545
530 spin_unlock_irq(&dev->event_lock); 546 mutex_unlock(&file_priv->event_read_lock);
531 ret = wait_event_interruptible(file_priv->event_wait, 547 ret = wait_event_interruptible(file_priv->event_wait,
532 !list_empty(&file_priv->event_list)); 548 !list_empty(&file_priv->event_list));
533 spin_lock_irq(&dev->event_lock); 549 if (ret >= 0)
534 if (ret < 0) 550 ret = mutex_lock_interruptible(&file_priv->event_read_lock);
535 break; 551 if (ret)
536 552 return ret;
537 ret = 0;
538 } else { 553 } else {
539 struct drm_pending_event *e; 554 unsigned length = e->event->length;
540 555
541 e = list_first_entry(&file_priv->event_list, 556 if (length > count - ret) {
542 struct drm_pending_event, link); 557put_back_event:
543 if (e->event->length + ret > count) 558 spin_lock_irq(&dev->event_lock);
559 file_priv->event_space -= length;
560 list_add(&e->link, &file_priv->event_list);
561 spin_unlock_irq(&dev->event_lock);
544 break; 562 break;
563 }
545 564
546 if (__copy_to_user_inatomic(buffer + ret, 565 if (copy_to_user(buffer + ret, e->event, length)) {
547 e->event, e->event->length)) {
548 if (ret == 0) 566 if (ret == 0)
549 ret = -EFAULT; 567 ret = -EFAULT;
550 break; 568 goto put_back_event;
551 } 569 }
552 570
553 file_priv->event_space += e->event->length; 571 ret += length;
554 ret += e->event->length;
555 list_del(&e->link);
556 e->destroy(e); 572 e->destroy(e);
557 } 573 }
558 } 574 }
559 spin_unlock_irq(&dev->event_lock); 575 mutex_unlock(&file_priv->event_read_lock);
560 576
561 return ret; 577 return ret;
562} 578}
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index c7de454e8e88..2e10bba4468b 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -244,8 +244,9 @@ drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)
244 * @filp: drm file-private structure to use for the handle look up 244 * @filp: drm file-private structure to use for the handle look up
245 * @handle: userspace handle to delete 245 * @handle: userspace handle to delete
246 * 246 *
247 * Removes the GEM handle from the @filp lookup table and if this is the last 247 * Removes the GEM handle from the @filp lookup table which has been added with
248 * handle also cleans up linked resources like GEM names. 248 * drm_gem_handle_create(). If this is the last handle also cleans up linked
249 * resources like GEM names.
249 */ 250 */
250int 251int
251drm_gem_handle_delete(struct drm_file *filp, u32 handle) 252drm_gem_handle_delete(struct drm_file *filp, u32 handle)
@@ -314,6 +315,10 @@ EXPORT_SYMBOL(drm_gem_dumb_destroy);
314 * This expects the dev->object_name_lock to be held already and will drop it 315 * This expects the dev->object_name_lock to be held already and will drop it
315 * before returning. Used to avoid races in establishing new handles when 316 * before returning. Used to avoid races in establishing new handles when
316 * importing an object from either an flink name or a dma-buf. 317 * importing an object from either an flink name or a dma-buf.
318 *
319 * Handles must be release again through drm_gem_handle_delete(). This is done
320 * when userspace closes @file_priv for all attached handles, or through the
321 * GEM_CLOSE ioctl for individual handles.
317 */ 322 */
318int 323int
319drm_gem_handle_create_tail(struct drm_file *file_priv, 324drm_gem_handle_create_tail(struct drm_file *file_priv,
@@ -541,7 +546,17 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
541} 546}
542EXPORT_SYMBOL(drm_gem_put_pages); 547EXPORT_SYMBOL(drm_gem_put_pages);
543 548
544/** Returns a reference to the object named by the handle. */ 549/**
550 * drm_gem_object_lookup - look up a GEM object from it's handle
551 * @dev: DRM device
552 * @filp: DRM file private date
553 * @handle: userspace handle
554 *
555 * Returns:
556 *
557 * A reference to the object named by the handle if such exists on @filp, NULL
558 * otherwise.
559 */
545struct drm_gem_object * 560struct drm_gem_object *
546drm_gem_object_lookup(struct drm_device *dev, struct drm_file *filp, 561drm_gem_object_lookup(struct drm_device *dev, struct drm_file *filp,
547 u32 handle) 562 u32 handle)
@@ -774,6 +789,13 @@ drm_gem_object_free(struct kref *kref)
774} 789}
775EXPORT_SYMBOL(drm_gem_object_free); 790EXPORT_SYMBOL(drm_gem_object_free);
776 791
792/**
793 * drm_gem_vm_open - vma->ops->open implementation for GEM
794 * @vma: VM area structure
795 *
796 * This function implements the #vm_operations_struct open() callback for GEM
797 * drivers. This must be used together with drm_gem_vm_close().
798 */
777void drm_gem_vm_open(struct vm_area_struct *vma) 799void drm_gem_vm_open(struct vm_area_struct *vma)
778{ 800{
779 struct drm_gem_object *obj = vma->vm_private_data; 801 struct drm_gem_object *obj = vma->vm_private_data;
@@ -782,6 +804,13 @@ void drm_gem_vm_open(struct vm_area_struct *vma)
782} 804}
783EXPORT_SYMBOL(drm_gem_vm_open); 805EXPORT_SYMBOL(drm_gem_vm_open);
784 806
807/**
808 * drm_gem_vm_close - vma->ops->close implementation for GEM
809 * @vma: VM area structure
810 *
811 * This function implements the #vm_operations_struct close() callback for GEM
812 * drivers. This must be used together with drm_gem_vm_open().
813 */
785void drm_gem_vm_close(struct vm_area_struct *vma) 814void drm_gem_vm_close(struct vm_area_struct *vma)
786{ 815{
787 struct drm_gem_object *obj = vma->vm_private_data; 816 struct drm_gem_object *obj = vma->vm_private_data;
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index cd74a0953f42..ef6bd3656548 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
@@ -917,13 +917,30 @@ bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_displ
917 } else if (mode1->clock != mode2->clock) 917 } else if (mode1->clock != mode2->clock)
918 return false; 918 return false;
919 919
920 return drm_mode_equal_no_clocks(mode1, mode2);
921}
922EXPORT_SYMBOL(drm_mode_equal);
923
924/**
925 * drm_mode_equal_no_clocks - test modes for equality
926 * @mode1: first mode
927 * @mode2: second mode
928 *
929 * Check to see if @mode1 and @mode2 are equivalent, but
930 * don't check the pixel clocks.
931 *
932 * Returns:
933 * True if the modes are equal, false otherwise.
934 */
935bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2)
936{
920 if ((mode1->flags & DRM_MODE_FLAG_3D_MASK) != 937 if ((mode1->flags & DRM_MODE_FLAG_3D_MASK) !=
921 (mode2->flags & DRM_MODE_FLAG_3D_MASK)) 938 (mode2->flags & DRM_MODE_FLAG_3D_MASK))
922 return false; 939 return false;
923 940
924 return drm_mode_equal_no_clocks_no_stereo(mode1, mode2); 941 return drm_mode_equal_no_clocks_no_stereo(mode1, mode2);
925} 942}
926EXPORT_SYMBOL(drm_mode_equal); 943EXPORT_SYMBOL(drm_mode_equal_no_clocks);
927 944
928/** 945/**
929 * drm_mode_equal_no_clocks_no_stereo - test modes for equality 946 * drm_mode_equal_no_clocks_no_stereo - test modes for equality
@@ -1230,7 +1247,7 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,
1230 unsigned int xres = 0, yres = 0, bpp = 32, refresh = 0; 1247 unsigned int xres = 0, yres = 0, bpp = 32, refresh = 0;
1231 bool yres_specified = false, cvt = false, rb = false; 1248 bool yres_specified = false, cvt = false, rb = false;
1232 bool interlace = false, margins = false, was_digit = false; 1249 bool interlace = false, margins = false, was_digit = false;
1233 int i; 1250 int i, err;
1234 enum drm_connector_force force = DRM_FORCE_UNSPECIFIED; 1251 enum drm_connector_force force = DRM_FORCE_UNSPECIFIED;
1235 1252
1236#ifdef CONFIG_FB 1253#ifdef CONFIG_FB
@@ -1250,7 +1267,9 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,
1250 case '@': 1267 case '@':
1251 if (!refresh_specified && !bpp_specified && 1268 if (!refresh_specified && !bpp_specified &&
1252 !yres_specified && !cvt && !rb && was_digit) { 1269 !yres_specified && !cvt && !rb && was_digit) {
1253 refresh = simple_strtol(&name[i+1], NULL, 10); 1270 err = kstrtouint(&name[i + 1], 10, &refresh);
1271 if (err)
1272 return false;
1254 refresh_specified = true; 1273 refresh_specified = true;
1255 was_digit = false; 1274 was_digit = false;
1256 } else 1275 } else
@@ -1259,7 +1278,9 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,
1259 case '-': 1278 case '-':
1260 if (!bpp_specified && !yres_specified && !cvt && 1279 if (!bpp_specified && !yres_specified && !cvt &&
1261 !rb && was_digit) { 1280 !rb && was_digit) {
1262 bpp = simple_strtol(&name[i+1], NULL, 10); 1281 err = kstrtouint(&name[i + 1], 10, &bpp);
1282 if (err)
1283 return false;
1263 bpp_specified = true; 1284 bpp_specified = true;
1264 was_digit = false; 1285 was_digit = false;
1265 } else 1286 } else
@@ -1267,7 +1288,9 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,
1267 break; 1288 break;
1268 case 'x': 1289 case 'x':
1269 if (!yres_specified && was_digit) { 1290 if (!yres_specified && was_digit) {
1270 yres = simple_strtol(&name[i+1], NULL, 10); 1291 err = kstrtouint(&name[i + 1], 10, &yres);
1292 if (err)
1293 return false;
1271 yres_specified = true; 1294 yres_specified = true;
1272 was_digit = false; 1295 was_digit = false;
1273 } else 1296 } else
@@ -1491,4 +1514,4 @@ int drm_mode_convert_umode(struct drm_display_mode *out,
1491 1514
1492out: 1515out:
1493 return ret; 1516 return ret;
1494} \ No newline at end of file 1517}
diff --git a/drivers/gpu/drm/drm_modeset_lock.c b/drivers/gpu/drm/drm_modeset_lock.c
index 6675b1428410..c2f5971146ba 100644
--- a/drivers/gpu/drm/drm_modeset_lock.c
+++ b/drivers/gpu/drm/drm_modeset_lock.c
@@ -57,11 +57,18 @@
57 57
58/** 58/**
59 * drm_modeset_lock_all - take all modeset locks 59 * drm_modeset_lock_all - take all modeset locks
60 * @dev: drm device 60 * @dev: DRM device
61 * 61 *
62 * This function takes all modeset locks, suitable where a more fine-grained 62 * This function takes all modeset locks, suitable where a more fine-grained
63 * scheme isn't (yet) implemented. Locks must be dropped with 63 * scheme isn't (yet) implemented. Locks must be dropped by calling the
64 * drm_modeset_unlock_all. 64 * drm_modeset_unlock_all() function.
65 *
66 * This function is deprecated. It allocates a lock acquisition context and
67 * stores it in the DRM device's ->mode_config. This facilitate conversion of
68 * existing code because it removes the need to manually deal with the
69 * acquisition context, but it is also brittle because the context is global
70 * and care must be taken not to nest calls. New code should use the
71 * drm_modeset_lock_all_ctx() function and pass in the context explicitly.
65 */ 72 */
66void drm_modeset_lock_all(struct drm_device *dev) 73void drm_modeset_lock_all(struct drm_device *dev)
67{ 74{
@@ -78,39 +85,43 @@ void drm_modeset_lock_all(struct drm_device *dev)
78 drm_modeset_acquire_init(ctx, 0); 85 drm_modeset_acquire_init(ctx, 0);
79 86
80retry: 87retry:
81 ret = drm_modeset_lock(&config->connection_mutex, ctx); 88 ret = drm_modeset_lock_all_ctx(dev, ctx);
82 if (ret) 89 if (ret < 0) {
83 goto fail; 90 if (ret == -EDEADLK) {
84 ret = drm_modeset_lock_all_crtcs(dev, ctx); 91 drm_modeset_backoff(ctx);
85 if (ret) 92 goto retry;
86 goto fail; 93 }
94
95 drm_modeset_acquire_fini(ctx);
96 kfree(ctx);
97 return;
98 }
87 99
88 WARN_ON(config->acquire_ctx); 100 WARN_ON(config->acquire_ctx);
89 101
90 /* now we hold the locks, so now that it is safe, stash the 102 /*
91 * ctx for drm_modeset_unlock_all(): 103 * We hold the locks now, so it is safe to stash the acquisition
104 * context for drm_modeset_unlock_all().
92 */ 105 */
93 config->acquire_ctx = ctx; 106 config->acquire_ctx = ctx;
94 107
95 drm_warn_on_modeset_not_all_locked(dev); 108 drm_warn_on_modeset_not_all_locked(dev);
96
97 return;
98
99fail:
100 if (ret == -EDEADLK) {
101 drm_modeset_backoff(ctx);
102 goto retry;
103 }
104
105 kfree(ctx);
106} 109}
107EXPORT_SYMBOL(drm_modeset_lock_all); 110EXPORT_SYMBOL(drm_modeset_lock_all);
108 111
109/** 112/**
110 * drm_modeset_unlock_all - drop all modeset locks 113 * drm_modeset_unlock_all - drop all modeset locks
111 * @dev: device 114 * @dev: DRM device
112 * 115 *
113 * This function drop all modeset locks taken by drm_modeset_lock_all. 116 * This function drops all modeset locks taken by a previous call to the
117 * drm_modeset_lock_all() function.
118 *
119 * This function is deprecated. It uses the lock acquisition context stored
120 * in the DRM device's ->mode_config. This facilitates conversion of existing
121 * code because it removes the need to manually deal with the acquisition
122 * context, but it is also brittle because the context is global and care must
123 * be taken not to nest calls. New code should pass the acquisition context
124 * directly to the drm_modeset_drop_locks() function.
114 */ 125 */
115void drm_modeset_unlock_all(struct drm_device *dev) 126void drm_modeset_unlock_all(struct drm_device *dev)
116{ 127{
@@ -431,14 +442,34 @@ void drm_modeset_unlock(struct drm_modeset_lock *lock)
431} 442}
432EXPORT_SYMBOL(drm_modeset_unlock); 443EXPORT_SYMBOL(drm_modeset_unlock);
433 444
434/* In some legacy codepaths it's convenient to just grab all the crtc and plane 445/**
435 * related locks. */ 446 * drm_modeset_lock_all_ctx - take all modeset locks
436int drm_modeset_lock_all_crtcs(struct drm_device *dev, 447 * @dev: DRM device
437 struct drm_modeset_acquire_ctx *ctx) 448 * @ctx: lock acquisition context
449 *
450 * This function takes all modeset locks, suitable where a more fine-grained
451 * scheme isn't (yet) implemented.
452 *
453 * Unlike drm_modeset_lock_all(), it doesn't take the dev->mode_config.mutex
454 * since that lock isn't required for modeset state changes. Callers which
455 * need to grab that lock too need to do so outside of the acquire context
456 * @ctx.
457 *
458 * Locks acquired with this function should be released by calling the
459 * drm_modeset_drop_locks() function on @ctx.
460 *
461 * Returns: 0 on success or a negative error-code on failure.
462 */
463int drm_modeset_lock_all_ctx(struct drm_device *dev,
464 struct drm_modeset_acquire_ctx *ctx)
438{ 465{
439 struct drm_crtc *crtc; 466 struct drm_crtc *crtc;
440 struct drm_plane *plane; 467 struct drm_plane *plane;
441 int ret = 0; 468 int ret;
469
470 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, ctx);
471 if (ret)
472 return ret;
442 473
443 drm_for_each_crtc(crtc, dev) { 474 drm_for_each_crtc(crtc, dev) {
444 ret = drm_modeset_lock(&crtc->mutex, ctx); 475 ret = drm_modeset_lock(&crtc->mutex, ctx);
@@ -454,4 +485,4 @@ int drm_modeset_lock_all_crtcs(struct drm_device *dev,
454 485
455 return 0; 486 return 0;
456} 487}
457EXPORT_SYMBOL(drm_modeset_lock_all_crtcs); 488EXPORT_SYMBOL(drm_modeset_lock_all_ctx);
diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
index d384ebcf0aaf..a6983d41920d 100644
--- a/drivers/gpu/drm/drm_plane_helper.c
+++ b/drivers/gpu/drm/drm_plane_helper.c
@@ -164,6 +164,8 @@ int drm_plane_helper_check_update(struct drm_plane *plane,
164 vscale = drm_rect_calc_vscale(src, dest, min_scale, max_scale); 164 vscale = drm_rect_calc_vscale(src, dest, min_scale, max_scale);
165 if (hscale < 0 || vscale < 0) { 165 if (hscale < 0 || vscale < 0) {
166 DRM_DEBUG_KMS("Invalid scaling of plane\n"); 166 DRM_DEBUG_KMS("Invalid scaling of plane\n");
167 drm_rect_debug_print("src: ", src, true);
168 drm_rect_debug_print("dst: ", dest, false);
167 return -ERANGE; 169 return -ERANGE;
168 } 170 }
169 171
@@ -180,6 +182,8 @@ int drm_plane_helper_check_update(struct drm_plane *plane,
180 182
181 if (!can_position && !drm_rect_equals(dest, clip)) { 183 if (!can_position && !drm_rect_equals(dest, clip)) {
182 DRM_DEBUG_KMS("Plane must cover entire CRTC\n"); 184 DRM_DEBUG_KMS("Plane must cover entire CRTC\n");
185 drm_rect_debug_print("dst: ", dest, false);
186 drm_rect_debug_print("clip: ", clip, false);
183 return -EINVAL; 187 return -EINVAL;
184 } 188 }
185 189
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index f8b5fcfa91a2..bfdf5bb223b9 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -147,6 +147,8 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect
147 list_for_each_entry(mode, &connector->modes, head) 147 list_for_each_entry(mode, &connector->modes, head)
148 mode->status = MODE_UNVERIFIED; 148 mode->status = MODE_UNVERIFIED;
149 149
150 old_status = connector->status;
151
150 if (connector->force) { 152 if (connector->force) {
151 if (connector->force == DRM_FORCE_ON || 153 if (connector->force == DRM_FORCE_ON ||
152 connector->force == DRM_FORCE_ON_DIGITAL) 154 connector->force == DRM_FORCE_ON_DIGITAL)
@@ -156,33 +158,32 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect
156 if (connector->funcs->force) 158 if (connector->funcs->force)
157 connector->funcs->force(connector); 159 connector->funcs->force(connector);
158 } else { 160 } else {
159 old_status = connector->status;
160
161 connector->status = connector->funcs->detect(connector, true); 161 connector->status = connector->funcs->detect(connector, true);
162 }
163
164 /*
165 * Normally either the driver's hpd code or the poll loop should
166 * pick up any changes and fire the hotplug event. But if
167 * userspace sneaks in a probe, we might miss a change. Hence
168 * check here, and if anything changed start the hotplug code.
169 */
170 if (old_status != connector->status) {
171 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
172 connector->base.id,
173 connector->name,
174 drm_get_connector_status_name(old_status),
175 drm_get_connector_status_name(connector->status));
162 176
163 /* 177 /*
164 * Normally either the driver's hpd code or the poll loop should 178 * The hotplug event code might call into the fb
165 * pick up any changes and fire the hotplug event. But if 179 * helpers, and so expects that we do not hold any
166 * userspace sneaks in a probe, we might miss a change. Hence 180 * locks. Fire up the poll struct instead, it will
167 * check here, and if anything changed start the hotplug code. 181 * disable itself again.
168 */ 182 */
169 if (old_status != connector->status) { 183 dev->mode_config.delayed_event = true;
170 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %d to %d\n", 184 if (dev->mode_config.poll_enabled)
171 connector->base.id, 185 schedule_delayed_work(&dev->mode_config.output_poll_work,
172 connector->name, 186 0);
173 old_status, connector->status);
174
175 /*
176 * The hotplug event code might call into the fb
177 * helpers, and so expects that we do not hold any
178 * locks. Fire up the poll struct instead, it will
179 * disable itself again.
180 */
181 dev->mode_config.delayed_event = true;
182 if (dev->mode_config.poll_enabled)
183 schedule_delayed_work(&dev->mode_config.output_poll_work,
184 0);
185 }
186 } 187 }
187 188
188 /* Re-enable polling in case the global poll config changed. */ 189 /* Re-enable polling in case the global poll config changed. */
diff --git a/drivers/gpu/drm/drm_rect.c b/drivers/gpu/drm/drm_rect.c
index 531ac4cc9756..a8e2c8603945 100644
--- a/drivers/gpu/drm/drm_rect.c
+++ b/drivers/gpu/drm/drm_rect.c
@@ -275,22 +275,23 @@ EXPORT_SYMBOL(drm_rect_calc_vscale_relaxed);
275 275
276/** 276/**
277 * drm_rect_debug_print - print the rectangle information 277 * drm_rect_debug_print - print the rectangle information
278 * @prefix: prefix string
278 * @r: rectangle to print 279 * @r: rectangle to print
279 * @fixed_point: rectangle is in 16.16 fixed point format 280 * @fixed_point: rectangle is in 16.16 fixed point format
280 */ 281 */
281void drm_rect_debug_print(const struct drm_rect *r, bool fixed_point) 282void drm_rect_debug_print(const char *prefix, const struct drm_rect *r, bool fixed_point)
282{ 283{
283 int w = drm_rect_width(r); 284 int w = drm_rect_width(r);
284 int h = drm_rect_height(r); 285 int h = drm_rect_height(r);
285 286
286 if (fixed_point) 287 if (fixed_point)
287 DRM_DEBUG_KMS("%d.%06ux%d.%06u%+d.%06u%+d.%06u\n", 288 DRM_DEBUG_KMS("%s%d.%06ux%d.%06u%+d.%06u%+d.%06u\n", prefix,
288 w >> 16, ((w & 0xffff) * 15625) >> 10, 289 w >> 16, ((w & 0xffff) * 15625) >> 10,
289 h >> 16, ((h & 0xffff) * 15625) >> 10, 290 h >> 16, ((h & 0xffff) * 15625) >> 10,
290 r->x1 >> 16, ((r->x1 & 0xffff) * 15625) >> 10, 291 r->x1 >> 16, ((r->x1 & 0xffff) * 15625) >> 10,
291 r->y1 >> 16, ((r->y1 & 0xffff) * 15625) >> 10); 292 r->y1 >> 16, ((r->y1 & 0xffff) * 15625) >> 10);
292 else 293 else
293 DRM_DEBUG_KMS("%dx%d%+d%+d\n", w, h, r->x1, r->y1); 294 DRM_DEBUG_KMS("%s%dx%d%+d%+d\n", prefix, w, h, r->x1, r->y1);
294} 295}
295EXPORT_SYMBOL(drm_rect_debug_print); 296EXPORT_SYMBOL(drm_rect_debug_print);
296 297
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
index 615b7e667320..0ca64106a97b 100644
--- a/drivers/gpu/drm/drm_sysfs.c
+++ b/drivers/gpu/drm/drm_sysfs.c
@@ -167,47 +167,35 @@ static ssize_t status_store(struct device *device,
167{ 167{
168 struct drm_connector *connector = to_drm_connector(device); 168 struct drm_connector *connector = to_drm_connector(device);
169 struct drm_device *dev = connector->dev; 169 struct drm_device *dev = connector->dev;
170 enum drm_connector_status old_status; 170 enum drm_connector_force old_force;
171 int ret; 171 int ret;
172 172
173 ret = mutex_lock_interruptible(&dev->mode_config.mutex); 173 ret = mutex_lock_interruptible(&dev->mode_config.mutex);
174 if (ret) 174 if (ret)
175 return ret; 175 return ret;
176 176
177 old_status = connector->status; 177 old_force = connector->force;
178 178
179 if (sysfs_streq(buf, "detect")) { 179 if (sysfs_streq(buf, "detect"))
180 connector->force = 0; 180 connector->force = 0;
181 connector->status = connector->funcs->detect(connector, true); 181 else if (sysfs_streq(buf, "on"))
182 } else if (sysfs_streq(buf, "on")) {
183 connector->force = DRM_FORCE_ON; 182 connector->force = DRM_FORCE_ON;
184 } else if (sysfs_streq(buf, "on-digital")) { 183 else if (sysfs_streq(buf, "on-digital"))
185 connector->force = DRM_FORCE_ON_DIGITAL; 184 connector->force = DRM_FORCE_ON_DIGITAL;
186 } else if (sysfs_streq(buf, "off")) { 185 else if (sysfs_streq(buf, "off"))
187 connector->force = DRM_FORCE_OFF; 186 connector->force = DRM_FORCE_OFF;
188 } else 187 else
189 ret = -EINVAL; 188 ret = -EINVAL;
190 189
191 if (ret == 0 && connector->force) { 190 if (old_force != connector->force || !connector->force) {
192 if (connector->force == DRM_FORCE_ON || 191 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] force updated from %d to %d or reprobing\n",
193 connector->force == DRM_FORCE_ON_DIGITAL)
194 connector->status = connector_status_connected;
195 else
196 connector->status = connector_status_disconnected;
197 if (connector->funcs->force)
198 connector->funcs->force(connector);
199 }
200
201 if (old_status != connector->status) {
202 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %d to %d\n",
203 connector->base.id, 192 connector->base.id,
204 connector->name, 193 connector->name,
205 old_status, connector->status); 194 old_force, connector->force);
206 195
207 dev->mode_config.delayed_event = true; 196 connector->funcs->fill_modes(connector,
208 if (dev->mode_config.poll_enabled) 197 dev->mode_config.max_width,
209 schedule_delayed_work(&dev->mode_config.output_poll_work, 198 dev->mode_config.max_height);
210 0);
211 } 199 }
212 200
213 mutex_unlock(&dev->mode_config.mutex); 201 mutex_unlock(&dev->mode_config.mutex);
@@ -256,23 +244,29 @@ static ssize_t edid_show(struct file *filp, struct kobject *kobj,
256 struct drm_connector *connector = to_drm_connector(connector_dev); 244 struct drm_connector *connector = to_drm_connector(connector_dev);
257 unsigned char *edid; 245 unsigned char *edid;
258 size_t size; 246 size_t size;
247 ssize_t ret = 0;
259 248
249 mutex_lock(&connector->dev->mode_config.mutex);
260 if (!connector->edid_blob_ptr) 250 if (!connector->edid_blob_ptr)
261 return 0; 251 goto unlock;
262 252
263 edid = connector->edid_blob_ptr->data; 253 edid = connector->edid_blob_ptr->data;
264 size = connector->edid_blob_ptr->length; 254 size = connector->edid_blob_ptr->length;
265 if (!edid) 255 if (!edid)
266 return 0; 256 goto unlock;
267 257
268 if (off >= size) 258 if (off >= size)
269 return 0; 259 goto unlock;
270 260
271 if (off + count > size) 261 if (off + count > size)
272 count = size - off; 262 count = size - off;
273 memcpy(buf, edid + off, count); 263 memcpy(buf, edid + off, count);
274 264
275 return count; 265 ret = count;
266unlock:
267 mutex_unlock(&connector->dev->mode_config.mutex);
268
269 return ret;
276} 270}
277 271
278static ssize_t modes_show(struct device *device, 272static ssize_t modes_show(struct device *device,
@@ -283,10 +277,12 @@ static ssize_t modes_show(struct device *device,
283 struct drm_display_mode *mode; 277 struct drm_display_mode *mode;
284 int written = 0; 278 int written = 0;
285 279
280 mutex_lock(&connector->dev->mode_config.mutex);
286 list_for_each_entry(mode, &connector->modes, head) { 281 list_for_each_entry(mode, &connector->modes, head) {
287 written += snprintf(buf + written, PAGE_SIZE - written, "%s\n", 282 written += snprintf(buf + written, PAGE_SIZE - written, "%s\n",
288 mode->name); 283 mode->name);
289 } 284 }
285 mutex_unlock(&connector->dev->mode_config.mutex);
290 286
291 return written; 287 return written;
292} 288}
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c
index fcea28bdbc42..49b9bc302e87 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fb.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c
@@ -117,7 +117,7 @@ static struct drm_framebuffer_funcs exynos_drm_fb_funcs = {
117 117
118struct drm_framebuffer * 118struct drm_framebuffer *
119exynos_drm_framebuffer_init(struct drm_device *dev, 119exynos_drm_framebuffer_init(struct drm_device *dev,
120 struct drm_mode_fb_cmd2 *mode_cmd, 120 const struct drm_mode_fb_cmd2 *mode_cmd,
121 struct exynos_drm_gem **exynos_gem, 121 struct exynos_drm_gem **exynos_gem,
122 int count) 122 int count)
123{ 123{
@@ -154,7 +154,7 @@ err:
154 154
155static struct drm_framebuffer * 155static struct drm_framebuffer *
156exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, 156exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
157 struct drm_mode_fb_cmd2 *mode_cmd) 157 const struct drm_mode_fb_cmd2 *mode_cmd)
158{ 158{
159 struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER]; 159 struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER];
160 struct drm_gem_object *obj; 160 struct drm_gem_object *obj;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.h b/drivers/gpu/drm/exynos/exynos_drm_fb.h
index cf39f9816a87..6fa0e47a1415 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fb.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_fb.h
@@ -18,7 +18,7 @@
18 18
19struct drm_framebuffer * 19struct drm_framebuffer *
20exynos_drm_framebuffer_init(struct drm_device *dev, 20exynos_drm_framebuffer_init(struct drm_device *dev,
21 struct drm_mode_fb_cmd2 *mode_cmd, 21 const struct drm_mode_fb_cmd2 *mode_cmd,
22 struct exynos_drm_gem **exynos_gem, 22 struct exynos_drm_gem **exynos_gem,
23 int count); 23 int count);
24 24
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
index 2eaf1b31c7bd..ee95c03a8c54 100644
--- a/drivers/gpu/drm/gma500/framebuffer.c
+++ b/drivers/gpu/drm/gma500/framebuffer.c
@@ -241,7 +241,7 @@ static struct fb_ops psbfb_unaccel_ops = {
241 */ 241 */
242static int psb_framebuffer_init(struct drm_device *dev, 242static int psb_framebuffer_init(struct drm_device *dev,
243 struct psb_framebuffer *fb, 243 struct psb_framebuffer *fb,
244 struct drm_mode_fb_cmd2 *mode_cmd, 244 const struct drm_mode_fb_cmd2 *mode_cmd,
245 struct gtt_range *gt) 245 struct gtt_range *gt)
246{ 246{
247 u32 bpp, depth; 247 u32 bpp, depth;
@@ -284,7 +284,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
284 284
285static struct drm_framebuffer *psb_framebuffer_create 285static struct drm_framebuffer *psb_framebuffer_create
286 (struct drm_device *dev, 286 (struct drm_device *dev,
287 struct drm_mode_fb_cmd2 *mode_cmd, 287 const struct drm_mode_fb_cmd2 *mode_cmd,
288 struct gtt_range *gt) 288 struct gtt_range *gt)
289{ 289{
290 struct psb_framebuffer *fb; 290 struct psb_framebuffer *fb;
@@ -406,8 +406,6 @@ static int psbfb_create(struct psb_fbdev *fbdev,
406 406
407 memset(dev_priv->vram_addr + backing->offset, 0, size); 407 memset(dev_priv->vram_addr + backing->offset, 0, size);
408 408
409 mutex_lock(&dev->struct_mutex);
410
411 info = drm_fb_helper_alloc_fbi(&fbdev->psb_fb_helper); 409 info = drm_fb_helper_alloc_fbi(&fbdev->psb_fb_helper);
412 if (IS_ERR(info)) { 410 if (IS_ERR(info)) {
413 ret = PTR_ERR(info); 411 ret = PTR_ERR(info);
@@ -463,17 +461,15 @@ static int psbfb_create(struct psb_fbdev *fbdev,
463 dev_dbg(dev->dev, "allocated %dx%d fb\n", 461 dev_dbg(dev->dev, "allocated %dx%d fb\n",
464 psbfb->base.width, psbfb->base.height); 462 psbfb->base.width, psbfb->base.height);
465 463
466 mutex_unlock(&dev->struct_mutex);
467 return 0; 464 return 0;
468out_unref: 465out_unref:
469 if (backing->stolen) 466 if (backing->stolen)
470 psb_gtt_free_range(dev, backing); 467 psb_gtt_free_range(dev, backing);
471 else 468 else
472 drm_gem_object_unreference(&backing->gem); 469 drm_gem_object_unreference_unlocked(&backing->gem);
473 470
474 drm_fb_helper_release_fbi(&fbdev->psb_fb_helper); 471 drm_fb_helper_release_fbi(&fbdev->psb_fb_helper);
475out_err1: 472out_err1:
476 mutex_unlock(&dev->struct_mutex);
477 psb_gtt_free_range(dev, backing); 473 psb_gtt_free_range(dev, backing);
478 return ret; 474 return ret;
479} 475}
@@ -488,7 +484,7 @@ out_err1:
488 */ 484 */
489static struct drm_framebuffer *psb_user_framebuffer_create 485static struct drm_framebuffer *psb_user_framebuffer_create
490 (struct drm_device *dev, struct drm_file *filp, 486 (struct drm_device *dev, struct drm_file *filp,
491 struct drm_mode_fb_cmd2 *cmd) 487 const struct drm_mode_fb_cmd2 *cmd)
492{ 488{
493 struct gtt_range *r; 489 struct gtt_range *r;
494 struct drm_gem_object *obj; 490 struct drm_gem_object *obj;
@@ -569,7 +565,7 @@ static int psb_fbdev_destroy(struct drm_device *dev, struct psb_fbdev *fbdev)
569 drm_framebuffer_cleanup(&psbfb->base); 565 drm_framebuffer_cleanup(&psbfb->base);
570 566
571 if (psbfb->gtt) 567 if (psbfb->gtt)
572 drm_gem_object_unreference(&psbfb->gtt->gem); 568 drm_gem_object_unreference_unlocked(&psbfb->gtt->gem);
573 return 0; 569 return 0;
574} 570}
575 571
@@ -784,12 +780,8 @@ void psb_modeset_cleanup(struct drm_device *dev)
784{ 780{
785 struct drm_psb_private *dev_priv = dev->dev_private; 781 struct drm_psb_private *dev_priv = dev->dev_private;
786 if (dev_priv->modeset) { 782 if (dev_priv->modeset) {
787 mutex_lock(&dev->struct_mutex);
788
789 drm_kms_helper_poll_fini(dev); 783 drm_kms_helper_poll_fini(dev);
790 psb_fbdev_fini(dev); 784 psb_fbdev_fini(dev);
791 drm_mode_config_cleanup(dev); 785 drm_mode_config_cleanup(dev);
792
793 mutex_unlock(&dev->struct_mutex);
794 } 786 }
795} 787}
diff --git a/drivers/gpu/drm/gma500/gem.c b/drivers/gpu/drm/gma500/gem.c
index c707fa6fca85..506224b3a0ad 100644
--- a/drivers/gpu/drm/gma500/gem.c
+++ b/drivers/gpu/drm/gma500/gem.c
@@ -62,15 +62,10 @@ int psb_gem_dumb_map_gtt(struct drm_file *file, struct drm_device *dev,
62 int ret = 0; 62 int ret = 0;
63 struct drm_gem_object *obj; 63 struct drm_gem_object *obj;
64 64
65 mutex_lock(&dev->struct_mutex);
66
67 /* GEM does all our handle to object mapping */ 65 /* GEM does all our handle to object mapping */
68 obj = drm_gem_object_lookup(dev, file, handle); 66 obj = drm_gem_object_lookup(dev, file, handle);
69 if (obj == NULL) { 67 if (obj == NULL)
70 ret = -ENOENT; 68 return -ENOENT;
71 goto unlock;
72 }
73 /* What validation is needed here ? */
74 69
75 /* Make it mmapable */ 70 /* Make it mmapable */
76 ret = drm_gem_create_mmap_offset(obj); 71 ret = drm_gem_create_mmap_offset(obj);
@@ -78,9 +73,7 @@ int psb_gem_dumb_map_gtt(struct drm_file *file, struct drm_device *dev,
78 goto out; 73 goto out;
79 *offset = drm_vma_node_offset_addr(&obj->vma_node); 74 *offset = drm_vma_node_offset_addr(&obj->vma_node);
80out: 75out:
81 drm_gem_object_unreference(obj); 76 drm_gem_object_unreference_unlocked(obj);
82unlock:
83 mutex_unlock(&dev->struct_mutex);
84 return ret; 77 return ret;
85} 78}
86 79
@@ -130,7 +123,7 @@ int psb_gem_create(struct drm_file *file, struct drm_device *dev, u64 size,
130 return ret; 123 return ret;
131 } 124 }
132 /* We have the initial and handle reference but need only one now */ 125 /* We have the initial and handle reference but need only one now */
133 drm_gem_object_unreference(&r->gem); 126 drm_gem_object_unreference_unlocked(&r->gem);
134 *handlep = handle; 127 *handlep = handle;
135 return 0; 128 return 0;
136} 129}
@@ -189,7 +182,7 @@ int psb_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
189 182
190 /* Make sure we don't parallel update on a fault, nor move or remove 183 /* Make sure we don't parallel update on a fault, nor move or remove
191 something from beneath our feet */ 184 something from beneath our feet */
192 mutex_lock(&dev->struct_mutex); 185 mutex_lock(&dev_priv->mmap_mutex);
193 186
194 /* For now the mmap pins the object and it stays pinned. As things 187 /* For now the mmap pins the object and it stays pinned. As things
195 stand that will do us no harm */ 188 stand that will do us no harm */
@@ -215,7 +208,7 @@ int psb_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
215 ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn); 208 ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
216 209
217fail: 210fail:
218 mutex_unlock(&dev->struct_mutex); 211 mutex_unlock(&dev_priv->mmap_mutex);
219 switch (ret) { 212 switch (ret) {
220 case 0: 213 case 0:
221 case -ERESTARTSYS: 214 case -ERESTARTSYS:
diff --git a/drivers/gpu/drm/gma500/gma_display.c b/drivers/gpu/drm/gma500/gma_display.c
index 001b450b27b3..ff17af4cfc64 100644
--- a/drivers/gpu/drm/gma500/gma_display.c
+++ b/drivers/gpu/drm/gma500/gma_display.c
@@ -349,8 +349,6 @@ int gma_crtc_cursor_set(struct drm_crtc *crtc,
349 /* If we didn't get a handle then turn the cursor off */ 349 /* If we didn't get a handle then turn the cursor off */
350 if (!handle) { 350 if (!handle) {
351 temp = CURSOR_MODE_DISABLE; 351 temp = CURSOR_MODE_DISABLE;
352 mutex_lock(&dev->struct_mutex);
353
354 if (gma_power_begin(dev, false)) { 352 if (gma_power_begin(dev, false)) {
355 REG_WRITE(control, temp); 353 REG_WRITE(control, temp);
356 REG_WRITE(base, 0); 354 REG_WRITE(base, 0);
@@ -362,11 +360,9 @@ int gma_crtc_cursor_set(struct drm_crtc *crtc,
362 gt = container_of(gma_crtc->cursor_obj, 360 gt = container_of(gma_crtc->cursor_obj,
363 struct gtt_range, gem); 361 struct gtt_range, gem);
364 psb_gtt_unpin(gt); 362 psb_gtt_unpin(gt);
365 drm_gem_object_unreference(gma_crtc->cursor_obj); 363 drm_gem_object_unreference_unlocked(gma_crtc->cursor_obj);
366 gma_crtc->cursor_obj = NULL; 364 gma_crtc->cursor_obj = NULL;
367 } 365 }
368
369 mutex_unlock(&dev->struct_mutex);
370 return 0; 366 return 0;
371 } 367 }
372 368
@@ -376,7 +372,6 @@ int gma_crtc_cursor_set(struct drm_crtc *crtc,
376 return -EINVAL; 372 return -EINVAL;
377 } 373 }
378 374
379 mutex_lock(&dev->struct_mutex);
380 obj = drm_gem_object_lookup(dev, file_priv, handle); 375 obj = drm_gem_object_lookup(dev, file_priv, handle);
381 if (!obj) { 376 if (!obj) {
382 ret = -ENOENT; 377 ret = -ENOENT;
@@ -441,17 +436,15 @@ int gma_crtc_cursor_set(struct drm_crtc *crtc,
441 if (gma_crtc->cursor_obj) { 436 if (gma_crtc->cursor_obj) {
442 gt = container_of(gma_crtc->cursor_obj, struct gtt_range, gem); 437 gt = container_of(gma_crtc->cursor_obj, struct gtt_range, gem);
443 psb_gtt_unpin(gt); 438 psb_gtt_unpin(gt);
444 drm_gem_object_unreference(gma_crtc->cursor_obj); 439 drm_gem_object_unreference_unlocked(gma_crtc->cursor_obj);
445 } 440 }
446 441
447 gma_crtc->cursor_obj = obj; 442 gma_crtc->cursor_obj = obj;
448unlock: 443unlock:
449 mutex_unlock(&dev->struct_mutex);
450 return ret; 444 return ret;
451 445
452unref_cursor: 446unref_cursor:
453 drm_gem_object_unreference(obj); 447 drm_gem_object_unreference_unlocked(obj);
454 mutex_unlock(&dev->struct_mutex);
455 return ret; 448 return ret;
456} 449}
457 450
diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c
index ce015db59dc6..8f69225ce2b4 100644
--- a/drivers/gpu/drm/gma500/gtt.c
+++ b/drivers/gpu/drm/gma500/gtt.c
@@ -425,6 +425,7 @@ int psb_gtt_init(struct drm_device *dev, int resume)
425 425
426 if (!resume) { 426 if (!resume) {
427 mutex_init(&dev_priv->gtt_mutex); 427 mutex_init(&dev_priv->gtt_mutex);
428 mutex_init(&dev_priv->mmap_mutex);
428 psb_gtt_alloc(dev); 429 psb_gtt_alloc(dev);
429 } 430 }
430 431
diff --git a/drivers/gpu/drm/gma500/psb_drv.h b/drivers/gpu/drm/gma500/psb_drv.h
index e21726ecac32..3bd2c726dd61 100644
--- a/drivers/gpu/drm/gma500/psb_drv.h
+++ b/drivers/gpu/drm/gma500/psb_drv.h
@@ -465,6 +465,8 @@ struct drm_psb_private {
465 struct mutex gtt_mutex; 465 struct mutex gtt_mutex;
466 struct resource *gtt_mem; /* Our PCI resource */ 466 struct resource *gtt_mem; /* Our PCI resource */
467 467
468 struct mutex mmap_mutex;
469
468 struct psb_mmu_driver *mmu; 470 struct psb_mmu_driver *mmu;
469 struct psb_mmu_pd *pf_pd; 471 struct psb_mmu_pd *pf_pd;
470 472
diff --git a/drivers/gpu/drm/i915/Kconfig b/drivers/gpu/drm/i915/Kconfig
index 051eab33e4c7..fcd77b27514d 100644
--- a/drivers/gpu/drm/i915/Kconfig
+++ b/drivers/gpu/drm/i915/Kconfig
@@ -10,6 +10,7 @@ config DRM_I915
10 # the shmem_readpage() which depends upon tmpfs 10 # the shmem_readpage() which depends upon tmpfs
11 select SHMEM 11 select SHMEM
12 select TMPFS 12 select TMPFS
13 select STOP_MACHINE
13 select DRM_KMS_HELPER 14 select DRM_KMS_HELPER
14 select DRM_PANEL 15 select DRM_PANEL
15 select DRM_MIPI_DSI 16 select DRM_MIPI_DSI
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 44d290ae1999..0851de07bd13 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -77,6 +77,7 @@ i915-y += dvo_ch7017.o \
77 dvo_tfp410.o \ 77 dvo_tfp410.o \
78 intel_crt.o \ 78 intel_crt.o \
79 intel_ddi.o \ 79 intel_ddi.o \
80 intel_dp_link_training.o \
80 intel_dp_mst.o \ 81 intel_dp_mst.o \
81 intel_dp.o \ 82 intel_dp.o \
82 intel_dsi.o \ 83 intel_dsi.o \
diff --git a/drivers/gpu/drm/i915/dvo.h b/drivers/gpu/drm/i915/dvo.h
index 0e2c1b9648a7..13dea4263554 100644
--- a/drivers/gpu/drm/i915/dvo.h
+++ b/drivers/gpu/drm/i915/dvo.h
@@ -32,7 +32,8 @@ struct intel_dvo_device {
32 const char *name; 32 const char *name;
33 int type; 33 int type;
34 /* DVOA/B/C output register */ 34 /* DVOA/B/C output register */
35 u32 dvo_reg; 35 i915_reg_t dvo_reg;
36 i915_reg_t dvo_srcdim_reg;
36 /* GPIO register used for i2c bus to control this device */ 37 /* GPIO register used for i2c bus to control this device */
37 u32 gpio; 38 u32 gpio;
38 int slave_addr; 39 int slave_addr;
diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c b/drivers/gpu/drm/i915/i915_cmd_parser.c
index db58c8d664c2..814d894ed925 100644
--- a/drivers/gpu/drm/i915/i915_cmd_parser.c
+++ b/drivers/gpu/drm/i915/i915_cmd_parser.c
@@ -407,14 +407,14 @@ static const struct drm_i915_cmd_table hsw_blt_ring_cmds[] = {
407 * LRI. 407 * LRI.
408 */ 408 */
409struct drm_i915_reg_descriptor { 409struct drm_i915_reg_descriptor {
410 u32 addr; 410 i915_reg_t addr;
411 u32 mask; 411 u32 mask;
412 u32 value; 412 u32 value;
413}; 413};
414 414
415/* Convenience macro for adding 32-bit registers. */ 415/* Convenience macro for adding 32-bit registers. */
416#define REG32(address, ...) \ 416#define REG32(_reg, ...) \
417 { .addr = address, __VA_ARGS__ } 417 { .addr = (_reg), __VA_ARGS__ }
418 418
419/* 419/*
420 * Convenience macro for adding 64-bit registers. 420 * Convenience macro for adding 64-bit registers.
@@ -423,8 +423,13 @@ struct drm_i915_reg_descriptor {
423 * access commands only allow 32-bit accesses. Hence, we have to include 423 * access commands only allow 32-bit accesses. Hence, we have to include
424 * entries for both halves of the 64-bit registers. 424 * entries for both halves of the 64-bit registers.
425 */ 425 */
426#define REG64(addr) \ 426#define REG64(_reg) \
427 REG32(addr), REG32(addr + sizeof(u32)) 427 { .addr = _reg }, \
428 { .addr = _reg ## _UDW }
429
430#define REG64_IDX(_reg, idx) \
431 { .addr = _reg(idx) }, \
432 { .addr = _reg ## _UDW(idx) }
428 433
429static const struct drm_i915_reg_descriptor gen7_render_regs[] = { 434static const struct drm_i915_reg_descriptor gen7_render_regs[] = {
430 REG64(GPGPU_THREADS_DISPATCHED), 435 REG64(GPGPU_THREADS_DISPATCHED),
@@ -451,14 +456,14 @@ static const struct drm_i915_reg_descriptor gen7_render_regs[] = {
451 REG32(GEN7_GPGPU_DISPATCHDIMX), 456 REG32(GEN7_GPGPU_DISPATCHDIMX),
452 REG32(GEN7_GPGPU_DISPATCHDIMY), 457 REG32(GEN7_GPGPU_DISPATCHDIMY),
453 REG32(GEN7_GPGPU_DISPATCHDIMZ), 458 REG32(GEN7_GPGPU_DISPATCHDIMZ),
454 REG64(GEN7_SO_NUM_PRIMS_WRITTEN(0)), 459 REG64_IDX(GEN7_SO_NUM_PRIMS_WRITTEN, 0),
455 REG64(GEN7_SO_NUM_PRIMS_WRITTEN(1)), 460 REG64_IDX(GEN7_SO_NUM_PRIMS_WRITTEN, 1),
456 REG64(GEN7_SO_NUM_PRIMS_WRITTEN(2)), 461 REG64_IDX(GEN7_SO_NUM_PRIMS_WRITTEN, 2),
457 REG64(GEN7_SO_NUM_PRIMS_WRITTEN(3)), 462 REG64_IDX(GEN7_SO_NUM_PRIMS_WRITTEN, 3),
458 REG64(GEN7_SO_PRIM_STORAGE_NEEDED(0)), 463 REG64_IDX(GEN7_SO_PRIM_STORAGE_NEEDED, 0),
459 REG64(GEN7_SO_PRIM_STORAGE_NEEDED(1)), 464 REG64_IDX(GEN7_SO_PRIM_STORAGE_NEEDED, 1),
460 REG64(GEN7_SO_PRIM_STORAGE_NEEDED(2)), 465 REG64_IDX(GEN7_SO_PRIM_STORAGE_NEEDED, 2),
461 REG64(GEN7_SO_PRIM_STORAGE_NEEDED(3)), 466 REG64_IDX(GEN7_SO_PRIM_STORAGE_NEEDED, 3),
462 REG32(GEN7_SO_WRITE_OFFSET(0)), 467 REG32(GEN7_SO_WRITE_OFFSET(0)),
463 REG32(GEN7_SO_WRITE_OFFSET(1)), 468 REG32(GEN7_SO_WRITE_OFFSET(1)),
464 REG32(GEN7_SO_WRITE_OFFSET(2)), 469 REG32(GEN7_SO_WRITE_OFFSET(2)),
@@ -592,7 +597,7 @@ static bool check_sorted(int ring_id,
592 bool ret = true; 597 bool ret = true;
593 598
594 for (i = 0; i < reg_count; i++) { 599 for (i = 0; i < reg_count; i++) {
595 u32 curr = reg_table[i].addr; 600 u32 curr = i915_mmio_reg_offset(reg_table[i].addr);
596 601
597 if (curr < previous) { 602 if (curr < previous) {
598 DRM_ERROR("CMD: table not sorted ring=%d entry=%d reg=0x%08X prev=0x%08X\n", 603 DRM_ERROR("CMD: table not sorted ring=%d entry=%d reg=0x%08X prev=0x%08X\n",
@@ -847,7 +852,7 @@ find_reg(const struct drm_i915_reg_descriptor *table,
847 int i; 852 int i;
848 853
849 for (i = 0; i < count; i++) { 854 for (i = 0; i < count; i++) {
850 if (table[i].addr == addr) 855 if (i915_mmio_reg_offset(table[i].addr) == addr)
851 return &table[i]; 856 return &table[i];
852 } 857 }
853 } 858 }
@@ -1023,7 +1028,7 @@ static bool check_cmd(const struct intel_engine_cs *ring,
1023 * to the register. Hence, limit OACONTROL writes to 1028 * to the register. Hence, limit OACONTROL writes to
1024 * only MI_LOAD_REGISTER_IMM commands. 1029 * only MI_LOAD_REGISTER_IMM commands.
1025 */ 1030 */
1026 if (reg_addr == OACONTROL) { 1031 if (reg_addr == i915_mmio_reg_offset(OACONTROL)) {
1027 if (desc->cmd.value == MI_LOAD_REGISTER_MEM) { 1032 if (desc->cmd.value == MI_LOAD_REGISTER_MEM) {
1028 DRM_DEBUG_DRIVER("CMD: Rejected LRM to OACONTROL\n"); 1033 DRM_DEBUG_DRIVER("CMD: Rejected LRM to OACONTROL\n");
1029 return false; 1034 return false;
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 8aab974b0564..411a9c68b4ee 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1252,18 +1252,21 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
1252 1252
1253 max_freq = (IS_BROXTON(dev) ? rp_state_cap >> 0 : 1253 max_freq = (IS_BROXTON(dev) ? rp_state_cap >> 0 :
1254 rp_state_cap >> 16) & 0xff; 1254 rp_state_cap >> 16) & 0xff;
1255 max_freq *= (IS_SKYLAKE(dev) ? GEN9_FREQ_SCALER : 1); 1255 max_freq *= (IS_SKYLAKE(dev) || IS_KABYLAKE(dev) ?
1256 GEN9_FREQ_SCALER : 1);
1256 seq_printf(m, "Lowest (RPN) frequency: %dMHz\n", 1257 seq_printf(m, "Lowest (RPN) frequency: %dMHz\n",
1257 intel_gpu_freq(dev_priv, max_freq)); 1258 intel_gpu_freq(dev_priv, max_freq));
1258 1259
1259 max_freq = (rp_state_cap & 0xff00) >> 8; 1260 max_freq = (rp_state_cap & 0xff00) >> 8;
1260 max_freq *= (IS_SKYLAKE(dev) ? GEN9_FREQ_SCALER : 1); 1261 max_freq *= (IS_SKYLAKE(dev) || IS_KABYLAKE(dev) ?
1262 GEN9_FREQ_SCALER : 1);
1261 seq_printf(m, "Nominal (RP1) frequency: %dMHz\n", 1263 seq_printf(m, "Nominal (RP1) frequency: %dMHz\n",
1262 intel_gpu_freq(dev_priv, max_freq)); 1264 intel_gpu_freq(dev_priv, max_freq));
1263 1265
1264 max_freq = (IS_BROXTON(dev) ? rp_state_cap >> 16 : 1266 max_freq = (IS_BROXTON(dev) ? rp_state_cap >> 16 :
1265 rp_state_cap >> 0) & 0xff; 1267 rp_state_cap >> 0) & 0xff;
1266 max_freq *= (IS_SKYLAKE(dev) ? GEN9_FREQ_SCALER : 1); 1268 max_freq *= (IS_SKYLAKE(dev) || IS_KABYLAKE(dev) ?
1269 GEN9_FREQ_SCALER : 1);
1267 seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n", 1270 seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n",
1268 intel_gpu_freq(dev_priv, max_freq)); 1271 intel_gpu_freq(dev_priv, max_freq));
1269 seq_printf(m, "Max overclocked frequency: %dMHz\n", 1272 seq_printf(m, "Max overclocked frequency: %dMHz\n",
@@ -1523,7 +1526,7 @@ static int gen6_drpc_info(struct seq_file *m)
1523 seq_printf(m, "RC information accurate: %s\n", yesno(count < 51)); 1526 seq_printf(m, "RC information accurate: %s\n", yesno(count < 51));
1524 } 1527 }
1525 1528
1526 gt_core_status = readl(dev_priv->regs + GEN6_GT_CORE_STATUS); 1529 gt_core_status = I915_READ_FW(GEN6_GT_CORE_STATUS);
1527 trace_i915_reg_rw(false, GEN6_GT_CORE_STATUS, gt_core_status, 4, true); 1530 trace_i915_reg_rw(false, GEN6_GT_CORE_STATUS, gt_core_status, 4, true);
1528 1531
1529 rpmodectl1 = I915_READ(GEN6_RP_CONTROL); 1532 rpmodectl1 = I915_READ(GEN6_RP_CONTROL);
@@ -1640,7 +1643,7 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
1640 seq_puts(m, "FBC enabled\n"); 1643 seq_puts(m, "FBC enabled\n");
1641 else 1644 else
1642 seq_printf(m, "FBC disabled: %s\n", 1645 seq_printf(m, "FBC disabled: %s\n",
1643 intel_no_fbc_reason_str(dev_priv->fbc.no_fbc_reason)); 1646 dev_priv->fbc.no_fbc_reason);
1644 1647
1645 if (INTEL_INFO(dev_priv)->gen >= 7) 1648 if (INTEL_INFO(dev_priv)->gen >= 7)
1646 seq_printf(m, "Compressing: %s\n", 1649 seq_printf(m, "Compressing: %s\n",
@@ -1801,7 +1804,7 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
1801 if (ret) 1804 if (ret)
1802 goto out; 1805 goto out;
1803 1806
1804 if (IS_SKYLAKE(dev)) { 1807 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
1805 /* Convert GT frequency to 50 HZ units */ 1808 /* Convert GT frequency to 50 HZ units */
1806 min_gpu_freq = 1809 min_gpu_freq =
1807 dev_priv->rps.min_freq_softlimit / GEN9_FREQ_SCALER; 1810 dev_priv->rps.min_freq_softlimit / GEN9_FREQ_SCALER;
@@ -1821,7 +1824,8 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
1821 &ia_freq); 1824 &ia_freq);
1822 seq_printf(m, "%d\t\t%d\t\t\t\t%d\n", 1825 seq_printf(m, "%d\t\t%d\t\t\t\t%d\n",
1823 intel_gpu_freq(dev_priv, (gpu_freq * 1826 intel_gpu_freq(dev_priv, (gpu_freq *
1824 (IS_SKYLAKE(dev) ? GEN9_FREQ_SCALER : 1))), 1827 (IS_SKYLAKE(dev) || IS_KABYLAKE(dev) ?
1828 GEN9_FREQ_SCALER : 1))),
1825 ((ia_freq >> 0) & 0xff) * 100, 1829 ((ia_freq >> 0) & 0xff) * 100,
1826 ((ia_freq >> 8) & 0xff) * 100); 1830 ((ia_freq >> 8) & 0xff) * 100);
1827 } 1831 }
@@ -1873,17 +1877,19 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
1873 struct drm_i915_private *dev_priv = dev->dev_private; 1877 struct drm_i915_private *dev_priv = dev->dev_private;
1874 1878
1875 ifbdev = dev_priv->fbdev; 1879 ifbdev = dev_priv->fbdev;
1876 fb = to_intel_framebuffer(ifbdev->helper.fb); 1880 if (ifbdev) {
1877 1881 fb = to_intel_framebuffer(ifbdev->helper.fb);
1878 seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ", 1882
1879 fb->base.width, 1883 seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ",
1880 fb->base.height, 1884 fb->base.width,
1881 fb->base.depth, 1885 fb->base.height,
1882 fb->base.bits_per_pixel, 1886 fb->base.depth,
1883 fb->base.modifier[0], 1887 fb->base.bits_per_pixel,
1884 atomic_read(&fb->base.refcount.refcount)); 1888 fb->base.modifier[0],
1885 describe_obj(m, fb->obj); 1889 atomic_read(&fb->base.refcount.refcount));
1886 seq_putc(m, '\n'); 1890 describe_obj(m, fb->obj);
1891 seq_putc(m, '\n');
1892 }
1887#endif 1893#endif
1888 1894
1889 mutex_lock(&dev->mode_config.fb_lock); 1895 mutex_lock(&dev->mode_config.fb_lock);
@@ -2402,6 +2408,12 @@ static int i915_guc_load_status_info(struct seq_file *m, void *data)
2402 guc_fw->guc_fw_major_wanted, guc_fw->guc_fw_minor_wanted); 2408 guc_fw->guc_fw_major_wanted, guc_fw->guc_fw_minor_wanted);
2403 seq_printf(m, "\tversion found: %d.%d\n", 2409 seq_printf(m, "\tversion found: %d.%d\n",
2404 guc_fw->guc_fw_major_found, guc_fw->guc_fw_minor_found); 2410 guc_fw->guc_fw_major_found, guc_fw->guc_fw_minor_found);
2411 seq_printf(m, "\theader: offset is %d; size = %d\n",
2412 guc_fw->header_offset, guc_fw->header_size);
2413 seq_printf(m, "\tuCode: offset is %d; size = %d\n",
2414 guc_fw->ucode_offset, guc_fw->ucode_size);
2415 seq_printf(m, "\tRSA: offset is %d; size = %d\n",
2416 guc_fw->rsa_offset, guc_fw->rsa_size);
2405 2417
2406 tmp = I915_READ(GUC_STATUS); 2418 tmp = I915_READ(GUC_STATUS);
2407 2419
@@ -2550,7 +2562,7 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
2550 yesno(work_busy(&dev_priv->psr.work.work))); 2562 yesno(work_busy(&dev_priv->psr.work.work)));
2551 2563
2552 if (HAS_DDI(dev)) 2564 if (HAS_DDI(dev))
2553 enabled = I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE; 2565 enabled = I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE;
2554 else { 2566 else {
2555 for_each_pipe(dev_priv, pipe) { 2567 for_each_pipe(dev_priv, pipe) {
2556 stat[pipe] = I915_READ(VLV_PSRSTAT(pipe)) & 2568 stat[pipe] = I915_READ(VLV_PSRSTAT(pipe)) &
@@ -2572,7 +2584,7 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
2572 2584
2573 /* CHV PSR has no kind of performance counter */ 2585 /* CHV PSR has no kind of performance counter */
2574 if (HAS_DDI(dev)) { 2586 if (HAS_DDI(dev)) {
2575 psrperf = I915_READ(EDP_PSR_PERF_CNT(dev)) & 2587 psrperf = I915_READ(EDP_PSR_PERF_CNT) &
2576 EDP_PSR_PERF_CNT_MASK; 2588 EDP_PSR_PERF_CNT_MASK;
2577 2589
2578 seq_printf(m, "Performance_Counter: %u\n", psrperf); 2590 seq_printf(m, "Performance_Counter: %u\n", psrperf);
@@ -2696,24 +2708,16 @@ static const char *power_domain_str(enum intel_display_power_domain domain)
2696 return "TRANSCODER_C"; 2708 return "TRANSCODER_C";
2697 case POWER_DOMAIN_TRANSCODER_EDP: 2709 case POWER_DOMAIN_TRANSCODER_EDP:
2698 return "TRANSCODER_EDP"; 2710 return "TRANSCODER_EDP";
2699 case POWER_DOMAIN_PORT_DDI_A_2_LANES: 2711 case POWER_DOMAIN_PORT_DDI_A_LANES:
2700 return "PORT_DDI_A_2_LANES"; 2712 return "PORT_DDI_A_LANES";
2701 case POWER_DOMAIN_PORT_DDI_A_4_LANES: 2713 case POWER_DOMAIN_PORT_DDI_B_LANES:
2702 return "PORT_DDI_A_4_LANES"; 2714 return "PORT_DDI_B_LANES";
2703 case POWER_DOMAIN_PORT_DDI_B_2_LANES: 2715 case POWER_DOMAIN_PORT_DDI_C_LANES:
2704 return "PORT_DDI_B_2_LANES"; 2716 return "PORT_DDI_C_LANES";
2705 case POWER_DOMAIN_PORT_DDI_B_4_LANES: 2717 case POWER_DOMAIN_PORT_DDI_D_LANES:
2706 return "PORT_DDI_B_4_LANES"; 2718 return "PORT_DDI_D_LANES";
2707 case POWER_DOMAIN_PORT_DDI_C_2_LANES: 2719 case POWER_DOMAIN_PORT_DDI_E_LANES:
2708 return "PORT_DDI_C_2_LANES"; 2720 return "PORT_DDI_E_LANES";
2709 case POWER_DOMAIN_PORT_DDI_C_4_LANES:
2710 return "PORT_DDI_C_4_LANES";
2711 case POWER_DOMAIN_PORT_DDI_D_2_LANES:
2712 return "PORT_DDI_D_2_LANES";
2713 case POWER_DOMAIN_PORT_DDI_D_4_LANES:
2714 return "PORT_DDI_D_4_LANES";
2715 case POWER_DOMAIN_PORT_DDI_E_2_LANES:
2716 return "PORT_DDI_E_2_LANES";
2717 case POWER_DOMAIN_PORT_DSI: 2721 case POWER_DOMAIN_PORT_DSI:
2718 return "PORT_DSI"; 2722 return "PORT_DSI";
2719 case POWER_DOMAIN_PORT_CRT: 2723 case POWER_DOMAIN_PORT_CRT:
@@ -2736,6 +2740,8 @@ static const char *power_domain_str(enum intel_display_power_domain domain)
2736 return "AUX_D"; 2740 return "AUX_D";
2737 case POWER_DOMAIN_GMBUS: 2741 case POWER_DOMAIN_GMBUS:
2738 return "GMBUS"; 2742 return "GMBUS";
2743 case POWER_DOMAIN_MODESET:
2744 return "MODESET";
2739 case POWER_DOMAIN_INIT: 2745 case POWER_DOMAIN_INIT:
2740 return "INIT"; 2746 return "INIT";
2741 default: 2747 default:
@@ -2779,6 +2785,51 @@ static int i915_power_domain_info(struct seq_file *m, void *unused)
2779 return 0; 2785 return 0;
2780} 2786}
2781 2787
2788static int i915_dmc_info(struct seq_file *m, void *unused)
2789{
2790 struct drm_info_node *node = m->private;
2791 struct drm_device *dev = node->minor->dev;
2792 struct drm_i915_private *dev_priv = dev->dev_private;
2793 struct intel_csr *csr;
2794
2795 if (!HAS_CSR(dev)) {
2796 seq_puts(m, "not supported\n");
2797 return 0;
2798 }
2799
2800 csr = &dev_priv->csr;
2801
2802 intel_runtime_pm_get(dev_priv);
2803
2804 seq_printf(m, "fw loaded: %s\n", yesno(csr->dmc_payload != NULL));
2805 seq_printf(m, "path: %s\n", csr->fw_path);
2806
2807 if (!csr->dmc_payload)
2808 goto out;
2809
2810 seq_printf(m, "version: %d.%d\n", CSR_VERSION_MAJOR(csr->version),
2811 CSR_VERSION_MINOR(csr->version));
2812
2813 if (IS_SKYLAKE(dev) && csr->version >= CSR_VERSION(1, 6)) {
2814 seq_printf(m, "DC3 -> DC5 count: %d\n",
2815 I915_READ(SKL_CSR_DC3_DC5_COUNT));
2816 seq_printf(m, "DC5 -> DC6 count: %d\n",
2817 I915_READ(SKL_CSR_DC5_DC6_COUNT));
2818 } else if (IS_BROXTON(dev) && csr->version >= CSR_VERSION(1, 4)) {
2819 seq_printf(m, "DC3 -> DC5 count: %d\n",
2820 I915_READ(BXT_CSR_DC3_DC5_COUNT));
2821 }
2822
2823out:
2824 seq_printf(m, "program base: 0x%08x\n", I915_READ(CSR_PROGRAM(0)));
2825 seq_printf(m, "ssp base: 0x%08x\n", I915_READ(CSR_SSP_BASE));
2826 seq_printf(m, "htp: 0x%08x\n", I915_READ(CSR_HTP_SKL));
2827
2828 intel_runtime_pm_put(dev_priv);
2829
2830 return 0;
2831}
2832
2782static void intel_seq_print_mode(struct seq_file *m, int tabs, 2833static void intel_seq_print_mode(struct seq_file *m, int tabs,
2783 struct drm_display_mode *mode) 2834 struct drm_display_mode *mode)
2784{ 2835{
@@ -2946,6 +2997,107 @@ static bool cursor_position(struct drm_device *dev, int pipe, int *x, int *y)
2946 return cursor_active(dev, pipe); 2997 return cursor_active(dev, pipe);
2947} 2998}
2948 2999
3000static const char *plane_type(enum drm_plane_type type)
3001{
3002 switch (type) {
3003 case DRM_PLANE_TYPE_OVERLAY:
3004 return "OVL";
3005 case DRM_PLANE_TYPE_PRIMARY:
3006 return "PRI";
3007 case DRM_PLANE_TYPE_CURSOR:
3008 return "CUR";
3009 /*
3010 * Deliberately omitting default: to generate compiler warnings
3011 * when a new drm_plane_type gets added.
3012 */
3013 }
3014
3015 return "unknown";
3016}
3017
3018static const char *plane_rotation(unsigned int rotation)
3019{
3020 static char buf[48];
3021 /*
3022 * According to doc only one DRM_ROTATE_ is allowed but this
3023 * will print them all to visualize if the values are misused
3024 */
3025 snprintf(buf, sizeof(buf),
3026 "%s%s%s%s%s%s(0x%08x)",
3027 (rotation & BIT(DRM_ROTATE_0)) ? "0 " : "",
3028 (rotation & BIT(DRM_ROTATE_90)) ? "90 " : "",
3029 (rotation & BIT(DRM_ROTATE_180)) ? "180 " : "",
3030 (rotation & BIT(DRM_ROTATE_270)) ? "270 " : "",
3031 (rotation & BIT(DRM_REFLECT_X)) ? "FLIPX " : "",
3032 (rotation & BIT(DRM_REFLECT_Y)) ? "FLIPY " : "",
3033 rotation);
3034
3035 return buf;
3036}
3037
3038static void intel_plane_info(struct seq_file *m, struct intel_crtc *intel_crtc)
3039{
3040 struct drm_info_node *node = m->private;
3041 struct drm_device *dev = node->minor->dev;
3042 struct intel_plane *intel_plane;
3043
3044 for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
3045 struct drm_plane_state *state;
3046 struct drm_plane *plane = &intel_plane->base;
3047
3048 if (!plane->state) {
3049 seq_puts(m, "plane->state is NULL!\n");
3050 continue;
3051 }
3052
3053 state = plane->state;
3054
3055 seq_printf(m, "\t--Plane id %d: type=%s, crtc_pos=%4dx%4d, crtc_size=%4dx%4d, src_pos=%d.%04ux%d.%04u, src_size=%d.%04ux%d.%04u, format=%s, rotation=%s\n",
3056 plane->base.id,
3057 plane_type(intel_plane->base.type),
3058 state->crtc_x, state->crtc_y,
3059 state->crtc_w, state->crtc_h,
3060 (state->src_x >> 16),
3061 ((state->src_x & 0xffff) * 15625) >> 10,
3062 (state->src_y >> 16),
3063 ((state->src_y & 0xffff) * 15625) >> 10,
3064 (state->src_w >> 16),
3065 ((state->src_w & 0xffff) * 15625) >> 10,
3066 (state->src_h >> 16),
3067 ((state->src_h & 0xffff) * 15625) >> 10,
3068 state->fb ? drm_get_format_name(state->fb->pixel_format) : "N/A",
3069 plane_rotation(state->rotation));
3070 }
3071}
3072
3073static void intel_scaler_info(struct seq_file *m, struct intel_crtc *intel_crtc)
3074{
3075 struct intel_crtc_state *pipe_config;
3076 int num_scalers = intel_crtc->num_scalers;
3077 int i;
3078
3079 pipe_config = to_intel_crtc_state(intel_crtc->base.state);
3080
3081 /* Not all platformas have a scaler */
3082 if (num_scalers) {
3083 seq_printf(m, "\tnum_scalers=%d, scaler_users=%x scaler_id=%d",
3084 num_scalers,
3085 pipe_config->scaler_state.scaler_users,
3086 pipe_config->scaler_state.scaler_id);
3087
3088 for (i = 0; i < SKL_NUM_SCALERS; i++) {
3089 struct intel_scaler *sc =
3090 &pipe_config->scaler_state.scalers[i];
3091
3092 seq_printf(m, ", scalers[%d]: use=%s, mode=%x",
3093 i, yesno(sc->in_use), sc->mode);
3094 }
3095 seq_puts(m, "\n");
3096 } else {
3097 seq_puts(m, "\tNo scalers available on this platform\n");
3098 }
3099}
3100
2949static int i915_display_info(struct seq_file *m, void *unused) 3101static int i915_display_info(struct seq_file *m, void *unused)
2950{ 3102{
2951 struct drm_info_node *node = m->private; 3103 struct drm_info_node *node = m->private;
@@ -2965,10 +3117,12 @@ static int i915_display_info(struct seq_file *m, void *unused)
2965 3117
2966 pipe_config = to_intel_crtc_state(crtc->base.state); 3118 pipe_config = to_intel_crtc_state(crtc->base.state);
2967 3119
2968 seq_printf(m, "CRTC %d: pipe: %c, active=%s (size=%dx%d)\n", 3120 seq_printf(m, "CRTC %d: pipe: %c, active=%s, (size=%dx%d), dither=%s, bpp=%d\n",
2969 crtc->base.base.id, pipe_name(crtc->pipe), 3121 crtc->base.base.id, pipe_name(crtc->pipe),
2970 yesno(pipe_config->base.active), 3122 yesno(pipe_config->base.active),
2971 pipe_config->pipe_src_w, pipe_config->pipe_src_h); 3123 pipe_config->pipe_src_w, pipe_config->pipe_src_h,
3124 yesno(pipe_config->dither), pipe_config->pipe_bpp);
3125
2972 if (pipe_config->base.active) { 3126 if (pipe_config->base.active) {
2973 intel_crtc_info(m, crtc); 3127 intel_crtc_info(m, crtc);
2974 3128
@@ -2978,6 +3132,8 @@ static int i915_display_info(struct seq_file *m, void *unused)
2978 x, y, crtc->base.cursor->state->crtc_w, 3132 x, y, crtc->base.cursor->state->crtc_w,
2979 crtc->base.cursor->state->crtc_h, 3133 crtc->base.cursor->state->crtc_h,
2980 crtc->cursor_addr, yesno(active)); 3134 crtc->cursor_addr, yesno(active));
3135 intel_scaler_info(m, crtc);
3136 intel_plane_info(m, crtc);
2981 } 3137 }
2982 3138
2983 seq_printf(m, "\tunderrun reporting: cpu=%s pch=%s \n", 3139 seq_printf(m, "\tunderrun reporting: cpu=%s pch=%s \n",
@@ -3112,7 +3268,8 @@ static int i915_wa_registers(struct seq_file *m, void *unused)
3112 3268
3113 seq_printf(m, "Workarounds applied: %d\n", dev_priv->workarounds.count); 3269 seq_printf(m, "Workarounds applied: %d\n", dev_priv->workarounds.count);
3114 for (i = 0; i < dev_priv->workarounds.count; ++i) { 3270 for (i = 0; i < dev_priv->workarounds.count; ++i) {
3115 u32 addr, mask, value, read; 3271 i915_reg_t addr;
3272 u32 mask, value, read;
3116 bool ok; 3273 bool ok;
3117 3274
3118 addr = dev_priv->workarounds.reg[i].addr; 3275 addr = dev_priv->workarounds.reg[i].addr;
@@ -3121,7 +3278,7 @@ static int i915_wa_registers(struct seq_file *m, void *unused)
3121 read = I915_READ(addr); 3278 read = I915_READ(addr);
3122 ok = (value & mask) == (read & mask); 3279 ok = (value & mask) == (read & mask);
3123 seq_printf(m, "0x%X: 0x%08X, mask: 0x%08X, read: 0x%08x, status: %s\n", 3280 seq_printf(m, "0x%X: 0x%08X, mask: 0x%08X, read: 0x%08x, status: %s\n",
3124 addr, value, mask, read, ok ? "OK" : "FAIL"); 3281 i915_mmio_reg_offset(addr), value, mask, read, ok ? "OK" : "FAIL");
3125 } 3282 }
3126 3283
3127 intel_runtime_pm_put(dev_priv); 3284 intel_runtime_pm_put(dev_priv);
@@ -5025,7 +5182,7 @@ static void gen9_sseu_device_status(struct drm_device *dev,
5025 5182
5026 stat->slice_total++; 5183 stat->slice_total++;
5027 5184
5028 if (IS_SKYLAKE(dev)) 5185 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
5029 ss_cnt = INTEL_INFO(dev)->subslice_per_slice; 5186 ss_cnt = INTEL_INFO(dev)->subslice_per_slice;
5030 5187
5031 for (ss = 0; ss < ss_max; ss++) { 5188 for (ss = 0; ss < ss_max; ss++) {
@@ -5238,6 +5395,7 @@ static const struct drm_info_list i915_debugfs_list[] = {
5238 {"i915_energy_uJ", i915_energy_uJ, 0}, 5395 {"i915_energy_uJ", i915_energy_uJ, 0},
5239 {"i915_runtime_pm_status", i915_runtime_pm_status, 0}, 5396 {"i915_runtime_pm_status", i915_runtime_pm_status, 0},
5240 {"i915_power_domain_info", i915_power_domain_info, 0}, 5397 {"i915_power_domain_info", i915_power_domain_info, 0},
5398 {"i915_dmc_info", i915_dmc_info, 0},
5241 {"i915_display_info", i915_display_info, 0}, 5399 {"i915_display_info", i915_display_info, 0},
5242 {"i915_semaphore_status", i915_semaphore_status, 0}, 5400 {"i915_semaphore_status", i915_semaphore_status, 0},
5243 {"i915_shared_dplls_info", i915_shared_dplls_info, 0}, 5401 {"i915_shared_dplls_info", i915_shared_dplls_info, 0},
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index b4741d121a74..a81c76603544 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -28,7 +28,6 @@
28 28
29#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 29#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
30 30
31#include <linux/async.h>
32#include <drm/drmP.h> 31#include <drm/drmP.h>
33#include <drm/drm_crtc_helper.h> 32#include <drm/drm_crtc_helper.h>
34#include <drm/drm_fb_helper.h> 33#include <drm/drm_fb_helper.h>
@@ -338,7 +337,7 @@ static void i915_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_
338 i915_resume_switcheroo(dev); 337 i915_resume_switcheroo(dev);
339 dev->switch_power_state = DRM_SWITCH_POWER_ON; 338 dev->switch_power_state = DRM_SWITCH_POWER_ON;
340 } else { 339 } else {
341 pr_err("switched off\n"); 340 pr_info("switched off\n");
342 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; 341 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
343 i915_suspend_switcheroo(dev, pmm); 342 i915_suspend_switcheroo(dev, pmm);
344 dev->switch_power_state = DRM_SWITCH_POWER_OFF; 343 dev->switch_power_state = DRM_SWITCH_POWER_OFF;
@@ -396,7 +395,9 @@ static int i915_load_modeset_init(struct drm_device *dev)
396 if (ret) 395 if (ret)
397 goto cleanup_vga_switcheroo; 396 goto cleanup_vga_switcheroo;
398 397
399 intel_power_domains_init_hw(dev_priv); 398 intel_power_domains_init_hw(dev_priv, false);
399
400 intel_csr_ucode_init(dev_priv);
400 401
401 ret = intel_irq_install(dev_priv); 402 ret = intel_irq_install(dev_priv);
402 if (ret) 403 if (ret)
@@ -437,7 +438,7 @@ static int i915_load_modeset_init(struct drm_device *dev)
437 * scanning against hotplug events. Hence do this first and ignore the 438 * scanning against hotplug events. Hence do this first and ignore the
438 * tiny window where we will loose hotplug notifactions. 439 * tiny window where we will loose hotplug notifactions.
439 */ 440 */
440 async_schedule(intel_fbdev_initial_config, dev_priv); 441 intel_fbdev_initial_config_async(dev);
441 442
442 drm_kms_helper_poll_init(dev); 443 drm_kms_helper_poll_init(dev);
443 444
@@ -663,7 +664,8 @@ static void gen9_sseu_info_init(struct drm_device *dev)
663 * supports EU power gating on devices with more than one EU 664 * supports EU power gating on devices with more than one EU
664 * pair per subslice. 665 * pair per subslice.
665 */ 666 */
666 info->has_slice_pg = (IS_SKYLAKE(dev) && (info->slice_total > 1)); 667 info->has_slice_pg = ((IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) &&
668 (info->slice_total > 1));
667 info->has_subslice_pg = (IS_BROXTON(dev) && (info->subslice_total > 1)); 669 info->has_subslice_pg = (IS_BROXTON(dev) && (info->subslice_total > 1));
668 info->has_eu_pg = (info->eu_per_subslice > 2); 670 info->has_eu_pg = (info->eu_per_subslice > 2);
669} 671}
@@ -890,7 +892,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
890 spin_lock_init(&dev_priv->mmio_flip_lock); 892 spin_lock_init(&dev_priv->mmio_flip_lock);
891 mutex_init(&dev_priv->sb_lock); 893 mutex_init(&dev_priv->sb_lock);
892 mutex_init(&dev_priv->modeset_restore_lock); 894 mutex_init(&dev_priv->modeset_restore_lock);
893 mutex_init(&dev_priv->csr_lock);
894 mutex_init(&dev_priv->av_mutex); 895 mutex_init(&dev_priv->av_mutex);
895 896
896 intel_pm_setup(dev); 897 intel_pm_setup(dev);
@@ -937,9 +938,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
937 938
938 intel_uncore_init(dev); 939 intel_uncore_init(dev);
939 940
940 /* Load CSR Firmware for SKL */
941 intel_csr_ucode_init(dev);
942
943 ret = i915_gem_gtt_init(dev); 941 ret = i915_gem_gtt_init(dev);
944 if (ret) 942 if (ret)
945 goto out_freecsr; 943 goto out_freecsr;
@@ -1113,7 +1111,7 @@ out_mtrrfree:
1113out_gtt: 1111out_gtt:
1114 i915_global_gtt_cleanup(dev); 1112 i915_global_gtt_cleanup(dev);
1115out_freecsr: 1113out_freecsr:
1116 intel_csr_ucode_fini(dev); 1114 intel_csr_ucode_fini(dev_priv);
1117 intel_uncore_fini(dev); 1115 intel_uncore_fini(dev);
1118 pci_iounmap(dev->pdev, dev_priv->regs); 1116 pci_iounmap(dev->pdev, dev_priv->regs);
1119put_bridge: 1117put_bridge:
@@ -1131,6 +1129,8 @@ int i915_driver_unload(struct drm_device *dev)
1131 struct drm_i915_private *dev_priv = dev->dev_private; 1129 struct drm_i915_private *dev_priv = dev->dev_private;
1132 int ret; 1130 int ret;
1133 1131
1132 intel_fbdev_fini(dev);
1133
1134 i915_audio_component_cleanup(dev_priv); 1134 i915_audio_component_cleanup(dev_priv);
1135 1135
1136 ret = i915_gem_suspend(dev); 1136 ret = i915_gem_suspend(dev);
@@ -1153,8 +1153,6 @@ int i915_driver_unload(struct drm_device *dev)
1153 1153
1154 acpi_video_unregister(); 1154 acpi_video_unregister();
1155 1155
1156 intel_fbdev_fini(dev);
1157
1158 drm_vblank_cleanup(dev); 1156 drm_vblank_cleanup(dev);
1159 1157
1160 intel_modeset_cleanup(dev); 1158 intel_modeset_cleanup(dev);
@@ -1196,7 +1194,7 @@ int i915_driver_unload(struct drm_device *dev)
1196 intel_fbc_cleanup_cfb(dev_priv); 1194 intel_fbc_cleanup_cfb(dev_priv);
1197 i915_gem_cleanup_stolen(dev); 1195 i915_gem_cleanup_stolen(dev);
1198 1196
1199 intel_csr_ucode_fini(dev); 1197 intel_csr_ucode_fini(dev_priv);
1200 1198
1201 intel_teardown_gmbus(dev); 1199 intel_teardown_gmbus(dev);
1202 intel_teardown_mchbar(dev); 1200 intel_teardown_mchbar(dev);
@@ -1264,8 +1262,6 @@ void i915_driver_postclose(struct drm_device *dev, struct drm_file *file)
1264{ 1262{
1265 struct drm_i915_file_private *file_priv = file->driver_priv; 1263 struct drm_i915_file_private *file_priv = file->driver_priv;
1266 1264
1267 if (file_priv && file_priv->bsd_ring)
1268 file_priv->bsd_ring = NULL;
1269 kfree(file_priv); 1265 kfree(file_priv);
1270} 1266}
1271 1267
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 760e0ce4aa26..6344dfb72177 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -383,6 +383,7 @@ static const struct intel_device_info intel_skylake_gt3_info = {
383 383
384static const struct intel_device_info intel_broxton_info = { 384static const struct intel_device_info intel_broxton_info = {
385 .is_preliminary = 1, 385 .is_preliminary = 1,
386 .is_broxton = 1,
386 .gen = 9, 387 .gen = 9,
387 .need_gfx_hws = 1, .has_hotplug = 1, 388 .need_gfx_hws = 1, .has_hotplug = 1,
388 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, 389 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING,
@@ -394,50 +395,81 @@ static const struct intel_device_info intel_broxton_info = {
394 IVB_CURSOR_OFFSETS, 395 IVB_CURSOR_OFFSETS,
395}; 396};
396 397
398static const struct intel_device_info intel_kabylake_info = {
399 .is_preliminary = 1,
400 .is_kabylake = 1,
401 .gen = 9,
402 .num_pipes = 3,
403 .need_gfx_hws = 1, .has_hotplug = 1,
404 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING,
405 .has_llc = 1,
406 .has_ddi = 1,
407 .has_fpga_dbg = 1,
408 .has_fbc = 1,
409 GEN_DEFAULT_PIPEOFFSETS,
410 IVB_CURSOR_OFFSETS,
411};
412
413static const struct intel_device_info intel_kabylake_gt3_info = {
414 .is_preliminary = 1,
415 .is_kabylake = 1,
416 .gen = 9,
417 .num_pipes = 3,
418 .need_gfx_hws = 1, .has_hotplug = 1,
419 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING,
420 .has_llc = 1,
421 .has_ddi = 1,
422 .has_fpga_dbg = 1,
423 .has_fbc = 1,
424 GEN_DEFAULT_PIPEOFFSETS,
425 IVB_CURSOR_OFFSETS,
426};
427
397/* 428/*
398 * Make sure any device matches here are from most specific to most 429 * Make sure any device matches here are from most specific to most
399 * general. For example, since the Quanta match is based on the subsystem 430 * general. For example, since the Quanta match is based on the subsystem
400 * and subvendor IDs, we need it to come before the more general IVB 431 * and subvendor IDs, we need it to come before the more general IVB
401 * PCI ID matches, otherwise we'll use the wrong info struct above. 432 * PCI ID matches, otherwise we'll use the wrong info struct above.
402 */ 433 */
403#define INTEL_PCI_IDS \ 434static const struct pci_device_id pciidlist[] = {
404 INTEL_I830_IDS(&intel_i830_info), \ 435 INTEL_I830_IDS(&intel_i830_info),
405 INTEL_I845G_IDS(&intel_845g_info), \ 436 INTEL_I845G_IDS(&intel_845g_info),
406 INTEL_I85X_IDS(&intel_i85x_info), \ 437 INTEL_I85X_IDS(&intel_i85x_info),
407 INTEL_I865G_IDS(&intel_i865g_info), \ 438 INTEL_I865G_IDS(&intel_i865g_info),
408 INTEL_I915G_IDS(&intel_i915g_info), \ 439 INTEL_I915G_IDS(&intel_i915g_info),
409 INTEL_I915GM_IDS(&intel_i915gm_info), \ 440 INTEL_I915GM_IDS(&intel_i915gm_info),
410 INTEL_I945G_IDS(&intel_i945g_info), \ 441 INTEL_I945G_IDS(&intel_i945g_info),
411 INTEL_I945GM_IDS(&intel_i945gm_info), \ 442 INTEL_I945GM_IDS(&intel_i945gm_info),
412 INTEL_I965G_IDS(&intel_i965g_info), \ 443 INTEL_I965G_IDS(&intel_i965g_info),
413 INTEL_G33_IDS(&intel_g33_info), \ 444 INTEL_G33_IDS(&intel_g33_info),
414 INTEL_I965GM_IDS(&intel_i965gm_info), \ 445 INTEL_I965GM_IDS(&intel_i965gm_info),
415 INTEL_GM45_IDS(&intel_gm45_info), \ 446 INTEL_GM45_IDS(&intel_gm45_info),
416 INTEL_G45_IDS(&intel_g45_info), \ 447 INTEL_G45_IDS(&intel_g45_info),
417 INTEL_PINEVIEW_IDS(&intel_pineview_info), \ 448 INTEL_PINEVIEW_IDS(&intel_pineview_info),
418 INTEL_IRONLAKE_D_IDS(&intel_ironlake_d_info), \ 449 INTEL_IRONLAKE_D_IDS(&intel_ironlake_d_info),
419 INTEL_IRONLAKE_M_IDS(&intel_ironlake_m_info), \ 450 INTEL_IRONLAKE_M_IDS(&intel_ironlake_m_info),
420 INTEL_SNB_D_IDS(&intel_sandybridge_d_info), \ 451 INTEL_SNB_D_IDS(&intel_sandybridge_d_info),
421 INTEL_SNB_M_IDS(&intel_sandybridge_m_info), \ 452 INTEL_SNB_M_IDS(&intel_sandybridge_m_info),
422 INTEL_IVB_Q_IDS(&intel_ivybridge_q_info), /* must be first IVB */ \ 453 INTEL_IVB_Q_IDS(&intel_ivybridge_q_info), /* must be first IVB */
423 INTEL_IVB_M_IDS(&intel_ivybridge_m_info), \ 454 INTEL_IVB_M_IDS(&intel_ivybridge_m_info),
424 INTEL_IVB_D_IDS(&intel_ivybridge_d_info), \ 455 INTEL_IVB_D_IDS(&intel_ivybridge_d_info),
425 INTEL_HSW_D_IDS(&intel_haswell_d_info), \ 456 INTEL_HSW_D_IDS(&intel_haswell_d_info),
426 INTEL_HSW_M_IDS(&intel_haswell_m_info), \ 457 INTEL_HSW_M_IDS(&intel_haswell_m_info),
427 INTEL_VLV_M_IDS(&intel_valleyview_m_info), \ 458 INTEL_VLV_M_IDS(&intel_valleyview_m_info),
428 INTEL_VLV_D_IDS(&intel_valleyview_d_info), \ 459 INTEL_VLV_D_IDS(&intel_valleyview_d_info),
429 INTEL_BDW_GT12M_IDS(&intel_broadwell_m_info), \ 460 INTEL_BDW_GT12M_IDS(&intel_broadwell_m_info),
430 INTEL_BDW_GT12D_IDS(&intel_broadwell_d_info), \ 461 INTEL_BDW_GT12D_IDS(&intel_broadwell_d_info),
431 INTEL_BDW_GT3M_IDS(&intel_broadwell_gt3m_info), \ 462 INTEL_BDW_GT3M_IDS(&intel_broadwell_gt3m_info),
432 INTEL_BDW_GT3D_IDS(&intel_broadwell_gt3d_info), \ 463 INTEL_BDW_GT3D_IDS(&intel_broadwell_gt3d_info),
433 INTEL_CHV_IDS(&intel_cherryview_info), \ 464 INTEL_CHV_IDS(&intel_cherryview_info),
434 INTEL_SKL_GT1_IDS(&intel_skylake_info), \ 465 INTEL_SKL_GT1_IDS(&intel_skylake_info),
435 INTEL_SKL_GT2_IDS(&intel_skylake_info), \ 466 INTEL_SKL_GT2_IDS(&intel_skylake_info),
436 INTEL_SKL_GT3_IDS(&intel_skylake_gt3_info), \ 467 INTEL_SKL_GT3_IDS(&intel_skylake_gt3_info),
437 INTEL_BXT_IDS(&intel_broxton_info) 468 INTEL_BXT_IDS(&intel_broxton_info),
438 469 INTEL_KBL_GT1_IDS(&intel_kabylake_info),
439static const struct pci_device_id pciidlist[] = { /* aka */ 470 INTEL_KBL_GT2_IDS(&intel_kabylake_info),
440 INTEL_PCI_IDS, 471 INTEL_KBL_GT3_IDS(&intel_kabylake_gt3_info),
472 INTEL_KBL_GT4_IDS(&intel_kabylake_gt3_info),
441 {0, 0, 0} 473 {0, 0, 0}
442}; 474};
443 475
@@ -463,7 +495,7 @@ static enum intel_pch intel_virt_detect_pch(struct drm_device *dev)
463 } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) { 495 } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
464 ret = PCH_LPT; 496 ret = PCH_LPT;
465 DRM_DEBUG_KMS("Assuming LynxPoint PCH\n"); 497 DRM_DEBUG_KMS("Assuming LynxPoint PCH\n");
466 } else if (IS_SKYLAKE(dev)) { 498 } else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
467 ret = PCH_SPT; 499 ret = PCH_SPT;
468 DRM_DEBUG_KMS("Assuming SunrisePoint PCH\n"); 500 DRM_DEBUG_KMS("Assuming SunrisePoint PCH\n");
469 } 501 }
@@ -526,11 +558,13 @@ void intel_detect_pch(struct drm_device *dev)
526 } else if (id == INTEL_PCH_SPT_DEVICE_ID_TYPE) { 558 } else if (id == INTEL_PCH_SPT_DEVICE_ID_TYPE) {
527 dev_priv->pch_type = PCH_SPT; 559 dev_priv->pch_type = PCH_SPT;
528 DRM_DEBUG_KMS("Found SunrisePoint PCH\n"); 560 DRM_DEBUG_KMS("Found SunrisePoint PCH\n");
529 WARN_ON(!IS_SKYLAKE(dev)); 561 WARN_ON(!IS_SKYLAKE(dev) &&
562 !IS_KABYLAKE(dev));
530 } else if (id == INTEL_PCH_SPT_LP_DEVICE_ID_TYPE) { 563 } else if (id == INTEL_PCH_SPT_LP_DEVICE_ID_TYPE) {
531 dev_priv->pch_type = PCH_SPT; 564 dev_priv->pch_type = PCH_SPT;
532 DRM_DEBUG_KMS("Found SunrisePoint LP PCH\n"); 565 DRM_DEBUG_KMS("Found SunrisePoint LP PCH\n");
533 WARN_ON(!IS_SKYLAKE(dev)); 566 WARN_ON(!IS_SKYLAKE(dev) &&
567 !IS_KABYLAKE(dev));
534 } else if (id == INTEL_PCH_P2X_DEVICE_ID_TYPE) { 568 } else if (id == INTEL_PCH_P2X_DEVICE_ID_TYPE) {
535 dev_priv->pch_type = intel_virt_detect_pch(dev); 569 dev_priv->pch_type = intel_virt_detect_pch(dev);
536 } else 570 } else
@@ -570,26 +604,6 @@ bool i915_semaphore_is_enabled(struct drm_device *dev)
570 return true; 604 return true;
571} 605}
572 606
573void i915_firmware_load_error_print(const char *fw_path, int err)
574{
575 DRM_ERROR("failed to load firmware %s (%d)\n", fw_path, err);
576
577 /*
578 * If the reason is not known assume -ENOENT since that's the most
579 * usual failure mode.
580 */
581 if (!err)
582 err = -ENOENT;
583
584 if (!(IS_BUILTIN(CONFIG_DRM_I915) && err == -ENOENT))
585 return;
586
587 DRM_ERROR(
588 "The driver is built-in, so to load the firmware you need to\n"
589 "include it either in the kernel (see CONFIG_EXTRA_FIRMWARE) or\n"
590 "in your initrd/initramfs image.\n");
591}
592
593static void intel_suspend_encoders(struct drm_i915_private *dev_priv) 607static void intel_suspend_encoders(struct drm_i915_private *dev_priv)
594{ 608{
595 struct drm_device *dev = dev_priv->dev; 609 struct drm_device *dev = dev_priv->dev;
@@ -608,7 +622,6 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv)
608static int intel_suspend_complete(struct drm_i915_private *dev_priv); 622static int intel_suspend_complete(struct drm_i915_private *dev_priv);
609static int vlv_resume_prepare(struct drm_i915_private *dev_priv, 623static int vlv_resume_prepare(struct drm_i915_private *dev_priv,
610 bool rpm_resume); 624 bool rpm_resume);
611static int skl_resume_prepare(struct drm_i915_private *dev_priv);
612static int bxt_resume_prepare(struct drm_i915_private *dev_priv); 625static int bxt_resume_prepare(struct drm_i915_private *dev_priv);
613 626
614 627
@@ -679,6 +692,9 @@ static int i915_drm_suspend(struct drm_device *dev)
679 692
680 intel_display_set_init_power(dev_priv, false); 693 intel_display_set_init_power(dev_priv, false);
681 694
695 if (HAS_CSR(dev_priv))
696 flush_work(&dev_priv->csr.work);
697
682 return 0; 698 return 0;
683} 699}
684 700
@@ -687,10 +703,13 @@ static int i915_drm_suspend_late(struct drm_device *drm_dev, bool hibernation)
687 struct drm_i915_private *dev_priv = drm_dev->dev_private; 703 struct drm_i915_private *dev_priv = drm_dev->dev_private;
688 int ret; 704 int ret;
689 705
706 intel_power_domains_suspend(dev_priv);
707
690 ret = intel_suspend_complete(dev_priv); 708 ret = intel_suspend_complete(dev_priv);
691 709
692 if (ret) { 710 if (ret) {
693 DRM_ERROR("Suspend complete failed: %d\n", ret); 711 DRM_ERROR("Suspend complete failed: %d\n", ret);
712 intel_power_domains_init_hw(dev_priv, true);
694 713
695 return ret; 714 return ret;
696 } 715 }
@@ -838,13 +857,11 @@ static int i915_drm_resume_early(struct drm_device *dev)
838 857
839 if (IS_BROXTON(dev)) 858 if (IS_BROXTON(dev))
840 ret = bxt_resume_prepare(dev_priv); 859 ret = bxt_resume_prepare(dev_priv);
841 else if (IS_SKYLAKE(dev_priv))
842 ret = skl_resume_prepare(dev_priv);
843 else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 860 else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
844 hsw_disable_pc8(dev_priv); 861 hsw_disable_pc8(dev_priv);
845 862
846 intel_uncore_sanitize(dev); 863 intel_uncore_sanitize(dev);
847 intel_power_domains_init_hw(dev_priv); 864 intel_power_domains_init_hw(dev_priv, true);
848 865
849 return ret; 866 return ret;
850} 867}
@@ -1051,15 +1068,6 @@ static int i915_pm_resume(struct device *dev)
1051 return i915_drm_resume(drm_dev); 1068 return i915_drm_resume(drm_dev);
1052} 1069}
1053 1070
1054static int skl_suspend_complete(struct drm_i915_private *dev_priv)
1055{
1056 /* Enabling DC6 is not a hard requirement to enter runtime D3 */
1057
1058 skl_uninit_cdclk(dev_priv);
1059
1060 return 0;
1061}
1062
1063static int hsw_suspend_complete(struct drm_i915_private *dev_priv) 1071static int hsw_suspend_complete(struct drm_i915_private *dev_priv)
1064{ 1072{
1065 hsw_enable_pc8(dev_priv); 1073 hsw_enable_pc8(dev_priv);
@@ -1099,16 +1107,6 @@ static int bxt_resume_prepare(struct drm_i915_private *dev_priv)
1099 return 0; 1107 return 0;
1100} 1108}
1101 1109
1102static int skl_resume_prepare(struct drm_i915_private *dev_priv)
1103{
1104 struct drm_device *dev = dev_priv->dev;
1105
1106 skl_init_cdclk(dev_priv);
1107 intel_csr_load_program(dev);
1108
1109 return 0;
1110}
1111
1112/* 1110/*
1113 * Save all Gunit registers that may be lost after a D3 and a subsequent 1111 * Save all Gunit registers that may be lost after a D3 and a subsequent
1114 * S0i[R123] transition. The list of registers needing a save/restore is 1112 * S0i[R123] transition. The list of registers needing a save/restore is
@@ -1572,8 +1570,6 @@ static int intel_runtime_resume(struct device *device)
1572 1570
1573 if (IS_BROXTON(dev)) 1571 if (IS_BROXTON(dev))
1574 ret = bxt_resume_prepare(dev_priv); 1572 ret = bxt_resume_prepare(dev_priv);
1575 else if (IS_SKYLAKE(dev))
1576 ret = skl_resume_prepare(dev_priv);
1577 else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 1573 else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
1578 hsw_disable_pc8(dev_priv); 1574 hsw_disable_pc8(dev_priv);
1579 else if (IS_VALLEYVIEW(dev_priv)) 1575 else if (IS_VALLEYVIEW(dev_priv))
@@ -1616,8 +1612,6 @@ static int intel_suspend_complete(struct drm_i915_private *dev_priv)
1616 1612
1617 if (IS_BROXTON(dev_priv)) 1613 if (IS_BROXTON(dev_priv))
1618 ret = bxt_suspend_complete(dev_priv); 1614 ret = bxt_suspend_complete(dev_priv);
1619 else if (IS_SKYLAKE(dev_priv))
1620 ret = skl_suspend_complete(dev_priv);
1621 else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 1615 else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
1622 ret = hsw_suspend_complete(dev_priv); 1616 ret = hsw_suspend_complete(dev_priv);
1623 else if (IS_VALLEYVIEW(dev_priv)) 1617 else if (IS_VALLEYVIEW(dev_priv))
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index f4af19a0d569..e6ab4655eb23 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -57,7 +57,7 @@
57 57
58#define DRIVER_NAME "i915" 58#define DRIVER_NAME "i915"
59#define DRIVER_DESC "Intel Graphics" 59#define DRIVER_DESC "Intel Graphics"
60#define DRIVER_DATE "20151010" 60#define DRIVER_DATE "20151120"
61 61
62#undef WARN_ON 62#undef WARN_ON
63/* Many gcc seem to no see through this and fall over :( */ 63/* Many gcc seem to no see through this and fall over :( */
@@ -180,15 +180,11 @@ enum intel_display_power_domain {
180 POWER_DOMAIN_TRANSCODER_B, 180 POWER_DOMAIN_TRANSCODER_B,
181 POWER_DOMAIN_TRANSCODER_C, 181 POWER_DOMAIN_TRANSCODER_C,
182 POWER_DOMAIN_TRANSCODER_EDP, 182 POWER_DOMAIN_TRANSCODER_EDP,
183 POWER_DOMAIN_PORT_DDI_A_2_LANES, 183 POWER_DOMAIN_PORT_DDI_A_LANES,
184 POWER_DOMAIN_PORT_DDI_A_4_LANES, 184 POWER_DOMAIN_PORT_DDI_B_LANES,
185 POWER_DOMAIN_PORT_DDI_B_2_LANES, 185 POWER_DOMAIN_PORT_DDI_C_LANES,
186 POWER_DOMAIN_PORT_DDI_B_4_LANES, 186 POWER_DOMAIN_PORT_DDI_D_LANES,
187 POWER_DOMAIN_PORT_DDI_C_2_LANES, 187 POWER_DOMAIN_PORT_DDI_E_LANES,
188 POWER_DOMAIN_PORT_DDI_C_4_LANES,
189 POWER_DOMAIN_PORT_DDI_D_2_LANES,
190 POWER_DOMAIN_PORT_DDI_D_4_LANES,
191 POWER_DOMAIN_PORT_DDI_E_2_LANES,
192 POWER_DOMAIN_PORT_DSI, 188 POWER_DOMAIN_PORT_DSI,
193 POWER_DOMAIN_PORT_CRT, 189 POWER_DOMAIN_PORT_CRT,
194 POWER_DOMAIN_PORT_OTHER, 190 POWER_DOMAIN_PORT_OTHER,
@@ -200,6 +196,7 @@ enum intel_display_power_domain {
200 POWER_DOMAIN_AUX_C, 196 POWER_DOMAIN_AUX_C,
201 POWER_DOMAIN_AUX_D, 197 POWER_DOMAIN_AUX_D,
202 POWER_DOMAIN_GMBUS, 198 POWER_DOMAIN_GMBUS,
199 POWER_DOMAIN_MODESET,
203 POWER_DOMAIN_INIT, 200 POWER_DOMAIN_INIT,
204 201
205 POWER_DOMAIN_NUM, 202 POWER_DOMAIN_NUM,
@@ -289,7 +286,7 @@ struct i915_hotplug {
289 list_for_each_entry(intel_plane, \ 286 list_for_each_entry(intel_plane, \
290 &(dev)->mode_config.plane_list, \ 287 &(dev)->mode_config.plane_list, \
291 base.head) \ 288 base.head) \
292 if ((intel_plane)->pipe == (intel_crtc)->pipe) 289 for_each_if ((intel_plane)->pipe == (intel_crtc)->pipe)
293 290
294#define for_each_intel_crtc(dev, intel_crtc) \ 291#define for_each_intel_crtc(dev, intel_crtc) \
295 list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list, base.head) 292 list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list, base.head)
@@ -306,15 +303,15 @@ struct i915_hotplug {
306 303
307#define for_each_encoder_on_crtc(dev, __crtc, intel_encoder) \ 304#define for_each_encoder_on_crtc(dev, __crtc, intel_encoder) \
308 list_for_each_entry((intel_encoder), &(dev)->mode_config.encoder_list, base.head) \ 305 list_for_each_entry((intel_encoder), &(dev)->mode_config.encoder_list, base.head) \
309 if ((intel_encoder)->base.crtc == (__crtc)) 306 for_each_if ((intel_encoder)->base.crtc == (__crtc))
310 307
311#define for_each_connector_on_encoder(dev, __encoder, intel_connector) \ 308#define for_each_connector_on_encoder(dev, __encoder, intel_connector) \
312 list_for_each_entry((intel_connector), &(dev)->mode_config.connector_list, base.head) \ 309 list_for_each_entry((intel_connector), &(dev)->mode_config.connector_list, base.head) \
313 if ((intel_connector)->base.encoder == (__encoder)) 310 for_each_if ((intel_connector)->base.encoder == (__encoder))
314 311
315#define for_each_power_domain(domain, mask) \ 312#define for_each_power_domain(domain, mask) \
316 for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \ 313 for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \
317 if ((1 << (domain)) & (mask)) 314 for_each_if ((1 << (domain)) & (mask))
318 315
319struct drm_i915_private; 316struct drm_i915_private;
320struct i915_mm_struct; 317struct i915_mm_struct;
@@ -631,11 +628,9 @@ struct drm_i915_display_funcs {
631 int target, int refclk, 628 int target, int refclk,
632 struct dpll *match_clock, 629 struct dpll *match_clock,
633 struct dpll *best_clock); 630 struct dpll *best_clock);
631 int (*compute_pipe_wm)(struct intel_crtc *crtc,
632 struct drm_atomic_state *state);
634 void (*update_wm)(struct drm_crtc *crtc); 633 void (*update_wm)(struct drm_crtc *crtc);
635 void (*update_sprite_wm)(struct drm_plane *plane,
636 struct drm_crtc *crtc,
637 uint32_t sprite_width, uint32_t sprite_height,
638 int pixel_size, bool enable, bool scaled);
639 int (*modeset_calc_cdclk)(struct drm_atomic_state *state); 634 int (*modeset_calc_cdclk)(struct drm_atomic_state *state);
640 void (*modeset_commit_cdclk)(struct drm_atomic_state *state); 635 void (*modeset_commit_cdclk)(struct drm_atomic_state *state);
641 /* Returns the active state of the crtc, and if the crtc is active, 636 /* Returns the active state of the crtc, and if the crtc is active,
@@ -693,18 +688,18 @@ struct intel_uncore_funcs {
693 void (*force_wake_put)(struct drm_i915_private *dev_priv, 688 void (*force_wake_put)(struct drm_i915_private *dev_priv,
694 enum forcewake_domains domains); 689 enum forcewake_domains domains);
695 690
696 uint8_t (*mmio_readb)(struct drm_i915_private *dev_priv, off_t offset, bool trace); 691 uint8_t (*mmio_readb)(struct drm_i915_private *dev_priv, i915_reg_t r, bool trace);
697 uint16_t (*mmio_readw)(struct drm_i915_private *dev_priv, off_t offset, bool trace); 692 uint16_t (*mmio_readw)(struct drm_i915_private *dev_priv, i915_reg_t r, bool trace);
698 uint32_t (*mmio_readl)(struct drm_i915_private *dev_priv, off_t offset, bool trace); 693 uint32_t (*mmio_readl)(struct drm_i915_private *dev_priv, i915_reg_t r, bool trace);
699 uint64_t (*mmio_readq)(struct drm_i915_private *dev_priv, off_t offset, bool trace); 694 uint64_t (*mmio_readq)(struct drm_i915_private *dev_priv, i915_reg_t r, bool trace);
700 695
701 void (*mmio_writeb)(struct drm_i915_private *dev_priv, off_t offset, 696 void (*mmio_writeb)(struct drm_i915_private *dev_priv, i915_reg_t r,
702 uint8_t val, bool trace); 697 uint8_t val, bool trace);
703 void (*mmio_writew)(struct drm_i915_private *dev_priv, off_t offset, 698 void (*mmio_writew)(struct drm_i915_private *dev_priv, i915_reg_t r,
704 uint16_t val, bool trace); 699 uint16_t val, bool trace);
705 void (*mmio_writel)(struct drm_i915_private *dev_priv, off_t offset, 700 void (*mmio_writel)(struct drm_i915_private *dev_priv, i915_reg_t r,
706 uint32_t val, bool trace); 701 uint32_t val, bool trace);
707 void (*mmio_writeq)(struct drm_i915_private *dev_priv, off_t offset, 702 void (*mmio_writeq)(struct drm_i915_private *dev_priv, i915_reg_t r,
708 uint64_t val, bool trace); 703 uint64_t val, bool trace);
709}; 704};
710 705
@@ -721,11 +716,11 @@ struct intel_uncore {
721 enum forcewake_domain_id id; 716 enum forcewake_domain_id id;
722 unsigned wake_count; 717 unsigned wake_count;
723 struct timer_list timer; 718 struct timer_list timer;
724 u32 reg_set; 719 i915_reg_t reg_set;
725 u32 val_set; 720 u32 val_set;
726 u32 val_clear; 721 u32 val_clear;
727 u32 reg_ack; 722 i915_reg_t reg_ack;
728 u32 reg_post; 723 i915_reg_t reg_post;
729 u32 val_reset; 724 u32 val_reset;
730 } fw_domain[FW_DOMAIN_ID_COUNT]; 725 } fw_domain[FW_DOMAIN_ID_COUNT];
731}; 726};
@@ -735,25 +730,24 @@ struct intel_uncore {
735 for ((i__) = 0, (domain__) = &(dev_priv__)->uncore.fw_domain[0]; \ 730 for ((i__) = 0, (domain__) = &(dev_priv__)->uncore.fw_domain[0]; \
736 (i__) < FW_DOMAIN_ID_COUNT; \ 731 (i__) < FW_DOMAIN_ID_COUNT; \
737 (i__)++, (domain__) = &(dev_priv__)->uncore.fw_domain[i__]) \ 732 (i__)++, (domain__) = &(dev_priv__)->uncore.fw_domain[i__]) \
738 if (((mask__) & (dev_priv__)->uncore.fw_domains) & (1 << (i__))) 733 for_each_if (((mask__) & (dev_priv__)->uncore.fw_domains) & (1 << (i__)))
739 734
740#define for_each_fw_domain(domain__, dev_priv__, i__) \ 735#define for_each_fw_domain(domain__, dev_priv__, i__) \
741 for_each_fw_domain_mask(domain__, FORCEWAKE_ALL, dev_priv__, i__) 736 for_each_fw_domain_mask(domain__, FORCEWAKE_ALL, dev_priv__, i__)
742 737
743enum csr_state { 738#define CSR_VERSION(major, minor) ((major) << 16 | (minor))
744 FW_UNINITIALIZED = 0, 739#define CSR_VERSION_MAJOR(version) ((version) >> 16)
745 FW_LOADED, 740#define CSR_VERSION_MINOR(version) ((version) & 0xffff)
746 FW_FAILED
747};
748 741
749struct intel_csr { 742struct intel_csr {
743 struct work_struct work;
750 const char *fw_path; 744 const char *fw_path;
751 uint32_t *dmc_payload; 745 uint32_t *dmc_payload;
752 uint32_t dmc_fw_size; 746 uint32_t dmc_fw_size;
747 uint32_t version;
753 uint32_t mmio_count; 748 uint32_t mmio_count;
754 uint32_t mmioaddr[8]; 749 i915_reg_t mmioaddr[8];
755 uint32_t mmiodata[8]; 750 uint32_t mmiodata[8];
756 enum csr_state state;
757}; 751};
758 752
759#define DEV_INFO_FOR_EACH_FLAG(func, sep) \ 753#define DEV_INFO_FOR_EACH_FLAG(func, sep) \
@@ -771,6 +765,8 @@ struct intel_csr {
771 func(is_valleyview) sep \ 765 func(is_valleyview) sep \
772 func(is_haswell) sep \ 766 func(is_haswell) sep \
773 func(is_skylake) sep \ 767 func(is_skylake) sep \
768 func(is_broxton) sep \
769 func(is_kabylake) sep \
774 func(is_preliminary) sep \ 770 func(is_preliminary) sep \
775 func(has_fbc) sep \ 771 func(has_fbc) sep \
776 func(has_pipe_cxsr) sep \ 772 func(has_pipe_cxsr) sep \
@@ -929,24 +925,7 @@ struct i915_fbc {
929 struct drm_framebuffer *fb; 925 struct drm_framebuffer *fb;
930 } *fbc_work; 926 } *fbc_work;
931 927
932 enum no_fbc_reason { 928 const char *no_fbc_reason;
933 FBC_OK, /* FBC is enabled */
934 FBC_UNSUPPORTED, /* FBC is not supported by this chipset */
935 FBC_NO_OUTPUT, /* no outputs enabled to compress */
936 FBC_STOLEN_TOO_SMALL, /* not enough space for buffers */
937 FBC_UNSUPPORTED_MODE, /* interlace or doublescanned mode */
938 FBC_MODE_TOO_LARGE, /* mode too large for compression */
939 FBC_BAD_PLANE, /* fbc not supported on plane */
940 FBC_NOT_TILED, /* buffer not tiled */
941 FBC_MULTIPLE_PIPES, /* more than one pipe active */
942 FBC_MODULE_PARAM,
943 FBC_CHIP_DEFAULT, /* disabled by default on this chip */
944 FBC_ROTATION, /* rotation is not supported */
945 FBC_IN_DBG_MASTER, /* kernel debugger is active */
946 FBC_BAD_STRIDE, /* stride is not supported */
947 FBC_PIXEL_RATE, /* pixel rate is too big */
948 FBC_PIXEL_FORMAT /* pixel format is invalid */
949 } no_fbc_reason;
950 929
951 bool (*fbc_enabled)(struct drm_i915_private *dev_priv); 930 bool (*fbc_enabled)(struct drm_i915_private *dev_priv);
952 void (*enable_fbc)(struct intel_crtc *crtc); 931 void (*enable_fbc)(struct intel_crtc *crtc);
@@ -1020,7 +999,7 @@ struct intel_gmbus {
1020 struct i2c_adapter adapter; 999 struct i2c_adapter adapter;
1021 u32 force_bit; 1000 u32 force_bit;
1022 u32 reg0; 1001 u32 reg0;
1023 u32 gpio_reg; 1002 i915_reg_t gpio_reg;
1024 struct i2c_algo_bit_data bit_algo; 1003 struct i2c_algo_bit_data bit_algo;
1025 struct drm_i915_private *dev_priv; 1004 struct drm_i915_private *dev_priv;
1026}; 1005};
@@ -1669,7 +1648,7 @@ struct i915_frontbuffer_tracking {
1669}; 1648};
1670 1649
1671struct i915_wa_reg { 1650struct i915_wa_reg {
1672 u32 addr; 1651 i915_reg_t addr;
1673 u32 value; 1652 u32 value;
1674 /* bitmask representing WA bits */ 1653 /* bitmask representing WA bits */
1675 u32 mask; 1654 u32 mask;
@@ -1698,6 +1677,13 @@ struct i915_execbuffer_params {
1698 struct drm_i915_gem_request *request; 1677 struct drm_i915_gem_request *request;
1699}; 1678};
1700 1679
1680/* used in computing the new watermarks state */
1681struct intel_wm_config {
1682 unsigned int num_pipes_active;
1683 bool sprites_enabled;
1684 bool sprites_scaled;
1685};
1686
1701struct drm_i915_private { 1687struct drm_i915_private {
1702 struct drm_device *dev; 1688 struct drm_device *dev;
1703 struct kmem_cache *objects; 1689 struct kmem_cache *objects;
@@ -1718,9 +1704,6 @@ struct drm_i915_private {
1718 1704
1719 struct intel_csr csr; 1705 struct intel_csr csr;
1720 1706
1721 /* Display CSR-related protection */
1722 struct mutex csr_lock;
1723
1724 struct intel_gmbus gmbus[GMBUS_NUM_PINS]; 1707 struct intel_gmbus gmbus[GMBUS_NUM_PINS];
1725 1708
1726 /** gmbus_mutex protects against concurrent usage of the single hw gmbus 1709 /** gmbus_mutex protects against concurrent usage of the single hw gmbus
@@ -1735,6 +1718,8 @@ struct drm_i915_private {
1735 /* MMIO base address for MIPI regs */ 1718 /* MMIO base address for MIPI regs */
1736 uint32_t mipi_mmio_base; 1719 uint32_t mipi_mmio_base;
1737 1720
1721 uint32_t psr_mmio_base;
1722
1738 wait_queue_head_t gmbus_wait_queue; 1723 wait_queue_head_t gmbus_wait_queue;
1739 1724
1740 struct pci_dev *bridge_dev; 1725 struct pci_dev *bridge_dev;
@@ -1922,6 +1907,9 @@ struct drm_i915_private {
1922 */ 1907 */
1923 uint16_t skl_latency[8]; 1908 uint16_t skl_latency[8];
1924 1909
1910 /* Committed wm config */
1911 struct intel_wm_config config;
1912
1925 /* 1913 /*
1926 * The skl_wm_values structure is a bit too big for stack 1914 * The skl_wm_values structure is a bit too big for stack
1927 * allocation, so we keep the staging struct where we store 1915 * allocation, so we keep the staging struct where we store
@@ -1956,6 +1944,8 @@ struct drm_i915_private {
1956 /* perform PHY state sanity checks? */ 1944 /* perform PHY state sanity checks? */
1957 bool chv_phy_assert[2]; 1945 bool chv_phy_assert[2];
1958 1946
1947 struct intel_encoder *dig_port_map[I915_MAX_PORTS];
1948
1959 /* 1949 /*
1960 * NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch 1950 * NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch
1961 * will be rejected. Instead look for a better place. 1951 * will be rejected. Instead look for a better place.
@@ -1980,7 +1970,7 @@ static inline struct drm_i915_private *guc_to_i915(struct intel_guc *guc)
1980/* Iterate over initialised rings */ 1970/* Iterate over initialised rings */
1981#define for_each_ring(ring__, dev_priv__, i__) \ 1971#define for_each_ring(ring__, dev_priv__, i__) \
1982 for ((i__) = 0; (i__) < I915_NUM_RINGS; (i__)++) \ 1972 for ((i__) = 0; (i__) < I915_NUM_RINGS; (i__)++) \
1983 if (((ring__) = &(dev_priv__)->ring[(i__)]), intel_ring_initialized((ring__))) 1973 for_each_if ((((ring__) = &(dev_priv__)->ring[(i__)]), intel_ring_initialized((ring__))))
1984 1974
1985enum hdmi_force_audio { 1975enum hdmi_force_audio {
1986 HDMI_AUDIO_OFF_DVI = -2, /* no aux data for HDMI-DVI converter */ 1976 HDMI_AUDIO_OFF_DVI = -2, /* no aux data for HDMI-DVI converter */
@@ -2445,6 +2435,15 @@ struct drm_i915_cmd_table {
2445#define INTEL_DEVID(p) (INTEL_INFO(p)->device_id) 2435#define INTEL_DEVID(p) (INTEL_INFO(p)->device_id)
2446#define INTEL_REVID(p) (__I915__(p)->dev->pdev->revision) 2436#define INTEL_REVID(p) (__I915__(p)->dev->pdev->revision)
2447 2437
2438#define REVID_FOREVER 0xff
2439/*
2440 * Return true if revision is in range [since,until] inclusive.
2441 *
2442 * Use 0 for open-ended since, and REVID_FOREVER for open-ended until.
2443 */
2444#define IS_REVID(p, since, until) \
2445 (INTEL_REVID(p) >= (since) && INTEL_REVID(p) <= (until))
2446
2448#define IS_I830(dev) (INTEL_DEVID(dev) == 0x3577) 2447#define IS_I830(dev) (INTEL_DEVID(dev) == 0x3577)
2449#define IS_845G(dev) (INTEL_DEVID(dev) == 0x2562) 2448#define IS_845G(dev) (INTEL_DEVID(dev) == 0x2562)
2450#define IS_I85X(dev) (INTEL_INFO(dev)->is_i85x) 2449#define IS_I85X(dev) (INTEL_INFO(dev)->is_i85x)
@@ -2471,7 +2470,8 @@ struct drm_i915_cmd_table {
2471#define IS_HASWELL(dev) (INTEL_INFO(dev)->is_haswell) 2470#define IS_HASWELL(dev) (INTEL_INFO(dev)->is_haswell)
2472#define IS_BROADWELL(dev) (!INTEL_INFO(dev)->is_valleyview && IS_GEN8(dev)) 2471#define IS_BROADWELL(dev) (!INTEL_INFO(dev)->is_valleyview && IS_GEN8(dev))
2473#define IS_SKYLAKE(dev) (INTEL_INFO(dev)->is_skylake) 2472#define IS_SKYLAKE(dev) (INTEL_INFO(dev)->is_skylake)
2474#define IS_BROXTON(dev) (!INTEL_INFO(dev)->is_skylake && IS_GEN9(dev)) 2473#define IS_BROXTON(dev) (INTEL_INFO(dev)->is_broxton)
2474#define IS_KABYLAKE(dev) (INTEL_INFO(dev)->is_kabylake)
2475#define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) 2475#define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile)
2476#define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \ 2476#define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \
2477 (INTEL_DEVID(dev) & 0xFF00) == 0x0C00) 2477 (INTEL_DEVID(dev) & 0xFF00) == 0x0C00)
@@ -2506,16 +2506,21 @@ struct drm_i915_cmd_table {
2506 2506
2507#define IS_PRELIMINARY_HW(intel_info) ((intel_info)->is_preliminary) 2507#define IS_PRELIMINARY_HW(intel_info) ((intel_info)->is_preliminary)
2508 2508
2509#define SKL_REVID_A0 (0x0) 2509#define SKL_REVID_A0 0x0
2510#define SKL_REVID_B0 (0x1) 2510#define SKL_REVID_B0 0x1
2511#define SKL_REVID_C0 (0x2) 2511#define SKL_REVID_C0 0x2
2512#define SKL_REVID_D0 (0x3) 2512#define SKL_REVID_D0 0x3
2513#define SKL_REVID_E0 (0x4) 2513#define SKL_REVID_E0 0x4
2514#define SKL_REVID_F0 (0x5) 2514#define SKL_REVID_F0 0x5
2515
2516#define IS_SKL_REVID(p, since, until) (IS_SKYLAKE(p) && IS_REVID(p, since, until))
2515 2517
2516#define BXT_REVID_A0 (0x0) 2518#define BXT_REVID_A0 0x0
2517#define BXT_REVID_B0 (0x3) 2519#define BXT_REVID_A1 0x1
2518#define BXT_REVID_C0 (0x9) 2520#define BXT_REVID_B0 0x3
2521#define BXT_REVID_C0 0x9
2522
2523#define IS_BXT_REVID(p, since, until) (IS_BROXTON(p) && IS_REVID(p, since, until))
2519 2524
2520/* 2525/*
2521 * The genX designation typically refers to the render engine, so render 2526 * The genX designation typically refers to the render engine, so render
@@ -2587,10 +2592,10 @@ struct drm_i915_cmd_table {
2587#define HAS_FPGA_DBG_UNCLAIMED(dev) (INTEL_INFO(dev)->has_fpga_dbg) 2592#define HAS_FPGA_DBG_UNCLAIMED(dev) (INTEL_INFO(dev)->has_fpga_dbg)
2588#define HAS_PSR(dev) (IS_HASWELL(dev) || IS_BROADWELL(dev) || \ 2593#define HAS_PSR(dev) (IS_HASWELL(dev) || IS_BROADWELL(dev) || \
2589 IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev) || \ 2594 IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev) || \
2590 IS_SKYLAKE(dev)) 2595 IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
2591#define HAS_RUNTIME_PM(dev) (IS_GEN6(dev) || IS_HASWELL(dev) || \ 2596#define HAS_RUNTIME_PM(dev) (IS_GEN6(dev) || IS_HASWELL(dev) || \
2592 IS_BROADWELL(dev) || IS_VALLEYVIEW(dev) || \ 2597 IS_BROADWELL(dev) || IS_VALLEYVIEW(dev) || \
2593 IS_SKYLAKE(dev)) 2598 IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
2594#define HAS_RC6(dev) (INTEL_INFO(dev)->gen >= 6) 2599#define HAS_RC6(dev) (INTEL_INFO(dev)->gen >= 6)
2595#define HAS_RC6p(dev) (INTEL_INFO(dev)->gen == 6 || IS_IVYBRIDGE(dev)) 2600#define HAS_RC6p(dev) (INTEL_INFO(dev)->gen == 6 || IS_IVYBRIDGE(dev))
2596 2601
@@ -2650,6 +2655,7 @@ struct i915_params {
2650 int panel_use_ssc; 2655 int panel_use_ssc;
2651 int vbt_sdvo_panel_type; 2656 int vbt_sdvo_panel_type;
2652 int enable_rc6; 2657 int enable_rc6;
2658 int enable_dc;
2653 int enable_fbc; 2659 int enable_fbc;
2654 int enable_ppgtt; 2660 int enable_ppgtt;
2655 int enable_execlists; 2661 int enable_execlists;
@@ -2698,7 +2704,6 @@ extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv);
2698extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv); 2704extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv);
2699extern void i915_update_gfx_val(struct drm_i915_private *dev_priv); 2705extern void i915_update_gfx_val(struct drm_i915_private *dev_priv);
2700int vlv_force_gfx_clock(struct drm_i915_private *dev_priv, bool on); 2706int vlv_force_gfx_clock(struct drm_i915_private *dev_priv, bool on);
2701void i915_firmware_load_error_print(const char *fw_path, int err);
2702 2707
2703/* intel_hotplug.c */ 2708/* intel_hotplug.c */
2704void intel_hpd_irq_handler(struct drm_device *dev, u32 pin_mask, u32 long_mask); 2709void intel_hpd_irq_handler(struct drm_device *dev, u32 pin_mask, u32 long_mask);
@@ -3008,8 +3013,6 @@ i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write);
3008int __must_check 3013int __must_check
3009i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj, 3014i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
3010 u32 alignment, 3015 u32 alignment,
3011 struct intel_engine_cs *pipelined,
3012 struct drm_i915_gem_request **pipelined_request,
3013 const struct i915_ggtt_view *view); 3016 const struct i915_ggtt_view *view);
3014void i915_gem_object_unpin_from_display_plane(struct drm_i915_gem_object *obj, 3017void i915_gem_object_unpin_from_display_plane(struct drm_i915_gem_object *obj,
3015 const struct i915_ggtt_view *view); 3018 const struct i915_ggtt_view *view);
@@ -3364,7 +3367,6 @@ extern void intel_set_rps(struct drm_device *dev, u8 val);
3364extern void intel_set_memory_cxsr(struct drm_i915_private *dev_priv, 3367extern void intel_set_memory_cxsr(struct drm_i915_private *dev_priv,
3365 bool enable); 3368 bool enable);
3366extern void intel_detect_pch(struct drm_device *dev); 3369extern void intel_detect_pch(struct drm_device *dev);
3367extern int intel_trans_dp_port_sel(struct drm_crtc *crtc);
3368extern int intel_enable_rc6(const struct drm_device *dev); 3370extern int intel_enable_rc6(const struct drm_device *dev);
3369 3371
3370extern bool i915_semaphore_is_enabled(struct drm_device *dev); 3372extern bool i915_semaphore_is_enabled(struct drm_device *dev);
@@ -3447,6 +3449,32 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
3447#define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) 3449#define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg)
3448#define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg) 3450#define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg)
3449 3451
3452#define __raw_read(x, s) \
3453static inline uint##x##_t __raw_i915_read##x(struct drm_i915_private *dev_priv, \
3454 i915_reg_t reg) \
3455{ \
3456 return read##s(dev_priv->regs + i915_mmio_reg_offset(reg)); \
3457}
3458
3459#define __raw_write(x, s) \
3460static inline void __raw_i915_write##x(struct drm_i915_private *dev_priv, \
3461 i915_reg_t reg, uint##x##_t val) \
3462{ \
3463 write##s(val, dev_priv->regs + i915_mmio_reg_offset(reg)); \
3464}
3465__raw_read(8, b)
3466__raw_read(16, w)
3467__raw_read(32, l)
3468__raw_read(64, q)
3469
3470__raw_write(8, b)
3471__raw_write(16, w)
3472__raw_write(32, l)
3473__raw_write(64, q)
3474
3475#undef __raw_read
3476#undef __raw_write
3477
3450/* These are untraced mmio-accessors that are only valid to be used inside 3478/* These are untraced mmio-accessors that are only valid to be used inside
3451 * criticial sections inside IRQ handlers where forcewake is explicitly 3479 * criticial sections inside IRQ handlers where forcewake is explicitly
3452 * controlled. 3480 * controlled.
@@ -3454,8 +3482,8 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
3454 * Note: Should only be used between intel_uncore_forcewake_irqlock() and 3482 * Note: Should only be used between intel_uncore_forcewake_irqlock() and
3455 * intel_uncore_forcewake_irqunlock(). 3483 * intel_uncore_forcewake_irqunlock().
3456 */ 3484 */
3457#define I915_READ_FW(reg__) readl(dev_priv->regs + (reg__)) 3485#define I915_READ_FW(reg__) __raw_i915_read32(dev_priv, (reg__))
3458#define I915_WRITE_FW(reg__, val__) writel(val__, dev_priv->regs + (reg__)) 3486#define I915_WRITE_FW(reg__, val__) __raw_i915_write32(dev_priv, (reg__), (val__))
3459#define POSTING_READ_FW(reg__) (void)I915_READ_FW(reg__) 3487#define POSTING_READ_FW(reg__) (void)I915_READ_FW(reg__)
3460 3488
3461/* "Broadcast RGB" property */ 3489/* "Broadcast RGB" property */
@@ -3463,7 +3491,7 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
3463#define INTEL_BROADCAST_RGB_FULL 1 3491#define INTEL_BROADCAST_RGB_FULL 1
3464#define INTEL_BROADCAST_RGB_LIMITED 2 3492#define INTEL_BROADCAST_RGB_LIMITED 2
3465 3493
3466static inline uint32_t i915_vgacntrl_reg(struct drm_device *dev) 3494static inline i915_reg_t i915_vgacntrl_reg(struct drm_device *dev)
3467{ 3495{
3468 if (IS_VALLEYVIEW(dev)) 3496 if (IS_VALLEYVIEW(dev))
3469 return VLV_VGACNTRL; 3497 return VLV_VGACNTRL;
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index f56af0aaafde..262020f8b38d 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2797,6 +2797,8 @@ static void i915_gem_reset_ring_status(struct drm_i915_private *dev_priv,
2797static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv, 2797static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv,
2798 struct intel_engine_cs *ring) 2798 struct intel_engine_cs *ring)
2799{ 2799{
2800 struct intel_ringbuffer *buffer;
2801
2800 while (!list_empty(&ring->active_list)) { 2802 while (!list_empty(&ring->active_list)) {
2801 struct drm_i915_gem_object *obj; 2803 struct drm_i915_gem_object *obj;
2802 2804
@@ -2812,18 +2814,23 @@ static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv,
2812 * are the ones that keep the context and ringbuffer backing objects 2814 * are the ones that keep the context and ringbuffer backing objects
2813 * pinned in place. 2815 * pinned in place.
2814 */ 2816 */
2815 while (!list_empty(&ring->execlist_queue)) {
2816 struct drm_i915_gem_request *submit_req;
2817 2817
2818 submit_req = list_first_entry(&ring->execlist_queue, 2818 if (i915.enable_execlists) {
2819 struct drm_i915_gem_request, 2819 spin_lock_irq(&ring->execlist_lock);
2820 execlist_link); 2820 while (!list_empty(&ring->execlist_queue)) {
2821 list_del(&submit_req->execlist_link); 2821 struct drm_i915_gem_request *submit_req;
2822
2823 submit_req = list_first_entry(&ring->execlist_queue,
2824 struct drm_i915_gem_request,
2825 execlist_link);
2826 list_del(&submit_req->execlist_link);
2822 2827
2823 if (submit_req->ctx != ring->default_context) 2828 if (submit_req->ctx != ring->default_context)
2824 intel_lr_context_unpin(submit_req); 2829 intel_lr_context_unpin(submit_req);
2825 2830
2826 i915_gem_request_unreference(submit_req); 2831 i915_gem_request_unreference(submit_req);
2832 }
2833 spin_unlock_irq(&ring->execlist_lock);
2827 } 2834 }
2828 2835
2829 /* 2836 /*
@@ -2842,6 +2849,18 @@ static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv,
2842 2849
2843 i915_gem_request_retire(request); 2850 i915_gem_request_retire(request);
2844 } 2851 }
2852
2853 /* Having flushed all requests from all queues, we know that all
2854 * ringbuffers must now be empty. However, since we do not reclaim
2855 * all space when retiring the request (to prevent HEADs colliding
2856 * with rapid ringbuffer wraparound) the amount of available space
2857 * upon reset is less than when we start. Do one more pass over
2858 * all the ringbuffers to reset last_retired_head.
2859 */
2860 list_for_each_entry(buffer, &ring->buffers, link) {
2861 buffer->last_retired_head = buffer->tail;
2862 intel_ring_update_space(buffer);
2863 }
2845} 2864}
2846 2865
2847void i915_gem_reset(struct drm_device *dev) 2866void i915_gem_reset(struct drm_device *dev)
@@ -3886,7 +3905,7 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
3886 * cacheline, whereas normally such cachelines would get 3905 * cacheline, whereas normally such cachelines would get
3887 * invalidated. 3906 * invalidated.
3888 */ 3907 */
3889 if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) 3908 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1))
3890 return -ENODEV; 3909 return -ENODEV;
3891 3910
3892 level = I915_CACHE_LLC; 3911 level = I915_CACHE_LLC;
@@ -3929,17 +3948,11 @@ rpm_put:
3929int 3948int
3930i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj, 3949i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
3931 u32 alignment, 3950 u32 alignment,
3932 struct intel_engine_cs *pipelined,
3933 struct drm_i915_gem_request **pipelined_request,
3934 const struct i915_ggtt_view *view) 3951 const struct i915_ggtt_view *view)
3935{ 3952{
3936 u32 old_read_domains, old_write_domain; 3953 u32 old_read_domains, old_write_domain;
3937 int ret; 3954 int ret;
3938 3955
3939 ret = i915_gem_object_sync(obj, pipelined, pipelined_request);
3940 if (ret)
3941 return ret;
3942
3943 /* Mark the pin_display early so that we account for the 3956 /* Mark the pin_display early so that we account for the
3944 * display coherency whilst setting up the cache domains. 3957 * display coherency whilst setting up the cache domains.
3945 */ 3958 */
@@ -4541,10 +4554,8 @@ struct i915_vma *i915_gem_obj_to_vma(struct drm_i915_gem_object *obj,
4541{ 4554{
4542 struct i915_vma *vma; 4555 struct i915_vma *vma;
4543 list_for_each_entry(vma, &obj->vma_list, vma_link) { 4556 list_for_each_entry(vma, &obj->vma_list, vma_link) {
4544 if (i915_is_ggtt(vma->vm) && 4557 if (vma->ggtt_view.type == I915_GGTT_VIEW_NORMAL &&
4545 vma->ggtt_view.type != I915_GGTT_VIEW_NORMAL) 4558 vma->vm == vm)
4546 continue;
4547 if (vma->vm == vm)
4548 return vma; 4559 return vma;
4549 } 4560 }
4550 return NULL; 4561 return NULL;
@@ -4633,7 +4644,6 @@ int i915_gem_l3_remap(struct drm_i915_gem_request *req, int slice)
4633 struct intel_engine_cs *ring = req->ring; 4644 struct intel_engine_cs *ring = req->ring;
4634 struct drm_device *dev = ring->dev; 4645 struct drm_device *dev = ring->dev;
4635 struct drm_i915_private *dev_priv = dev->dev_private; 4646 struct drm_i915_private *dev_priv = dev->dev_private;
4636 u32 reg_base = GEN7_L3LOG_BASE + (slice * 0x200);
4637 u32 *remap_info = dev_priv->l3_parity.remap_info[slice]; 4647 u32 *remap_info = dev_priv->l3_parity.remap_info[slice];
4638 int i, ret; 4648 int i, ret;
4639 4649
@@ -4649,10 +4659,10 @@ int i915_gem_l3_remap(struct drm_i915_gem_request *req, int slice)
4649 * here because no other code should access these registers other than 4659 * here because no other code should access these registers other than
4650 * at initialization time. 4660 * at initialization time.
4651 */ 4661 */
4652 for (i = 0; i < GEN7_L3LOG_SIZE; i += 4) { 4662 for (i = 0; i < GEN7_L3LOG_SIZE / 4; i++) {
4653 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); 4663 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
4654 intel_ring_emit(ring, reg_base + i); 4664 intel_ring_emit_reg(ring, GEN7_L3LOG(slice, i));
4655 intel_ring_emit(ring, remap_info[i/4]); 4665 intel_ring_emit(ring, remap_info[i]);
4656 } 4666 }
4657 4667
4658 intel_ring_advance(ring); 4668 intel_ring_advance(ring);
@@ -4820,18 +4830,9 @@ i915_gem_init_hw(struct drm_device *dev)
4820 if (HAS_GUC_UCODE(dev)) { 4830 if (HAS_GUC_UCODE(dev)) {
4821 ret = intel_guc_ucode_load(dev); 4831 ret = intel_guc_ucode_load(dev);
4822 if (ret) { 4832 if (ret) {
4823 /* 4833 DRM_ERROR("Failed to initialize GuC, error %d\n", ret);
4824 * If we got an error and GuC submission is enabled, map 4834 ret = -EIO;
4825 * the error to -EIO so the GPU will be declared wedged. 4835 goto out;
4826 * OTOH, if we didn't intend to use the GuC anyway, just
4827 * discard the error and carry on.
4828 */
4829 DRM_ERROR("Failed to initialize GuC, error %d%s\n", ret,
4830 i915.enable_guc_submission ? "" :
4831 " (ignored)");
4832 ret = i915.enable_guc_submission ? -EIO : 0;
4833 if (ret)
4834 goto out;
4835 } 4836 }
4836 } 4837 }
4837 4838
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 02ceb7a4b481..43761c5bcaca 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -554,7 +554,7 @@ mi_set_context(struct drm_i915_gem_request *req, u32 hw_flags)
554 if (signaller == ring) 554 if (signaller == ring)
555 continue; 555 continue;
556 556
557 intel_ring_emit(ring, RING_PSMI_CTL(signaller->mmio_base)); 557 intel_ring_emit_reg(ring, RING_PSMI_CTL(signaller->mmio_base));
558 intel_ring_emit(ring, _MASKED_BIT_ENABLE(GEN6_PSMI_SLEEP_MSG_DISABLE)); 558 intel_ring_emit(ring, _MASKED_BIT_ENABLE(GEN6_PSMI_SLEEP_MSG_DISABLE));
559 } 559 }
560 } 560 }
@@ -579,7 +579,7 @@ mi_set_context(struct drm_i915_gem_request *req, u32 hw_flags)
579 if (signaller == ring) 579 if (signaller == ring)
580 continue; 580 continue;
581 581
582 intel_ring_emit(ring, RING_PSMI_CTL(signaller->mmio_base)); 582 intel_ring_emit_reg(ring, RING_PSMI_CTL(signaller->mmio_base));
583 intel_ring_emit(ring, _MASKED_BIT_DISABLE(GEN6_PSMI_SLEEP_MSG_DISABLE)); 583 intel_ring_emit(ring, _MASKED_BIT_DISABLE(GEN6_PSMI_SLEEP_MSG_DISABLE));
584 } 584 }
585 } 585 }
@@ -923,6 +923,14 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
923 case I915_CONTEXT_PARAM_NO_ZEROMAP: 923 case I915_CONTEXT_PARAM_NO_ZEROMAP:
924 args->value = ctx->flags & CONTEXT_NO_ZEROMAP; 924 args->value = ctx->flags & CONTEXT_NO_ZEROMAP;
925 break; 925 break;
926 case I915_CONTEXT_PARAM_GTT_SIZE:
927 if (ctx->ppgtt)
928 args->value = ctx->ppgtt->base.total;
929 else if (to_i915(dev)->mm.aliasing_ppgtt)
930 args->value = to_i915(dev)->mm.aliasing_ppgtt->base.total;
931 else
932 args->value = to_i915(dev)->gtt.base.total;
933 break;
926 default: 934 default:
927 ret = -EINVAL; 935 ret = -EINVAL;
928 break; 936 break;
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 6ed7d63a0688..a4c243cec4aa 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -1114,7 +1114,7 @@ i915_reset_gen7_sol_offsets(struct drm_device *dev,
1114 1114
1115 for (i = 0; i < 4; i++) { 1115 for (i = 0; i < 4; i++) {
1116 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); 1116 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
1117 intel_ring_emit(ring, GEN7_SO_WRITE_OFFSET(i)); 1117 intel_ring_emit_reg(ring, GEN7_SO_WRITE_OFFSET(i));
1118 intel_ring_emit(ring, 0); 1118 intel_ring_emit(ring, 0);
1119 } 1119 }
1120 1120
@@ -1241,7 +1241,7 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
1241 1241
1242 intel_ring_emit(ring, MI_NOOP); 1242 intel_ring_emit(ring, MI_NOOP);
1243 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); 1243 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
1244 intel_ring_emit(ring, INSTPM); 1244 intel_ring_emit_reg(ring, INSTPM);
1245 intel_ring_emit(ring, instp_mask << 16 | instp_mode); 1245 intel_ring_emit(ring, instp_mask << 16 | instp_mode);
1246 intel_ring_advance(ring); 1246 intel_ring_advance(ring);
1247 1247
diff --git a/drivers/gpu/drm/i915/i915_gem_fence.c b/drivers/gpu/drm/i915/i915_gem_fence.c
index f010391b87f5..598198543dcd 100644
--- a/drivers/gpu/drm/i915/i915_gem_fence.c
+++ b/drivers/gpu/drm/i915/i915_gem_fence.c
@@ -59,7 +59,7 @@ static void i965_write_fence_reg(struct drm_device *dev, int reg,
59 struct drm_i915_gem_object *obj) 59 struct drm_i915_gem_object *obj)
60{ 60{
61 struct drm_i915_private *dev_priv = dev->dev_private; 61 struct drm_i915_private *dev_priv = dev->dev_private;
62 int fence_reg_lo, fence_reg_hi; 62 i915_reg_t fence_reg_lo, fence_reg_hi;
63 int fence_pitch_shift; 63 int fence_pitch_shift;
64 64
65 if (INTEL_INFO(dev)->gen >= 6) { 65 if (INTEL_INFO(dev)->gen >= 6) {
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 86c7500454b4..f4cd01df40db 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -24,6 +24,7 @@
24 */ 24 */
25 25
26#include <linux/seq_file.h> 26#include <linux/seq_file.h>
27#include <linux/stop_machine.h>
27#include <drm/drmP.h> 28#include <drm/drmP.h>
28#include <drm/i915_drm.h> 29#include <drm/i915_drm.h>
29#include "i915_drv.h" 30#include "i915_drv.h"
@@ -104,9 +105,11 @@ static int sanitize_enable_ppgtt(struct drm_device *dev, int enable_ppgtt)
104{ 105{
105 bool has_aliasing_ppgtt; 106 bool has_aliasing_ppgtt;
106 bool has_full_ppgtt; 107 bool has_full_ppgtt;
108 bool has_full_48bit_ppgtt;
107 109
108 has_aliasing_ppgtt = INTEL_INFO(dev)->gen >= 6; 110 has_aliasing_ppgtt = INTEL_INFO(dev)->gen >= 6;
109 has_full_ppgtt = INTEL_INFO(dev)->gen >= 7; 111 has_full_ppgtt = INTEL_INFO(dev)->gen >= 7;
112 has_full_48bit_ppgtt = IS_BROADWELL(dev) || INTEL_INFO(dev)->gen >= 9;
110 113
111 if (intel_vgpu_active(dev)) 114 if (intel_vgpu_active(dev))
112 has_full_ppgtt = false; /* emulation is too hard */ 115 has_full_ppgtt = false; /* emulation is too hard */
@@ -125,6 +128,9 @@ static int sanitize_enable_ppgtt(struct drm_device *dev, int enable_ppgtt)
125 if (enable_ppgtt == 2 && has_full_ppgtt) 128 if (enable_ppgtt == 2 && has_full_ppgtt)
126 return 2; 129 return 2;
127 130
131 if (enable_ppgtt == 3 && has_full_48bit_ppgtt)
132 return 3;
133
128#ifdef CONFIG_INTEL_IOMMU 134#ifdef CONFIG_INTEL_IOMMU
129 /* Disable ppgtt on SNB if VT-d is on. */ 135 /* Disable ppgtt on SNB if VT-d is on. */
130 if (INTEL_INFO(dev)->gen == 6 && intel_iommu_gfx_mapped) { 136 if (INTEL_INFO(dev)->gen == 6 && intel_iommu_gfx_mapped) {
@@ -141,7 +147,7 @@ static int sanitize_enable_ppgtt(struct drm_device *dev, int enable_ppgtt)
141 } 147 }
142 148
143 if (INTEL_INFO(dev)->gen >= 8 && i915.enable_execlists) 149 if (INTEL_INFO(dev)->gen >= 8 && i915.enable_execlists)
144 return 2; 150 return has_full_48bit_ppgtt ? 3 : 2;
145 else 151 else
146 return has_aliasing_ppgtt ? 1 : 0; 152 return has_aliasing_ppgtt ? 1 : 0;
147} 153}
@@ -661,10 +667,10 @@ static int gen8_write_pdp(struct drm_i915_gem_request *req,
661 return ret; 667 return ret;
662 668
663 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); 669 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
664 intel_ring_emit(ring, GEN8_RING_PDP_UDW(ring, entry)); 670 intel_ring_emit_reg(ring, GEN8_RING_PDP_UDW(ring, entry));
665 intel_ring_emit(ring, upper_32_bits(addr)); 671 intel_ring_emit(ring, upper_32_bits(addr));
666 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); 672 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
667 intel_ring_emit(ring, GEN8_RING_PDP_LDW(ring, entry)); 673 intel_ring_emit_reg(ring, GEN8_RING_PDP_LDW(ring, entry));
668 intel_ring_emit(ring, lower_32_bits(addr)); 674 intel_ring_emit(ring, lower_32_bits(addr));
669 intel_ring_advance(ring); 675 intel_ring_advance(ring);
670 676
@@ -904,14 +910,13 @@ static int gen8_ppgtt_notify_vgt(struct i915_hw_ppgtt *ppgtt, bool create)
904 enum vgt_g2v_type msg; 910 enum vgt_g2v_type msg;
905 struct drm_device *dev = ppgtt->base.dev; 911 struct drm_device *dev = ppgtt->base.dev;
906 struct drm_i915_private *dev_priv = dev->dev_private; 912 struct drm_i915_private *dev_priv = dev->dev_private;
907 unsigned int offset = vgtif_reg(pdp0_lo);
908 int i; 913 int i;
909 914
910 if (USES_FULL_48BIT_PPGTT(dev)) { 915 if (USES_FULL_48BIT_PPGTT(dev)) {
911 u64 daddr = px_dma(&ppgtt->pml4); 916 u64 daddr = px_dma(&ppgtt->pml4);
912 917
913 I915_WRITE(offset, lower_32_bits(daddr)); 918 I915_WRITE(vgtif_reg(pdp[0].lo), lower_32_bits(daddr));
914 I915_WRITE(offset + 4, upper_32_bits(daddr)); 919 I915_WRITE(vgtif_reg(pdp[0].hi), upper_32_bits(daddr));
915 920
916 msg = (create ? VGT_G2V_PPGTT_L4_PAGE_TABLE_CREATE : 921 msg = (create ? VGT_G2V_PPGTT_L4_PAGE_TABLE_CREATE :
917 VGT_G2V_PPGTT_L4_PAGE_TABLE_DESTROY); 922 VGT_G2V_PPGTT_L4_PAGE_TABLE_DESTROY);
@@ -919,10 +924,8 @@ static int gen8_ppgtt_notify_vgt(struct i915_hw_ppgtt *ppgtt, bool create)
919 for (i = 0; i < GEN8_LEGACY_PDPES; i++) { 924 for (i = 0; i < GEN8_LEGACY_PDPES; i++) {
920 u64 daddr = i915_page_dir_dma_addr(ppgtt, i); 925 u64 daddr = i915_page_dir_dma_addr(ppgtt, i);
921 926
922 I915_WRITE(offset, lower_32_bits(daddr)); 927 I915_WRITE(vgtif_reg(pdp[i].lo), lower_32_bits(daddr));
923 I915_WRITE(offset + 4, upper_32_bits(daddr)); 928 I915_WRITE(vgtif_reg(pdp[i].hi), upper_32_bits(daddr));
924
925 offset += 8;
926 } 929 }
927 930
928 msg = (create ? VGT_G2V_PPGTT_L3_PAGE_TABLE_CREATE : 931 msg = (create ? VGT_G2V_PPGTT_L3_PAGE_TABLE_CREATE :
@@ -1662,9 +1665,9 @@ static int hsw_mm_switch(struct i915_hw_ppgtt *ppgtt,
1662 return ret; 1665 return ret;
1663 1666
1664 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(2)); 1667 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(2));
1665 intel_ring_emit(ring, RING_PP_DIR_DCLV(ring)); 1668 intel_ring_emit_reg(ring, RING_PP_DIR_DCLV(ring));
1666 intel_ring_emit(ring, PP_DIR_DCLV_2G); 1669 intel_ring_emit(ring, PP_DIR_DCLV_2G);
1667 intel_ring_emit(ring, RING_PP_DIR_BASE(ring)); 1670 intel_ring_emit_reg(ring, RING_PP_DIR_BASE(ring));
1668 intel_ring_emit(ring, get_pd_offset(ppgtt)); 1671 intel_ring_emit(ring, get_pd_offset(ppgtt));
1669 intel_ring_emit(ring, MI_NOOP); 1672 intel_ring_emit(ring, MI_NOOP);
1670 intel_ring_advance(ring); 1673 intel_ring_advance(ring);
@@ -1699,9 +1702,9 @@ static int gen7_mm_switch(struct i915_hw_ppgtt *ppgtt,
1699 return ret; 1702 return ret;
1700 1703
1701 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(2)); 1704 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(2));
1702 intel_ring_emit(ring, RING_PP_DIR_DCLV(ring)); 1705 intel_ring_emit_reg(ring, RING_PP_DIR_DCLV(ring));
1703 intel_ring_emit(ring, PP_DIR_DCLV_2G); 1706 intel_ring_emit(ring, PP_DIR_DCLV_2G);
1704 intel_ring_emit(ring, RING_PP_DIR_BASE(ring)); 1707 intel_ring_emit_reg(ring, RING_PP_DIR_BASE(ring));
1705 intel_ring_emit(ring, get_pd_offset(ppgtt)); 1708 intel_ring_emit(ring, get_pd_offset(ppgtt));
1706 intel_ring_emit(ring, MI_NOOP); 1709 intel_ring_emit(ring, MI_NOOP);
1707 intel_ring_advance(ring); 1710 intel_ring_advance(ring);
@@ -2528,6 +2531,26 @@ static int ggtt_bind_vma(struct i915_vma *vma,
2528 return 0; 2531 return 0;
2529} 2532}
2530 2533
2534struct ggtt_bind_vma__cb {
2535 struct i915_vma *vma;
2536 enum i915_cache_level cache_level;
2537 u32 flags;
2538};
2539
2540static int ggtt_bind_vma__cb(void *_arg)
2541{
2542 struct ggtt_bind_vma__cb *arg = _arg;
2543 return ggtt_bind_vma(arg->vma, arg->cache_level, arg->flags);
2544}
2545
2546static int ggtt_bind_vma__BKL(struct i915_vma *vma,
2547 enum i915_cache_level cache_level,
2548 u32 flags)
2549{
2550 struct ggtt_bind_vma__cb arg = { vma, cache_level, flags };
2551 return stop_machine(ggtt_bind_vma__cb, &arg, NULL);
2552}
2553
2531static int aliasing_gtt_bind_vma(struct i915_vma *vma, 2554static int aliasing_gtt_bind_vma(struct i915_vma *vma,
2532 enum i915_cache_level cache_level, 2555 enum i915_cache_level cache_level,
2533 u32 flags) 2556 u32 flags)
@@ -2996,6 +3019,9 @@ static int gen8_gmch_probe(struct drm_device *dev,
2996 dev_priv->gtt.base.bind_vma = ggtt_bind_vma; 3019 dev_priv->gtt.base.bind_vma = ggtt_bind_vma;
2997 dev_priv->gtt.base.unbind_vma = ggtt_unbind_vma; 3020 dev_priv->gtt.base.unbind_vma = ggtt_unbind_vma;
2998 3021
3022 if (IS_CHERRYVIEW(dev))
3023 dev_priv->gtt.base.bind_vma = ggtt_bind_vma__BKL;
3024
2999 return ret; 3025 return ret;
3000} 3026}
3001 3027
@@ -3303,7 +3329,7 @@ static struct sg_table *
3303intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view, 3329intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view,
3304 struct drm_i915_gem_object *obj) 3330 struct drm_i915_gem_object *obj)
3305{ 3331{
3306 struct intel_rotation_info *rot_info = &ggtt_view->rotation_info; 3332 struct intel_rotation_info *rot_info = &ggtt_view->params.rotation_info;
3307 unsigned int size_pages = rot_info->size >> PAGE_SHIFT; 3333 unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
3308 unsigned int size_pages_uv; 3334 unsigned int size_pages_uv;
3309 struct sg_page_iter sg_iter; 3335 struct sg_page_iter sg_iter;
@@ -3535,7 +3561,7 @@ i915_ggtt_view_size(struct drm_i915_gem_object *obj,
3535 if (view->type == I915_GGTT_VIEW_NORMAL) { 3561 if (view->type == I915_GGTT_VIEW_NORMAL) {
3536 return obj->base.size; 3562 return obj->base.size;
3537 } else if (view->type == I915_GGTT_VIEW_ROTATED) { 3563 } else if (view->type == I915_GGTT_VIEW_ROTATED) {
3538 return view->rotation_info.size; 3564 return view->params.rotation_info.size;
3539 } else if (view->type == I915_GGTT_VIEW_PARTIAL) { 3565 } else if (view->type == I915_GGTT_VIEW_PARTIAL) {
3540 return view->params.partial.size << PAGE_SHIFT; 3566 return view->params.partial.size << PAGE_SHIFT;
3541 } else { 3567 } else {
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
index a216397ead52..877c32c78a6a 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.h
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
@@ -156,13 +156,10 @@ struct i915_ggtt_view {
156 u64 offset; 156 u64 offset;
157 unsigned int size; 157 unsigned int size;
158 } partial; 158 } partial;
159 struct intel_rotation_info rotation_info;
159 } params; 160 } params;
160 161
161 struct sg_table *pages; 162 struct sg_table *pages;
162
163 union {
164 struct intel_rotation_info rotation_info;
165 };
166}; 163};
167 164
168extern const struct i915_ggtt_view i915_ggtt_view_normal; 165extern const struct i915_ggtt_view i915_ggtt_view_normal;
@@ -556,7 +553,7 @@ i915_ggtt_view_equal(const struct i915_ggtt_view *a,
556 553
557 if (a->type != b->type) 554 if (a->type != b->type)
558 return false; 555 return false;
559 if (a->type == I915_GGTT_VIEW_PARTIAL) 556 if (a->type != I915_GGTT_VIEW_NORMAL)
560 return !memcmp(&a->params, &b->params, sizeof(a->params)); 557 return !memcmp(&a->params, &b->params, sizeof(a->params));
561 return true; 558 return true;
562} 559}
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c
index 87e919a06b27..3476877fc0d6 100644
--- a/drivers/gpu/drm/i915/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/i915_gem_stolen.c
@@ -433,7 +433,8 @@ int i915_gem_init_stolen(struct drm_device *dev)
433 &reserved_size); 433 &reserved_size);
434 break; 434 break;
435 default: 435 default:
436 if (IS_BROADWELL(dev_priv) || IS_SKYLAKE(dev_priv)) 436 if (IS_BROADWELL(dev_priv) ||
437 IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev))
437 bdw_get_stolen_reserved(dev_priv, &reserved_base, 438 bdw_get_stolen_reserved(dev_priv, &reserved_base,
438 &reserved_size); 439 &reserved_size);
439 else 440 else
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
index 8a6717cc265c..7410f6c962e7 100644
--- a/drivers/gpu/drm/i915/i915_gem_tiling.c
+++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
@@ -176,6 +176,8 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
176 return -EINVAL; 176 return -EINVAL;
177 } 177 }
178 178
179 intel_runtime_pm_get(dev_priv);
180
179 mutex_lock(&dev->struct_mutex); 181 mutex_lock(&dev->struct_mutex);
180 if (obj->pin_display || obj->framebuffer_references) { 182 if (obj->pin_display || obj->framebuffer_references) {
181 ret = -EBUSY; 183 ret = -EBUSY;
@@ -269,6 +271,8 @@ err:
269 drm_gem_object_unreference(&obj->base); 271 drm_gem_object_unreference(&obj->base);
270 mutex_unlock(&dev->struct_mutex); 272 mutex_unlock(&dev->struct_mutex);
271 273
274 intel_runtime_pm_put(dev_priv);
275
272 return ret; 276 return ret;
273} 277}
274 278
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index 2f04e4f2ff35..06ca4082735b 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -366,6 +366,17 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
366 err_printf(m, "Suspend count: %u\n", error->suspend_count); 366 err_printf(m, "Suspend count: %u\n", error->suspend_count);
367 err_printf(m, "PCI ID: 0x%04x\n", dev->pdev->device); 367 err_printf(m, "PCI ID: 0x%04x\n", dev->pdev->device);
368 err_printf(m, "IOMMU enabled?: %d\n", error->iommu); 368 err_printf(m, "IOMMU enabled?: %d\n", error->iommu);
369
370 if (HAS_CSR(dev)) {
371 struct intel_csr *csr = &dev_priv->csr;
372
373 err_printf(m, "DMC loaded: %s\n",
374 yesno(csr->dmc_payload != NULL));
375 err_printf(m, "DMC fw version: %d.%d\n",
376 CSR_VERSION_MAJOR(csr->version),
377 CSR_VERSION_MINOR(csr->version));
378 }
379
369 err_printf(m, "EIR: 0x%08x\n", error->eir); 380 err_printf(m, "EIR: 0x%08x\n", error->eir);
370 err_printf(m, "IER: 0x%08x\n", error->ier); 381 err_printf(m, "IER: 0x%08x\n", error->ier);
371 if (INTEL_INFO(dev)->gen >= 8) { 382 if (INTEL_INFO(dev)->gen >= 8) {
@@ -862,7 +873,7 @@ static void i915_record_ring_state(struct drm_device *dev,
862 struct drm_i915_private *dev_priv = dev->dev_private; 873 struct drm_i915_private *dev_priv = dev->dev_private;
863 874
864 if (INTEL_INFO(dev)->gen >= 6) { 875 if (INTEL_INFO(dev)->gen >= 6) {
865 ering->rc_psmi = I915_READ(ring->mmio_base + 0x50); 876 ering->rc_psmi = I915_READ(RING_PSMI_CTL(ring->mmio_base));
866 ering->fault_reg = I915_READ(RING_FAULT_REG(ring)); 877 ering->fault_reg = I915_READ(RING_FAULT_REG(ring));
867 if (INTEL_INFO(dev)->gen >= 8) 878 if (INTEL_INFO(dev)->gen >= 8)
868 gen8_record_semaphore_state(dev_priv, error, ring, ering); 879 gen8_record_semaphore_state(dev_priv, error, ring, ering);
@@ -899,7 +910,7 @@ static void i915_record_ring_state(struct drm_device *dev,
899 ering->ctl = I915_READ_CTL(ring); 910 ering->ctl = I915_READ_CTL(ring);
900 911
901 if (I915_NEED_GFX_HWS(dev)) { 912 if (I915_NEED_GFX_HWS(dev)) {
902 int mmio; 913 i915_reg_t mmio;
903 914
904 if (IS_GEN7(dev)) { 915 if (IS_GEN7(dev)) {
905 switch (ring->id) { 916 switch (ring->id) {
@@ -1071,6 +1082,25 @@ static void i915_gem_record_rings(struct drm_device *dev,
1071 list_for_each_entry(request, &ring->request_list, list) { 1082 list_for_each_entry(request, &ring->request_list, list) {
1072 struct drm_i915_error_request *erq; 1083 struct drm_i915_error_request *erq;
1073 1084
1085 if (count >= error->ring[i].num_requests) {
1086 /*
1087 * If the ring request list was changed in
1088 * between the point where the error request
1089 * list was created and dimensioned and this
1090 * point then just exit early to avoid crashes.
1091 *
1092 * We don't need to communicate that the
1093 * request list changed state during error
1094 * state capture and that the error state is
1095 * slightly incorrect as a consequence since we
1096 * are typically only interested in the request
1097 * list state at the point of error state
1098 * capture, not in any changes happening during
1099 * the capture.
1100 */
1101 break;
1102 }
1103
1074 erq = &error->ring[i].requests[count++]; 1104 erq = &error->ring[i].requests[count++];
1075 erq->seqno = request->seqno; 1105 erq->seqno = request->seqno;
1076 erq->jiffies = request->emitted_jiffies; 1106 erq->jiffies = request->emitted_jiffies;
@@ -1181,7 +1211,7 @@ static void i915_capture_reg_state(struct drm_i915_private *dev_priv,
1181 if (IS_VALLEYVIEW(dev)) { 1211 if (IS_VALLEYVIEW(dev)) {
1182 error->gtier[0] = I915_READ(GTIER); 1212 error->gtier[0] = I915_READ(GTIER);
1183 error->ier = I915_READ(VLV_IER); 1213 error->ier = I915_READ(VLV_IER);
1184 error->forcewake = I915_READ(FORCEWAKE_VLV); 1214 error->forcewake = I915_READ_FW(FORCEWAKE_VLV);
1185 } 1215 }
1186 1216
1187 if (IS_GEN7(dev)) 1217 if (IS_GEN7(dev))
@@ -1193,14 +1223,14 @@ static void i915_capture_reg_state(struct drm_i915_private *dev_priv,
1193 } 1223 }
1194 1224
1195 if (IS_GEN6(dev)) { 1225 if (IS_GEN6(dev)) {
1196 error->forcewake = I915_READ(FORCEWAKE); 1226 error->forcewake = I915_READ_FW(FORCEWAKE);
1197 error->gab_ctl = I915_READ(GAB_CTL); 1227 error->gab_ctl = I915_READ(GAB_CTL);
1198 error->gfx_mode = I915_READ(GFX_MODE); 1228 error->gfx_mode = I915_READ(GFX_MODE);
1199 } 1229 }
1200 1230
1201 /* 2: Registers which belong to multiple generations */ 1231 /* 2: Registers which belong to multiple generations */
1202 if (INTEL_INFO(dev)->gen >= 7) 1232 if (INTEL_INFO(dev)->gen >= 7)
1203 error->forcewake = I915_READ(FORCEWAKE_MT); 1233 error->forcewake = I915_READ_FW(FORCEWAKE_MT);
1204 1234
1205 if (INTEL_INFO(dev)->gen >= 6) { 1235 if (INTEL_INFO(dev)->gen >= 6) {
1206 error->derrmr = I915_READ(DERRMR); 1236 error->derrmr = I915_READ(DERRMR);
diff --git a/drivers/gpu/drm/i915/i915_guc_reg.h b/drivers/gpu/drm/i915/i915_guc_reg.h
index c4cb1c0c4d0d..685c7991e24f 100644
--- a/drivers/gpu/drm/i915/i915_guc_reg.h
+++ b/drivers/gpu/drm/i915/i915_guc_reg.h
@@ -26,7 +26,7 @@
26 26
27/* Definitions of GuC H/W registers, bits, etc */ 27/* Definitions of GuC H/W registers, bits, etc */
28 28
29#define GUC_STATUS 0xc000 29#define GUC_STATUS _MMIO(0xc000)
30#define GS_BOOTROM_SHIFT 1 30#define GS_BOOTROM_SHIFT 1
31#define GS_BOOTROM_MASK (0x7F << GS_BOOTROM_SHIFT) 31#define GS_BOOTROM_MASK (0x7F << GS_BOOTROM_SHIFT)
32#define GS_BOOTROM_RSA_FAILED (0x50 << GS_BOOTROM_SHIFT) 32#define GS_BOOTROM_RSA_FAILED (0x50 << GS_BOOTROM_SHIFT)
@@ -39,40 +39,41 @@
39#define GS_MIA_MASK (0x07 << GS_MIA_SHIFT) 39#define GS_MIA_MASK (0x07 << GS_MIA_SHIFT)
40#define GS_MIA_CORE_STATE (1 << GS_MIA_SHIFT) 40#define GS_MIA_CORE_STATE (1 << GS_MIA_SHIFT)
41 41
42#define SOFT_SCRATCH(n) (0xc180 + ((n) * 4)) 42#define SOFT_SCRATCH(n) _MMIO(0xc180 + (n) * 4)
43 43
44#define UOS_RSA_SCRATCH(i) (0xc200 + (i) * 4) 44#define UOS_RSA_SCRATCH(i) _MMIO(0xc200 + (i) * 4)
45#define DMA_ADDR_0_LOW 0xc300 45#define UOS_RSA_SCRATCH_MAX_COUNT 64
46#define DMA_ADDR_0_HIGH 0xc304 46#define DMA_ADDR_0_LOW _MMIO(0xc300)
47#define DMA_ADDR_1_LOW 0xc308 47#define DMA_ADDR_0_HIGH _MMIO(0xc304)
48#define DMA_ADDR_1_HIGH 0xc30c 48#define DMA_ADDR_1_LOW _MMIO(0xc308)
49#define DMA_ADDR_1_HIGH _MMIO(0xc30c)
49#define DMA_ADDRESS_SPACE_WOPCM (7 << 16) 50#define DMA_ADDRESS_SPACE_WOPCM (7 << 16)
50#define DMA_ADDRESS_SPACE_GTT (8 << 16) 51#define DMA_ADDRESS_SPACE_GTT (8 << 16)
51#define DMA_COPY_SIZE 0xc310 52#define DMA_COPY_SIZE _MMIO(0xc310)
52#define DMA_CTRL 0xc314 53#define DMA_CTRL _MMIO(0xc314)
53#define UOS_MOVE (1<<4) 54#define UOS_MOVE (1<<4)
54#define START_DMA (1<<0) 55#define START_DMA (1<<0)
55#define DMA_GUC_WOPCM_OFFSET 0xc340 56#define DMA_GUC_WOPCM_OFFSET _MMIO(0xc340)
56#define GUC_WOPCM_OFFSET_VALUE 0x80000 /* 512KB */ 57#define GUC_WOPCM_OFFSET_VALUE 0x80000 /* 512KB */
57#define GUC_MAX_IDLE_COUNT 0xC3E4 58#define GUC_MAX_IDLE_COUNT _MMIO(0xC3E4)
58 59
59#define GUC_WOPCM_SIZE 0xc050 60#define GUC_WOPCM_SIZE _MMIO(0xc050)
60#define GUC_WOPCM_SIZE_VALUE (0x80 << 12) /* 512KB */ 61#define GUC_WOPCM_SIZE_VALUE (0x80 << 12) /* 512KB */
61 62
62/* GuC addresses below GUC_WOPCM_TOP don't map through the GTT */ 63/* GuC addresses below GUC_WOPCM_TOP don't map through the GTT */
63#define GUC_WOPCM_TOP (GUC_WOPCM_SIZE_VALUE) 64#define GUC_WOPCM_TOP (GUC_WOPCM_SIZE_VALUE)
64 65
65#define GEN8_GT_PM_CONFIG 0x138140 66#define GEN8_GT_PM_CONFIG _MMIO(0x138140)
66#define GEN9LP_GT_PM_CONFIG 0x138140 67#define GEN9LP_GT_PM_CONFIG _MMIO(0x138140)
67#define GEN9_GT_PM_CONFIG 0x13816c 68#define GEN9_GT_PM_CONFIG _MMIO(0x13816c)
68#define GT_DOORBELL_ENABLE (1<<0) 69#define GT_DOORBELL_ENABLE (1<<0)
69 70
70#define GEN8_GTCR 0x4274 71#define GEN8_GTCR _MMIO(0x4274)
71#define GEN8_GTCR_INVALIDATE (1<<0) 72#define GEN8_GTCR_INVALIDATE (1<<0)
72 73
73#define GUC_ARAT_C6DIS 0xA178 74#define GUC_ARAT_C6DIS _MMIO(0xA178)
74 75
75#define GUC_SHIM_CONTROL 0xc064 76#define GUC_SHIM_CONTROL _MMIO(0xc064)
76#define GUC_DISABLE_SRAM_INIT_TO_ZEROES (1<<0) 77#define GUC_DISABLE_SRAM_INIT_TO_ZEROES (1<<0)
77#define GUC_ENABLE_READ_CACHE_LOGIC (1<<1) 78#define GUC_ENABLE_READ_CACHE_LOGIC (1<<1)
78#define GUC_ENABLE_MIA_CACHING (1<<2) 79#define GUC_ENABLE_MIA_CACHING (1<<2)
@@ -89,21 +90,21 @@
89 GUC_ENABLE_READ_CACHE_FOR_WOPCM_DATA | \ 90 GUC_ENABLE_READ_CACHE_FOR_WOPCM_DATA | \
90 GUC_ENABLE_MIA_CLOCK_GATING) 91 GUC_ENABLE_MIA_CLOCK_GATING)
91 92
92#define HOST2GUC_INTERRUPT 0xc4c8 93#define HOST2GUC_INTERRUPT _MMIO(0xc4c8)
93#define HOST2GUC_TRIGGER (1<<0) 94#define HOST2GUC_TRIGGER (1<<0)
94 95
95#define DRBMISC1 0x1984 96#define DRBMISC1 0x1984
96#define DOORBELL_ENABLE (1<<0) 97#define DOORBELL_ENABLE (1<<0)
97 98
98#define GEN8_DRBREGL(x) (0x1000 + (x) * 8) 99#define GEN8_DRBREGL(x) _MMIO(0x1000 + (x) * 8)
99#define GEN8_DRB_VALID (1<<0) 100#define GEN8_DRB_VALID (1<<0)
100#define GEN8_DRBREGU(x) (GEN8_DRBREGL(x) + 4) 101#define GEN8_DRBREGU(x) _MMIO(0x1000 + (x) * 8 + 4)
101 102
102#define DE_GUCRMR 0x44054 103#define DE_GUCRMR _MMIO(0x44054)
103 104
104#define GUC_BCS_RCS_IER 0xC550 105#define GUC_BCS_RCS_IER _MMIO(0xC550)
105#define GUC_VCS2_VCS1_IER 0xC554 106#define GUC_VCS2_VCS1_IER _MMIO(0xC554)
106#define GUC_WD_VECS_IER 0xC558 107#define GUC_WD_VECS_IER _MMIO(0xC558)
107#define GUC_PM_P24C_IER 0xC55C 108#define GUC_PM_P24C_IER _MMIO(0xC55C)
108 109
109#endif 110#endif
diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
index 036b42bae827..ed9f1002ab36 100644
--- a/drivers/gpu/drm/i915/i915_guc_submission.c
+++ b/drivers/gpu/drm/i915/i915_guc_submission.c
@@ -27,7 +27,7 @@
27#include "intel_guc.h" 27#include "intel_guc.h"
28 28
29/** 29/**
30 * DOC: GuC Client 30 * DOC: GuC-based command submission
31 * 31 *
32 * i915_guc_client: 32 * i915_guc_client:
33 * We use the term client to avoid confusion with contexts. A i915_guc_client is 33 * We use the term client to avoid confusion with contexts. A i915_guc_client is
@@ -161,9 +161,9 @@ static int host2guc_sample_forcewake(struct intel_guc *guc,
161 data[0] = HOST2GUC_ACTION_SAMPLE_FORCEWAKE; 161 data[0] = HOST2GUC_ACTION_SAMPLE_FORCEWAKE;
162 /* WaRsDisableCoarsePowerGating:skl,bxt */ 162 /* WaRsDisableCoarsePowerGating:skl,bxt */
163 if (!intel_enable_rc6(dev_priv->dev) || 163 if (!intel_enable_rc6(dev_priv->dev) ||
164 (IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0)) || 164 IS_BXT_REVID(dev, 0, BXT_REVID_A1) ||
165 (IS_SKL_GT3(dev) && (INTEL_REVID(dev) <= SKL_REVID_E0)) || 165 (IS_SKL_GT3(dev) && IS_SKL_REVID(dev, 0, SKL_REVID_E0)) ||
166 (IS_SKL_GT4(dev) && (INTEL_REVID(dev) <= SKL_REVID_E0))) 166 (IS_SKL_GT4(dev) && IS_SKL_REVID(dev, 0, SKL_REVID_E0)))
167 data[1] = 0; 167 data[1] = 0;
168 else 168 else
169 /* bit 0 and 1 are for Render and Media domain separately */ 169 /* bit 0 and 1 are for Render and Media domain separately */
@@ -258,7 +258,7 @@ static void guc_disable_doorbell(struct intel_guc *guc,
258 struct drm_i915_private *dev_priv = guc_to_i915(guc); 258 struct drm_i915_private *dev_priv = guc_to_i915(guc);
259 struct guc_doorbell_info *doorbell; 259 struct guc_doorbell_info *doorbell;
260 void *base; 260 void *base;
261 int drbreg = GEN8_DRBREGL(client->doorbell_id); 261 i915_reg_t drbreg = GEN8_DRBREGL(client->doorbell_id);
262 int value; 262 int value;
263 263
264 base = kmap_atomic(i915_gem_object_get_page(client->client_obj, 0)); 264 base = kmap_atomic(i915_gem_object_get_page(client->client_obj, 0));
@@ -588,8 +588,7 @@ static void lr_context_update(struct drm_i915_gem_request *rq)
588/** 588/**
589 * i915_guc_submit() - Submit commands through GuC 589 * i915_guc_submit() - Submit commands through GuC
590 * @client: the guc client where commands will go through 590 * @client: the guc client where commands will go through
591 * @ctx: LRC where commands come from 591 * @rq: request associated with the commands
592 * @ring: HW engine that will excute the commands
593 * 592 *
594 * Return: 0 if succeed 593 * Return: 0 if succeed
595 */ 594 */
@@ -731,7 +730,8 @@ static void guc_client_free(struct drm_device *dev,
731 * The kernel client to replace ExecList submission is created with 730 * The kernel client to replace ExecList submission is created with
732 * NORMAL priority. Priority of a client for scheduler can be HIGH, 731 * NORMAL priority. Priority of a client for scheduler can be HIGH,
733 * while a preemption context can use CRITICAL. 732 * while a preemption context can use CRITICAL.
734 * @ctx the context to own the client (we use the default render context) 733 * @ctx: the context that owns the client (we use the default render
734 * context)
735 * 735 *
736 * Return: An i915_guc_client object if success. 736 * Return: An i915_guc_client object if success.
737 */ 737 */
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 0d228f909dcb..c8ba94968aaf 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -139,7 +139,8 @@ static const u32 hpd_bxt[HPD_NUM_PINS] = {
139/* 139/*
140 * We should clear IMR at preinstall/uninstall, and just check at postinstall. 140 * We should clear IMR at preinstall/uninstall, and just check at postinstall.
141 */ 141 */
142static void gen5_assert_iir_is_zero(struct drm_i915_private *dev_priv, u32 reg) 142static void gen5_assert_iir_is_zero(struct drm_i915_private *dev_priv,
143 i915_reg_t reg)
143{ 144{
144 u32 val = I915_READ(reg); 145 u32 val = I915_READ(reg);
145 146
@@ -147,7 +148,7 @@ static void gen5_assert_iir_is_zero(struct drm_i915_private *dev_priv, u32 reg)
147 return; 148 return;
148 149
149 WARN(1, "Interrupt register 0x%x is not zero: 0x%08x\n", 150 WARN(1, "Interrupt register 0x%x is not zero: 0x%08x\n",
150 reg, val); 151 i915_mmio_reg_offset(reg), val);
151 I915_WRITE(reg, 0xffffffff); 152 I915_WRITE(reg, 0xffffffff);
152 POSTING_READ(reg); 153 POSTING_READ(reg);
153 I915_WRITE(reg, 0xffffffff); 154 I915_WRITE(reg, 0xffffffff);
@@ -283,17 +284,17 @@ void gen5_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask)
283 ilk_update_gt_irq(dev_priv, mask, 0); 284 ilk_update_gt_irq(dev_priv, mask, 0);
284} 285}
285 286
286static u32 gen6_pm_iir(struct drm_i915_private *dev_priv) 287static i915_reg_t gen6_pm_iir(struct drm_i915_private *dev_priv)
287{ 288{
288 return INTEL_INFO(dev_priv)->gen >= 8 ? GEN8_GT_IIR(2) : GEN6_PMIIR; 289 return INTEL_INFO(dev_priv)->gen >= 8 ? GEN8_GT_IIR(2) : GEN6_PMIIR;
289} 290}
290 291
291static u32 gen6_pm_imr(struct drm_i915_private *dev_priv) 292static i915_reg_t gen6_pm_imr(struct drm_i915_private *dev_priv)
292{ 293{
293 return INTEL_INFO(dev_priv)->gen >= 8 ? GEN8_GT_IMR(2) : GEN6_PMIMR; 294 return INTEL_INFO(dev_priv)->gen >= 8 ? GEN8_GT_IMR(2) : GEN6_PMIMR;
294} 295}
295 296
296static u32 gen6_pm_ier(struct drm_i915_private *dev_priv) 297static i915_reg_t gen6_pm_ier(struct drm_i915_private *dev_priv)
297{ 298{
298 return INTEL_INFO(dev_priv)->gen >= 8 ? GEN8_GT_IER(2) : GEN6_PMIER; 299 return INTEL_INFO(dev_priv)->gen >= 8 ? GEN8_GT_IER(2) : GEN6_PMIER;
299} 300}
@@ -350,7 +351,7 @@ void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
350void gen6_reset_rps_interrupts(struct drm_device *dev) 351void gen6_reset_rps_interrupts(struct drm_device *dev)
351{ 352{
352 struct drm_i915_private *dev_priv = dev->dev_private; 353 struct drm_i915_private *dev_priv = dev->dev_private;
353 uint32_t reg = gen6_pm_iir(dev_priv); 354 i915_reg_t reg = gen6_pm_iir(dev_priv);
354 355
355 spin_lock_irq(&dev_priv->irq_lock); 356 spin_lock_irq(&dev_priv->irq_lock);
356 I915_WRITE(reg, dev_priv->pm_rps_events); 357 I915_WRITE(reg, dev_priv->pm_rps_events);
@@ -477,7 +478,7 @@ static void
477__i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, 478__i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe,
478 u32 enable_mask, u32 status_mask) 479 u32 enable_mask, u32 status_mask)
479{ 480{
480 u32 reg = PIPESTAT(pipe); 481 i915_reg_t reg = PIPESTAT(pipe);
481 u32 pipestat = I915_READ(reg) & PIPESTAT_INT_ENABLE_MASK; 482 u32 pipestat = I915_READ(reg) & PIPESTAT_INT_ENABLE_MASK;
482 483
483 assert_spin_locked(&dev_priv->irq_lock); 484 assert_spin_locked(&dev_priv->irq_lock);
@@ -504,7 +505,7 @@ static void
504__i915_disable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe, 505__i915_disable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe,
505 u32 enable_mask, u32 status_mask) 506 u32 enable_mask, u32 status_mask)
506{ 507{
507 u32 reg = PIPESTAT(pipe); 508 i915_reg_t reg = PIPESTAT(pipe);
508 u32 pipestat = I915_READ(reg) & PIPESTAT_INT_ENABLE_MASK; 509 u32 pipestat = I915_READ(reg) & PIPESTAT_INT_ENABLE_MASK;
509 510
510 assert_spin_locked(&dev_priv->irq_lock); 511 assert_spin_locked(&dev_priv->irq_lock);
@@ -665,8 +666,7 @@ static u32 i8xx_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
665static u32 i915_get_vblank_counter(struct drm_device *dev, unsigned int pipe) 666static u32 i915_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
666{ 667{
667 struct drm_i915_private *dev_priv = dev->dev_private; 668 struct drm_i915_private *dev_priv = dev->dev_private;
668 unsigned long high_frame; 669 i915_reg_t high_frame, low_frame;
669 unsigned long low_frame;
670 u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal; 670 u32 high1, high2, low, pixel, vbl_start, hsync_start, htotal;
671 struct intel_crtc *intel_crtc = 671 struct intel_crtc *intel_crtc =
672 to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]); 672 to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
@@ -717,9 +717,7 @@ static u32 g4x_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
717 return I915_READ(PIPE_FRMCOUNT_G4X(pipe)); 717 return I915_READ(PIPE_FRMCOUNT_G4X(pipe));
718} 718}
719 719
720/* raw reads, only for fast reads of display block, no need for forcewake etc. */ 720/* I915_READ_FW, only for fast reads of display block, no need for forcewake etc. */
721#define __raw_i915_read32(dev_priv__, reg__) readl((dev_priv__)->regs + (reg__))
722
723static int __intel_get_crtc_scanline(struct intel_crtc *crtc) 721static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
724{ 722{
725 struct drm_device *dev = crtc->base.dev; 723 struct drm_device *dev = crtc->base.dev;
@@ -733,9 +731,9 @@ static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
733 vtotal /= 2; 731 vtotal /= 2;
734 732
735 if (IS_GEN2(dev)) 733 if (IS_GEN2(dev))
736 position = __raw_i915_read32(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN2; 734 position = I915_READ_FW(PIPEDSL(pipe)) & DSL_LINEMASK_GEN2;
737 else 735 else
738 position = __raw_i915_read32(dev_priv, PIPEDSL(pipe)) & DSL_LINEMASK_GEN3; 736 position = I915_READ_FW(PIPEDSL(pipe)) & DSL_LINEMASK_GEN3;
739 737
740 /* 738 /*
741 * On HSW, the DSL reg (0x70000) appears to return 0 if we 739 * On HSW, the DSL reg (0x70000) appears to return 0 if we
@@ -827,7 +825,7 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
827 * We can split this into vertical and horizontal 825 * We can split this into vertical and horizontal
828 * scanout position. 826 * scanout position.
829 */ 827 */
830 position = (__raw_i915_read32(dev_priv, PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT; 828 position = (I915_READ_FW(PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT;
831 829
832 /* convert to pixel counts */ 830 /* convert to pixel counts */
833 vbl_start *= htotal; 831 vbl_start *= htotal;
@@ -1188,7 +1186,7 @@ static void ivybridge_parity_work(struct work_struct *work)
1188 POSTING_READ(GEN7_MISCCPCTL); 1186 POSTING_READ(GEN7_MISCCPCTL);
1189 1187
1190 while ((slice = ffs(dev_priv->l3_parity.which_slice)) != 0) { 1188 while ((slice = ffs(dev_priv->l3_parity.which_slice)) != 0) {
1191 u32 reg; 1189 i915_reg_t reg;
1192 1190
1193 slice--; 1191 slice--;
1194 if (WARN_ON_ONCE(slice >= NUM_L3_SLICES(dev_priv->dev))) 1192 if (WARN_ON_ONCE(slice >= NUM_L3_SLICES(dev_priv->dev)))
@@ -1196,7 +1194,7 @@ static void ivybridge_parity_work(struct work_struct *work)
1196 1194
1197 dev_priv->l3_parity.which_slice &= ~(1<<slice); 1195 dev_priv->l3_parity.which_slice &= ~(1<<slice);
1198 1196
1199 reg = GEN7_L3CDERRST1 + (slice * 0x200); 1197 reg = GEN7_L3CDERRST1(slice);
1200 1198
1201 error_status = I915_READ(reg); 1199 error_status = I915_READ(reg);
1202 row = GEN7_PARITY_ERROR_ROW(error_status); 1200 row = GEN7_PARITY_ERROR_ROW(error_status);
@@ -1290,70 +1288,69 @@ static void snb_gt_irq_handler(struct drm_device *dev,
1290 ivybridge_parity_error_irq_handler(dev, gt_iir); 1288 ivybridge_parity_error_irq_handler(dev, gt_iir);
1291} 1289}
1292 1290
1291static __always_inline void
1292gen8_cs_irq_handler(struct intel_engine_cs *ring, u32 iir, int test_shift)
1293{
1294 if (iir & (GT_RENDER_USER_INTERRUPT << test_shift))
1295 notify_ring(ring);
1296 if (iir & (GT_CONTEXT_SWITCH_INTERRUPT << test_shift))
1297 intel_lrc_irq_handler(ring);
1298}
1299
1293static irqreturn_t gen8_gt_irq_handler(struct drm_i915_private *dev_priv, 1300static irqreturn_t gen8_gt_irq_handler(struct drm_i915_private *dev_priv,
1294 u32 master_ctl) 1301 u32 master_ctl)
1295{ 1302{
1296 irqreturn_t ret = IRQ_NONE; 1303 irqreturn_t ret = IRQ_NONE;
1297 1304
1298 if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) { 1305 if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) {
1299 u32 tmp = I915_READ_FW(GEN8_GT_IIR(0)); 1306 u32 iir = I915_READ_FW(GEN8_GT_IIR(0));
1300 if (tmp) { 1307 if (iir) {
1301 I915_WRITE_FW(GEN8_GT_IIR(0), tmp); 1308 I915_WRITE_FW(GEN8_GT_IIR(0), iir);
1302 ret = IRQ_HANDLED; 1309 ret = IRQ_HANDLED;
1303 1310
1304 if (tmp & (GT_CONTEXT_SWITCH_INTERRUPT << GEN8_RCS_IRQ_SHIFT)) 1311 gen8_cs_irq_handler(&dev_priv->ring[RCS],
1305 intel_lrc_irq_handler(&dev_priv->ring[RCS]); 1312 iir, GEN8_RCS_IRQ_SHIFT);
1306 if (tmp & (GT_RENDER_USER_INTERRUPT << GEN8_RCS_IRQ_SHIFT))
1307 notify_ring(&dev_priv->ring[RCS]);
1308 1313
1309 if (tmp & (GT_CONTEXT_SWITCH_INTERRUPT << GEN8_BCS_IRQ_SHIFT)) 1314 gen8_cs_irq_handler(&dev_priv->ring[BCS],
1310 intel_lrc_irq_handler(&dev_priv->ring[BCS]); 1315 iir, GEN8_BCS_IRQ_SHIFT);
1311 if (tmp & (GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT))
1312 notify_ring(&dev_priv->ring[BCS]);
1313 } else 1316 } else
1314 DRM_ERROR("The master control interrupt lied (GT0)!\n"); 1317 DRM_ERROR("The master control interrupt lied (GT0)!\n");
1315 } 1318 }
1316 1319
1317 if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) { 1320 if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) {
1318 u32 tmp = I915_READ_FW(GEN8_GT_IIR(1)); 1321 u32 iir = I915_READ_FW(GEN8_GT_IIR(1));
1319 if (tmp) { 1322 if (iir) {
1320 I915_WRITE_FW(GEN8_GT_IIR(1), tmp); 1323 I915_WRITE_FW(GEN8_GT_IIR(1), iir);
1321 ret = IRQ_HANDLED; 1324 ret = IRQ_HANDLED;
1322 1325
1323 if (tmp & (GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VCS1_IRQ_SHIFT)) 1326 gen8_cs_irq_handler(&dev_priv->ring[VCS],
1324 intel_lrc_irq_handler(&dev_priv->ring[VCS]); 1327 iir, GEN8_VCS1_IRQ_SHIFT);
1325 if (tmp & (GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT))
1326 notify_ring(&dev_priv->ring[VCS]);
1327 1328
1328 if (tmp & (GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VCS2_IRQ_SHIFT)) 1329 gen8_cs_irq_handler(&dev_priv->ring[VCS2],
1329 intel_lrc_irq_handler(&dev_priv->ring[VCS2]); 1330 iir, GEN8_VCS2_IRQ_SHIFT);
1330 if (tmp & (GT_RENDER_USER_INTERRUPT << GEN8_VCS2_IRQ_SHIFT))
1331 notify_ring(&dev_priv->ring[VCS2]);
1332 } else 1331 } else
1333 DRM_ERROR("The master control interrupt lied (GT1)!\n"); 1332 DRM_ERROR("The master control interrupt lied (GT1)!\n");
1334 } 1333 }
1335 1334
1336 if (master_ctl & GEN8_GT_VECS_IRQ) { 1335 if (master_ctl & GEN8_GT_VECS_IRQ) {
1337 u32 tmp = I915_READ_FW(GEN8_GT_IIR(3)); 1336 u32 iir = I915_READ_FW(GEN8_GT_IIR(3));
1338 if (tmp) { 1337 if (iir) {
1339 I915_WRITE_FW(GEN8_GT_IIR(3), tmp); 1338 I915_WRITE_FW(GEN8_GT_IIR(3), iir);
1340 ret = IRQ_HANDLED; 1339 ret = IRQ_HANDLED;
1341 1340
1342 if (tmp & (GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VECS_IRQ_SHIFT)) 1341 gen8_cs_irq_handler(&dev_priv->ring[VECS],
1343 intel_lrc_irq_handler(&dev_priv->ring[VECS]); 1342 iir, GEN8_VECS_IRQ_SHIFT);
1344 if (tmp & (GT_RENDER_USER_INTERRUPT << GEN8_VECS_IRQ_SHIFT))
1345 notify_ring(&dev_priv->ring[VECS]);
1346 } else 1343 } else
1347 DRM_ERROR("The master control interrupt lied (GT3)!\n"); 1344 DRM_ERROR("The master control interrupt lied (GT3)!\n");
1348 } 1345 }
1349 1346
1350 if (master_ctl & GEN8_GT_PM_IRQ) { 1347 if (master_ctl & GEN8_GT_PM_IRQ) {
1351 u32 tmp = I915_READ_FW(GEN8_GT_IIR(2)); 1348 u32 iir = I915_READ_FW(GEN8_GT_IIR(2));
1352 if (tmp & dev_priv->pm_rps_events) { 1349 if (iir & dev_priv->pm_rps_events) {
1353 I915_WRITE_FW(GEN8_GT_IIR(2), 1350 I915_WRITE_FW(GEN8_GT_IIR(2),
1354 tmp & dev_priv->pm_rps_events); 1351 iir & dev_priv->pm_rps_events);
1355 ret = IRQ_HANDLED; 1352 ret = IRQ_HANDLED;
1356 gen6_rps_irq_handler(dev_priv, tmp); 1353 gen6_rps_irq_handler(dev_priv, iir);
1357 } else 1354 } else
1358 DRM_ERROR("The master control interrupt lied (PM)!\n"); 1355 DRM_ERROR("The master control interrupt lied (PM)!\n");
1359 } 1356 }
@@ -1625,7 +1622,7 @@ static void valleyview_pipestat_irq_handler(struct drm_device *dev, u32 iir)
1625 1622
1626 spin_lock(&dev_priv->irq_lock); 1623 spin_lock(&dev_priv->irq_lock);
1627 for_each_pipe(dev_priv, pipe) { 1624 for_each_pipe(dev_priv, pipe) {
1628 int reg; 1625 i915_reg_t reg;
1629 u32 mask, iir_bit = 0; 1626 u32 mask, iir_bit = 0;
1630 1627
1631 /* 1628 /*
@@ -2354,9 +2351,13 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
2354 spt_irq_handler(dev, pch_iir); 2351 spt_irq_handler(dev, pch_iir);
2355 else 2352 else
2356 cpt_irq_handler(dev, pch_iir); 2353 cpt_irq_handler(dev, pch_iir);
2357 } else 2354 } else {
2358 DRM_ERROR("The master control interrupt lied (SDE)!\n"); 2355 /*
2359 2356 * Like on previous PCH there seems to be something
2357 * fishy going on with forwarding PCH interrupts.
2358 */
2359 DRM_DEBUG_DRIVER("The master control interrupt lied (SDE)!\n");
2360 }
2360 } 2361 }
2361 2362
2362 I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL); 2363 I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
@@ -3869,7 +3870,7 @@ static irqreturn_t i8xx_irq_handler(int irq, void *arg)
3869 DRM_DEBUG("Command parser error, iir 0x%08x\n", iir); 3870 DRM_DEBUG("Command parser error, iir 0x%08x\n", iir);
3870 3871
3871 for_each_pipe(dev_priv, pipe) { 3872 for_each_pipe(dev_priv, pipe) {
3872 int reg = PIPESTAT(pipe); 3873 i915_reg_t reg = PIPESTAT(pipe);
3873 pipe_stats[pipe] = I915_READ(reg); 3874 pipe_stats[pipe] = I915_READ(reg);
3874 3875
3875 /* 3876 /*
@@ -4050,7 +4051,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
4050 DRM_DEBUG("Command parser error, iir 0x%08x\n", iir); 4051 DRM_DEBUG("Command parser error, iir 0x%08x\n", iir);
4051 4052
4052 for_each_pipe(dev_priv, pipe) { 4053 for_each_pipe(dev_priv, pipe) {
4053 int reg = PIPESTAT(pipe); 4054 i915_reg_t reg = PIPESTAT(pipe);
4054 pipe_stats[pipe] = I915_READ(reg); 4055 pipe_stats[pipe] = I915_READ(reg);
4055 4056
4056 /* Clear the PIPE*STAT regs before the IIR */ 4057 /* Clear the PIPE*STAT regs before the IIR */
@@ -4272,7 +4273,7 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
4272 DRM_DEBUG("Command parser error, iir 0x%08x\n", iir); 4273 DRM_DEBUG("Command parser error, iir 0x%08x\n", iir);
4273 4274
4274 for_each_pipe(dev_priv, pipe) { 4275 for_each_pipe(dev_priv, pipe) {
4275 int reg = PIPESTAT(pipe); 4276 i915_reg_t reg = PIPESTAT(pipe);
4276 pipe_stats[pipe] = I915_READ(reg); 4277 pipe_stats[pipe] = I915_READ(reg);
4277 4278
4278 /* 4279 /*
diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
index 4be13a5eb932..835d6099c769 100644
--- a/drivers/gpu/drm/i915/i915_params.c
+++ b/drivers/gpu/drm/i915/i915_params.c
@@ -32,6 +32,7 @@ struct i915_params i915 __read_mostly = {
32 .panel_use_ssc = -1, 32 .panel_use_ssc = -1,
33 .vbt_sdvo_panel_type = -1, 33 .vbt_sdvo_panel_type = -1,
34 .enable_rc6 = -1, 34 .enable_rc6 = -1,
35 .enable_dc = -1,
35 .enable_fbc = -1, 36 .enable_fbc = -1,
36 .enable_execlists = -1, 37 .enable_execlists = -1,
37 .enable_hangcheck = true, 38 .enable_hangcheck = true,
@@ -80,6 +81,11 @@ MODULE_PARM_DESC(enable_rc6,
80 "For example, 3 would enable rc6 and deep rc6, and 7 would enable everything. " 81 "For example, 3 would enable rc6 and deep rc6, and 7 would enable everything. "
81 "default: -1 (use per-chip default)"); 82 "default: -1 (use per-chip default)");
82 83
84module_param_named_unsafe(enable_dc, i915.enable_dc, int, 0400);
85MODULE_PARM_DESC(enable_dc,
86 "Enable power-saving display C-states. "
87 "(-1=auto [default]; 0=disable; 1=up to DC5; 2=up to DC6)");
88
83module_param_named_unsafe(enable_fbc, i915.enable_fbc, int, 0600); 89module_param_named_unsafe(enable_fbc, i915.enable_fbc, int, 0600);
84MODULE_PARM_DESC(enable_fbc, 90MODULE_PARM_DESC(enable_fbc,
85 "Enable frame buffer compression for power savings " 91 "Enable frame buffer compression for power savings "
@@ -112,7 +118,7 @@ MODULE_PARM_DESC(enable_hangcheck,
112module_param_named_unsafe(enable_ppgtt, i915.enable_ppgtt, int, 0400); 118module_param_named_unsafe(enable_ppgtt, i915.enable_ppgtt, int, 0400);
113MODULE_PARM_DESC(enable_ppgtt, 119MODULE_PARM_DESC(enable_ppgtt,
114 "Override PPGTT usage. " 120 "Override PPGTT usage. "
115 "(-1=auto [default], 0=disabled, 1=aliasing, 2=full)"); 121 "(-1=auto [default], 0=disabled, 1=aliasing, 2=full, 3=full with extended address space)");
116 122
117module_param_named_unsafe(enable_execlists, i915.enable_execlists, int, 0400); 123module_param_named_unsafe(enable_execlists, i915.enable_execlists, int, 0400);
118MODULE_PARM_DESC(enable_execlists, 124MODULE_PARM_DESC(enable_execlists,
@@ -126,7 +132,7 @@ module_param_named_unsafe(preliminary_hw_support, i915.preliminary_hw_support, i
126MODULE_PARM_DESC(preliminary_hw_support, 132MODULE_PARM_DESC(preliminary_hw_support,
127 "Enable preliminary hardware support."); 133 "Enable preliminary hardware support.");
128 134
129module_param_named_unsafe(disable_power_well, i915.disable_power_well, int, 0600); 135module_param_named_unsafe(disable_power_well, i915.disable_power_well, int, 0400);
130MODULE_PARM_DESC(disable_power_well, 136MODULE_PARM_DESC(disable_power_well,
131 "Disable display power wells when possible " 137 "Disable display power wells when possible "
132 "(-1=auto [default], 0=power wells always on, 1=power wells disabled when possible)"); 138 "(-1=auto [default], 0=power wells always on, 1=power wells disabled when possible)");
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index bc7b8faba84d..1a12d44b9710 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -25,14 +25,43 @@
25#ifndef _I915_REG_H_ 25#ifndef _I915_REG_H_
26#define _I915_REG_H_ 26#define _I915_REG_H_
27 27
28typedef struct {
29 uint32_t reg;
30} i915_reg_t;
31
32#define _MMIO(r) ((const i915_reg_t){ .reg = (r) })
33
34#define INVALID_MMIO_REG _MMIO(0)
35
36static inline uint32_t i915_mmio_reg_offset(i915_reg_t reg)
37{
38 return reg.reg;
39}
40
41static inline bool i915_mmio_reg_equal(i915_reg_t a, i915_reg_t b)
42{
43 return i915_mmio_reg_offset(a) == i915_mmio_reg_offset(b);
44}
45
46static inline bool i915_mmio_reg_valid(i915_reg_t reg)
47{
48 return !i915_mmio_reg_equal(reg, INVALID_MMIO_REG);
49}
50
28#define _PIPE(pipe, a, b) ((a) + (pipe)*((b)-(a))) 51#define _PIPE(pipe, a, b) ((a) + (pipe)*((b)-(a)))
52#define _MMIO_PIPE(pipe, a, b) _MMIO(_PIPE(pipe, a, b))
29#define _PLANE(plane, a, b) _PIPE(plane, a, b) 53#define _PLANE(plane, a, b) _PIPE(plane, a, b)
30#define _TRANSCODER(tran, a, b) ((a) + (tran)*((b)-(a))) 54#define _MMIO_PLANE(plane, a, b) _MMIO_PIPE(plane, a, b)
55#define _TRANS(tran, a, b) ((a) + (tran)*((b)-(a)))
56#define _MMIO_TRANS(tran, a, b) _MMIO(_TRANS(tran, a, b))
31#define _PORT(port, a, b) ((a) + (port)*((b)-(a))) 57#define _PORT(port, a, b) ((a) + (port)*((b)-(a)))
58#define _MMIO_PORT(port, a, b) _MMIO(_PORT(port, a, b))
32#define _PIPE3(pipe, a, b, c) ((pipe) == PIPE_A ? (a) : \ 59#define _PIPE3(pipe, a, b, c) ((pipe) == PIPE_A ? (a) : \
33 (pipe) == PIPE_B ? (b) : (c)) 60 (pipe) == PIPE_B ? (b) : (c))
61#define _MMIO_PIPE3(pipe, a, b, c) _MMIO(_PIPE3(pipe, a, b, c))
34#define _PORT3(port, a, b, c) ((port) == PORT_A ? (a) : \ 62#define _PORT3(port, a, b, c) ((port) == PORT_A ? (a) : \
35 (port) == PORT_B ? (b) : (c)) 63 (port) == PORT_B ? (b) : (c))
64#define _MMIO_PORT3(pipe, a, b, c) _MMIO(_PORT3(pipe, a, b, c))
36 65
37#define _MASKED_FIELD(mask, value) ({ \ 66#define _MASKED_FIELD(mask, value) ({ \
38 if (__builtin_constant_p(mask)) \ 67 if (__builtin_constant_p(mask)) \
@@ -105,14 +134,14 @@
105#define GRDOM_RESET_STATUS (1<<1) 134#define GRDOM_RESET_STATUS (1<<1)
106#define GRDOM_RESET_ENABLE (1<<0) 135#define GRDOM_RESET_ENABLE (1<<0)
107 136
108#define ILK_GDSR (MCHBAR_MIRROR_BASE + 0x2ca4) 137#define ILK_GDSR _MMIO(MCHBAR_MIRROR_BASE + 0x2ca4)
109#define ILK_GRDOM_FULL (0<<1) 138#define ILK_GRDOM_FULL (0<<1)
110#define ILK_GRDOM_RENDER (1<<1) 139#define ILK_GRDOM_RENDER (1<<1)
111#define ILK_GRDOM_MEDIA (3<<1) 140#define ILK_GRDOM_MEDIA (3<<1)
112#define ILK_GRDOM_MASK (3<<1) 141#define ILK_GRDOM_MASK (3<<1)
113#define ILK_GRDOM_RESET_ENABLE (1<<0) 142#define ILK_GRDOM_RESET_ENABLE (1<<0)
114 143
115#define GEN6_MBCUNIT_SNPCR 0x900c /* for LLC config */ 144#define GEN6_MBCUNIT_SNPCR _MMIO(0x900c) /* for LLC config */
116#define GEN6_MBC_SNPCR_SHIFT 21 145#define GEN6_MBC_SNPCR_SHIFT 21
117#define GEN6_MBC_SNPCR_MASK (3<<21) 146#define GEN6_MBC_SNPCR_MASK (3<<21)
118#define GEN6_MBC_SNPCR_MAX (0<<21) 147#define GEN6_MBC_SNPCR_MAX (0<<21)
@@ -120,31 +149,31 @@
120#define GEN6_MBC_SNPCR_LOW (2<<21) 149#define GEN6_MBC_SNPCR_LOW (2<<21)
121#define GEN6_MBC_SNPCR_MIN (3<<21) /* only 1/16th of the cache is shared */ 150#define GEN6_MBC_SNPCR_MIN (3<<21) /* only 1/16th of the cache is shared */
122 151
123#define VLV_G3DCTL 0x9024 152#define VLV_G3DCTL _MMIO(0x9024)
124#define VLV_GSCKGCTL 0x9028 153#define VLV_GSCKGCTL _MMIO(0x9028)
125 154
126#define GEN6_MBCTL 0x0907c 155#define GEN6_MBCTL _MMIO(0x0907c)
127#define GEN6_MBCTL_ENABLE_BOOT_FETCH (1 << 4) 156#define GEN6_MBCTL_ENABLE_BOOT_FETCH (1 << 4)
128#define GEN6_MBCTL_CTX_FETCH_NEEDED (1 << 3) 157#define GEN6_MBCTL_CTX_FETCH_NEEDED (1 << 3)
129#define GEN6_MBCTL_BME_UPDATE_ENABLE (1 << 2) 158#define GEN6_MBCTL_BME_UPDATE_ENABLE (1 << 2)
130#define GEN6_MBCTL_MAE_UPDATE_ENABLE (1 << 1) 159#define GEN6_MBCTL_MAE_UPDATE_ENABLE (1 << 1)
131#define GEN6_MBCTL_BOOT_FETCH_MECH (1 << 0) 160#define GEN6_MBCTL_BOOT_FETCH_MECH (1 << 0)
132 161
133#define GEN6_GDRST 0x941c 162#define GEN6_GDRST _MMIO(0x941c)
134#define GEN6_GRDOM_FULL (1 << 0) 163#define GEN6_GRDOM_FULL (1 << 0)
135#define GEN6_GRDOM_RENDER (1 << 1) 164#define GEN6_GRDOM_RENDER (1 << 1)
136#define GEN6_GRDOM_MEDIA (1 << 2) 165#define GEN6_GRDOM_MEDIA (1 << 2)
137#define GEN6_GRDOM_BLT (1 << 3) 166#define GEN6_GRDOM_BLT (1 << 3)
138 167
139#define RING_PP_DIR_BASE(ring) ((ring)->mmio_base+0x228) 168#define RING_PP_DIR_BASE(ring) _MMIO((ring)->mmio_base+0x228)
140#define RING_PP_DIR_BASE_READ(ring) ((ring)->mmio_base+0x518) 169#define RING_PP_DIR_BASE_READ(ring) _MMIO((ring)->mmio_base+0x518)
141#define RING_PP_DIR_DCLV(ring) ((ring)->mmio_base+0x220) 170#define RING_PP_DIR_DCLV(ring) _MMIO((ring)->mmio_base+0x220)
142#define PP_DIR_DCLV_2G 0xffffffff 171#define PP_DIR_DCLV_2G 0xffffffff
143 172
144#define GEN8_RING_PDP_UDW(ring, n) ((ring)->mmio_base+0x270 + ((n) * 8 + 4)) 173#define GEN8_RING_PDP_UDW(ring, n) _MMIO((ring)->mmio_base+0x270 + (n) * 8 + 4)
145#define GEN8_RING_PDP_LDW(ring, n) ((ring)->mmio_base+0x270 + (n) * 8) 174#define GEN8_RING_PDP_LDW(ring, n) _MMIO((ring)->mmio_base+0x270 + (n) * 8)
146 175
147#define GEN8_R_PWR_CLK_STATE 0x20C8 176#define GEN8_R_PWR_CLK_STATE _MMIO(0x20C8)
148#define GEN8_RPCS_ENABLE (1 << 31) 177#define GEN8_RPCS_ENABLE (1 << 31)
149#define GEN8_RPCS_S_CNT_ENABLE (1 << 18) 178#define GEN8_RPCS_S_CNT_ENABLE (1 << 18)
150#define GEN8_RPCS_S_CNT_SHIFT 15 179#define GEN8_RPCS_S_CNT_SHIFT 15
@@ -157,7 +186,7 @@
157#define GEN8_RPCS_EU_MIN_SHIFT 0 186#define GEN8_RPCS_EU_MIN_SHIFT 0
158#define GEN8_RPCS_EU_MIN_MASK (0xf << GEN8_RPCS_EU_MIN_SHIFT) 187#define GEN8_RPCS_EU_MIN_MASK (0xf << GEN8_RPCS_EU_MIN_SHIFT)
159 188
160#define GAM_ECOCHK 0x4090 189#define GAM_ECOCHK _MMIO(0x4090)
161#define BDW_DISABLE_HDC_INVALIDATION (1<<25) 190#define BDW_DISABLE_HDC_INVALIDATION (1<<25)
162#define ECOCHK_SNB_BIT (1<<10) 191#define ECOCHK_SNB_BIT (1<<10)
163#define ECOCHK_DIS_TLB (1<<8) 192#define ECOCHK_DIS_TLB (1<<8)
@@ -170,15 +199,15 @@
170#define ECOCHK_PPGTT_WT_HSW (0x2<<3) 199#define ECOCHK_PPGTT_WT_HSW (0x2<<3)
171#define ECOCHK_PPGTT_WB_HSW (0x3<<3) 200#define ECOCHK_PPGTT_WB_HSW (0x3<<3)
172 201
173#define GAC_ECO_BITS 0x14090 202#define GAC_ECO_BITS _MMIO(0x14090)
174#define ECOBITS_SNB_BIT (1<<13) 203#define ECOBITS_SNB_BIT (1<<13)
175#define ECOBITS_PPGTT_CACHE64B (3<<8) 204#define ECOBITS_PPGTT_CACHE64B (3<<8)
176#define ECOBITS_PPGTT_CACHE4B (0<<8) 205#define ECOBITS_PPGTT_CACHE4B (0<<8)
177 206
178#define GAB_CTL 0x24000 207#define GAB_CTL _MMIO(0x24000)
179#define GAB_CTL_CONT_AFTER_PAGEFAULT (1<<8) 208#define GAB_CTL_CONT_AFTER_PAGEFAULT (1<<8)
180 209
181#define GEN6_STOLEN_RESERVED 0x1082C0 210#define GEN6_STOLEN_RESERVED _MMIO(0x1082C0)
182#define GEN6_STOLEN_RESERVED_ADDR_MASK (0xFFF << 20) 211#define GEN6_STOLEN_RESERVED_ADDR_MASK (0xFFF << 20)
183#define GEN7_STOLEN_RESERVED_ADDR_MASK (0x3FFF << 18) 212#define GEN7_STOLEN_RESERVED_ADDR_MASK (0x3FFF << 18)
184#define GEN6_STOLEN_RESERVED_SIZE_MASK (3 << 4) 213#define GEN6_STOLEN_RESERVED_SIZE_MASK (3 << 4)
@@ -200,6 +229,7 @@
200#define VGA_ST01_MDA 0x3ba 229#define VGA_ST01_MDA 0x3ba
201#define VGA_ST01_CGA 0x3da 230#define VGA_ST01_CGA 0x3da
202 231
232#define _VGA_MSR_WRITE _MMIO(0x3c2)
203#define VGA_MSR_WRITE 0x3c2 233#define VGA_MSR_WRITE 0x3c2
204#define VGA_MSR_READ 0x3cc 234#define VGA_MSR_READ 0x3cc
205#define VGA_MSR_MEM_EN (1<<1) 235#define VGA_MSR_MEM_EN (1<<1)
@@ -377,10 +407,12 @@
377#define MI_BATCH_BUFFER_START_GEN8 MI_INSTR(0x31, 1) 407#define MI_BATCH_BUFFER_START_GEN8 MI_INSTR(0x31, 1)
378#define MI_BATCH_RESOURCE_STREAMER (1<<10) 408#define MI_BATCH_RESOURCE_STREAMER (1<<10)
379 409
380#define MI_PREDICATE_SRC0 (0x2400) 410#define MI_PREDICATE_SRC0 _MMIO(0x2400)
381#define MI_PREDICATE_SRC1 (0x2408) 411#define MI_PREDICATE_SRC0_UDW _MMIO(0x2400 + 4)
412#define MI_PREDICATE_SRC1 _MMIO(0x2408)
413#define MI_PREDICATE_SRC1_UDW _MMIO(0x2408 + 4)
382 414
383#define MI_PREDICATE_RESULT_2 (0x2214) 415#define MI_PREDICATE_RESULT_2 _MMIO(0x2214)
384#define LOWER_SLICE_ENABLED (1<<0) 416#define LOWER_SLICE_ENABLED (1<<0)
385#define LOWER_SLICE_DISABLED (0<<0) 417#define LOWER_SLICE_DISABLED (0<<0)
386 418
@@ -509,49 +541,61 @@
509/* 541/*
510 * Registers used only by the command parser 542 * Registers used only by the command parser
511 */ 543 */
512#define BCS_SWCTRL 0x22200 544#define BCS_SWCTRL _MMIO(0x22200)
513 545
514#define GPGPU_THREADS_DISPATCHED 0x2290 546#define GPGPU_THREADS_DISPATCHED _MMIO(0x2290)
515#define HS_INVOCATION_COUNT 0x2300 547#define GPGPU_THREADS_DISPATCHED_UDW _MMIO(0x2290 + 4)
516#define DS_INVOCATION_COUNT 0x2308 548#define HS_INVOCATION_COUNT _MMIO(0x2300)
517#define IA_VERTICES_COUNT 0x2310 549#define HS_INVOCATION_COUNT_UDW _MMIO(0x2300 + 4)
518#define IA_PRIMITIVES_COUNT 0x2318 550#define DS_INVOCATION_COUNT _MMIO(0x2308)
519#define VS_INVOCATION_COUNT 0x2320 551#define DS_INVOCATION_COUNT_UDW _MMIO(0x2308 + 4)
520#define GS_INVOCATION_COUNT 0x2328 552#define IA_VERTICES_COUNT _MMIO(0x2310)
521#define GS_PRIMITIVES_COUNT 0x2330 553#define IA_VERTICES_COUNT_UDW _MMIO(0x2310 + 4)
522#define CL_INVOCATION_COUNT 0x2338 554#define IA_PRIMITIVES_COUNT _MMIO(0x2318)
523#define CL_PRIMITIVES_COUNT 0x2340 555#define IA_PRIMITIVES_COUNT_UDW _MMIO(0x2318 + 4)
524#define PS_INVOCATION_COUNT 0x2348 556#define VS_INVOCATION_COUNT _MMIO(0x2320)
525#define PS_DEPTH_COUNT 0x2350 557#define VS_INVOCATION_COUNT_UDW _MMIO(0x2320 + 4)
558#define GS_INVOCATION_COUNT _MMIO(0x2328)
559#define GS_INVOCATION_COUNT_UDW _MMIO(0x2328 + 4)
560#define GS_PRIMITIVES_COUNT _MMIO(0x2330)
561#define GS_PRIMITIVES_COUNT_UDW _MMIO(0x2330 + 4)
562#define CL_INVOCATION_COUNT _MMIO(0x2338)
563#define CL_INVOCATION_COUNT_UDW _MMIO(0x2338 + 4)
564#define CL_PRIMITIVES_COUNT _MMIO(0x2340)
565#define CL_PRIMITIVES_COUNT_UDW _MMIO(0x2340 + 4)
566#define PS_INVOCATION_COUNT _MMIO(0x2348)
567#define PS_INVOCATION_COUNT_UDW _MMIO(0x2348 + 4)
568#define PS_DEPTH_COUNT _MMIO(0x2350)
569#define PS_DEPTH_COUNT_UDW _MMIO(0x2350 + 4)
526 570
527/* There are the 4 64-bit counter registers, one for each stream output */ 571/* There are the 4 64-bit counter registers, one for each stream output */
528#define GEN7_SO_NUM_PRIMS_WRITTEN(n) (0x5200 + (n) * 8) 572#define GEN7_SO_NUM_PRIMS_WRITTEN(n) _MMIO(0x5200 + (n) * 8)
573#define GEN7_SO_NUM_PRIMS_WRITTEN_UDW(n) _MMIO(0x5200 + (n) * 8 + 4)
529 574
530#define GEN7_SO_PRIM_STORAGE_NEEDED(n) (0x5240 + (n) * 8) 575#define GEN7_SO_PRIM_STORAGE_NEEDED(n) _MMIO(0x5240 + (n) * 8)
576#define GEN7_SO_PRIM_STORAGE_NEEDED_UDW(n) _MMIO(0x5240 + (n) * 8 + 4)
531 577
532#define GEN7_3DPRIM_END_OFFSET 0x2420 578#define GEN7_3DPRIM_END_OFFSET _MMIO(0x2420)
533#define GEN7_3DPRIM_START_VERTEX 0x2430 579#define GEN7_3DPRIM_START_VERTEX _MMIO(0x2430)
534#define GEN7_3DPRIM_VERTEX_COUNT 0x2434 580#define GEN7_3DPRIM_VERTEX_COUNT _MMIO(0x2434)
535#define GEN7_3DPRIM_INSTANCE_COUNT 0x2438 581#define GEN7_3DPRIM_INSTANCE_COUNT _MMIO(0x2438)
536#define GEN7_3DPRIM_START_INSTANCE 0x243C 582#define GEN7_3DPRIM_START_INSTANCE _MMIO(0x243C)
537#define GEN7_3DPRIM_BASE_VERTEX 0x2440 583#define GEN7_3DPRIM_BASE_VERTEX _MMIO(0x2440)
538 584
539#define GEN7_GPGPU_DISPATCHDIMX 0x2500 585#define GEN7_GPGPU_DISPATCHDIMX _MMIO(0x2500)
540#define GEN7_GPGPU_DISPATCHDIMY 0x2504 586#define GEN7_GPGPU_DISPATCHDIMY _MMIO(0x2504)
541#define GEN7_GPGPU_DISPATCHDIMZ 0x2508 587#define GEN7_GPGPU_DISPATCHDIMZ _MMIO(0x2508)
542 588
543#define OACONTROL 0x2360 589#define OACONTROL _MMIO(0x2360)
544 590
545#define _GEN7_PIPEA_DE_LOAD_SL 0x70068 591#define _GEN7_PIPEA_DE_LOAD_SL 0x70068
546#define _GEN7_PIPEB_DE_LOAD_SL 0x71068 592#define _GEN7_PIPEB_DE_LOAD_SL 0x71068
547#define GEN7_PIPE_DE_LOAD_SL(pipe) _PIPE(pipe, \ 593#define GEN7_PIPE_DE_LOAD_SL(pipe) _MMIO_PIPE(pipe, _GEN7_PIPEA_DE_LOAD_SL, _GEN7_PIPEB_DE_LOAD_SL)
548 _GEN7_PIPEA_DE_LOAD_SL, \
549 _GEN7_PIPEB_DE_LOAD_SL)
550 594
551/* 595/*
552 * Reset registers 596 * Reset registers
553 */ 597 */
554#define DEBUG_RESET_I830 0x6070 598#define DEBUG_RESET_I830 _MMIO(0x6070)
555#define DEBUG_RESET_FULL (1<<7) 599#define DEBUG_RESET_FULL (1<<7)
556#define DEBUG_RESET_RENDER (1<<8) 600#define DEBUG_RESET_RENDER (1<<8)
557#define DEBUG_RESET_DISPLAY (1<<9) 601#define DEBUG_RESET_DISPLAY (1<<9)
@@ -559,7 +603,7 @@
559/* 603/*
560 * IOSF sideband 604 * IOSF sideband
561 */ 605 */
562#define VLV_IOSF_DOORBELL_REQ (VLV_DISPLAY_BASE + 0x2100) 606#define VLV_IOSF_DOORBELL_REQ _MMIO(VLV_DISPLAY_BASE + 0x2100)
563#define IOSF_DEVFN_SHIFT 24 607#define IOSF_DEVFN_SHIFT 24
564#define IOSF_OPCODE_SHIFT 16 608#define IOSF_OPCODE_SHIFT 16
565#define IOSF_PORT_SHIFT 8 609#define IOSF_PORT_SHIFT 8
@@ -576,8 +620,8 @@
576#define IOSF_PORT_CCU 0xA9 620#define IOSF_PORT_CCU 0xA9
577#define IOSF_PORT_GPS_CORE 0x48 621#define IOSF_PORT_GPS_CORE 0x48
578#define IOSF_PORT_FLISDSI 0x1B 622#define IOSF_PORT_FLISDSI 0x1B
579#define VLV_IOSF_DATA (VLV_DISPLAY_BASE + 0x2104) 623#define VLV_IOSF_DATA _MMIO(VLV_DISPLAY_BASE + 0x2104)
580#define VLV_IOSF_ADDR (VLV_DISPLAY_BASE + 0x2108) 624#define VLV_IOSF_ADDR _MMIO(VLV_DISPLAY_BASE + 0x2108)
581 625
582/* See configdb bunit SB addr map */ 626/* See configdb bunit SB addr map */
583#define BUNIT_REG_BISOC 0x11 627#define BUNIT_REG_BISOC 0x11
@@ -609,6 +653,7 @@
609 653
610/* See the PUNIT HAS v0.8 for the below bits */ 654/* See the PUNIT HAS v0.8 for the below bits */
611enum punit_power_well { 655enum punit_power_well {
656 /* These numbers are fixed and must match the position of the pw bits */
612 PUNIT_POWER_WELL_RENDER = 0, 657 PUNIT_POWER_WELL_RENDER = 0,
613 PUNIT_POWER_WELL_MEDIA = 1, 658 PUNIT_POWER_WELL_MEDIA = 1,
614 PUNIT_POWER_WELL_DISP2D = 3, 659 PUNIT_POWER_WELL_DISP2D = 3,
@@ -621,10 +666,12 @@ enum punit_power_well {
621 PUNIT_POWER_WELL_DPIO_RX1 = 11, 666 PUNIT_POWER_WELL_DPIO_RX1 = 11,
622 PUNIT_POWER_WELL_DPIO_CMN_D = 12, 667 PUNIT_POWER_WELL_DPIO_CMN_D = 12,
623 668
624 PUNIT_POWER_WELL_NUM, 669 /* Not actual bit groups. Used as IDs for lookup_power_well() */
670 PUNIT_POWER_WELL_ALWAYS_ON,
625}; 671};
626 672
627enum skl_disp_power_wells { 673enum skl_disp_power_wells {
674 /* These numbers are fixed and must match the position of the pw bits */
628 SKL_DISP_PW_MISC_IO, 675 SKL_DISP_PW_MISC_IO,
629 SKL_DISP_PW_DDI_A_E, 676 SKL_DISP_PW_DDI_A_E,
630 SKL_DISP_PW_DDI_B, 677 SKL_DISP_PW_DDI_B,
@@ -632,6 +679,10 @@ enum skl_disp_power_wells {
632 SKL_DISP_PW_DDI_D, 679 SKL_DISP_PW_DDI_D,
633 SKL_DISP_PW_1 = 14, 680 SKL_DISP_PW_1 = 14,
634 SKL_DISP_PW_2, 681 SKL_DISP_PW_2,
682
683 /* Not actual bit groups. Used as IDs for lookup_power_well() */
684 SKL_DISP_PW_ALWAYS_ON,
685 SKL_DISP_PW_DC_OFF,
635}; 686};
636 687
637#define SKL_POWER_WELL_STATE(pw) (1 << ((pw) * 2)) 688#define SKL_POWER_WELL_STATE(pw) (1 << ((pw) * 2))
@@ -832,7 +883,7 @@ enum skl_disp_power_wells {
832 */ 883 */
833#define DPIO_DEVFN 0 884#define DPIO_DEVFN 0
834 885
835#define DPIO_CTL (VLV_DISPLAY_BASE + 0x2110) 886#define DPIO_CTL _MMIO(VLV_DISPLAY_BASE + 0x2110)
836#define DPIO_MODSEL1 (1<<3) /* if ref clk b == 27 */ 887#define DPIO_MODSEL1 (1<<3) /* if ref clk b == 27 */
837#define DPIO_MODSEL0 (1<<2) /* if ref clk a == 27 */ 888#define DPIO_MODSEL0 (1<<2) /* if ref clk a == 27 */
838#define DPIO_SFR_BYPASS (1<<1) 889#define DPIO_SFR_BYPASS (1<<1)
@@ -1185,9 +1236,9 @@ enum skl_disp_power_wells {
1185#define DPIO_UPAR_SHIFT 30 1236#define DPIO_UPAR_SHIFT 30
1186 1237
1187/* BXT PHY registers */ 1238/* BXT PHY registers */
1188#define _BXT_PHY(phy, a, b) _PIPE((phy), (a), (b)) 1239#define _BXT_PHY(phy, a, b) _MMIO_PIPE((phy), (a), (b))
1189 1240
1190#define BXT_P_CR_GT_DISP_PWRON 0x138090 1241#define BXT_P_CR_GT_DISP_PWRON _MMIO(0x138090)
1191#define GT_DISPLAY_POWER_ON(phy) (1 << (phy)) 1242#define GT_DISPLAY_POWER_ON(phy) (1 << (phy))
1192 1243
1193#define _PHY_CTL_FAMILY_EDP 0x64C80 1244#define _PHY_CTL_FAMILY_EDP 0x64C80
@@ -1203,7 +1254,7 @@ enum skl_disp_power_wells {
1203#define PORT_PLL_ENABLE (1 << 31) 1254#define PORT_PLL_ENABLE (1 << 31)
1204#define PORT_PLL_LOCK (1 << 30) 1255#define PORT_PLL_LOCK (1 << 30)
1205#define PORT_PLL_REF_SEL (1 << 27) 1256#define PORT_PLL_REF_SEL (1 << 27)
1206#define BXT_PORT_PLL_ENABLE(port) _PORT(port, _PORT_PLL_A, _PORT_PLL_B) 1257#define BXT_PORT_PLL_ENABLE(port) _MMIO_PORT(port, _PORT_PLL_A, _PORT_PLL_B)
1207 1258
1208#define _PORT_PLL_EBB_0_A 0x162034 1259#define _PORT_PLL_EBB_0_A 0x162034
1209#define _PORT_PLL_EBB_0_B 0x6C034 1260#define _PORT_PLL_EBB_0_B 0x6C034
@@ -1214,7 +1265,7 @@ enum skl_disp_power_wells {
1214#define PORT_PLL_P2_SHIFT 8 1265#define PORT_PLL_P2_SHIFT 8
1215#define PORT_PLL_P2_MASK (0x1f << PORT_PLL_P2_SHIFT) 1266#define PORT_PLL_P2_MASK (0x1f << PORT_PLL_P2_SHIFT)
1216#define PORT_PLL_P2(x) ((x) << PORT_PLL_P2_SHIFT) 1267#define PORT_PLL_P2(x) ((x) << PORT_PLL_P2_SHIFT)
1217#define BXT_PORT_PLL_EBB_0(port) _PORT3(port, _PORT_PLL_EBB_0_A, \ 1268#define BXT_PORT_PLL_EBB_0(port) _MMIO_PORT3(port, _PORT_PLL_EBB_0_A, \
1218 _PORT_PLL_EBB_0_B, \ 1269 _PORT_PLL_EBB_0_B, \
1219 _PORT_PLL_EBB_0_C) 1270 _PORT_PLL_EBB_0_C)
1220 1271
@@ -1223,7 +1274,7 @@ enum skl_disp_power_wells {
1223#define _PORT_PLL_EBB_4_C 0x6C344 1274#define _PORT_PLL_EBB_4_C 0x6C344
1224#define PORT_PLL_10BIT_CLK_ENABLE (1 << 13) 1275#define PORT_PLL_10BIT_CLK_ENABLE (1 << 13)
1225#define PORT_PLL_RECALIBRATE (1 << 14) 1276#define PORT_PLL_RECALIBRATE (1 << 14)
1226#define BXT_PORT_PLL_EBB_4(port) _PORT3(port, _PORT_PLL_EBB_4_A, \ 1277#define BXT_PORT_PLL_EBB_4(port) _MMIO_PORT3(port, _PORT_PLL_EBB_4_A, \
1227 _PORT_PLL_EBB_4_B, \ 1278 _PORT_PLL_EBB_4_B, \
1228 _PORT_PLL_EBB_4_C) 1279 _PORT_PLL_EBB_4_C)
1229 1280
@@ -1259,7 +1310,7 @@ enum skl_disp_power_wells {
1259#define _PORT_PLL_BASE(port) _PORT3(port, _PORT_PLL_0_A, \ 1310#define _PORT_PLL_BASE(port) _PORT3(port, _PORT_PLL_0_A, \
1260 _PORT_PLL_0_B, \ 1311 _PORT_PLL_0_B, \
1261 _PORT_PLL_0_C) 1312 _PORT_PLL_0_C)
1262#define BXT_PORT_PLL(port, idx) (_PORT_PLL_BASE(port) + (idx) * 4) 1313#define BXT_PORT_PLL(port, idx) _MMIO(_PORT_PLL_BASE(port) + (idx) * 4)
1263 1314
1264/* BXT PHY common lane registers */ 1315/* BXT PHY common lane registers */
1265#define _PORT_CL1CM_DW0_A 0x162000 1316#define _PORT_CL1CM_DW0_A 0x162000
@@ -1297,7 +1348,7 @@ enum skl_disp_power_wells {
1297 _PORT_CL1CM_DW30_A) 1348 _PORT_CL1CM_DW30_A)
1298 1349
1299/* Defined for PHY0 only */ 1350/* Defined for PHY0 only */
1300#define BXT_PORT_CL2CM_DW6_BC 0x6C358 1351#define BXT_PORT_CL2CM_DW6_BC _MMIO(0x6C358)
1301#define DW6_OLDO_DYN_PWR_DOWN_EN (1 << 28) 1352#define DW6_OLDO_DYN_PWR_DOWN_EN (1 << 28)
1302 1353
1303/* BXT PHY Ref registers */ 1354/* BXT PHY Ref registers */
@@ -1337,10 +1388,10 @@ enum skl_disp_power_wells {
1337#define _PORT_PCS_DW10_GRP_A 0x162C28 1388#define _PORT_PCS_DW10_GRP_A 0x162C28
1338#define _PORT_PCS_DW10_GRP_B 0x6CC28 1389#define _PORT_PCS_DW10_GRP_B 0x6CC28
1339#define _PORT_PCS_DW10_GRP_C 0x6CE28 1390#define _PORT_PCS_DW10_GRP_C 0x6CE28
1340#define BXT_PORT_PCS_DW10_LN01(port) _PORT3(port, _PORT_PCS_DW10_LN01_A, \ 1391#define BXT_PORT_PCS_DW10_LN01(port) _MMIO_PORT3(port, _PORT_PCS_DW10_LN01_A, \
1341 _PORT_PCS_DW10_LN01_B, \ 1392 _PORT_PCS_DW10_LN01_B, \
1342 _PORT_PCS_DW10_LN01_C) 1393 _PORT_PCS_DW10_LN01_C)
1343#define BXT_PORT_PCS_DW10_GRP(port) _PORT3(port, _PORT_PCS_DW10_GRP_A, \ 1394#define BXT_PORT_PCS_DW10_GRP(port) _MMIO_PORT3(port, _PORT_PCS_DW10_GRP_A, \
1344 _PORT_PCS_DW10_GRP_B, \ 1395 _PORT_PCS_DW10_GRP_B, \
1345 _PORT_PCS_DW10_GRP_C) 1396 _PORT_PCS_DW10_GRP_C)
1346#define TX2_SWING_CALC_INIT (1 << 31) 1397#define TX2_SWING_CALC_INIT (1 << 31)
@@ -1357,13 +1408,13 @@ enum skl_disp_power_wells {
1357#define _PORT_PCS_DW12_GRP_C 0x6CE30 1408#define _PORT_PCS_DW12_GRP_C 0x6CE30
1358#define LANESTAGGER_STRAP_OVRD (1 << 6) 1409#define LANESTAGGER_STRAP_OVRD (1 << 6)
1359#define LANE_STAGGER_MASK 0x1F 1410#define LANE_STAGGER_MASK 0x1F
1360#define BXT_PORT_PCS_DW12_LN01(port) _PORT3(port, _PORT_PCS_DW12_LN01_A, \ 1411#define BXT_PORT_PCS_DW12_LN01(port) _MMIO_PORT3(port, _PORT_PCS_DW12_LN01_A, \
1361 _PORT_PCS_DW12_LN01_B, \ 1412 _PORT_PCS_DW12_LN01_B, \
1362 _PORT_PCS_DW12_LN01_C) 1413 _PORT_PCS_DW12_LN01_C)
1363#define BXT_PORT_PCS_DW12_LN23(port) _PORT3(port, _PORT_PCS_DW12_LN23_A, \ 1414#define BXT_PORT_PCS_DW12_LN23(port) _MMIO_PORT3(port, _PORT_PCS_DW12_LN23_A, \
1364 _PORT_PCS_DW12_LN23_B, \ 1415 _PORT_PCS_DW12_LN23_B, \
1365 _PORT_PCS_DW12_LN23_C) 1416 _PORT_PCS_DW12_LN23_C)
1366#define BXT_PORT_PCS_DW12_GRP(port) _PORT3(port, _PORT_PCS_DW12_GRP_A, \ 1417#define BXT_PORT_PCS_DW12_GRP(port) _MMIO_PORT3(port, _PORT_PCS_DW12_GRP_A, \
1367 _PORT_PCS_DW12_GRP_B, \ 1418 _PORT_PCS_DW12_GRP_B, \
1368 _PORT_PCS_DW12_GRP_C) 1419 _PORT_PCS_DW12_GRP_C)
1369 1420
@@ -1377,10 +1428,10 @@ enum skl_disp_power_wells {
1377#define _PORT_TX_DW2_GRP_A 0x162D08 1428#define _PORT_TX_DW2_GRP_A 0x162D08
1378#define _PORT_TX_DW2_GRP_B 0x6CD08 1429#define _PORT_TX_DW2_GRP_B 0x6CD08
1379#define _PORT_TX_DW2_GRP_C 0x6CF08 1430#define _PORT_TX_DW2_GRP_C 0x6CF08
1380#define BXT_PORT_TX_DW2_GRP(port) _PORT3(port, _PORT_TX_DW2_GRP_A, \ 1431#define BXT_PORT_TX_DW2_GRP(port) _MMIO_PORT3(port, _PORT_TX_DW2_GRP_A, \
1381 _PORT_TX_DW2_GRP_B, \ 1432 _PORT_TX_DW2_GRP_B, \
1382 _PORT_TX_DW2_GRP_C) 1433 _PORT_TX_DW2_GRP_C)
1383#define BXT_PORT_TX_DW2_LN0(port) _PORT3(port, _PORT_TX_DW2_LN0_A, \ 1434#define BXT_PORT_TX_DW2_LN0(port) _MMIO_PORT3(port, _PORT_TX_DW2_LN0_A, \
1384 _PORT_TX_DW2_LN0_B, \ 1435 _PORT_TX_DW2_LN0_B, \
1385 _PORT_TX_DW2_LN0_C) 1436 _PORT_TX_DW2_LN0_C)
1386#define MARGIN_000_SHIFT 16 1437#define MARGIN_000_SHIFT 16
@@ -1394,10 +1445,10 @@ enum skl_disp_power_wells {
1394#define _PORT_TX_DW3_GRP_A 0x162D0C 1445#define _PORT_TX_DW3_GRP_A 0x162D0C
1395#define _PORT_TX_DW3_GRP_B 0x6CD0C 1446#define _PORT_TX_DW3_GRP_B 0x6CD0C
1396#define _PORT_TX_DW3_GRP_C 0x6CF0C 1447#define _PORT_TX_DW3_GRP_C 0x6CF0C
1397#define BXT_PORT_TX_DW3_GRP(port) _PORT3(port, _PORT_TX_DW3_GRP_A, \ 1448#define BXT_PORT_TX_DW3_GRP(port) _MMIO_PORT3(port, _PORT_TX_DW3_GRP_A, \
1398 _PORT_TX_DW3_GRP_B, \ 1449 _PORT_TX_DW3_GRP_B, \
1399 _PORT_TX_DW3_GRP_C) 1450 _PORT_TX_DW3_GRP_C)
1400#define BXT_PORT_TX_DW3_LN0(port) _PORT3(port, _PORT_TX_DW3_LN0_A, \ 1451#define BXT_PORT_TX_DW3_LN0(port) _MMIO_PORT3(port, _PORT_TX_DW3_LN0_A, \
1401 _PORT_TX_DW3_LN0_B, \ 1452 _PORT_TX_DW3_LN0_B, \
1402 _PORT_TX_DW3_LN0_C) 1453 _PORT_TX_DW3_LN0_C)
1403#define SCALE_DCOMP_METHOD (1 << 26) 1454#define SCALE_DCOMP_METHOD (1 << 26)
@@ -1409,10 +1460,10 @@ enum skl_disp_power_wells {
1409#define _PORT_TX_DW4_GRP_A 0x162D10 1460#define _PORT_TX_DW4_GRP_A 0x162D10
1410#define _PORT_TX_DW4_GRP_B 0x6CD10 1461#define _PORT_TX_DW4_GRP_B 0x6CD10
1411#define _PORT_TX_DW4_GRP_C 0x6CF10 1462#define _PORT_TX_DW4_GRP_C 0x6CF10
1412#define BXT_PORT_TX_DW4_LN0(port) _PORT3(port, _PORT_TX_DW4_LN0_A, \ 1463#define BXT_PORT_TX_DW4_LN0(port) _MMIO_PORT3(port, _PORT_TX_DW4_LN0_A, \
1413 _PORT_TX_DW4_LN0_B, \ 1464 _PORT_TX_DW4_LN0_B, \
1414 _PORT_TX_DW4_LN0_C) 1465 _PORT_TX_DW4_LN0_C)
1415#define BXT_PORT_TX_DW4_GRP(port) _PORT3(port, _PORT_TX_DW4_GRP_A, \ 1466#define BXT_PORT_TX_DW4_GRP(port) _MMIO_PORT3(port, _PORT_TX_DW4_GRP_A, \
1416 _PORT_TX_DW4_GRP_B, \ 1467 _PORT_TX_DW4_GRP_B, \
1417 _PORT_TX_DW4_GRP_C) 1468 _PORT_TX_DW4_GRP_C)
1418#define DEEMPH_SHIFT 24 1469#define DEEMPH_SHIFT 24
@@ -1423,17 +1474,17 @@ enum skl_disp_power_wells {
1423#define _PORT_TX_DW14_LN0_C 0x6C938 1474#define _PORT_TX_DW14_LN0_C 0x6C938
1424#define LATENCY_OPTIM_SHIFT 30 1475#define LATENCY_OPTIM_SHIFT 30
1425#define LATENCY_OPTIM (1 << LATENCY_OPTIM_SHIFT) 1476#define LATENCY_OPTIM (1 << LATENCY_OPTIM_SHIFT)
1426#define BXT_PORT_TX_DW14_LN(port, lane) (_PORT3((port), _PORT_TX_DW14_LN0_A, \ 1477#define BXT_PORT_TX_DW14_LN(port, lane) _MMIO(_PORT3((port), _PORT_TX_DW14_LN0_A, \
1427 _PORT_TX_DW14_LN0_B, \ 1478 _PORT_TX_DW14_LN0_B, \
1428 _PORT_TX_DW14_LN0_C) + \ 1479 _PORT_TX_DW14_LN0_C) + \
1429 _BXT_LANE_OFFSET(lane)) 1480 _BXT_LANE_OFFSET(lane))
1430 1481
1431/* UAIMI scratch pad register 1 */ 1482/* UAIMI scratch pad register 1 */
1432#define UAIMI_SPR1 0x4F074 1483#define UAIMI_SPR1 _MMIO(0x4F074)
1433/* SKL VccIO mask */ 1484/* SKL VccIO mask */
1434#define SKL_VCCIO_MASK 0x1 1485#define SKL_VCCIO_MASK 0x1
1435/* SKL balance leg register */ 1486/* SKL balance leg register */
1436#define DISPIO_CR_TX_BMU_CR0 0x6C00C 1487#define DISPIO_CR_TX_BMU_CR0 _MMIO(0x6C00C)
1437/* I_boost values */ 1488/* I_boost values */
1438#define BALANCE_LEG_SHIFT(port) (8+3*(port)) 1489#define BALANCE_LEG_SHIFT(port) (8+3*(port))
1439#define BALANCE_LEG_MASK(port) (7<<(8+3*(port))) 1490#define BALANCE_LEG_MASK(port) (7<<(8+3*(port)))
@@ -1450,7 +1501,7 @@ enum skl_disp_power_wells {
1450 * [0-15] @ 0x100000 gen6,vlv,chv 1501 * [0-15] @ 0x100000 gen6,vlv,chv
1451 * [0-31] @ 0x100000 gen7+ 1502 * [0-31] @ 0x100000 gen7+
1452 */ 1503 */
1453#define FENCE_REG(i) (0x2000 + (((i) & 8) << 9) + ((i) & 7) * 4) 1504#define FENCE_REG(i) _MMIO(0x2000 + (((i) & 8) << 9) + ((i) & 7) * 4)
1454#define I830_FENCE_START_MASK 0x07f80000 1505#define I830_FENCE_START_MASK 0x07f80000
1455#define I830_FENCE_TILING_Y_SHIFT 12 1506#define I830_FENCE_TILING_Y_SHIFT 12
1456#define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8) 1507#define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8)
@@ -1463,21 +1514,21 @@ enum skl_disp_power_wells {
1463#define I915_FENCE_START_MASK 0x0ff00000 1514#define I915_FENCE_START_MASK 0x0ff00000
1464#define I915_FENCE_SIZE_BITS(size) ((ffs((size) >> 20) - 1) << 8) 1515#define I915_FENCE_SIZE_BITS(size) ((ffs((size) >> 20) - 1) << 8)
1465 1516
1466#define FENCE_REG_965_LO(i) (0x03000 + (i) * 8) 1517#define FENCE_REG_965_LO(i) _MMIO(0x03000 + (i) * 8)
1467#define FENCE_REG_965_HI(i) (0x03000 + (i) * 8 + 4) 1518#define FENCE_REG_965_HI(i) _MMIO(0x03000 + (i) * 8 + 4)
1468#define I965_FENCE_PITCH_SHIFT 2 1519#define I965_FENCE_PITCH_SHIFT 2
1469#define I965_FENCE_TILING_Y_SHIFT 1 1520#define I965_FENCE_TILING_Y_SHIFT 1
1470#define I965_FENCE_REG_VALID (1<<0) 1521#define I965_FENCE_REG_VALID (1<<0)
1471#define I965_FENCE_MAX_PITCH_VAL 0x0400 1522#define I965_FENCE_MAX_PITCH_VAL 0x0400
1472 1523
1473#define FENCE_REG_GEN6_LO(i) (0x100000 + (i) * 8) 1524#define FENCE_REG_GEN6_LO(i) _MMIO(0x100000 + (i) * 8)
1474#define FENCE_REG_GEN6_HI(i) (0x100000 + (i) * 8 + 4) 1525#define FENCE_REG_GEN6_HI(i) _MMIO(0x100000 + (i) * 8 + 4)
1475#define GEN6_FENCE_PITCH_SHIFT 32 1526#define GEN6_FENCE_PITCH_SHIFT 32
1476#define GEN7_FENCE_MAX_PITCH_VAL 0x0800 1527#define GEN7_FENCE_MAX_PITCH_VAL 0x0800
1477 1528
1478 1529
1479/* control register for cpu gtt access */ 1530/* control register for cpu gtt access */
1480#define TILECTL 0x101000 1531#define TILECTL _MMIO(0x101000)
1481#define TILECTL_SWZCTL (1 << 0) 1532#define TILECTL_SWZCTL (1 << 0)
1482#define TILECTL_TLBPF (1 << 1) 1533#define TILECTL_TLBPF (1 << 1)
1483#define TILECTL_TLB_PREFETCH_DIS (1 << 2) 1534#define TILECTL_TLB_PREFETCH_DIS (1 << 2)
@@ -1486,30 +1537,30 @@ enum skl_disp_power_wells {
1486/* 1537/*
1487 * Instruction and interrupt control regs 1538 * Instruction and interrupt control regs
1488 */ 1539 */
1489#define PGTBL_CTL 0x02020 1540#define PGTBL_CTL _MMIO(0x02020)
1490#define PGTBL_ADDRESS_LO_MASK 0xfffff000 /* bits [31:12] */ 1541#define PGTBL_ADDRESS_LO_MASK 0xfffff000 /* bits [31:12] */
1491#define PGTBL_ADDRESS_HI_MASK 0x000000f0 /* bits [35:32] (gen4) */ 1542#define PGTBL_ADDRESS_HI_MASK 0x000000f0 /* bits [35:32] (gen4) */
1492#define PGTBL_ER 0x02024 1543#define PGTBL_ER _MMIO(0x02024)
1493#define PRB0_BASE (0x2030-0x30) 1544#define PRB0_BASE (0x2030-0x30)
1494#define PRB1_BASE (0x2040-0x30) /* 830,gen3 */ 1545#define PRB1_BASE (0x2040-0x30) /* 830,gen3 */
1495#define PRB2_BASE (0x2050-0x30) /* gen3 */ 1546#define PRB2_BASE (0x2050-0x30) /* gen3 */
1496#define SRB0_BASE (0x2100-0x30) /* gen2 */ 1547#define SRB0_BASE (0x2100-0x30) /* gen2 */
1497#define SRB1_BASE (0x2110-0x30) /* gen2 */ 1548#define SRB1_BASE (0x2110-0x30) /* gen2 */
1498#define SRB2_BASE (0x2120-0x30) /* 830 */ 1549#define SRB2_BASE (0x2120-0x30) /* 830 */
1499#define SRB3_BASE (0x2130-0x30) /* 830 */ 1550#define SRB3_BASE (0x2130-0x30) /* 830 */
1500#define RENDER_RING_BASE 0x02000 1551#define RENDER_RING_BASE 0x02000
1501#define BSD_RING_BASE 0x04000 1552#define BSD_RING_BASE 0x04000
1502#define GEN6_BSD_RING_BASE 0x12000 1553#define GEN6_BSD_RING_BASE 0x12000
1503#define GEN8_BSD2_RING_BASE 0x1c000 1554#define GEN8_BSD2_RING_BASE 0x1c000
1504#define VEBOX_RING_BASE 0x1a000 1555#define VEBOX_RING_BASE 0x1a000
1505#define BLT_RING_BASE 0x22000 1556#define BLT_RING_BASE 0x22000
1506#define RING_TAIL(base) ((base)+0x30) 1557#define RING_TAIL(base) _MMIO((base)+0x30)
1507#define RING_HEAD(base) ((base)+0x34) 1558#define RING_HEAD(base) _MMIO((base)+0x34)
1508#define RING_START(base) ((base)+0x38) 1559#define RING_START(base) _MMIO((base)+0x38)
1509#define RING_CTL(base) ((base)+0x3c) 1560#define RING_CTL(base) _MMIO((base)+0x3c)
1510#define RING_SYNC_0(base) ((base)+0x40) 1561#define RING_SYNC_0(base) _MMIO((base)+0x40)
1511#define RING_SYNC_1(base) ((base)+0x44) 1562#define RING_SYNC_1(base) _MMIO((base)+0x44)
1512#define RING_SYNC_2(base) ((base)+0x48) 1563#define RING_SYNC_2(base) _MMIO((base)+0x48)
1513#define GEN6_RVSYNC (RING_SYNC_0(RENDER_RING_BASE)) 1564#define GEN6_RVSYNC (RING_SYNC_0(RENDER_RING_BASE))
1514#define GEN6_RBSYNC (RING_SYNC_1(RENDER_RING_BASE)) 1565#define GEN6_RBSYNC (RING_SYNC_1(RENDER_RING_BASE))
1515#define GEN6_RVESYNC (RING_SYNC_2(RENDER_RING_BASE)) 1566#define GEN6_RVESYNC (RING_SYNC_2(RENDER_RING_BASE))
@@ -1522,51 +1573,52 @@ enum skl_disp_power_wells {
1522#define GEN6_VEBSYNC (RING_SYNC_0(VEBOX_RING_BASE)) 1573#define GEN6_VEBSYNC (RING_SYNC_0(VEBOX_RING_BASE))
1523#define GEN6_VERSYNC (RING_SYNC_1(VEBOX_RING_BASE)) 1574#define GEN6_VERSYNC (RING_SYNC_1(VEBOX_RING_BASE))
1524#define GEN6_VEVSYNC (RING_SYNC_2(VEBOX_RING_BASE)) 1575#define GEN6_VEVSYNC (RING_SYNC_2(VEBOX_RING_BASE))
1525#define GEN6_NOSYNC 0 1576#define GEN6_NOSYNC INVALID_MMIO_REG
1526#define RING_PSMI_CTL(base) ((base)+0x50) 1577#define RING_PSMI_CTL(base) _MMIO((base)+0x50)
1527#define RING_MAX_IDLE(base) ((base)+0x54) 1578#define RING_MAX_IDLE(base) _MMIO((base)+0x54)
1528#define RING_HWS_PGA(base) ((base)+0x80) 1579#define RING_HWS_PGA(base) _MMIO((base)+0x80)
1529#define RING_HWS_PGA_GEN6(base) ((base)+0x2080) 1580#define RING_HWS_PGA_GEN6(base) _MMIO((base)+0x2080)
1530#define RING_RESET_CTL(base) ((base)+0xd0) 1581#define RING_RESET_CTL(base) _MMIO((base)+0xd0)
1531#define RESET_CTL_REQUEST_RESET (1 << 0) 1582#define RESET_CTL_REQUEST_RESET (1 << 0)
1532#define RESET_CTL_READY_TO_RESET (1 << 1) 1583#define RESET_CTL_READY_TO_RESET (1 << 1)
1533 1584
1534#define HSW_GTT_CACHE_EN 0x4024 1585#define HSW_GTT_CACHE_EN _MMIO(0x4024)
1535#define GTT_CACHE_EN_ALL 0xF0007FFF 1586#define GTT_CACHE_EN_ALL 0xF0007FFF
1536#define GEN7_WR_WATERMARK 0x4028 1587#define GEN7_WR_WATERMARK _MMIO(0x4028)
1537#define GEN7_GFX_PRIO_CTRL 0x402C 1588#define GEN7_GFX_PRIO_CTRL _MMIO(0x402C)
1538#define ARB_MODE 0x4030 1589#define ARB_MODE _MMIO(0x4030)
1539#define ARB_MODE_SWIZZLE_SNB (1<<4) 1590#define ARB_MODE_SWIZZLE_SNB (1<<4)
1540#define ARB_MODE_SWIZZLE_IVB (1<<5) 1591#define ARB_MODE_SWIZZLE_IVB (1<<5)
1541#define GEN7_GFX_PEND_TLB0 0x4034 1592#define GEN7_GFX_PEND_TLB0 _MMIO(0x4034)
1542#define GEN7_GFX_PEND_TLB1 0x4038 1593#define GEN7_GFX_PEND_TLB1 _MMIO(0x4038)
1543/* L3, CVS, ZTLB, RCC, CASC LRA min, max values */ 1594/* L3, CVS, ZTLB, RCC, CASC LRA min, max values */
1544#define GEN7_LRA_LIMITS(i) (0x403C + (i) * 4) 1595#define GEN7_LRA_LIMITS(i) _MMIO(0x403C + (i) * 4)
1545#define GEN7_LRA_LIMITS_REG_NUM 13 1596#define GEN7_LRA_LIMITS_REG_NUM 13
1546#define GEN7_MEDIA_MAX_REQ_COUNT 0x4070 1597#define GEN7_MEDIA_MAX_REQ_COUNT _MMIO(0x4070)
1547#define GEN7_GFX_MAX_REQ_COUNT 0x4074 1598#define GEN7_GFX_MAX_REQ_COUNT _MMIO(0x4074)
1548 1599
1549#define GAMTARBMODE 0x04a08 1600#define GAMTARBMODE _MMIO(0x04a08)
1550#define ARB_MODE_BWGTLB_DISABLE (1<<9) 1601#define ARB_MODE_BWGTLB_DISABLE (1<<9)
1551#define ARB_MODE_SWIZZLE_BDW (1<<1) 1602#define ARB_MODE_SWIZZLE_BDW (1<<1)
1552#define RENDER_HWS_PGA_GEN7 (0x04080) 1603#define RENDER_HWS_PGA_GEN7 _MMIO(0x04080)
1553#define RING_FAULT_REG(ring) (0x4094 + 0x100*(ring)->id) 1604#define RING_FAULT_REG(ring) _MMIO(0x4094 + 0x100*(ring)->id)
1554#define RING_FAULT_GTTSEL_MASK (1<<11) 1605#define RING_FAULT_GTTSEL_MASK (1<<11)
1555#define RING_FAULT_SRCID(x) (((x) >> 3) & 0xff) 1606#define RING_FAULT_SRCID(x) (((x) >> 3) & 0xff)
1556#define RING_FAULT_FAULT_TYPE(x) (((x) >> 1) & 0x3) 1607#define RING_FAULT_FAULT_TYPE(x) (((x) >> 1) & 0x3)
1557#define RING_FAULT_VALID (1<<0) 1608#define RING_FAULT_VALID (1<<0)
1558#define DONE_REG 0x40b0 1609#define DONE_REG _MMIO(0x40b0)
1559#define GEN8_PRIVATE_PAT_LO 0x40e0 1610#define GEN8_PRIVATE_PAT_LO _MMIO(0x40e0)
1560#define GEN8_PRIVATE_PAT_HI (0x40e0 + 4) 1611#define GEN8_PRIVATE_PAT_HI _MMIO(0x40e0 + 4)
1561#define BSD_HWS_PGA_GEN7 (0x04180) 1612#define BSD_HWS_PGA_GEN7 _MMIO(0x04180)
1562#define BLT_HWS_PGA_GEN7 (0x04280) 1613#define BLT_HWS_PGA_GEN7 _MMIO(0x04280)
1563#define VEBOX_HWS_PGA_GEN7 (0x04380) 1614#define VEBOX_HWS_PGA_GEN7 _MMIO(0x04380)
1564#define RING_ACTHD(base) ((base)+0x74) 1615#define RING_ACTHD(base) _MMIO((base)+0x74)
1565#define RING_ACTHD_UDW(base) ((base)+0x5c) 1616#define RING_ACTHD_UDW(base) _MMIO((base)+0x5c)
1566#define RING_NOPID(base) ((base)+0x94) 1617#define RING_NOPID(base) _MMIO((base)+0x94)
1567#define RING_IMR(base) ((base)+0xa8) 1618#define RING_IMR(base) _MMIO((base)+0xa8)
1568#define RING_HWSTAM(base) ((base)+0x98) 1619#define RING_HWSTAM(base) _MMIO((base)+0x98)
1569#define RING_TIMESTAMP(base) ((base)+0x358) 1620#define RING_TIMESTAMP(base) _MMIO((base)+0x358)
1621#define RING_TIMESTAMP_UDW(base) _MMIO((base)+0x358 + 4)
1570#define TAIL_ADDR 0x001FFFF8 1622#define TAIL_ADDR 0x001FFFF8
1571#define HEAD_WRAP_COUNT 0xFFE00000 1623#define HEAD_WRAP_COUNT 0xFFE00000
1572#define HEAD_WRAP_ONE 0x00200000 1624#define HEAD_WRAP_ONE 0x00200000
@@ -1583,57 +1635,65 @@ enum skl_disp_power_wells {
1583#define RING_WAIT (1<<11) /* gen3+, PRBx_CTL */ 1635#define RING_WAIT (1<<11) /* gen3+, PRBx_CTL */
1584#define RING_WAIT_SEMAPHORE (1<<10) /* gen6+ */ 1636#define RING_WAIT_SEMAPHORE (1<<10) /* gen6+ */
1585 1637
1586#define GEN7_TLB_RD_ADDR 0x4700 1638#define GEN7_TLB_RD_ADDR _MMIO(0x4700)
1587 1639
1588#if 0 1640#if 0
1589#define PRB0_TAIL 0x02030 1641#define PRB0_TAIL _MMIO(0x2030)
1590#define PRB0_HEAD 0x02034 1642#define PRB0_HEAD _MMIO(0x2034)
1591#define PRB0_START 0x02038 1643#define PRB0_START _MMIO(0x2038)
1592#define PRB0_CTL 0x0203c 1644#define PRB0_CTL _MMIO(0x203c)
1593#define PRB1_TAIL 0x02040 /* 915+ only */ 1645#define PRB1_TAIL _MMIO(0x2040) /* 915+ only */
1594#define PRB1_HEAD 0x02044 /* 915+ only */ 1646#define PRB1_HEAD _MMIO(0x2044) /* 915+ only */
1595#define PRB1_START 0x02048 /* 915+ only */ 1647#define PRB1_START _MMIO(0x2048) /* 915+ only */
1596#define PRB1_CTL 0x0204c /* 915+ only */ 1648#define PRB1_CTL _MMIO(0x204c) /* 915+ only */
1597#endif 1649#endif
1598#define IPEIR_I965 0x02064 1650#define IPEIR_I965 _MMIO(0x2064)
1599#define IPEHR_I965 0x02068 1651#define IPEHR_I965 _MMIO(0x2068)
1600#define GEN7_SC_INSTDONE 0x07100 1652#define GEN7_SC_INSTDONE _MMIO(0x7100)
1601#define GEN7_SAMPLER_INSTDONE 0x0e160 1653#define GEN7_SAMPLER_INSTDONE _MMIO(0xe160)
1602#define GEN7_ROW_INSTDONE 0x0e164 1654#define GEN7_ROW_INSTDONE _MMIO(0xe164)
1603#define I915_NUM_INSTDONE_REG 4 1655#define I915_NUM_INSTDONE_REG 4
1604#define RING_IPEIR(base) ((base)+0x64) 1656#define RING_IPEIR(base) _MMIO((base)+0x64)
1605#define RING_IPEHR(base) ((base)+0x68) 1657#define RING_IPEHR(base) _MMIO((base)+0x68)
1606/* 1658/*
1607 * On GEN4, only the render ring INSTDONE exists and has a different 1659 * On GEN4, only the render ring INSTDONE exists and has a different
1608 * layout than the GEN7+ version. 1660 * layout than the GEN7+ version.
1609 * The GEN2 counterpart of this register is GEN2_INSTDONE. 1661 * The GEN2 counterpart of this register is GEN2_INSTDONE.
1610 */ 1662 */
1611#define RING_INSTDONE(base) ((base)+0x6c) 1663#define RING_INSTDONE(base) _MMIO((base)+0x6c)
1612#define RING_INSTPS(base) ((base)+0x70) 1664#define RING_INSTPS(base) _MMIO((base)+0x70)
1613#define RING_DMA_FADD(base) ((base)+0x78) 1665#define RING_DMA_FADD(base) _MMIO((base)+0x78)
1614#define RING_DMA_FADD_UDW(base) ((base)+0x60) /* gen8+ */ 1666#define RING_DMA_FADD_UDW(base) _MMIO((base)+0x60) /* gen8+ */
1615#define RING_INSTPM(base) ((base)+0xc0) 1667#define RING_INSTPM(base) _MMIO((base)+0xc0)
1616#define RING_MI_MODE(base) ((base)+0x9c) 1668#define RING_MI_MODE(base) _MMIO((base)+0x9c)
1617#define INSTPS 0x02070 /* 965+ only */ 1669#define INSTPS _MMIO(0x2070) /* 965+ only */
1618#define GEN4_INSTDONE1 0x0207c /* 965+ only, aka INSTDONE_2 on SNB */ 1670#define GEN4_INSTDONE1 _MMIO(0x207c) /* 965+ only, aka INSTDONE_2 on SNB */
1619#define ACTHD_I965 0x02074 1671#define ACTHD_I965 _MMIO(0x2074)
1620#define HWS_PGA 0x02080 1672#define HWS_PGA _MMIO(0x2080)
1621#define HWS_ADDRESS_MASK 0xfffff000 1673#define HWS_ADDRESS_MASK 0xfffff000
1622#define HWS_START_ADDRESS_SHIFT 4 1674#define HWS_START_ADDRESS_SHIFT 4
1623#define PWRCTXA 0x2088 /* 965GM+ only */ 1675#define PWRCTXA _MMIO(0x2088) /* 965GM+ only */
1624#define PWRCTX_EN (1<<0) 1676#define PWRCTX_EN (1<<0)
1625#define IPEIR 0x02088 1677#define IPEIR _MMIO(0x2088)
1626#define IPEHR 0x0208c 1678#define IPEHR _MMIO(0x208c)
1627#define GEN2_INSTDONE 0x02090 1679#define GEN2_INSTDONE _MMIO(0x2090)
1628#define NOPID 0x02094 1680#define NOPID _MMIO(0x2094)
1629#define HWSTAM 0x02098 1681#define HWSTAM _MMIO(0x2098)
1630#define DMA_FADD_I8XX 0x020d0 1682#define DMA_FADD_I8XX _MMIO(0x20d0)
1631#define RING_BBSTATE(base) ((base)+0x110) 1683#define RING_BBSTATE(base) _MMIO((base)+0x110)
1632#define RING_BBADDR(base) ((base)+0x140) 1684#define RING_BB_PPGTT (1 << 5)
1633#define RING_BBADDR_UDW(base) ((base)+0x168) /* gen8+ */ 1685#define RING_SBBADDR(base) _MMIO((base)+0x114) /* hsw+ */
1634 1686#define RING_SBBSTATE(base) _MMIO((base)+0x118) /* hsw+ */
1635#define ERROR_GEN6 0x040a0 1687#define RING_SBBADDR_UDW(base) _MMIO((base)+0x11c) /* gen8+ */
1636#define GEN7_ERR_INT 0x44040 1688#define RING_BBADDR(base) _MMIO((base)+0x140)
1689#define RING_BBADDR_UDW(base) _MMIO((base)+0x168) /* gen8+ */
1690#define RING_BB_PER_CTX_PTR(base) _MMIO((base)+0x1c0) /* gen8+ */
1691#define RING_INDIRECT_CTX(base) _MMIO((base)+0x1c4) /* gen8+ */
1692#define RING_INDIRECT_CTX_OFFSET(base) _MMIO((base)+0x1c8) /* gen8+ */
1693#define RING_CTX_TIMESTAMP(base) _MMIO((base)+0x3a8) /* gen8+ */
1694
1695#define ERROR_GEN6 _MMIO(0x40a0)
1696#define GEN7_ERR_INT _MMIO(0x44040)
1637#define ERR_INT_POISON (1<<31) 1697#define ERR_INT_POISON (1<<31)
1638#define ERR_INT_MMIO_UNCLAIMED (1<<13) 1698#define ERR_INT_MMIO_UNCLAIMED (1<<13)
1639#define ERR_INT_PIPE_CRC_DONE_C (1<<8) 1699#define ERR_INT_PIPE_CRC_DONE_C (1<<8)
@@ -1645,13 +1705,13 @@ enum skl_disp_power_wells {
1645#define ERR_INT_FIFO_UNDERRUN_A (1<<0) 1705#define ERR_INT_FIFO_UNDERRUN_A (1<<0)
1646#define ERR_INT_FIFO_UNDERRUN(pipe) (1<<((pipe)*3)) 1706#define ERR_INT_FIFO_UNDERRUN(pipe) (1<<((pipe)*3))
1647 1707
1648#define GEN8_FAULT_TLB_DATA0 0x04b10 1708#define GEN8_FAULT_TLB_DATA0 _MMIO(0x4b10)
1649#define GEN8_FAULT_TLB_DATA1 0x04b14 1709#define GEN8_FAULT_TLB_DATA1 _MMIO(0x4b14)
1650 1710
1651#define FPGA_DBG 0x42300 1711#define FPGA_DBG _MMIO(0x42300)
1652#define FPGA_DBG_RM_NOCLAIM (1<<31) 1712#define FPGA_DBG_RM_NOCLAIM (1<<31)
1653 1713
1654#define DERRMR 0x44050 1714#define DERRMR _MMIO(0x44050)
1655/* Note that HBLANK events are reserved on bdw+ */ 1715/* Note that HBLANK events are reserved on bdw+ */
1656#define DERRMR_PIPEA_SCANLINE (1<<0) 1716#define DERRMR_PIPEA_SCANLINE (1<<0)
1657#define DERRMR_PIPEA_PRI_FLIP_DONE (1<<1) 1717#define DERRMR_PIPEA_PRI_FLIP_DONE (1<<1)
@@ -1675,29 +1735,29 @@ enum skl_disp_power_wells {
1675 * for various sorts of correct behavior. The top 16 bits of each are 1735 * for various sorts of correct behavior. The top 16 bits of each are
1676 * the enables for writing to the corresponding low bit. 1736 * the enables for writing to the corresponding low bit.
1677 */ 1737 */
1678#define _3D_CHICKEN 0x02084 1738#define _3D_CHICKEN _MMIO(0x2084)
1679#define _3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB (1 << 10) 1739#define _3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB (1 << 10)
1680#define _3D_CHICKEN2 0x0208c 1740#define _3D_CHICKEN2 _MMIO(0x208c)
1681/* Disables pipelining of read flushes past the SF-WIZ interface. 1741/* Disables pipelining of read flushes past the SF-WIZ interface.
1682 * Required on all Ironlake steppings according to the B-Spec, but the 1742 * Required on all Ironlake steppings according to the B-Spec, but the
1683 * particular danger of not doing so is not specified. 1743 * particular danger of not doing so is not specified.
1684 */ 1744 */
1685# define _3D_CHICKEN2_WM_READ_PIPELINED (1 << 14) 1745# define _3D_CHICKEN2_WM_READ_PIPELINED (1 << 14)
1686#define _3D_CHICKEN3 0x02090 1746#define _3D_CHICKEN3 _MMIO(0x2090)
1687#define _3D_CHICKEN_SF_DISABLE_OBJEND_CULL (1 << 10) 1747#define _3D_CHICKEN_SF_DISABLE_OBJEND_CULL (1 << 10)
1688#define _3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL (1 << 5) 1748#define _3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL (1 << 5)
1689#define _3D_CHICKEN_SDE_LIMIT_FIFO_POLY_DEPTH(x) ((x)<<1) /* gen8+ */ 1749#define _3D_CHICKEN_SDE_LIMIT_FIFO_POLY_DEPTH(x) ((x)<<1) /* gen8+ */
1690#define _3D_CHICKEN3_SF_DISABLE_PIPELINED_ATTR_FETCH (1 << 1) /* gen6 */ 1750#define _3D_CHICKEN3_SF_DISABLE_PIPELINED_ATTR_FETCH (1 << 1) /* gen6 */
1691 1751
1692#define MI_MODE 0x0209c 1752#define MI_MODE _MMIO(0x209c)
1693# define VS_TIMER_DISPATCH (1 << 6) 1753# define VS_TIMER_DISPATCH (1 << 6)
1694# define MI_FLUSH_ENABLE (1 << 12) 1754# define MI_FLUSH_ENABLE (1 << 12)
1695# define ASYNC_FLIP_PERF_DISABLE (1 << 14) 1755# define ASYNC_FLIP_PERF_DISABLE (1 << 14)
1696# define MODE_IDLE (1 << 9) 1756# define MODE_IDLE (1 << 9)
1697# define STOP_RING (1 << 8) 1757# define STOP_RING (1 << 8)
1698 1758
1699#define GEN6_GT_MODE 0x20d0 1759#define GEN6_GT_MODE _MMIO(0x20d0)
1700#define GEN7_GT_MODE 0x7008 1760#define GEN7_GT_MODE _MMIO(0x7008)
1701#define GEN6_WIZ_HASHING(hi, lo) (((hi) << 9) | ((lo) << 7)) 1761#define GEN6_WIZ_HASHING(hi, lo) (((hi) << 9) | ((lo) << 7))
1702#define GEN6_WIZ_HASHING_8x8 GEN6_WIZ_HASHING(0, 0) 1762#define GEN6_WIZ_HASHING_8x8 GEN6_WIZ_HASHING(0, 0)
1703#define GEN6_WIZ_HASHING_8x4 GEN6_WIZ_HASHING(0, 1) 1763#define GEN6_WIZ_HASHING_8x4 GEN6_WIZ_HASHING(0, 1)
@@ -1707,9 +1767,9 @@ enum skl_disp_power_wells {
1707#define GEN9_IZ_HASHING_MASK(slice) (0x3 << ((slice) * 2)) 1767#define GEN9_IZ_HASHING_MASK(slice) (0x3 << ((slice) * 2))
1708#define GEN9_IZ_HASHING(slice, val) ((val) << ((slice) * 2)) 1768#define GEN9_IZ_HASHING(slice, val) ((val) << ((slice) * 2))
1709 1769
1710#define GFX_MODE 0x02520 1770#define GFX_MODE _MMIO(0x2520)
1711#define GFX_MODE_GEN7 0x0229c 1771#define GFX_MODE_GEN7 _MMIO(0x229c)
1712#define RING_MODE_GEN7(ring) ((ring)->mmio_base+0x29c) 1772#define RING_MODE_GEN7(ring) _MMIO((ring)->mmio_base+0x29c)
1713#define GFX_RUN_LIST_ENABLE (1<<15) 1773#define GFX_RUN_LIST_ENABLE (1<<15)
1714#define GFX_INTERRUPT_STEERING (1<<14) 1774#define GFX_INTERRUPT_STEERING (1<<14)
1715#define GFX_TLB_INVALIDATE_EXPLICIT (1<<13) 1775#define GFX_TLB_INVALIDATE_EXPLICIT (1<<13)
@@ -1727,36 +1787,36 @@ enum skl_disp_power_wells {
1727#define VLV_DISPLAY_BASE 0x180000 1787#define VLV_DISPLAY_BASE 0x180000
1728#define VLV_MIPI_BASE VLV_DISPLAY_BASE 1788#define VLV_MIPI_BASE VLV_DISPLAY_BASE
1729 1789
1730#define VLV_GU_CTL0 (VLV_DISPLAY_BASE + 0x2030) 1790#define VLV_GU_CTL0 _MMIO(VLV_DISPLAY_BASE + 0x2030)
1731#define VLV_GU_CTL1 (VLV_DISPLAY_BASE + 0x2034) 1791#define VLV_GU_CTL1 _MMIO(VLV_DISPLAY_BASE + 0x2034)
1732#define SCPD0 0x0209c /* 915+ only */ 1792#define SCPD0 _MMIO(0x209c) /* 915+ only */
1733#define IER 0x020a0 1793#define IER _MMIO(0x20a0)
1734#define IIR 0x020a4 1794#define IIR _MMIO(0x20a4)
1735#define IMR 0x020a8 1795#define IMR _MMIO(0x20a8)
1736#define ISR 0x020ac 1796#define ISR _MMIO(0x20ac)
1737#define VLV_GUNIT_CLOCK_GATE (VLV_DISPLAY_BASE + 0x2060) 1797#define VLV_GUNIT_CLOCK_GATE _MMIO(VLV_DISPLAY_BASE + 0x2060)
1738#define GINT_DIS (1<<22) 1798#define GINT_DIS (1<<22)
1739#define GCFG_DIS (1<<8) 1799#define GCFG_DIS (1<<8)
1740#define VLV_GUNIT_CLOCK_GATE2 (VLV_DISPLAY_BASE + 0x2064) 1800#define VLV_GUNIT_CLOCK_GATE2 _MMIO(VLV_DISPLAY_BASE + 0x2064)
1741#define VLV_IIR_RW (VLV_DISPLAY_BASE + 0x2084) 1801#define VLV_IIR_RW _MMIO(VLV_DISPLAY_BASE + 0x2084)
1742#define VLV_IER (VLV_DISPLAY_BASE + 0x20a0) 1802#define VLV_IER _MMIO(VLV_DISPLAY_BASE + 0x20a0)
1743#define VLV_IIR (VLV_DISPLAY_BASE + 0x20a4) 1803#define VLV_IIR _MMIO(VLV_DISPLAY_BASE + 0x20a4)
1744#define VLV_IMR (VLV_DISPLAY_BASE + 0x20a8) 1804#define VLV_IMR _MMIO(VLV_DISPLAY_BASE + 0x20a8)
1745#define VLV_ISR (VLV_DISPLAY_BASE + 0x20ac) 1805#define VLV_ISR _MMIO(VLV_DISPLAY_BASE + 0x20ac)
1746#define VLV_PCBR (VLV_DISPLAY_BASE + 0x2120) 1806#define VLV_PCBR _MMIO(VLV_DISPLAY_BASE + 0x2120)
1747#define VLV_PCBR_ADDR_SHIFT 12 1807#define VLV_PCBR_ADDR_SHIFT 12
1748 1808
1749#define DISPLAY_PLANE_FLIP_PENDING(plane) (1<<(11-(plane))) /* A and B only */ 1809#define DISPLAY_PLANE_FLIP_PENDING(plane) (1<<(11-(plane))) /* A and B only */
1750#define EIR 0x020b0 1810#define EIR _MMIO(0x20b0)
1751#define EMR 0x020b4 1811#define EMR _MMIO(0x20b4)
1752#define ESR 0x020b8 1812#define ESR _MMIO(0x20b8)
1753#define GM45_ERROR_PAGE_TABLE (1<<5) 1813#define GM45_ERROR_PAGE_TABLE (1<<5)
1754#define GM45_ERROR_MEM_PRIV (1<<4) 1814#define GM45_ERROR_MEM_PRIV (1<<4)
1755#define I915_ERROR_PAGE_TABLE (1<<4) 1815#define I915_ERROR_PAGE_TABLE (1<<4)
1756#define GM45_ERROR_CP_PRIV (1<<3) 1816#define GM45_ERROR_CP_PRIV (1<<3)
1757#define I915_ERROR_MEMORY_REFRESH (1<<1) 1817#define I915_ERROR_MEMORY_REFRESH (1<<1)
1758#define I915_ERROR_INSTRUCTION (1<<0) 1818#define I915_ERROR_INSTRUCTION (1<<0)
1759#define INSTPM 0x020c0 1819#define INSTPM _MMIO(0x20c0)
1760#define INSTPM_SELF_EN (1<<12) /* 915GM only */ 1820#define INSTPM_SELF_EN (1<<12) /* 915GM only */
1761#define INSTPM_AGPBUSY_INT_EN (1<<11) /* gen3: when disabled, pending interrupts 1821#define INSTPM_AGPBUSY_INT_EN (1<<11) /* gen3: when disabled, pending interrupts
1762 will not assert AGPBUSY# and will only 1822 will not assert AGPBUSY# and will only
@@ -1764,14 +1824,14 @@ enum skl_disp_power_wells {
1764#define INSTPM_FORCE_ORDERING (1<<7) /* GEN6+ */ 1824#define INSTPM_FORCE_ORDERING (1<<7) /* GEN6+ */
1765#define INSTPM_TLB_INVALIDATE (1<<9) 1825#define INSTPM_TLB_INVALIDATE (1<<9)
1766#define INSTPM_SYNC_FLUSH (1<<5) 1826#define INSTPM_SYNC_FLUSH (1<<5)
1767#define ACTHD 0x020c8 1827#define ACTHD _MMIO(0x20c8)
1768#define MEM_MODE 0x020cc 1828#define MEM_MODE _MMIO(0x20cc)
1769#define MEM_DISPLAY_B_TRICKLE_FEED_DISABLE (1<<3) /* 830 only */ 1829#define MEM_DISPLAY_B_TRICKLE_FEED_DISABLE (1<<3) /* 830 only */
1770#define MEM_DISPLAY_A_TRICKLE_FEED_DISABLE (1<<2) /* 830/845 only */ 1830#define MEM_DISPLAY_A_TRICKLE_FEED_DISABLE (1<<2) /* 830/845 only */
1771#define MEM_DISPLAY_TRICKLE_FEED_DISABLE (1<<2) /* 85x only */ 1831#define MEM_DISPLAY_TRICKLE_FEED_DISABLE (1<<2) /* 85x only */
1772#define FW_BLC 0x020d8 1832#define FW_BLC _MMIO(0x20d8)
1773#define FW_BLC2 0x020dc 1833#define FW_BLC2 _MMIO(0x20dc)
1774#define FW_BLC_SELF 0x020e0 /* 915+ only */ 1834#define FW_BLC_SELF _MMIO(0x20e0) /* 915+ only */
1775#define FW_BLC_SELF_EN_MASK (1<<31) 1835#define FW_BLC_SELF_EN_MASK (1<<31)
1776#define FW_BLC_SELF_FIFO_MASK (1<<16) /* 945 only */ 1836#define FW_BLC_SELF_FIFO_MASK (1<<16) /* 945 only */
1777#define FW_BLC_SELF_EN (1<<15) /* 945 only */ 1837#define FW_BLC_SELF_EN (1<<15) /* 945 only */
@@ -1779,7 +1839,7 @@ enum skl_disp_power_wells {
1779#define MM_FIFO_WATERMARK 0x0001F000 1839#define MM_FIFO_WATERMARK 0x0001F000
1780#define LM_BURST_LENGTH 0x00000700 1840#define LM_BURST_LENGTH 0x00000700
1781#define LM_FIFO_WATERMARK 0x0000001F 1841#define LM_FIFO_WATERMARK 0x0000001F
1782#define MI_ARB_STATE 0x020e4 /* 915+ only */ 1842#define MI_ARB_STATE _MMIO(0x20e4) /* 915+ only */
1783 1843
1784/* Make render/texture TLB fetches lower priorty than associated data 1844/* Make render/texture TLB fetches lower priorty than associated data
1785 * fetches. This is not turned on by default 1845 * fetches. This is not turned on by default
@@ -1843,11 +1903,11 @@ enum skl_disp_power_wells {
1843#define MI_ARB_DISPLAY_PRIORITY_A_B (0 << 0) /* display A > display B */ 1903#define MI_ARB_DISPLAY_PRIORITY_A_B (0 << 0) /* display A > display B */
1844#define MI_ARB_DISPLAY_PRIORITY_B_A (1 << 0) /* display B > display A */ 1904#define MI_ARB_DISPLAY_PRIORITY_B_A (1 << 0) /* display B > display A */
1845 1905
1846#define MI_STATE 0x020e4 /* gen2 only */ 1906#define MI_STATE _MMIO(0x20e4) /* gen2 only */
1847#define MI_AGPBUSY_INT_EN (1 << 1) /* 85x only */ 1907#define MI_AGPBUSY_INT_EN (1 << 1) /* 85x only */
1848#define MI_AGPBUSY_830_MODE (1 << 0) /* 85x only */ 1908#define MI_AGPBUSY_830_MODE (1 << 0) /* 85x only */
1849 1909
1850#define CACHE_MODE_0 0x02120 /* 915+ only */ 1910#define CACHE_MODE_0 _MMIO(0x2120) /* 915+ only */
1851#define CM0_PIPELINED_RENDER_FLUSH_DISABLE (1<<8) 1911#define CM0_PIPELINED_RENDER_FLUSH_DISABLE (1<<8)
1852#define CM0_IZ_OPT_DISABLE (1<<6) 1912#define CM0_IZ_OPT_DISABLE (1<<6)
1853#define CM0_ZR_OPT_DISABLE (1<<5) 1913#define CM0_ZR_OPT_DISABLE (1<<5)
@@ -1856,32 +1916,32 @@ enum skl_disp_power_wells {
1856#define CM0_COLOR_EVICT_DISABLE (1<<3) 1916#define CM0_COLOR_EVICT_DISABLE (1<<3)
1857#define CM0_DEPTH_WRITE_DISABLE (1<<1) 1917#define CM0_DEPTH_WRITE_DISABLE (1<<1)
1858#define CM0_RC_OP_FLUSH_DISABLE (1<<0) 1918#define CM0_RC_OP_FLUSH_DISABLE (1<<0)
1859#define GFX_FLSH_CNTL 0x02170 /* 915+ only */ 1919#define GFX_FLSH_CNTL _MMIO(0x2170) /* 915+ only */
1860#define GFX_FLSH_CNTL_GEN6 0x101008 1920#define GFX_FLSH_CNTL_GEN6 _MMIO(0x101008)
1861#define GFX_FLSH_CNTL_EN (1<<0) 1921#define GFX_FLSH_CNTL_EN (1<<0)
1862#define ECOSKPD 0x021d0 1922#define ECOSKPD _MMIO(0x21d0)
1863#define ECO_GATING_CX_ONLY (1<<3) 1923#define ECO_GATING_CX_ONLY (1<<3)
1864#define ECO_FLIP_DONE (1<<0) 1924#define ECO_FLIP_DONE (1<<0)
1865 1925
1866#define CACHE_MODE_0_GEN7 0x7000 /* IVB+ */ 1926#define CACHE_MODE_0_GEN7 _MMIO(0x7000) /* IVB+ */
1867#define RC_OP_FLUSH_ENABLE (1<<0) 1927#define RC_OP_FLUSH_ENABLE (1<<0)
1868#define HIZ_RAW_STALL_OPT_DISABLE (1<<2) 1928#define HIZ_RAW_STALL_OPT_DISABLE (1<<2)
1869#define CACHE_MODE_1 0x7004 /* IVB+ */ 1929#define CACHE_MODE_1 _MMIO(0x7004) /* IVB+ */
1870#define PIXEL_SUBSPAN_COLLECT_OPT_DISABLE (1<<6) 1930#define PIXEL_SUBSPAN_COLLECT_OPT_DISABLE (1<<6)
1871#define GEN8_4x4_STC_OPTIMIZATION_DISABLE (1<<6) 1931#define GEN8_4x4_STC_OPTIMIZATION_DISABLE (1<<6)
1872#define GEN9_PARTIAL_RESOLVE_IN_VC_DISABLE (1<<1) 1932#define GEN9_PARTIAL_RESOLVE_IN_VC_DISABLE (1<<1)
1873 1933
1874#define GEN6_BLITTER_ECOSKPD 0x221d0 1934#define GEN6_BLITTER_ECOSKPD _MMIO(0x221d0)
1875#define GEN6_BLITTER_LOCK_SHIFT 16 1935#define GEN6_BLITTER_LOCK_SHIFT 16
1876#define GEN6_BLITTER_FBC_NOTIFY (1<<3) 1936#define GEN6_BLITTER_FBC_NOTIFY (1<<3)
1877 1937
1878#define GEN6_RC_SLEEP_PSMI_CONTROL 0x2050 1938#define GEN6_RC_SLEEP_PSMI_CONTROL _MMIO(0x2050)
1879#define GEN6_PSMI_SLEEP_MSG_DISABLE (1 << 0) 1939#define GEN6_PSMI_SLEEP_MSG_DISABLE (1 << 0)
1880#define GEN8_RC_SEMA_IDLE_MSG_DISABLE (1 << 12) 1940#define GEN8_RC_SEMA_IDLE_MSG_DISABLE (1 << 12)
1881#define GEN8_FF_DOP_CLOCK_GATE_DISABLE (1<<10) 1941#define GEN8_FF_DOP_CLOCK_GATE_DISABLE (1<<10)
1882 1942
1883/* Fuse readout registers for GT */ 1943/* Fuse readout registers for GT */
1884#define CHV_FUSE_GT (VLV_DISPLAY_BASE + 0x2168) 1944#define CHV_FUSE_GT _MMIO(VLV_DISPLAY_BASE + 0x2168)
1885#define CHV_FGT_DISABLE_SS0 (1 << 10) 1945#define CHV_FGT_DISABLE_SS0 (1 << 10)
1886#define CHV_FGT_DISABLE_SS1 (1 << 11) 1946#define CHV_FGT_DISABLE_SS1 (1 << 11)
1887#define CHV_FGT_EU_DIS_SS0_R0_SHIFT 16 1947#define CHV_FGT_EU_DIS_SS0_R0_SHIFT 16
@@ -1893,7 +1953,7 @@ enum skl_disp_power_wells {
1893#define CHV_FGT_EU_DIS_SS1_R1_SHIFT 28 1953#define CHV_FGT_EU_DIS_SS1_R1_SHIFT 28
1894#define CHV_FGT_EU_DIS_SS1_R1_MASK (0xf << CHV_FGT_EU_DIS_SS1_R1_SHIFT) 1954#define CHV_FGT_EU_DIS_SS1_R1_MASK (0xf << CHV_FGT_EU_DIS_SS1_R1_SHIFT)
1895 1955
1896#define GEN8_FUSE2 0x9120 1956#define GEN8_FUSE2 _MMIO(0x9120)
1897#define GEN8_F2_SS_DIS_SHIFT 21 1957#define GEN8_F2_SS_DIS_SHIFT 21
1898#define GEN8_F2_SS_DIS_MASK (0x7 << GEN8_F2_SS_DIS_SHIFT) 1958#define GEN8_F2_SS_DIS_MASK (0x7 << GEN8_F2_SS_DIS_SHIFT)
1899#define GEN8_F2_S_ENA_SHIFT 25 1959#define GEN8_F2_S_ENA_SHIFT 25
@@ -1902,22 +1962,22 @@ enum skl_disp_power_wells {
1902#define GEN9_F2_SS_DIS_SHIFT 20 1962#define GEN9_F2_SS_DIS_SHIFT 20
1903#define GEN9_F2_SS_DIS_MASK (0xf << GEN9_F2_SS_DIS_SHIFT) 1963#define GEN9_F2_SS_DIS_MASK (0xf << GEN9_F2_SS_DIS_SHIFT)
1904 1964
1905#define GEN8_EU_DISABLE0 0x9134 1965#define GEN8_EU_DISABLE0 _MMIO(0x9134)
1906#define GEN8_EU_DIS0_S0_MASK 0xffffff 1966#define GEN8_EU_DIS0_S0_MASK 0xffffff
1907#define GEN8_EU_DIS0_S1_SHIFT 24 1967#define GEN8_EU_DIS0_S1_SHIFT 24
1908#define GEN8_EU_DIS0_S1_MASK (0xff << GEN8_EU_DIS0_S1_SHIFT) 1968#define GEN8_EU_DIS0_S1_MASK (0xff << GEN8_EU_DIS0_S1_SHIFT)
1909 1969
1910#define GEN8_EU_DISABLE1 0x9138 1970#define GEN8_EU_DISABLE1 _MMIO(0x9138)
1911#define GEN8_EU_DIS1_S1_MASK 0xffff 1971#define GEN8_EU_DIS1_S1_MASK 0xffff
1912#define GEN8_EU_DIS1_S2_SHIFT 16 1972#define GEN8_EU_DIS1_S2_SHIFT 16
1913#define GEN8_EU_DIS1_S2_MASK (0xffff << GEN8_EU_DIS1_S2_SHIFT) 1973#define GEN8_EU_DIS1_S2_MASK (0xffff << GEN8_EU_DIS1_S2_SHIFT)
1914 1974
1915#define GEN8_EU_DISABLE2 0x913c 1975#define GEN8_EU_DISABLE2 _MMIO(0x913c)
1916#define GEN8_EU_DIS2_S2_MASK 0xff 1976#define GEN8_EU_DIS2_S2_MASK 0xff
1917 1977
1918#define GEN9_EU_DISABLE(slice) (0x9134 + (slice)*0x4) 1978#define GEN9_EU_DISABLE(slice) _MMIO(0x9134 + (slice)*0x4)
1919 1979
1920#define GEN6_BSD_SLEEP_PSMI_CONTROL 0x12050 1980#define GEN6_BSD_SLEEP_PSMI_CONTROL _MMIO(0x12050)
1921#define GEN6_BSD_SLEEP_MSG_DISABLE (1 << 0) 1981#define GEN6_BSD_SLEEP_MSG_DISABLE (1 << 0)
1922#define GEN6_BSD_SLEEP_FLUSH_DISABLE (1 << 2) 1982#define GEN6_BSD_SLEEP_FLUSH_DISABLE (1 << 2)
1923#define GEN6_BSD_SLEEP_INDICATOR (1 << 3) 1983#define GEN6_BSD_SLEEP_INDICATOR (1 << 3)
@@ -1995,9 +2055,9 @@ enum skl_disp_power_wells {
1995#define I915_ASLE_INTERRUPT (1<<0) 2055#define I915_ASLE_INTERRUPT (1<<0)
1996#define I915_BSD_USER_INTERRUPT (1<<25) 2056#define I915_BSD_USER_INTERRUPT (1<<25)
1997 2057
1998#define GEN6_BSD_RNCID 0x12198 2058#define GEN6_BSD_RNCID _MMIO(0x12198)
1999 2059
2000#define GEN7_FF_THREAD_MODE 0x20a0 2060#define GEN7_FF_THREAD_MODE _MMIO(0x20a0)
2001#define GEN7_FF_SCHED_MASK 0x0077070 2061#define GEN7_FF_SCHED_MASK 0x0077070
2002#define GEN8_FF_DS_REF_CNT_FFME (1 << 19) 2062#define GEN8_FF_DS_REF_CNT_FFME (1 << 19)
2003#define GEN7_FF_TS_SCHED_HS1 (0x5<<16) 2063#define GEN7_FF_TS_SCHED_HS1 (0x5<<16)
@@ -2018,9 +2078,9 @@ enum skl_disp_power_wells {
2018 * Framebuffer compression (915+ only) 2078 * Framebuffer compression (915+ only)
2019 */ 2079 */
2020 2080
2021#define FBC_CFB_BASE 0x03200 /* 4k page aligned */ 2081#define FBC_CFB_BASE _MMIO(0x3200) /* 4k page aligned */
2022#define FBC_LL_BASE 0x03204 /* 4k page aligned */ 2082#define FBC_LL_BASE _MMIO(0x3204) /* 4k page aligned */
2023#define FBC_CONTROL 0x03208 2083#define FBC_CONTROL _MMIO(0x3208)
2024#define FBC_CTL_EN (1<<31) 2084#define FBC_CTL_EN (1<<31)
2025#define FBC_CTL_PERIODIC (1<<30) 2085#define FBC_CTL_PERIODIC (1<<30)
2026#define FBC_CTL_INTERVAL_SHIFT (16) 2086#define FBC_CTL_INTERVAL_SHIFT (16)
@@ -2028,14 +2088,14 @@ enum skl_disp_power_wells {
2028#define FBC_CTL_C3_IDLE (1<<13) 2088#define FBC_CTL_C3_IDLE (1<<13)
2029#define FBC_CTL_STRIDE_SHIFT (5) 2089#define FBC_CTL_STRIDE_SHIFT (5)
2030#define FBC_CTL_FENCENO_SHIFT (0) 2090#define FBC_CTL_FENCENO_SHIFT (0)
2031#define FBC_COMMAND 0x0320c 2091#define FBC_COMMAND _MMIO(0x320c)
2032#define FBC_CMD_COMPRESS (1<<0) 2092#define FBC_CMD_COMPRESS (1<<0)
2033#define FBC_STATUS 0x03210 2093#define FBC_STATUS _MMIO(0x3210)
2034#define FBC_STAT_COMPRESSING (1<<31) 2094#define FBC_STAT_COMPRESSING (1<<31)
2035#define FBC_STAT_COMPRESSED (1<<30) 2095#define FBC_STAT_COMPRESSED (1<<30)
2036#define FBC_STAT_MODIFIED (1<<29) 2096#define FBC_STAT_MODIFIED (1<<29)
2037#define FBC_STAT_CURRENT_LINE_SHIFT (0) 2097#define FBC_STAT_CURRENT_LINE_SHIFT (0)
2038#define FBC_CONTROL2 0x03214 2098#define FBC_CONTROL2 _MMIO(0x3214)
2039#define FBC_CTL_FENCE_DBL (0<<4) 2099#define FBC_CTL_FENCE_DBL (0<<4)
2040#define FBC_CTL_IDLE_IMM (0<<2) 2100#define FBC_CTL_IDLE_IMM (0<<2)
2041#define FBC_CTL_IDLE_FULL (1<<2) 2101#define FBC_CTL_IDLE_FULL (1<<2)
@@ -2043,17 +2103,17 @@ enum skl_disp_power_wells {
2043#define FBC_CTL_IDLE_DEBUG (3<<2) 2103#define FBC_CTL_IDLE_DEBUG (3<<2)
2044#define FBC_CTL_CPU_FENCE (1<<1) 2104#define FBC_CTL_CPU_FENCE (1<<1)
2045#define FBC_CTL_PLANE(plane) ((plane)<<0) 2105#define FBC_CTL_PLANE(plane) ((plane)<<0)
2046#define FBC_FENCE_OFF 0x03218 /* BSpec typo has 321Bh */ 2106#define FBC_FENCE_OFF _MMIO(0x3218) /* BSpec typo has 321Bh */
2047#define FBC_TAG(i) (0x03300 + (i) * 4) 2107#define FBC_TAG(i) _MMIO(0x3300 + (i) * 4)
2048 2108
2049#define FBC_STATUS2 0x43214 2109#define FBC_STATUS2 _MMIO(0x43214)
2050#define FBC_COMPRESSION_MASK 0x7ff 2110#define FBC_COMPRESSION_MASK 0x7ff
2051 2111
2052#define FBC_LL_SIZE (1536) 2112#define FBC_LL_SIZE (1536)
2053 2113
2054/* Framebuffer compression for GM45+ */ 2114/* Framebuffer compression for GM45+ */
2055#define DPFC_CB_BASE 0x3200 2115#define DPFC_CB_BASE _MMIO(0x3200)
2056#define DPFC_CONTROL 0x3208 2116#define DPFC_CONTROL _MMIO(0x3208)
2057#define DPFC_CTL_EN (1<<31) 2117#define DPFC_CTL_EN (1<<31)
2058#define DPFC_CTL_PLANE(plane) ((plane)<<30) 2118#define DPFC_CTL_PLANE(plane) ((plane)<<30)
2059#define IVB_DPFC_CTL_PLANE(plane) ((plane)<<29) 2119#define IVB_DPFC_CTL_PLANE(plane) ((plane)<<29)
@@ -2064,37 +2124,37 @@ enum skl_disp_power_wells {
2064#define DPFC_CTL_LIMIT_1X (0<<6) 2124#define DPFC_CTL_LIMIT_1X (0<<6)
2065#define DPFC_CTL_LIMIT_2X (1<<6) 2125#define DPFC_CTL_LIMIT_2X (1<<6)
2066#define DPFC_CTL_LIMIT_4X (2<<6) 2126#define DPFC_CTL_LIMIT_4X (2<<6)
2067#define DPFC_RECOMP_CTL 0x320c 2127#define DPFC_RECOMP_CTL _MMIO(0x320c)
2068#define DPFC_RECOMP_STALL_EN (1<<27) 2128#define DPFC_RECOMP_STALL_EN (1<<27)
2069#define DPFC_RECOMP_STALL_WM_SHIFT (16) 2129#define DPFC_RECOMP_STALL_WM_SHIFT (16)
2070#define DPFC_RECOMP_STALL_WM_MASK (0x07ff0000) 2130#define DPFC_RECOMP_STALL_WM_MASK (0x07ff0000)
2071#define DPFC_RECOMP_TIMER_COUNT_SHIFT (0) 2131#define DPFC_RECOMP_TIMER_COUNT_SHIFT (0)
2072#define DPFC_RECOMP_TIMER_COUNT_MASK (0x0000003f) 2132#define DPFC_RECOMP_TIMER_COUNT_MASK (0x0000003f)
2073#define DPFC_STATUS 0x3210 2133#define DPFC_STATUS _MMIO(0x3210)
2074#define DPFC_INVAL_SEG_SHIFT (16) 2134#define DPFC_INVAL_SEG_SHIFT (16)
2075#define DPFC_INVAL_SEG_MASK (0x07ff0000) 2135#define DPFC_INVAL_SEG_MASK (0x07ff0000)
2076#define DPFC_COMP_SEG_SHIFT (0) 2136#define DPFC_COMP_SEG_SHIFT (0)
2077#define DPFC_COMP_SEG_MASK (0x000003ff) 2137#define DPFC_COMP_SEG_MASK (0x000003ff)
2078#define DPFC_STATUS2 0x3214 2138#define DPFC_STATUS2 _MMIO(0x3214)
2079#define DPFC_FENCE_YOFF 0x3218 2139#define DPFC_FENCE_YOFF _MMIO(0x3218)
2080#define DPFC_CHICKEN 0x3224 2140#define DPFC_CHICKEN _MMIO(0x3224)
2081#define DPFC_HT_MODIFY (1<<31) 2141#define DPFC_HT_MODIFY (1<<31)
2082 2142
2083/* Framebuffer compression for Ironlake */ 2143/* Framebuffer compression for Ironlake */
2084#define ILK_DPFC_CB_BASE 0x43200 2144#define ILK_DPFC_CB_BASE _MMIO(0x43200)
2085#define ILK_DPFC_CONTROL 0x43208 2145#define ILK_DPFC_CONTROL _MMIO(0x43208)
2086#define FBC_CTL_FALSE_COLOR (1<<10) 2146#define FBC_CTL_FALSE_COLOR (1<<10)
2087/* The bit 28-8 is reserved */ 2147/* The bit 28-8 is reserved */
2088#define DPFC_RESERVED (0x1FFFFF00) 2148#define DPFC_RESERVED (0x1FFFFF00)
2089#define ILK_DPFC_RECOMP_CTL 0x4320c 2149#define ILK_DPFC_RECOMP_CTL _MMIO(0x4320c)
2090#define ILK_DPFC_STATUS 0x43210 2150#define ILK_DPFC_STATUS _MMIO(0x43210)
2091#define ILK_DPFC_FENCE_YOFF 0x43218 2151#define ILK_DPFC_FENCE_YOFF _MMIO(0x43218)
2092#define ILK_DPFC_CHICKEN 0x43224 2152#define ILK_DPFC_CHICKEN _MMIO(0x43224)
2093#define ILK_FBC_RT_BASE 0x2128 2153#define ILK_FBC_RT_BASE _MMIO(0x2128)
2094#define ILK_FBC_RT_VALID (1<<0) 2154#define ILK_FBC_RT_VALID (1<<0)
2095#define SNB_FBC_FRONT_BUFFER (1<<1) 2155#define SNB_FBC_FRONT_BUFFER (1<<1)
2096 2156
2097#define ILK_DISPLAY_CHICKEN1 0x42000 2157#define ILK_DISPLAY_CHICKEN1 _MMIO(0x42000)
2098#define ILK_FBCQ_DIS (1<<22) 2158#define ILK_FBCQ_DIS (1<<22)
2099#define ILK_PABSTRETCH_DIS (1<<21) 2159#define ILK_PABSTRETCH_DIS (1<<21)
2100 2160
@@ -2104,31 +2164,31 @@ enum skl_disp_power_wells {
2104 * 2164 *
2105 * The following two registers are of type GTTMMADR 2165 * The following two registers are of type GTTMMADR
2106 */ 2166 */
2107#define SNB_DPFC_CTL_SA 0x100100 2167#define SNB_DPFC_CTL_SA _MMIO(0x100100)
2108#define SNB_CPU_FENCE_ENABLE (1<<29) 2168#define SNB_CPU_FENCE_ENABLE (1<<29)
2109#define DPFC_CPU_FENCE_OFFSET 0x100104 2169#define DPFC_CPU_FENCE_OFFSET _MMIO(0x100104)
2110 2170
2111/* Framebuffer compression for Ivybridge */ 2171/* Framebuffer compression for Ivybridge */
2112#define IVB_FBC_RT_BASE 0x7020 2172#define IVB_FBC_RT_BASE _MMIO(0x7020)
2113 2173
2114#define IPS_CTL 0x43408 2174#define IPS_CTL _MMIO(0x43408)
2115#define IPS_ENABLE (1 << 31) 2175#define IPS_ENABLE (1 << 31)
2116 2176
2117#define MSG_FBC_REND_STATE 0x50380 2177#define MSG_FBC_REND_STATE _MMIO(0x50380)
2118#define FBC_REND_NUKE (1<<2) 2178#define FBC_REND_NUKE (1<<2)
2119#define FBC_REND_CACHE_CLEAN (1<<1) 2179#define FBC_REND_CACHE_CLEAN (1<<1)
2120 2180
2121/* 2181/*
2122 * GPIO regs 2182 * GPIO regs
2123 */ 2183 */
2124#define GPIOA 0x5010 2184#define GPIOA _MMIO(0x5010)
2125#define GPIOB 0x5014 2185#define GPIOB _MMIO(0x5014)
2126#define GPIOC 0x5018 2186#define GPIOC _MMIO(0x5018)
2127#define GPIOD 0x501c 2187#define GPIOD _MMIO(0x501c)
2128#define GPIOE 0x5020 2188#define GPIOE _MMIO(0x5020)
2129#define GPIOF 0x5024 2189#define GPIOF _MMIO(0x5024)
2130#define GPIOG 0x5028 2190#define GPIOG _MMIO(0x5028)
2131#define GPIOH 0x502c 2191#define GPIOH _MMIO(0x502c)
2132# define GPIO_CLOCK_DIR_MASK (1 << 0) 2192# define GPIO_CLOCK_DIR_MASK (1 << 0)
2133# define GPIO_CLOCK_DIR_IN (0 << 1) 2193# define GPIO_CLOCK_DIR_IN (0 << 1)
2134# define GPIO_CLOCK_DIR_OUT (1 << 1) 2194# define GPIO_CLOCK_DIR_OUT (1 << 1)
@@ -2144,7 +2204,7 @@ enum skl_disp_power_wells {
2144# define GPIO_DATA_VAL_IN (1 << 12) 2204# define GPIO_DATA_VAL_IN (1 << 12)
2145# define GPIO_DATA_PULLUP_DISABLE (1 << 13) 2205# define GPIO_DATA_PULLUP_DISABLE (1 << 13)
2146 2206
2147#define GMBUS0 (dev_priv->gpio_mmio_base + 0x5100) /* clock/port select */ 2207#define GMBUS0 _MMIO(dev_priv->gpio_mmio_base + 0x5100) /* clock/port select */
2148#define GMBUS_RATE_100KHZ (0<<8) 2208#define GMBUS_RATE_100KHZ (0<<8)
2149#define GMBUS_RATE_50KHZ (1<<8) 2209#define GMBUS_RATE_50KHZ (1<<8)
2150#define GMBUS_RATE_400KHZ (2<<8) /* reserved on Pineview */ 2210#define GMBUS_RATE_400KHZ (2<<8) /* reserved on Pineview */
@@ -2163,7 +2223,7 @@ enum skl_disp_power_wells {
2163#define GMBUS_PIN_2_BXT 2 2223#define GMBUS_PIN_2_BXT 2
2164#define GMBUS_PIN_3_BXT 3 2224#define GMBUS_PIN_3_BXT 3
2165#define GMBUS_NUM_PINS 7 /* including 0 */ 2225#define GMBUS_NUM_PINS 7 /* including 0 */
2166#define GMBUS1 (dev_priv->gpio_mmio_base + 0x5104) /* command/status */ 2226#define GMBUS1 _MMIO(dev_priv->gpio_mmio_base + 0x5104) /* command/status */
2167#define GMBUS_SW_CLR_INT (1<<31) 2227#define GMBUS_SW_CLR_INT (1<<31)
2168#define GMBUS_SW_RDY (1<<30) 2228#define GMBUS_SW_RDY (1<<30)
2169#define GMBUS_ENT (1<<29) /* enable timeout */ 2229#define GMBUS_ENT (1<<29) /* enable timeout */
@@ -2177,7 +2237,7 @@ enum skl_disp_power_wells {
2177#define GMBUS_SLAVE_ADDR_SHIFT 1 2237#define GMBUS_SLAVE_ADDR_SHIFT 1
2178#define GMBUS_SLAVE_READ (1<<0) 2238#define GMBUS_SLAVE_READ (1<<0)
2179#define GMBUS_SLAVE_WRITE (0<<0) 2239#define GMBUS_SLAVE_WRITE (0<<0)
2180#define GMBUS2 (dev_priv->gpio_mmio_base + 0x5108) /* status */ 2240#define GMBUS2 _MMIO(dev_priv->gpio_mmio_base + 0x5108) /* status */
2181#define GMBUS_INUSE (1<<15) 2241#define GMBUS_INUSE (1<<15)
2182#define GMBUS_HW_WAIT_PHASE (1<<14) 2242#define GMBUS_HW_WAIT_PHASE (1<<14)
2183#define GMBUS_STALL_TIMEOUT (1<<13) 2243#define GMBUS_STALL_TIMEOUT (1<<13)
@@ -2185,14 +2245,14 @@ enum skl_disp_power_wells {
2185#define GMBUS_HW_RDY (1<<11) 2245#define GMBUS_HW_RDY (1<<11)
2186#define GMBUS_SATOER (1<<10) 2246#define GMBUS_SATOER (1<<10)
2187#define GMBUS_ACTIVE (1<<9) 2247#define GMBUS_ACTIVE (1<<9)
2188#define GMBUS3 (dev_priv->gpio_mmio_base + 0x510c) /* data buffer bytes 3-0 */ 2248#define GMBUS3 _MMIO(dev_priv->gpio_mmio_base + 0x510c) /* data buffer bytes 3-0 */
2189#define GMBUS4 (dev_priv->gpio_mmio_base + 0x5110) /* interrupt mask (Pineview+) */ 2249#define GMBUS4 _MMIO(dev_priv->gpio_mmio_base + 0x5110) /* interrupt mask (Pineview+) */
2190#define GMBUS_SLAVE_TIMEOUT_EN (1<<4) 2250#define GMBUS_SLAVE_TIMEOUT_EN (1<<4)
2191#define GMBUS_NAK_EN (1<<3) 2251#define GMBUS_NAK_EN (1<<3)
2192#define GMBUS_IDLE_EN (1<<2) 2252#define GMBUS_IDLE_EN (1<<2)
2193#define GMBUS_HW_WAIT_EN (1<<1) 2253#define GMBUS_HW_WAIT_EN (1<<1)
2194#define GMBUS_HW_RDY_EN (1<<0) 2254#define GMBUS_HW_RDY_EN (1<<0)
2195#define GMBUS5 (dev_priv->gpio_mmio_base + 0x5120) /* byte index */ 2255#define GMBUS5 _MMIO(dev_priv->gpio_mmio_base + 0x5120) /* byte index */
2196#define GMBUS_2BYTE_INDEX_EN (1<<31) 2256#define GMBUS_2BYTE_INDEX_EN (1<<31)
2197 2257
2198/* 2258/*
@@ -2201,11 +2261,11 @@ enum skl_disp_power_wells {
2201#define _DPLL_A (dev_priv->info.display_mmio_offset + 0x6014) 2261#define _DPLL_A (dev_priv->info.display_mmio_offset + 0x6014)
2202#define _DPLL_B (dev_priv->info.display_mmio_offset + 0x6018) 2262#define _DPLL_B (dev_priv->info.display_mmio_offset + 0x6018)
2203#define _CHV_DPLL_C (dev_priv->info.display_mmio_offset + 0x6030) 2263#define _CHV_DPLL_C (dev_priv->info.display_mmio_offset + 0x6030)
2204#define DPLL(pipe) _PIPE3((pipe), _DPLL_A, _DPLL_B, _CHV_DPLL_C) 2264#define DPLL(pipe) _MMIO_PIPE3((pipe), _DPLL_A, _DPLL_B, _CHV_DPLL_C)
2205 2265
2206#define VGA0 0x6000 2266#define VGA0 _MMIO(0x6000)
2207#define VGA1 0x6004 2267#define VGA1 _MMIO(0x6004)
2208#define VGA_PD 0x6010 2268#define VGA_PD _MMIO(0x6010)
2209#define VGA0_PD_P2_DIV_4 (1 << 7) 2269#define VGA0_PD_P2_DIV_4 (1 << 7)
2210#define VGA0_PD_P1_DIV_2 (1 << 5) 2270#define VGA0_PD_P1_DIV_2 (1 << 5)
2211#define VGA0_PD_P1_SHIFT 0 2271#define VGA0_PD_P1_SHIFT 0
@@ -2241,9 +2301,9 @@ enum skl_disp_power_wells {
2241#define DPLL_FPA01_P1_POST_DIV_MASK_I830 0x001f0000 2301#define DPLL_FPA01_P1_POST_DIV_MASK_I830 0x001f0000
2242 2302
2243/* Additional CHV pll/phy registers */ 2303/* Additional CHV pll/phy registers */
2244#define DPIO_PHY_STATUS (VLV_DISPLAY_BASE + 0x6240) 2304#define DPIO_PHY_STATUS _MMIO(VLV_DISPLAY_BASE + 0x6240)
2245#define DPLL_PORTD_READY_MASK (0xf) 2305#define DPLL_PORTD_READY_MASK (0xf)
2246#define DISPLAY_PHY_CONTROL (VLV_DISPLAY_BASE + 0x60100) 2306#define DISPLAY_PHY_CONTROL _MMIO(VLV_DISPLAY_BASE + 0x60100)
2247#define PHY_CH_POWER_DOWN_OVRD_EN(phy, ch) (1 << (2*(phy)+(ch)+27)) 2307#define PHY_CH_POWER_DOWN_OVRD_EN(phy, ch) (1 << (2*(phy)+(ch)+27))
2248#define PHY_LDO_DELAY_0NS 0x0 2308#define PHY_LDO_DELAY_0NS 0x0
2249#define PHY_LDO_DELAY_200NS 0x1 2309#define PHY_LDO_DELAY_200NS 0x1
@@ -2254,7 +2314,7 @@ enum skl_disp_power_wells {
2254#define PHY_CH_DEEP_PSR 0x7 2314#define PHY_CH_DEEP_PSR 0x7
2255#define PHY_CH_POWER_MODE(mode, phy, ch) ((mode) << (6*(phy)+3*(ch)+2)) 2315#define PHY_CH_POWER_MODE(mode, phy, ch) ((mode) << (6*(phy)+3*(ch)+2))
2256#define PHY_COM_LANE_RESET_DEASSERT(phy) (1 << (phy)) 2316#define PHY_COM_LANE_RESET_DEASSERT(phy) (1 << (phy))
2257#define DISPLAY_PHY_STATUS (VLV_DISPLAY_BASE + 0x60104) 2317#define DISPLAY_PHY_STATUS _MMIO(VLV_DISPLAY_BASE + 0x60104)
2258#define PHY_POWERGOOD(phy) (((phy) == DPIO_PHY0) ? (1<<31) : (1<<30)) 2318#define PHY_POWERGOOD(phy) (((phy) == DPIO_PHY0) ? (1<<31) : (1<<30))
2259#define PHY_STATUS_CMN_LDO(phy, ch) (1 << (6-(6*(phy)+3*(ch)))) 2319#define PHY_STATUS_CMN_LDO(phy, ch) (1 << (6-(6*(phy)+3*(ch))))
2260#define PHY_STATUS_SPLINE_LDO(phy, ch, spline) (1 << (8-(6*(phy)+3*(ch)+(spline)))) 2320#define PHY_STATUS_SPLINE_LDO(phy, ch, spline) (1 << (8-(6*(phy)+3*(ch)+(spline))))
@@ -2300,7 +2360,7 @@ enum skl_disp_power_wells {
2300#define _DPLL_A_MD (dev_priv->info.display_mmio_offset + 0x601c) 2360#define _DPLL_A_MD (dev_priv->info.display_mmio_offset + 0x601c)
2301#define _DPLL_B_MD (dev_priv->info.display_mmio_offset + 0x6020) 2361#define _DPLL_B_MD (dev_priv->info.display_mmio_offset + 0x6020)
2302#define _CHV_DPLL_C_MD (dev_priv->info.display_mmio_offset + 0x603c) 2362#define _CHV_DPLL_C_MD (dev_priv->info.display_mmio_offset + 0x603c)
2303#define DPLL_MD(pipe) _PIPE3((pipe), _DPLL_A_MD, _DPLL_B_MD, _CHV_DPLL_C_MD) 2363#define DPLL_MD(pipe) _MMIO_PIPE3((pipe), _DPLL_A_MD, _DPLL_B_MD, _CHV_DPLL_C_MD)
2304 2364
2305/* 2365/*
2306 * UDI pixel divider, controlling how many pixels are stuffed into a packet. 2366 * UDI pixel divider, controlling how many pixels are stuffed into a packet.
@@ -2339,12 +2399,12 @@ enum skl_disp_power_wells {
2339#define DPLL_MD_VGA_UDI_MULTIPLIER_MASK 0x0000003f 2399#define DPLL_MD_VGA_UDI_MULTIPLIER_MASK 0x0000003f
2340#define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT 0 2400#define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT 0
2341 2401
2342#define _FPA0 0x06040 2402#define _FPA0 0x6040
2343#define _FPA1 0x06044 2403#define _FPA1 0x6044
2344#define _FPB0 0x06048 2404#define _FPB0 0x6048
2345#define _FPB1 0x0604c 2405#define _FPB1 0x604c
2346#define FP0(pipe) _PIPE(pipe, _FPA0, _FPB0) 2406#define FP0(pipe) _MMIO_PIPE(pipe, _FPA0, _FPB0)
2347#define FP1(pipe) _PIPE(pipe, _FPA1, _FPB1) 2407#define FP1(pipe) _MMIO_PIPE(pipe, _FPA1, _FPB1)
2348#define FP_N_DIV_MASK 0x003f0000 2408#define FP_N_DIV_MASK 0x003f0000
2349#define FP_N_PINEVIEW_DIV_MASK 0x00ff0000 2409#define FP_N_PINEVIEW_DIV_MASK 0x00ff0000
2350#define FP_N_DIV_SHIFT 16 2410#define FP_N_DIV_SHIFT 16
@@ -2353,7 +2413,7 @@ enum skl_disp_power_wells {
2353#define FP_M2_DIV_MASK 0x0000003f 2413#define FP_M2_DIV_MASK 0x0000003f
2354#define FP_M2_PINEVIEW_DIV_MASK 0x000000ff 2414#define FP_M2_PINEVIEW_DIV_MASK 0x000000ff
2355#define FP_M2_DIV_SHIFT 0 2415#define FP_M2_DIV_SHIFT 0
2356#define DPLL_TEST 0x606c 2416#define DPLL_TEST _MMIO(0x606c)
2357#define DPLLB_TEST_SDVO_DIV_1 (0 << 22) 2417#define DPLLB_TEST_SDVO_DIV_1 (0 << 22)
2358#define DPLLB_TEST_SDVO_DIV_2 (1 << 22) 2418#define DPLLB_TEST_SDVO_DIV_2 (1 << 22)
2359#define DPLLB_TEST_SDVO_DIV_4 (2 << 22) 2419#define DPLLB_TEST_SDVO_DIV_4 (2 << 22)
@@ -2364,12 +2424,12 @@ enum skl_disp_power_wells {
2364#define DPLLA_TEST_N_BYPASS (1 << 3) 2424#define DPLLA_TEST_N_BYPASS (1 << 3)
2365#define DPLLA_TEST_M_BYPASS (1 << 2) 2425#define DPLLA_TEST_M_BYPASS (1 << 2)
2366#define DPLLA_INPUT_BUFFER_ENABLE (1 << 0) 2426#define DPLLA_INPUT_BUFFER_ENABLE (1 << 0)
2367#define D_STATE 0x6104 2427#define D_STATE _MMIO(0x6104)
2368#define DSTATE_GFX_RESET_I830 (1<<6) 2428#define DSTATE_GFX_RESET_I830 (1<<6)
2369#define DSTATE_PLL_D3_OFF (1<<3) 2429#define DSTATE_PLL_D3_OFF (1<<3)
2370#define DSTATE_GFX_CLOCK_GATING (1<<1) 2430#define DSTATE_GFX_CLOCK_GATING (1<<1)
2371#define DSTATE_DOT_CLOCK_GATING (1<<0) 2431#define DSTATE_DOT_CLOCK_GATING (1<<0)
2372#define DSPCLK_GATE_D (dev_priv->info.display_mmio_offset + 0x6200) 2432#define DSPCLK_GATE_D _MMIO(dev_priv->info.display_mmio_offset + 0x6200)
2373# define DPUNIT_B_CLOCK_GATE_DISABLE (1 << 30) /* 965 */ 2433# define DPUNIT_B_CLOCK_GATE_DISABLE (1 << 30) /* 965 */
2374# define VSUNIT_CLOCK_GATE_DISABLE (1 << 29) /* 965 */ 2434# define VSUNIT_CLOCK_GATE_DISABLE (1 << 29) /* 965 */
2375# define VRHUNIT_CLOCK_GATE_DISABLE (1 << 28) /* 965 */ 2435# define VRHUNIT_CLOCK_GATE_DISABLE (1 << 28) /* 965 */
@@ -2408,7 +2468,7 @@ enum skl_disp_power_wells {
2408# define ZVUNIT_CLOCK_GATE_DISABLE (1 << 0) /* 830 */ 2468# define ZVUNIT_CLOCK_GATE_DISABLE (1 << 0) /* 830 */
2409# define OVLUNIT_CLOCK_GATE_DISABLE (1 << 0) /* 845,865 */ 2469# define OVLUNIT_CLOCK_GATE_DISABLE (1 << 0) /* 845,865 */
2410 2470
2411#define RENCLK_GATE_D1 0x6204 2471#define RENCLK_GATE_D1 _MMIO(0x6204)
2412# define BLITTER_CLOCK_GATE_DISABLE (1 << 13) /* 945GM only */ 2472# define BLITTER_CLOCK_GATE_DISABLE (1 << 13) /* 945GM only */
2413# define MPEG_CLOCK_GATE_DISABLE (1 << 12) /* 945GM only */ 2473# define MPEG_CLOCK_GATE_DISABLE (1 << 12) /* 945GM only */
2414# define PC_FE_CLOCK_GATE_DISABLE (1 << 11) 2474# define PC_FE_CLOCK_GATE_DISABLE (1 << 11)
@@ -2472,35 +2532,35 @@ enum skl_disp_power_wells {
2472# define I965_FT_CLOCK_GATE_DISABLE (1 << 1) 2532# define I965_FT_CLOCK_GATE_DISABLE (1 << 1)
2473# define I965_DM_CLOCK_GATE_DISABLE (1 << 0) 2533# define I965_DM_CLOCK_GATE_DISABLE (1 << 0)
2474 2534
2475#define RENCLK_GATE_D2 0x6208 2535#define RENCLK_GATE_D2 _MMIO(0x6208)
2476#define VF_UNIT_CLOCK_GATE_DISABLE (1 << 9) 2536#define VF_UNIT_CLOCK_GATE_DISABLE (1 << 9)
2477#define GS_UNIT_CLOCK_GATE_DISABLE (1 << 7) 2537#define GS_UNIT_CLOCK_GATE_DISABLE (1 << 7)
2478#define CL_UNIT_CLOCK_GATE_DISABLE (1 << 6) 2538#define CL_UNIT_CLOCK_GATE_DISABLE (1 << 6)
2479 2539
2480#define VDECCLK_GATE_D 0x620C /* g4x only */ 2540#define VDECCLK_GATE_D _MMIO(0x620C) /* g4x only */
2481#define VCP_UNIT_CLOCK_GATE_DISABLE (1 << 4) 2541#define VCP_UNIT_CLOCK_GATE_DISABLE (1 << 4)
2482 2542
2483#define RAMCLK_GATE_D 0x6210 /* CRL only */ 2543#define RAMCLK_GATE_D _MMIO(0x6210) /* CRL only */
2484#define DEUC 0x6214 /* CRL only */ 2544#define DEUC _MMIO(0x6214) /* CRL only */
2485 2545
2486#define FW_BLC_SELF_VLV (VLV_DISPLAY_BASE + 0x6500) 2546#define FW_BLC_SELF_VLV _MMIO(VLV_DISPLAY_BASE + 0x6500)
2487#define FW_CSPWRDWNEN (1<<15) 2547#define FW_CSPWRDWNEN (1<<15)
2488 2548
2489#define MI_ARB_VLV (VLV_DISPLAY_BASE + 0x6504) 2549#define MI_ARB_VLV _MMIO(VLV_DISPLAY_BASE + 0x6504)
2490 2550
2491#define CZCLK_CDCLK_FREQ_RATIO (VLV_DISPLAY_BASE + 0x6508) 2551#define CZCLK_CDCLK_FREQ_RATIO _MMIO(VLV_DISPLAY_BASE + 0x6508)
2492#define CDCLK_FREQ_SHIFT 4 2552#define CDCLK_FREQ_SHIFT 4
2493#define CDCLK_FREQ_MASK (0x1f << CDCLK_FREQ_SHIFT) 2553#define CDCLK_FREQ_MASK (0x1f << CDCLK_FREQ_SHIFT)
2494#define CZCLK_FREQ_MASK 0xf 2554#define CZCLK_FREQ_MASK 0xf
2495 2555
2496#define GCI_CONTROL (VLV_DISPLAY_BASE + 0x650C) 2556#define GCI_CONTROL _MMIO(VLV_DISPLAY_BASE + 0x650C)
2497#define PFI_CREDIT_63 (9 << 28) /* chv only */ 2557#define PFI_CREDIT_63 (9 << 28) /* chv only */
2498#define PFI_CREDIT_31 (8 << 28) /* chv only */ 2558#define PFI_CREDIT_31 (8 << 28) /* chv only */
2499#define PFI_CREDIT(x) (((x) - 8) << 28) /* 8-15 */ 2559#define PFI_CREDIT(x) (((x) - 8) << 28) /* 8-15 */
2500#define PFI_CREDIT_RESEND (1 << 27) 2560#define PFI_CREDIT_RESEND (1 << 27)
2501#define VGA_FAST_MODE_DISABLE (1 << 14) 2561#define VGA_FAST_MODE_DISABLE (1 << 14)
2502 2562
2503#define GMBUSFREQ_VLV (VLV_DISPLAY_BASE + 0x6510) 2563#define GMBUSFREQ_VLV _MMIO(VLV_DISPLAY_BASE + 0x6510)
2504 2564
2505/* 2565/*
2506 * Palette regs 2566 * Palette regs
@@ -2508,8 +2568,8 @@ enum skl_disp_power_wells {
2508#define PALETTE_A_OFFSET 0xa000 2568#define PALETTE_A_OFFSET 0xa000
2509#define PALETTE_B_OFFSET 0xa800 2569#define PALETTE_B_OFFSET 0xa800
2510#define CHV_PALETTE_C_OFFSET 0xc000 2570#define CHV_PALETTE_C_OFFSET 0xc000
2511#define PALETTE(pipe, i) (dev_priv->info.palette_offsets[pipe] + \ 2571#define PALETTE(pipe, i) _MMIO(dev_priv->info.palette_offsets[pipe] + \
2512 dev_priv->info.display_mmio_offset + (i) * 4) 2572 dev_priv->info.display_mmio_offset + (i) * 4)
2513 2573
2514/* MCH MMIO space */ 2574/* MCH MMIO space */
2515 2575
@@ -2527,37 +2587,37 @@ enum skl_disp_power_wells {
2527 2587
2528#define MCHBAR_MIRROR_BASE_SNB 0x140000 2588#define MCHBAR_MIRROR_BASE_SNB 0x140000
2529 2589
2530#define CTG_STOLEN_RESERVED (MCHBAR_MIRROR_BASE + 0x34) 2590#define CTG_STOLEN_RESERVED _MMIO(MCHBAR_MIRROR_BASE + 0x34)
2531#define ELK_STOLEN_RESERVED (MCHBAR_MIRROR_BASE + 0x48) 2591#define ELK_STOLEN_RESERVED _MMIO(MCHBAR_MIRROR_BASE + 0x48)
2532#define G4X_STOLEN_RESERVED_ADDR1_MASK (0xFFFF << 16) 2592#define G4X_STOLEN_RESERVED_ADDR1_MASK (0xFFFF << 16)
2533#define G4X_STOLEN_RESERVED_ADDR2_MASK (0xFFF << 4) 2593#define G4X_STOLEN_RESERVED_ADDR2_MASK (0xFFF << 4)
2534 2594
2535/* Memory controller frequency in MCHBAR for Haswell (possible SNB+) */ 2595/* Memory controller frequency in MCHBAR for Haswell (possible SNB+) */
2536#define DCLK (MCHBAR_MIRROR_BASE_SNB + 0x5e04) 2596#define DCLK _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5e04)
2537 2597
2538/* 915-945 and GM965 MCH register controlling DRAM channel access */ 2598/* 915-945 and GM965 MCH register controlling DRAM channel access */
2539#define DCC 0x10200 2599#define DCC _MMIO(MCHBAR_MIRROR_BASE + 0x200)
2540#define DCC_ADDRESSING_MODE_SINGLE_CHANNEL (0 << 0) 2600#define DCC_ADDRESSING_MODE_SINGLE_CHANNEL (0 << 0)
2541#define DCC_ADDRESSING_MODE_DUAL_CHANNEL_ASYMMETRIC (1 << 0) 2601#define DCC_ADDRESSING_MODE_DUAL_CHANNEL_ASYMMETRIC (1 << 0)
2542#define DCC_ADDRESSING_MODE_DUAL_CHANNEL_INTERLEAVED (2 << 0) 2602#define DCC_ADDRESSING_MODE_DUAL_CHANNEL_INTERLEAVED (2 << 0)
2543#define DCC_ADDRESSING_MODE_MASK (3 << 0) 2603#define DCC_ADDRESSING_MODE_MASK (3 << 0)
2544#define DCC_CHANNEL_XOR_DISABLE (1 << 10) 2604#define DCC_CHANNEL_XOR_DISABLE (1 << 10)
2545#define DCC_CHANNEL_XOR_BIT_17 (1 << 9) 2605#define DCC_CHANNEL_XOR_BIT_17 (1 << 9)
2546#define DCC2 0x10204 2606#define DCC2 _MMIO(MCHBAR_MIRROR_BASE + 0x204)
2547#define DCC2_MODIFIED_ENHANCED_DISABLE (1 << 20) 2607#define DCC2_MODIFIED_ENHANCED_DISABLE (1 << 20)
2548 2608
2549/* Pineview MCH register contains DDR3 setting */ 2609/* Pineview MCH register contains DDR3 setting */
2550#define CSHRDDR3CTL 0x101a8 2610#define CSHRDDR3CTL _MMIO(MCHBAR_MIRROR_BASE + 0x1a8)
2551#define CSHRDDR3CTL_DDR3 (1 << 2) 2611#define CSHRDDR3CTL_DDR3 (1 << 2)
2552 2612
2553/* 965 MCH register controlling DRAM channel configuration */ 2613/* 965 MCH register controlling DRAM channel configuration */
2554#define C0DRB3 0x10206 2614#define C0DRB3 _MMIO(MCHBAR_MIRROR_BASE + 0x206)
2555#define C1DRB3 0x10606 2615#define C1DRB3 _MMIO(MCHBAR_MIRROR_BASE + 0x606)
2556 2616
2557/* snb MCH registers for reading the DRAM channel configuration */ 2617/* snb MCH registers for reading the DRAM channel configuration */
2558#define MAD_DIMM_C0 (MCHBAR_MIRROR_BASE_SNB + 0x5004) 2618#define MAD_DIMM_C0 _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5004)
2559#define MAD_DIMM_C1 (MCHBAR_MIRROR_BASE_SNB + 0x5008) 2619#define MAD_DIMM_C1 _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5008)
2560#define MAD_DIMM_C2 (MCHBAR_MIRROR_BASE_SNB + 0x500C) 2620#define MAD_DIMM_C2 _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x500C)
2561#define MAD_DIMM_ECC_MASK (0x3 << 24) 2621#define MAD_DIMM_ECC_MASK (0x3 << 24)
2562#define MAD_DIMM_ECC_OFF (0x0 << 24) 2622#define MAD_DIMM_ECC_OFF (0x0 << 24)
2563#define MAD_DIMM_ECC_IO_ON_LOGIC_OFF (0x1 << 24) 2623#define MAD_DIMM_ECC_IO_ON_LOGIC_OFF (0x1 << 24)
@@ -2577,14 +2637,14 @@ enum skl_disp_power_wells {
2577#define MAD_DIMM_A_SIZE_MASK (0xff << MAD_DIMM_A_SIZE_SHIFT) 2637#define MAD_DIMM_A_SIZE_MASK (0xff << MAD_DIMM_A_SIZE_SHIFT)
2578 2638
2579/* snb MCH registers for priority tuning */ 2639/* snb MCH registers for priority tuning */
2580#define MCH_SSKPD (MCHBAR_MIRROR_BASE_SNB + 0x5d10) 2640#define MCH_SSKPD _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5d10)
2581#define MCH_SSKPD_WM0_MASK 0x3f 2641#define MCH_SSKPD_WM0_MASK 0x3f
2582#define MCH_SSKPD_WM0_VAL 0xc 2642#define MCH_SSKPD_WM0_VAL 0xc
2583 2643
2584#define MCH_SECP_NRG_STTS (MCHBAR_MIRROR_BASE_SNB + 0x592c) 2644#define MCH_SECP_NRG_STTS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x592c)
2585 2645
2586/* Clocking configuration register */ 2646/* Clocking configuration register */
2587#define CLKCFG 0x10c00 2647#define CLKCFG _MMIO(MCHBAR_MIRROR_BASE + 0xc00)
2588#define CLKCFG_FSB_400 (5 << 0) /* hrawclk 100 */ 2648#define CLKCFG_FSB_400 (5 << 0) /* hrawclk 100 */
2589#define CLKCFG_FSB_533 (1 << 0) /* hrawclk 133 */ 2649#define CLKCFG_FSB_533 (1 << 0) /* hrawclk 133 */
2590#define CLKCFG_FSB_667 (3 << 0) /* hrawclk 166 */ 2650#define CLKCFG_FSB_667 (3 << 0) /* hrawclk 166 */
@@ -2600,26 +2660,26 @@ enum skl_disp_power_wells {
2600#define CLKCFG_MEM_800 (3 << 4) 2660#define CLKCFG_MEM_800 (3 << 4)
2601#define CLKCFG_MEM_MASK (7 << 4) 2661#define CLKCFG_MEM_MASK (7 << 4)
2602 2662
2603#define HPLLVCO (MCHBAR_MIRROR_BASE + 0xc38) 2663#define HPLLVCO _MMIO(MCHBAR_MIRROR_BASE + 0xc38)
2604#define HPLLVCO_MOBILE (MCHBAR_MIRROR_BASE + 0xc0f) 2664#define HPLLVCO_MOBILE _MMIO(MCHBAR_MIRROR_BASE + 0xc0f)
2605 2665
2606#define TSC1 0x11001 2666#define TSC1 _MMIO(0x11001)
2607#define TSE (1<<0) 2667#define TSE (1<<0)
2608#define TR1 0x11006 2668#define TR1 _MMIO(0x11006)
2609#define TSFS 0x11020 2669#define TSFS _MMIO(0x11020)
2610#define TSFS_SLOPE_MASK 0x0000ff00 2670#define TSFS_SLOPE_MASK 0x0000ff00
2611#define TSFS_SLOPE_SHIFT 8 2671#define TSFS_SLOPE_SHIFT 8
2612#define TSFS_INTR_MASK 0x000000ff 2672#define TSFS_INTR_MASK 0x000000ff
2613 2673
2614#define CRSTANDVID 0x11100 2674#define CRSTANDVID _MMIO(0x11100)
2615#define PXVFREQ(i) (0x11110 + (i) * 4) /* P[0-15]VIDFREQ (0x1114c) (Ironlake) */ 2675#define PXVFREQ(fstart) _MMIO(0x11110 + (fstart) * 4) /* P[0-15]VIDFREQ (0x1114c) (Ironlake) */
2616#define PXVFREQ_PX_MASK 0x7f000000 2676#define PXVFREQ_PX_MASK 0x7f000000
2617#define PXVFREQ_PX_SHIFT 24 2677#define PXVFREQ_PX_SHIFT 24
2618#define VIDFREQ_BASE 0x11110 2678#define VIDFREQ_BASE _MMIO(0x11110)
2619#define VIDFREQ1 0x11110 /* VIDFREQ1-4 (0x1111c) (Cantiga) */ 2679#define VIDFREQ1 _MMIO(0x11110) /* VIDFREQ1-4 (0x1111c) (Cantiga) */
2620#define VIDFREQ2 0x11114 2680#define VIDFREQ2 _MMIO(0x11114)
2621#define VIDFREQ3 0x11118 2681#define VIDFREQ3 _MMIO(0x11118)
2622#define VIDFREQ4 0x1111c 2682#define VIDFREQ4 _MMIO(0x1111c)
2623#define VIDFREQ_P0_MASK 0x1f000000 2683#define VIDFREQ_P0_MASK 0x1f000000
2624#define VIDFREQ_P0_SHIFT 24 2684#define VIDFREQ_P0_SHIFT 24
2625#define VIDFREQ_P0_CSCLK_MASK 0x00f00000 2685#define VIDFREQ_P0_CSCLK_MASK 0x00f00000
@@ -2631,8 +2691,8 @@ enum skl_disp_power_wells {
2631#define VIDFREQ_P1_CSCLK_MASK 0x000000f0 2691#define VIDFREQ_P1_CSCLK_MASK 0x000000f0
2632#define VIDFREQ_P1_CSCLK_SHIFT 4 2692#define VIDFREQ_P1_CSCLK_SHIFT 4
2633#define VIDFREQ_P1_CRCLK_MASK 0x0000000f 2693#define VIDFREQ_P1_CRCLK_MASK 0x0000000f
2634#define INTTOEXT_BASE_ILK 0x11300 2694#define INTTOEXT_BASE_ILK _MMIO(0x11300)
2635#define INTTOEXT_BASE 0x11120 /* INTTOEXT1-8 (0x1113c) */ 2695#define INTTOEXT_BASE _MMIO(0x11120) /* INTTOEXT1-8 (0x1113c) */
2636#define INTTOEXT_MAP3_SHIFT 24 2696#define INTTOEXT_MAP3_SHIFT 24
2637#define INTTOEXT_MAP3_MASK (0x1f << INTTOEXT_MAP3_SHIFT) 2697#define INTTOEXT_MAP3_MASK (0x1f << INTTOEXT_MAP3_SHIFT)
2638#define INTTOEXT_MAP2_SHIFT 16 2698#define INTTOEXT_MAP2_SHIFT 16
@@ -2641,7 +2701,7 @@ enum skl_disp_power_wells {
2641#define INTTOEXT_MAP1_MASK (0x1f << INTTOEXT_MAP1_SHIFT) 2701#define INTTOEXT_MAP1_MASK (0x1f << INTTOEXT_MAP1_SHIFT)
2642#define INTTOEXT_MAP0_SHIFT 0 2702#define INTTOEXT_MAP0_SHIFT 0
2643#define INTTOEXT_MAP0_MASK (0x1f << INTTOEXT_MAP0_SHIFT) 2703#define INTTOEXT_MAP0_MASK (0x1f << INTTOEXT_MAP0_SHIFT)
2644#define MEMSWCTL 0x11170 /* Ironlake only */ 2704#define MEMSWCTL _MMIO(0x11170) /* Ironlake only */
2645#define MEMCTL_CMD_MASK 0xe000 2705#define MEMCTL_CMD_MASK 0xe000
2646#define MEMCTL_CMD_SHIFT 13 2706#define MEMCTL_CMD_SHIFT 13
2647#define MEMCTL_CMD_RCLK_OFF 0 2707#define MEMCTL_CMD_RCLK_OFF 0
@@ -2656,8 +2716,8 @@ enum skl_disp_power_wells {
2656#define MEMCTL_FREQ_SHIFT 8 2716#define MEMCTL_FREQ_SHIFT 8
2657#define MEMCTL_SFCAVM (1<<7) 2717#define MEMCTL_SFCAVM (1<<7)
2658#define MEMCTL_TGT_VID_MASK 0x007f 2718#define MEMCTL_TGT_VID_MASK 0x007f
2659#define MEMIHYST 0x1117c 2719#define MEMIHYST _MMIO(0x1117c)
2660#define MEMINTREN 0x11180 /* 16 bits */ 2720#define MEMINTREN _MMIO(0x11180) /* 16 bits */
2661#define MEMINT_RSEXIT_EN (1<<8) 2721#define MEMINT_RSEXIT_EN (1<<8)
2662#define MEMINT_CX_SUPR_EN (1<<7) 2722#define MEMINT_CX_SUPR_EN (1<<7)
2663#define MEMINT_CONT_BUSY_EN (1<<6) 2723#define MEMINT_CONT_BUSY_EN (1<<6)
@@ -2667,7 +2727,7 @@ enum skl_disp_power_wells {
2667#define MEMINT_UP_EVAL_EN (1<<2) 2727#define MEMINT_UP_EVAL_EN (1<<2)
2668#define MEMINT_DOWN_EVAL_EN (1<<1) 2728#define MEMINT_DOWN_EVAL_EN (1<<1)
2669#define MEMINT_SW_CMD_EN (1<<0) 2729#define MEMINT_SW_CMD_EN (1<<0)
2670#define MEMINTRSTR 0x11182 /* 16 bits */ 2730#define MEMINTRSTR _MMIO(0x11182) /* 16 bits */
2671#define MEM_RSEXIT_MASK 0xc000 2731#define MEM_RSEXIT_MASK 0xc000
2672#define MEM_RSEXIT_SHIFT 14 2732#define MEM_RSEXIT_SHIFT 14
2673#define MEM_CONT_BUSY_MASK 0x3000 2733#define MEM_CONT_BUSY_MASK 0x3000
@@ -2687,7 +2747,7 @@ enum skl_disp_power_wells {
2687#define MEM_INT_STEER_CMR 1 2747#define MEM_INT_STEER_CMR 1
2688#define MEM_INT_STEER_SMI 2 2748#define MEM_INT_STEER_SMI 2
2689#define MEM_INT_STEER_SCI 3 2749#define MEM_INT_STEER_SCI 3
2690#define MEMINTRSTS 0x11184 2750#define MEMINTRSTS _MMIO(0x11184)
2691#define MEMINT_RSEXIT (1<<7) 2751#define MEMINT_RSEXIT (1<<7)
2692#define MEMINT_CONT_BUSY (1<<6) 2752#define MEMINT_CONT_BUSY (1<<6)
2693#define MEMINT_AVG_BUSY (1<<5) 2753#define MEMINT_AVG_BUSY (1<<5)
@@ -2696,7 +2756,7 @@ enum skl_disp_power_wells {
2696#define MEMINT_UP_EVAL (1<<2) 2756#define MEMINT_UP_EVAL (1<<2)
2697#define MEMINT_DOWN_EVAL (1<<1) 2757#define MEMINT_DOWN_EVAL (1<<1)
2698#define MEMINT_SW_CMD (1<<0) 2758#define MEMINT_SW_CMD (1<<0)
2699#define MEMMODECTL 0x11190 2759#define MEMMODECTL _MMIO(0x11190)
2700#define MEMMODE_BOOST_EN (1<<31) 2760#define MEMMODE_BOOST_EN (1<<31)
2701#define MEMMODE_BOOST_FREQ_MASK 0x0f000000 /* jitter for boost, 0-15 */ 2761#define MEMMODE_BOOST_FREQ_MASK 0x0f000000 /* jitter for boost, 0-15 */
2702#define MEMMODE_BOOST_FREQ_SHIFT 24 2762#define MEMMODE_BOOST_FREQ_SHIFT 24
@@ -2713,8 +2773,8 @@ enum skl_disp_power_wells {
2713#define MEMMODE_FMAX_MASK 0x000000f0 /* max jitter, 0-15 */ 2773#define MEMMODE_FMAX_MASK 0x000000f0 /* max jitter, 0-15 */
2714#define MEMMODE_FMAX_SHIFT 4 2774#define MEMMODE_FMAX_SHIFT 4
2715#define MEMMODE_FMIN_MASK 0x0000000f /* min jitter, 0-15 */ 2775#define MEMMODE_FMIN_MASK 0x0000000f /* min jitter, 0-15 */
2716#define RCBMAXAVG 0x1119c 2776#define RCBMAXAVG _MMIO(0x1119c)
2717#define MEMSWCTL2 0x1119e /* Cantiga only */ 2777#define MEMSWCTL2 _MMIO(0x1119e) /* Cantiga only */
2718#define SWMEMCMD_RENDER_OFF (0 << 13) 2778#define SWMEMCMD_RENDER_OFF (0 << 13)
2719#define SWMEMCMD_RENDER_ON (1 << 13) 2779#define SWMEMCMD_RENDER_ON (1 << 13)
2720#define SWMEMCMD_SWFREQ (2 << 13) 2780#define SWMEMCMD_SWFREQ (2 << 13)
@@ -2726,11 +2786,11 @@ enum skl_disp_power_wells {
2726#define SWFREQ_MASK 0x0380 /* P0-7 */ 2786#define SWFREQ_MASK 0x0380 /* P0-7 */
2727#define SWFREQ_SHIFT 7 2787#define SWFREQ_SHIFT 7
2728#define TARVID_MASK 0x001f 2788#define TARVID_MASK 0x001f
2729#define MEMSTAT_CTG 0x111a0 2789#define MEMSTAT_CTG _MMIO(0x111a0)
2730#define RCBMINAVG 0x111a0 2790#define RCBMINAVG _MMIO(0x111a0)
2731#define RCUPEI 0x111b0 2791#define RCUPEI _MMIO(0x111b0)
2732#define RCDNEI 0x111b4 2792#define RCDNEI _MMIO(0x111b4)
2733#define RSTDBYCTL 0x111b8 2793#define RSTDBYCTL _MMIO(0x111b8)
2734#define RS1EN (1<<31) 2794#define RS1EN (1<<31)
2735#define RS2EN (1<<30) 2795#define RS2EN (1<<30)
2736#define RS3EN (1<<29) 2796#define RS3EN (1<<29)
@@ -2774,10 +2834,10 @@ enum skl_disp_power_wells {
2774#define RS_CSTATE_C367_RS2 (3<<4) 2834#define RS_CSTATE_C367_RS2 (3<<4)
2775#define REDSAVES (1<<3) /* no context save if was idle during rs0 */ 2835#define REDSAVES (1<<3) /* no context save if was idle during rs0 */
2776#define REDRESTORES (1<<2) /* no restore if was idle during rs0 */ 2836#define REDRESTORES (1<<2) /* no restore if was idle during rs0 */
2777#define VIDCTL 0x111c0 2837#define VIDCTL _MMIO(0x111c0)
2778#define VIDSTS 0x111c8 2838#define VIDSTS _MMIO(0x111c8)
2779#define VIDSTART 0x111cc /* 8 bits */ 2839#define VIDSTART _MMIO(0x111cc) /* 8 bits */
2780#define MEMSTAT_ILK 0x111f8 2840#define MEMSTAT_ILK _MMIO(0x111f8)
2781#define MEMSTAT_VID_MASK 0x7f00 2841#define MEMSTAT_VID_MASK 0x7f00
2782#define MEMSTAT_VID_SHIFT 8 2842#define MEMSTAT_VID_SHIFT 8
2783#define MEMSTAT_PSTATE_MASK 0x00f8 2843#define MEMSTAT_PSTATE_MASK 0x00f8
@@ -2788,55 +2848,55 @@ enum skl_disp_power_wells {
2788#define MEMSTAT_SRC_CTL_TRB 1 2848#define MEMSTAT_SRC_CTL_TRB 1
2789#define MEMSTAT_SRC_CTL_THM 2 2849#define MEMSTAT_SRC_CTL_THM 2
2790#define MEMSTAT_SRC_CTL_STDBY 3 2850#define MEMSTAT_SRC_CTL_STDBY 3
2791#define RCPREVBSYTUPAVG 0x113b8 2851#define RCPREVBSYTUPAVG _MMIO(0x113b8)
2792#define RCPREVBSYTDNAVG 0x113bc 2852#define RCPREVBSYTDNAVG _MMIO(0x113bc)
2793#define PMMISC 0x11214 2853#define PMMISC _MMIO(0x11214)
2794#define MCPPCE_EN (1<<0) /* enable PM_MSG from PCH->MPC */ 2854#define MCPPCE_EN (1<<0) /* enable PM_MSG from PCH->MPC */
2795#define SDEW 0x1124c 2855#define SDEW _MMIO(0x1124c)
2796#define CSIEW0 0x11250 2856#define CSIEW0 _MMIO(0x11250)
2797#define CSIEW1 0x11254 2857#define CSIEW1 _MMIO(0x11254)
2798#define CSIEW2 0x11258 2858#define CSIEW2 _MMIO(0x11258)
2799#define PEW(i) (0x1125c + (i) * 4) /* 5 registers */ 2859#define PEW(i) _MMIO(0x1125c + (i) * 4) /* 5 registers */
2800#define DEW(i) (0x11270 + (i) * 4) /* 3 registers */ 2860#define DEW(i) _MMIO(0x11270 + (i) * 4) /* 3 registers */
2801#define MCHAFE 0x112c0 2861#define MCHAFE _MMIO(0x112c0)
2802#define CSIEC 0x112e0 2862#define CSIEC _MMIO(0x112e0)
2803#define DMIEC 0x112e4 2863#define DMIEC _MMIO(0x112e4)
2804#define DDREC 0x112e8 2864#define DDREC _MMIO(0x112e8)
2805#define PEG0EC 0x112ec 2865#define PEG0EC _MMIO(0x112ec)
2806#define PEG1EC 0x112f0 2866#define PEG1EC _MMIO(0x112f0)
2807#define GFXEC 0x112f4 2867#define GFXEC _MMIO(0x112f4)
2808#define RPPREVBSYTUPAVG 0x113b8 2868#define RPPREVBSYTUPAVG _MMIO(0x113b8)
2809#define RPPREVBSYTDNAVG 0x113bc 2869#define RPPREVBSYTDNAVG _MMIO(0x113bc)
2810#define ECR 0x11600 2870#define ECR _MMIO(0x11600)
2811#define ECR_GPFE (1<<31) 2871#define ECR_GPFE (1<<31)
2812#define ECR_IMONE (1<<30) 2872#define ECR_IMONE (1<<30)
2813#define ECR_CAP_MASK 0x0000001f /* Event range, 0-31 */ 2873#define ECR_CAP_MASK 0x0000001f /* Event range, 0-31 */
2814#define OGW0 0x11608 2874#define OGW0 _MMIO(0x11608)
2815#define OGW1 0x1160c 2875#define OGW1 _MMIO(0x1160c)
2816#define EG0 0x11610 2876#define EG0 _MMIO(0x11610)
2817#define EG1 0x11614 2877#define EG1 _MMIO(0x11614)
2818#define EG2 0x11618 2878#define EG2 _MMIO(0x11618)
2819#define EG3 0x1161c 2879#define EG3 _MMIO(0x1161c)
2820#define EG4 0x11620 2880#define EG4 _MMIO(0x11620)
2821#define EG5 0x11624 2881#define EG5 _MMIO(0x11624)
2822#define EG6 0x11628 2882#define EG6 _MMIO(0x11628)
2823#define EG7 0x1162c 2883#define EG7 _MMIO(0x1162c)
2824#define PXW(i) (0x11664 + (i) * 4) /* 4 registers */ 2884#define PXW(i) _MMIO(0x11664 + (i) * 4) /* 4 registers */
2825#define PXWL(i) (0x11680 + (i) * 4) /* 8 registers */ 2885#define PXWL(i) _MMIO(0x11680 + (i) * 8) /* 8 registers */
2826#define LCFUSE02 0x116c0 2886#define LCFUSE02 _MMIO(0x116c0)
2827#define LCFUSE_HIV_MASK 0x000000ff 2887#define LCFUSE_HIV_MASK 0x000000ff
2828#define CSIPLL0 0x12c10 2888#define CSIPLL0 _MMIO(0x12c10)
2829#define DDRMPLL1 0X12c20 2889#define DDRMPLL1 _MMIO(0X12c20)
2830#define PEG_BAND_GAP_DATA 0x14d68 2890#define PEG_BAND_GAP_DATA _MMIO(0x14d68)
2831 2891
2832#define GEN6_GT_THREAD_STATUS_REG 0x13805c 2892#define GEN6_GT_THREAD_STATUS_REG _MMIO(0x13805c)
2833#define GEN6_GT_THREAD_STATUS_CORE_MASK 0x7 2893#define GEN6_GT_THREAD_STATUS_CORE_MASK 0x7
2834 2894
2835#define GEN6_GT_PERF_STATUS (MCHBAR_MIRROR_BASE_SNB + 0x5948) 2895#define GEN6_GT_PERF_STATUS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5948)
2836#define BXT_GT_PERF_STATUS (MCHBAR_MIRROR_BASE_SNB + 0x7070) 2896#define BXT_GT_PERF_STATUS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x7070)
2837#define GEN6_RP_STATE_LIMITS (MCHBAR_MIRROR_BASE_SNB + 0x5994) 2897#define GEN6_RP_STATE_LIMITS _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5994)
2838#define GEN6_RP_STATE_CAP (MCHBAR_MIRROR_BASE_SNB + 0x5998) 2898#define GEN6_RP_STATE_CAP _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5998)
2839#define BXT_RP_STATE_CAP 0x138170 2899#define BXT_RP_STATE_CAP _MMIO(0x138170)
2840 2900
2841#define INTERVAL_1_28_US(us) (((us) * 100) >> 7) 2901#define INTERVAL_1_28_US(us) (((us) * 100) >> 7)
2842#define INTERVAL_1_33_US(us) (((us) * 3) >> 2) 2902#define INTERVAL_1_33_US(us) (((us) * 3) >> 2)
@@ -2850,7 +2910,7 @@ enum skl_disp_power_wells {
2850/* 2910/*
2851 * Logical Context regs 2911 * Logical Context regs
2852 */ 2912 */
2853#define CCID 0x2180 2913#define CCID _MMIO(0x2180)
2854#define CCID_EN (1<<0) 2914#define CCID_EN (1<<0)
2855/* 2915/*
2856 * Notes on SNB/IVB/VLV context size: 2916 * Notes on SNB/IVB/VLV context size:
@@ -2865,7 +2925,7 @@ enum skl_disp_power_wells {
2865 * - GT1 size just indicates how much of render context 2925 * - GT1 size just indicates how much of render context
2866 * doesn't need saving on GT1 2926 * doesn't need saving on GT1
2867 */ 2927 */
2868#define CXT_SIZE 0x21a0 2928#define CXT_SIZE _MMIO(0x21a0)
2869#define GEN6_CXT_POWER_SIZE(cxt_reg) (((cxt_reg) >> 24) & 0x3f) 2929#define GEN6_CXT_POWER_SIZE(cxt_reg) (((cxt_reg) >> 24) & 0x3f)
2870#define GEN6_CXT_RING_SIZE(cxt_reg) (((cxt_reg) >> 18) & 0x3f) 2930#define GEN6_CXT_RING_SIZE(cxt_reg) (((cxt_reg) >> 18) & 0x3f)
2871#define GEN6_CXT_RENDER_SIZE(cxt_reg) (((cxt_reg) >> 12) & 0x3f) 2931#define GEN6_CXT_RENDER_SIZE(cxt_reg) (((cxt_reg) >> 12) & 0x3f)
@@ -2874,7 +2934,7 @@ enum skl_disp_power_wells {
2874#define GEN6_CXT_TOTAL_SIZE(cxt_reg) (GEN6_CXT_RING_SIZE(cxt_reg) + \ 2934#define GEN6_CXT_TOTAL_SIZE(cxt_reg) (GEN6_CXT_RING_SIZE(cxt_reg) + \
2875 GEN6_CXT_EXTENDED_SIZE(cxt_reg) + \ 2935 GEN6_CXT_EXTENDED_SIZE(cxt_reg) + \
2876 GEN6_CXT_PIPELINE_SIZE(cxt_reg)) 2936 GEN6_CXT_PIPELINE_SIZE(cxt_reg))
2877#define GEN7_CXT_SIZE 0x21a8 2937#define GEN7_CXT_SIZE _MMIO(0x21a8)
2878#define GEN7_CXT_POWER_SIZE(ctx_reg) (((ctx_reg) >> 25) & 0x7f) 2938#define GEN7_CXT_POWER_SIZE(ctx_reg) (((ctx_reg) >> 25) & 0x7f)
2879#define GEN7_CXT_RING_SIZE(ctx_reg) (((ctx_reg) >> 22) & 0x7) 2939#define GEN7_CXT_RING_SIZE(ctx_reg) (((ctx_reg) >> 22) & 0x7)
2880#define GEN7_CXT_RENDER_SIZE(ctx_reg) (((ctx_reg) >> 16) & 0x3f) 2940#define GEN7_CXT_RENDER_SIZE(ctx_reg) (((ctx_reg) >> 16) & 0x3f)
@@ -2894,23 +2954,23 @@ enum skl_disp_power_wells {
2894/* Same as Haswell, but 72064 bytes now. */ 2954/* Same as Haswell, but 72064 bytes now. */
2895#define GEN8_CXT_TOTAL_SIZE (18 * PAGE_SIZE) 2955#define GEN8_CXT_TOTAL_SIZE (18 * PAGE_SIZE)
2896 2956
2897#define CHV_CLK_CTL1 0x101100 2957#define CHV_CLK_CTL1 _MMIO(0x101100)
2898#define VLV_CLK_CTL2 0x101104 2958#define VLV_CLK_CTL2 _MMIO(0x101104)
2899#define CLK_CTL2_CZCOUNT_30NS_SHIFT 28 2959#define CLK_CTL2_CZCOUNT_30NS_SHIFT 28
2900 2960
2901/* 2961/*
2902 * Overlay regs 2962 * Overlay regs
2903 */ 2963 */
2904 2964
2905#define OVADD 0x30000 2965#define OVADD _MMIO(0x30000)
2906#define DOVSTA 0x30008 2966#define DOVSTA _MMIO(0x30008)
2907#define OC_BUF (0x3<<20) 2967#define OC_BUF (0x3<<20)
2908#define OGAMC5 0x30010 2968#define OGAMC5 _MMIO(0x30010)
2909#define OGAMC4 0x30014 2969#define OGAMC4 _MMIO(0x30014)
2910#define OGAMC3 0x30018 2970#define OGAMC3 _MMIO(0x30018)
2911#define OGAMC2 0x3001c 2971#define OGAMC2 _MMIO(0x3001c)
2912#define OGAMC1 0x30020 2972#define OGAMC1 _MMIO(0x30020)
2913#define OGAMC0 0x30024 2973#define OGAMC0 _MMIO(0x30024)
2914 2974
2915/* 2975/*
2916 * Display engine regs 2976 * Display engine regs
@@ -2970,28 +3030,18 @@ enum skl_disp_power_wells {
2970#define _PIPE_CRC_RES_4_B_IVB 0x61070 3030#define _PIPE_CRC_RES_4_B_IVB 0x61070
2971#define _PIPE_CRC_RES_5_B_IVB 0x61074 3031#define _PIPE_CRC_RES_5_B_IVB 0x61074
2972 3032
2973#define PIPE_CRC_CTL(pipe) _TRANSCODER2(pipe, _PIPE_CRC_CTL_A) 3033#define PIPE_CRC_CTL(pipe) _MMIO_TRANS2(pipe, _PIPE_CRC_CTL_A)
2974#define PIPE_CRC_RES_1_IVB(pipe) \ 3034#define PIPE_CRC_RES_1_IVB(pipe) _MMIO_TRANS2(pipe, _PIPE_CRC_RES_1_A_IVB)
2975 _TRANSCODER2(pipe, _PIPE_CRC_RES_1_A_IVB) 3035#define PIPE_CRC_RES_2_IVB(pipe) _MMIO_TRANS2(pipe, _PIPE_CRC_RES_2_A_IVB)
2976#define PIPE_CRC_RES_2_IVB(pipe) \ 3036#define PIPE_CRC_RES_3_IVB(pipe) _MMIO_TRANS2(pipe, _PIPE_CRC_RES_3_A_IVB)
2977 _TRANSCODER2(pipe, _PIPE_CRC_RES_2_A_IVB) 3037#define PIPE_CRC_RES_4_IVB(pipe) _MMIO_TRANS2(pipe, _PIPE_CRC_RES_4_A_IVB)
2978#define PIPE_CRC_RES_3_IVB(pipe) \ 3038#define PIPE_CRC_RES_5_IVB(pipe) _MMIO_TRANS2(pipe, _PIPE_CRC_RES_5_A_IVB)
2979 _TRANSCODER2(pipe, _PIPE_CRC_RES_3_A_IVB) 3039
2980#define PIPE_CRC_RES_4_IVB(pipe) \ 3040#define PIPE_CRC_RES_RED(pipe) _MMIO_TRANS2(pipe, _PIPE_CRC_RES_RED_A)
2981 _TRANSCODER2(pipe, _PIPE_CRC_RES_4_A_IVB) 3041#define PIPE_CRC_RES_GREEN(pipe) _MMIO_TRANS2(pipe, _PIPE_CRC_RES_GREEN_A)
2982#define PIPE_CRC_RES_5_IVB(pipe) \ 3042#define PIPE_CRC_RES_BLUE(pipe) _MMIO_TRANS2(pipe, _PIPE_CRC_RES_BLUE_A)
2983 _TRANSCODER2(pipe, _PIPE_CRC_RES_5_A_IVB) 3043#define PIPE_CRC_RES_RES1_I915(pipe) _MMIO_TRANS2(pipe, _PIPE_CRC_RES_RES1_A_I915)
2984 3044#define PIPE_CRC_RES_RES2_G4X(pipe) _MMIO_TRANS2(pipe, _PIPE_CRC_RES_RES2_A_G4X)
2985#define PIPE_CRC_RES_RED(pipe) \
2986 _TRANSCODER2(pipe, _PIPE_CRC_RES_RED_A)
2987#define PIPE_CRC_RES_GREEN(pipe) \
2988 _TRANSCODER2(pipe, _PIPE_CRC_RES_GREEN_A)
2989#define PIPE_CRC_RES_BLUE(pipe) \
2990 _TRANSCODER2(pipe, _PIPE_CRC_RES_BLUE_A)
2991#define PIPE_CRC_RES_RES1_I915(pipe) \
2992 _TRANSCODER2(pipe, _PIPE_CRC_RES_RES1_A_I915)
2993#define PIPE_CRC_RES_RES2_G4X(pipe) \
2994 _TRANSCODER2(pipe, _PIPE_CRC_RES_RES2_A_G4X)
2995 3045
2996/* Pipe A timing regs */ 3046/* Pipe A timing regs */
2997#define _HTOTAL_A 0x60000 3047#define _HTOTAL_A 0x60000
@@ -3023,20 +3073,20 @@ enum skl_disp_power_wells {
3023#define CHV_TRANSCODER_C_OFFSET 0x63000 3073#define CHV_TRANSCODER_C_OFFSET 0x63000
3024#define TRANSCODER_EDP_OFFSET 0x6f000 3074#define TRANSCODER_EDP_OFFSET 0x6f000
3025 3075
3026#define _TRANSCODER2(pipe, reg) (dev_priv->info.trans_offsets[(pipe)] - \ 3076#define _MMIO_TRANS2(pipe, reg) _MMIO(dev_priv->info.trans_offsets[(pipe)] - \
3027 dev_priv->info.trans_offsets[TRANSCODER_A] + (reg) + \ 3077 dev_priv->info.trans_offsets[TRANSCODER_A] + (reg) + \
3028 dev_priv->info.display_mmio_offset) 3078 dev_priv->info.display_mmio_offset)
3029 3079
3030#define HTOTAL(trans) _TRANSCODER2(trans, _HTOTAL_A) 3080#define HTOTAL(trans) _MMIO_TRANS2(trans, _HTOTAL_A)
3031#define HBLANK(trans) _TRANSCODER2(trans, _HBLANK_A) 3081#define HBLANK(trans) _MMIO_TRANS2(trans, _HBLANK_A)
3032#define HSYNC(trans) _TRANSCODER2(trans, _HSYNC_A) 3082#define HSYNC(trans) _MMIO_TRANS2(trans, _HSYNC_A)
3033#define VTOTAL(trans) _TRANSCODER2(trans, _VTOTAL_A) 3083#define VTOTAL(trans) _MMIO_TRANS2(trans, _VTOTAL_A)
3034#define VBLANK(trans) _TRANSCODER2(trans, _VBLANK_A) 3084#define VBLANK(trans) _MMIO_TRANS2(trans, _VBLANK_A)
3035#define VSYNC(trans) _TRANSCODER2(trans, _VSYNC_A) 3085#define VSYNC(trans) _MMIO_TRANS2(trans, _VSYNC_A)
3036#define BCLRPAT(trans) _TRANSCODER2(trans, _BCLRPAT_A) 3086#define BCLRPAT(trans) _MMIO_TRANS2(trans, _BCLRPAT_A)
3037#define VSYNCSHIFT(trans) _TRANSCODER2(trans, _VSYNCSHIFT_A) 3087#define VSYNCSHIFT(trans) _MMIO_TRANS2(trans, _VSYNCSHIFT_A)
3038#define PIPESRC(trans) _TRANSCODER2(trans, _PIPEASRC) 3088#define PIPESRC(trans) _MMIO_TRANS2(trans, _PIPEASRC)
3039#define PIPE_MULT(trans) _TRANSCODER2(trans, _PIPE_MULT_A) 3089#define PIPE_MULT(trans) _MMIO_TRANS2(trans, _PIPE_MULT_A)
3040 3090
3041/* VLV eDP PSR registers */ 3091/* VLV eDP PSR registers */
3042#define _PSRCTLA (VLV_DISPLAY_BASE + 0x60090) 3092#define _PSRCTLA (VLV_DISPLAY_BASE + 0x60090)
@@ -3052,14 +3102,14 @@ enum skl_disp_power_wells {
3052#define VLV_EDP_PSR_DBL_FRAME (1<<10) 3102#define VLV_EDP_PSR_DBL_FRAME (1<<10)
3053#define VLV_EDP_PSR_FRAME_COUNT_MASK (0xff<<16) 3103#define VLV_EDP_PSR_FRAME_COUNT_MASK (0xff<<16)
3054#define VLV_EDP_PSR_IDLE_FRAME_SHIFT 16 3104#define VLV_EDP_PSR_IDLE_FRAME_SHIFT 16
3055#define VLV_PSRCTL(pipe) _PIPE(pipe, _PSRCTLA, _PSRCTLB) 3105#define VLV_PSRCTL(pipe) _MMIO_PIPE(pipe, _PSRCTLA, _PSRCTLB)
3056 3106
3057#define _VSCSDPA (VLV_DISPLAY_BASE + 0x600a0) 3107#define _VSCSDPA (VLV_DISPLAY_BASE + 0x600a0)
3058#define _VSCSDPB (VLV_DISPLAY_BASE + 0x610a0) 3108#define _VSCSDPB (VLV_DISPLAY_BASE + 0x610a0)
3059#define VLV_EDP_PSR_SDP_FREQ_MASK (3<<30) 3109#define VLV_EDP_PSR_SDP_FREQ_MASK (3<<30)
3060#define VLV_EDP_PSR_SDP_FREQ_ONCE (1<<31) 3110#define VLV_EDP_PSR_SDP_FREQ_ONCE (1<<31)
3061#define VLV_EDP_PSR_SDP_FREQ_EVFRAME (1<<30) 3111#define VLV_EDP_PSR_SDP_FREQ_EVFRAME (1<<30)
3062#define VLV_VSCSDP(pipe) _PIPE(pipe, _VSCSDPA, _VSCSDPB) 3112#define VLV_VSCSDP(pipe) _MMIO_PIPE(pipe, _VSCSDPA, _VSCSDPB)
3063 3113
3064#define _PSRSTATA (VLV_DISPLAY_BASE + 0x60094) 3114#define _PSRSTATA (VLV_DISPLAY_BASE + 0x60094)
3065#define _PSRSTATB (VLV_DISPLAY_BASE + 0x61094) 3115#define _PSRSTATB (VLV_DISPLAY_BASE + 0x61094)
@@ -3072,11 +3122,12 @@ enum skl_disp_power_wells {
3072#define VLV_EDP_PSR_ACTIVE_SF_UPDATE (4<<0) 3122#define VLV_EDP_PSR_ACTIVE_SF_UPDATE (4<<0)
3073#define VLV_EDP_PSR_EXIT (5<<0) 3123#define VLV_EDP_PSR_EXIT (5<<0)
3074#define VLV_EDP_PSR_IN_TRANS (1<<7) 3124#define VLV_EDP_PSR_IN_TRANS (1<<7)
3075#define VLV_PSRSTAT(pipe) _PIPE(pipe, _PSRSTATA, _PSRSTATB) 3125#define VLV_PSRSTAT(pipe) _MMIO_PIPE(pipe, _PSRSTATA, _PSRSTATB)
3076 3126
3077/* HSW+ eDP PSR registers */ 3127/* HSW+ eDP PSR registers */
3078#define EDP_PSR_BASE(dev) (IS_HASWELL(dev) ? 0x64800 : 0x6f800) 3128#define HSW_EDP_PSR_BASE 0x64800
3079#define EDP_PSR_CTL(dev) (EDP_PSR_BASE(dev) + 0) 3129#define BDW_EDP_PSR_BASE 0x6f800
3130#define EDP_PSR_CTL _MMIO(dev_priv->psr_mmio_base + 0)
3080#define EDP_PSR_ENABLE (1<<31) 3131#define EDP_PSR_ENABLE (1<<31)
3081#define BDW_PSR_SINGLE_FRAME (1<<30) 3132#define BDW_PSR_SINGLE_FRAME (1<<30)
3082#define EDP_PSR_LINK_STANDBY (1<<27) 3133#define EDP_PSR_LINK_STANDBY (1<<27)
@@ -3099,14 +3150,10 @@ enum skl_disp_power_wells {
3099#define EDP_PSR_TP1_TIME_0us (3<<4) 3150#define EDP_PSR_TP1_TIME_0us (3<<4)
3100#define EDP_PSR_IDLE_FRAME_SHIFT 0 3151#define EDP_PSR_IDLE_FRAME_SHIFT 0
3101 3152
3102#define EDP_PSR_AUX_CTL(dev) (EDP_PSR_BASE(dev) + 0x10) 3153#define EDP_PSR_AUX_CTL _MMIO(dev_priv->psr_mmio_base + 0x10)
3103#define EDP_PSR_AUX_DATA1(dev) (EDP_PSR_BASE(dev) + 0x14) 3154#define EDP_PSR_AUX_DATA(i) _MMIO(dev_priv->psr_mmio_base + 0x14 + (i) * 4) /* 5 registers */
3104#define EDP_PSR_AUX_DATA2(dev) (EDP_PSR_BASE(dev) + 0x18)
3105#define EDP_PSR_AUX_DATA3(dev) (EDP_PSR_BASE(dev) + 0x1c)
3106#define EDP_PSR_AUX_DATA4(dev) (EDP_PSR_BASE(dev) + 0x20)
3107#define EDP_PSR_AUX_DATA5(dev) (EDP_PSR_BASE(dev) + 0x24)
3108 3155
3109#define EDP_PSR_STATUS_CTL(dev) (EDP_PSR_BASE(dev) + 0x40) 3156#define EDP_PSR_STATUS_CTL _MMIO(dev_priv->psr_mmio_base + 0x40)
3110#define EDP_PSR_STATUS_STATE_MASK (7<<29) 3157#define EDP_PSR_STATUS_STATE_MASK (7<<29)
3111#define EDP_PSR_STATUS_STATE_IDLE (0<<29) 3158#define EDP_PSR_STATUS_STATE_IDLE (0<<29)
3112#define EDP_PSR_STATUS_STATE_SRDONACK (1<<29) 3159#define EDP_PSR_STATUS_STATE_SRDONACK (1<<29)
@@ -3130,15 +3177,15 @@ enum skl_disp_power_wells {
3130#define EDP_PSR_STATUS_SENDING_TP1 (1<<4) 3177#define EDP_PSR_STATUS_SENDING_TP1 (1<<4)
3131#define EDP_PSR_STATUS_IDLE_MASK 0xf 3178#define EDP_PSR_STATUS_IDLE_MASK 0xf
3132 3179
3133#define EDP_PSR_PERF_CNT(dev) (EDP_PSR_BASE(dev) + 0x44) 3180#define EDP_PSR_PERF_CNT _MMIO(dev_priv->psr_mmio_base + 0x44)
3134#define EDP_PSR_PERF_CNT_MASK 0xffffff 3181#define EDP_PSR_PERF_CNT_MASK 0xffffff
3135 3182
3136#define EDP_PSR_DEBUG_CTL(dev) (EDP_PSR_BASE(dev) + 0x60) 3183#define EDP_PSR_DEBUG_CTL _MMIO(dev_priv->psr_mmio_base + 0x60)
3137#define EDP_PSR_DEBUG_MASK_LPSP (1<<27) 3184#define EDP_PSR_DEBUG_MASK_LPSP (1<<27)
3138#define EDP_PSR_DEBUG_MASK_MEMUP (1<<26) 3185#define EDP_PSR_DEBUG_MASK_MEMUP (1<<26)
3139#define EDP_PSR_DEBUG_MASK_HPD (1<<25) 3186#define EDP_PSR_DEBUG_MASK_HPD (1<<25)
3140 3187
3141#define EDP_PSR2_CTL 0x6f900 3188#define EDP_PSR2_CTL _MMIO(0x6f900)
3142#define EDP_PSR2_ENABLE (1<<31) 3189#define EDP_PSR2_ENABLE (1<<31)
3143#define EDP_SU_TRACK_ENABLE (1<<30) 3190#define EDP_SU_TRACK_ENABLE (1<<30)
3144#define EDP_MAX_SU_DISABLE_TIME(t) ((t)<<20) 3191#define EDP_MAX_SU_DISABLE_TIME(t) ((t)<<20)
@@ -3153,9 +3200,9 @@ enum skl_disp_power_wells {
3153#define EDP_PSR2_IDLE_MASK 0xf 3200#define EDP_PSR2_IDLE_MASK 0xf
3154 3201
3155/* VGA port control */ 3202/* VGA port control */
3156#define ADPA 0x61100 3203#define ADPA _MMIO(0x61100)
3157#define PCH_ADPA 0xe1100 3204#define PCH_ADPA _MMIO(0xe1100)
3158#define VLV_ADPA (VLV_DISPLAY_BASE + ADPA) 3205#define VLV_ADPA _MMIO(VLV_DISPLAY_BASE + 0x61100)
3159 3206
3160#define ADPA_DAC_ENABLE (1<<31) 3207#define ADPA_DAC_ENABLE (1<<31)
3161#define ADPA_DAC_DISABLE 0 3208#define ADPA_DAC_DISABLE 0
@@ -3201,7 +3248,7 @@ enum skl_disp_power_wells {
3201 3248
3202 3249
3203/* Hotplug control (945+ only) */ 3250/* Hotplug control (945+ only) */
3204#define PORT_HOTPLUG_EN (dev_priv->info.display_mmio_offset + 0x61110) 3251#define PORT_HOTPLUG_EN _MMIO(dev_priv->info.display_mmio_offset + 0x61110)
3205#define PORTB_HOTPLUG_INT_EN (1 << 29) 3252#define PORTB_HOTPLUG_INT_EN (1 << 29)
3206#define PORTC_HOTPLUG_INT_EN (1 << 28) 3253#define PORTC_HOTPLUG_INT_EN (1 << 28)
3207#define PORTD_HOTPLUG_INT_EN (1 << 27) 3254#define PORTD_HOTPLUG_INT_EN (1 << 27)
@@ -3231,7 +3278,7 @@ enum skl_disp_power_wells {
3231#define CRT_HOTPLUG_DETECT_VOLTAGE_325MV (0 << 2) 3278#define CRT_HOTPLUG_DETECT_VOLTAGE_325MV (0 << 2)
3232#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2) 3279#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2)
3233 3280
3234#define PORT_HOTPLUG_STAT (dev_priv->info.display_mmio_offset + 0x61114) 3281#define PORT_HOTPLUG_STAT _MMIO(dev_priv->info.display_mmio_offset + 0x61114)
3235/* 3282/*
3236 * HDMI/DP bits are gen4+ 3283 * HDMI/DP bits are gen4+
3237 * 3284 *
@@ -3296,21 +3343,23 @@ enum skl_disp_power_wells {
3296 3343
3297/* SDVO and HDMI port control. 3344/* SDVO and HDMI port control.
3298 * The same register may be used for SDVO or HDMI */ 3345 * The same register may be used for SDVO or HDMI */
3299#define GEN3_SDVOB 0x61140 3346#define _GEN3_SDVOB 0x61140
3300#define GEN3_SDVOC 0x61160 3347#define _GEN3_SDVOC 0x61160
3348#define GEN3_SDVOB _MMIO(_GEN3_SDVOB)
3349#define GEN3_SDVOC _MMIO(_GEN3_SDVOC)
3301#define GEN4_HDMIB GEN3_SDVOB 3350#define GEN4_HDMIB GEN3_SDVOB
3302#define GEN4_HDMIC GEN3_SDVOC 3351#define GEN4_HDMIC GEN3_SDVOC
3303#define VLV_HDMIB (VLV_DISPLAY_BASE + GEN4_HDMIB) 3352#define VLV_HDMIB _MMIO(VLV_DISPLAY_BASE + 0x61140)
3304#define VLV_HDMIC (VLV_DISPLAY_BASE + GEN4_HDMIC) 3353#define VLV_HDMIC _MMIO(VLV_DISPLAY_BASE + 0x61160)
3305#define CHV_HDMID (VLV_DISPLAY_BASE + 0x6116C) 3354#define CHV_HDMID _MMIO(VLV_DISPLAY_BASE + 0x6116C)
3306#define PCH_SDVOB 0xe1140 3355#define PCH_SDVOB _MMIO(0xe1140)
3307#define PCH_HDMIB PCH_SDVOB 3356#define PCH_HDMIB PCH_SDVOB
3308#define PCH_HDMIC 0xe1150 3357#define PCH_HDMIC _MMIO(0xe1150)
3309#define PCH_HDMID 0xe1160 3358#define PCH_HDMID _MMIO(0xe1160)
3310 3359
3311#define PORT_DFT_I9XX 0x61150 3360#define PORT_DFT_I9XX _MMIO(0x61150)
3312#define DC_BALANCE_RESET (1 << 25) 3361#define DC_BALANCE_RESET (1 << 25)
3313#define PORT_DFT2_G4X (dev_priv->info.display_mmio_offset + 0x61154) 3362#define PORT_DFT2_G4X _MMIO(dev_priv->info.display_mmio_offset + 0x61154)
3314#define DC_BALANCE_RESET_VLV (1 << 31) 3363#define DC_BALANCE_RESET_VLV (1 << 31)
3315#define PIPE_SCRAMBLE_RESET_MASK ((1 << 14) | (0x3 << 0)) 3364#define PIPE_SCRAMBLE_RESET_MASK ((1 << 14) | (0x3 << 0))
3316#define PIPE_C_SCRAMBLE_RESET (1 << 14) /* chv */ 3365#define PIPE_C_SCRAMBLE_RESET (1 << 14) /* chv */
@@ -3370,9 +3419,12 @@ enum skl_disp_power_wells {
3370 3419
3371 3420
3372/* DVO port control */ 3421/* DVO port control */
3373#define DVOA 0x61120 3422#define _DVOA 0x61120
3374#define DVOB 0x61140 3423#define DVOA _MMIO(_DVOA)
3375#define DVOC 0x61160 3424#define _DVOB 0x61140
3425#define DVOB _MMIO(_DVOB)
3426#define _DVOC 0x61160
3427#define DVOC _MMIO(_DVOC)
3376#define DVO_ENABLE (1 << 31) 3428#define DVO_ENABLE (1 << 31)
3377#define DVO_PIPE_B_SELECT (1 << 30) 3429#define DVO_PIPE_B_SELECT (1 << 30)
3378#define DVO_PIPE_STALL_UNUSED (0 << 28) 3430#define DVO_PIPE_STALL_UNUSED (0 << 28)
@@ -3397,14 +3449,14 @@ enum skl_disp_power_wells {
3397#define DVO_OUTPUT_CSTATE_PIXELS (1 << 1) /* SDG only */ 3449#define DVO_OUTPUT_CSTATE_PIXELS (1 << 1) /* SDG only */
3398#define DVO_OUTPUT_SOURCE_SIZE_PIXELS (1 << 0) /* SDG only */ 3450#define DVO_OUTPUT_SOURCE_SIZE_PIXELS (1 << 0) /* SDG only */
3399#define DVO_PRESERVE_MASK (0x7<<24) 3451#define DVO_PRESERVE_MASK (0x7<<24)
3400#define DVOA_SRCDIM 0x61124 3452#define DVOA_SRCDIM _MMIO(0x61124)
3401#define DVOB_SRCDIM 0x61144 3453#define DVOB_SRCDIM _MMIO(0x61144)
3402#define DVOC_SRCDIM 0x61164 3454#define DVOC_SRCDIM _MMIO(0x61164)
3403#define DVO_SRCDIM_HORIZONTAL_SHIFT 12 3455#define DVO_SRCDIM_HORIZONTAL_SHIFT 12
3404#define DVO_SRCDIM_VERTICAL_SHIFT 0 3456#define DVO_SRCDIM_VERTICAL_SHIFT 0
3405 3457
3406/* LVDS port control */ 3458/* LVDS port control */
3407#define LVDS 0x61180 3459#define LVDS _MMIO(0x61180)
3408/* 3460/*
3409 * Enables the LVDS port. This bit must be set before DPLLs are enabled, as 3461 * Enables the LVDS port. This bit must be set before DPLLs are enabled, as
3410 * the DPLL semantics change when the LVDS is assigned to that pipe. 3462 * the DPLL semantics change when the LVDS is assigned to that pipe.
@@ -3454,13 +3506,13 @@ enum skl_disp_power_wells {
3454#define LVDS_B0B3_POWER_UP (3 << 2) 3506#define LVDS_B0B3_POWER_UP (3 << 2)
3455 3507
3456/* Video Data Island Packet control */ 3508/* Video Data Island Packet control */
3457#define VIDEO_DIP_DATA 0x61178 3509#define VIDEO_DIP_DATA _MMIO(0x61178)
3458/* Read the description of VIDEO_DIP_DATA (before Haswell) or VIDEO_DIP_ECC 3510/* Read the description of VIDEO_DIP_DATA (before Haswell) or VIDEO_DIP_ECC
3459 * (Haswell and newer) to see which VIDEO_DIP_DATA byte corresponds to each byte 3511 * (Haswell and newer) to see which VIDEO_DIP_DATA byte corresponds to each byte
3460 * of the infoframe structure specified by CEA-861. */ 3512 * of the infoframe structure specified by CEA-861. */
3461#define VIDEO_DIP_DATA_SIZE 32 3513#define VIDEO_DIP_DATA_SIZE 32
3462#define VIDEO_DIP_VSC_DATA_SIZE 36 3514#define VIDEO_DIP_VSC_DATA_SIZE 36
3463#define VIDEO_DIP_CTL 0x61170 3515#define VIDEO_DIP_CTL _MMIO(0x61170)
3464/* Pre HSW: */ 3516/* Pre HSW: */
3465#define VIDEO_DIP_ENABLE (1 << 31) 3517#define VIDEO_DIP_ENABLE (1 << 31)
3466#define VIDEO_DIP_PORT(port) ((port) << 29) 3518#define VIDEO_DIP_PORT(port) ((port) << 29)
@@ -3487,7 +3539,7 @@ enum skl_disp_power_wells {
3487#define VIDEO_DIP_ENABLE_SPD_HSW (1 << 0) 3539#define VIDEO_DIP_ENABLE_SPD_HSW (1 << 0)
3488 3540
3489/* Panel power sequencing */ 3541/* Panel power sequencing */
3490#define PP_STATUS 0x61200 3542#define PP_STATUS _MMIO(0x61200)
3491#define PP_ON (1 << 31) 3543#define PP_ON (1 << 31)
3492/* 3544/*
3493 * Indicates that all dependencies of the panel are on: 3545 * Indicates that all dependencies of the panel are on:
@@ -3513,14 +3565,14 @@ enum skl_disp_power_wells {
3513#define PP_SEQUENCE_STATE_ON_S1_2 (0xa << 0) 3565#define PP_SEQUENCE_STATE_ON_S1_2 (0xa << 0)
3514#define PP_SEQUENCE_STATE_ON_S1_3 (0xb << 0) 3566#define PP_SEQUENCE_STATE_ON_S1_3 (0xb << 0)
3515#define PP_SEQUENCE_STATE_RESET (0xf << 0) 3567#define PP_SEQUENCE_STATE_RESET (0xf << 0)
3516#define PP_CONTROL 0x61204 3568#define PP_CONTROL _MMIO(0x61204)
3517#define POWER_TARGET_ON (1 << 0) 3569#define POWER_TARGET_ON (1 << 0)
3518#define PP_ON_DELAYS 0x61208 3570#define PP_ON_DELAYS _MMIO(0x61208)
3519#define PP_OFF_DELAYS 0x6120c 3571#define PP_OFF_DELAYS _MMIO(0x6120c)
3520#define PP_DIVISOR 0x61210 3572#define PP_DIVISOR _MMIO(0x61210)
3521 3573
3522/* Panel fitting */ 3574/* Panel fitting */
3523#define PFIT_CONTROL (dev_priv->info.display_mmio_offset + 0x61230) 3575#define PFIT_CONTROL _MMIO(dev_priv->info.display_mmio_offset + 0x61230)
3524#define PFIT_ENABLE (1 << 31) 3576#define PFIT_ENABLE (1 << 31)
3525#define PFIT_PIPE_MASK (3 << 29) 3577#define PFIT_PIPE_MASK (3 << 29)
3526#define PFIT_PIPE_SHIFT 29 3578#define PFIT_PIPE_SHIFT 29
@@ -3538,7 +3590,7 @@ enum skl_disp_power_wells {
3538#define PFIT_SCALING_PROGRAMMED (1 << 26) 3590#define PFIT_SCALING_PROGRAMMED (1 << 26)
3539#define PFIT_SCALING_PILLAR (2 << 26) 3591#define PFIT_SCALING_PILLAR (2 << 26)
3540#define PFIT_SCALING_LETTER (3 << 26) 3592#define PFIT_SCALING_LETTER (3 << 26)
3541#define PFIT_PGM_RATIOS (dev_priv->info.display_mmio_offset + 0x61234) 3593#define PFIT_PGM_RATIOS _MMIO(dev_priv->info.display_mmio_offset + 0x61234)
3542/* Pre-965 */ 3594/* Pre-965 */
3543#define PFIT_VERT_SCALE_SHIFT 20 3595#define PFIT_VERT_SCALE_SHIFT 20
3544#define PFIT_VERT_SCALE_MASK 0xfff00000 3596#define PFIT_VERT_SCALE_MASK 0xfff00000
@@ -3550,25 +3602,25 @@ enum skl_disp_power_wells {
3550#define PFIT_HORIZ_SCALE_SHIFT_965 0 3602#define PFIT_HORIZ_SCALE_SHIFT_965 0
3551#define PFIT_HORIZ_SCALE_MASK_965 0x00001fff 3603#define PFIT_HORIZ_SCALE_MASK_965 0x00001fff
3552 3604
3553#define PFIT_AUTO_RATIOS (dev_priv->info.display_mmio_offset + 0x61238) 3605#define PFIT_AUTO_RATIOS _MMIO(dev_priv->info.display_mmio_offset + 0x61238)
3554 3606
3555#define _VLV_BLC_PWM_CTL2_A (dev_priv->info.display_mmio_offset + 0x61250) 3607#define _VLV_BLC_PWM_CTL2_A (dev_priv->info.display_mmio_offset + 0x61250)
3556#define _VLV_BLC_PWM_CTL2_B (dev_priv->info.display_mmio_offset + 0x61350) 3608#define _VLV_BLC_PWM_CTL2_B (dev_priv->info.display_mmio_offset + 0x61350)
3557#define VLV_BLC_PWM_CTL2(pipe) _PIPE(pipe, _VLV_BLC_PWM_CTL2_A, \ 3609#define VLV_BLC_PWM_CTL2(pipe) _MMIO_PIPE(pipe, _VLV_BLC_PWM_CTL2_A, \
3558 _VLV_BLC_PWM_CTL2_B) 3610 _VLV_BLC_PWM_CTL2_B)
3559 3611
3560#define _VLV_BLC_PWM_CTL_A (dev_priv->info.display_mmio_offset + 0x61254) 3612#define _VLV_BLC_PWM_CTL_A (dev_priv->info.display_mmio_offset + 0x61254)
3561#define _VLV_BLC_PWM_CTL_B (dev_priv->info.display_mmio_offset + 0x61354) 3613#define _VLV_BLC_PWM_CTL_B (dev_priv->info.display_mmio_offset + 0x61354)
3562#define VLV_BLC_PWM_CTL(pipe) _PIPE(pipe, _VLV_BLC_PWM_CTL_A, \ 3614#define VLV_BLC_PWM_CTL(pipe) _MMIO_PIPE(pipe, _VLV_BLC_PWM_CTL_A, \
3563 _VLV_BLC_PWM_CTL_B) 3615 _VLV_BLC_PWM_CTL_B)
3564 3616
3565#define _VLV_BLC_HIST_CTL_A (dev_priv->info.display_mmio_offset + 0x61260) 3617#define _VLV_BLC_HIST_CTL_A (dev_priv->info.display_mmio_offset + 0x61260)
3566#define _VLV_BLC_HIST_CTL_B (dev_priv->info.display_mmio_offset + 0x61360) 3618#define _VLV_BLC_HIST_CTL_B (dev_priv->info.display_mmio_offset + 0x61360)
3567#define VLV_BLC_HIST_CTL(pipe) _PIPE(pipe, _VLV_BLC_HIST_CTL_A, \ 3619#define VLV_BLC_HIST_CTL(pipe) _MMIO_PIPE(pipe, _VLV_BLC_HIST_CTL_A, \
3568 _VLV_BLC_HIST_CTL_B) 3620 _VLV_BLC_HIST_CTL_B)
3569 3621
3570/* Backlight control */ 3622/* Backlight control */
3571#define BLC_PWM_CTL2 (dev_priv->info.display_mmio_offset + 0x61250) /* 965+ only */ 3623#define BLC_PWM_CTL2 _MMIO(dev_priv->info.display_mmio_offset + 0x61250) /* 965+ only */
3572#define BLM_PWM_ENABLE (1 << 31) 3624#define BLM_PWM_ENABLE (1 << 31)
3573#define BLM_COMBINATION_MODE (1 << 30) /* gen4 only */ 3625#define BLM_COMBINATION_MODE (1 << 30) /* gen4 only */
3574#define BLM_PIPE_SELECT (1 << 29) 3626#define BLM_PIPE_SELECT (1 << 29)
@@ -3591,7 +3643,7 @@ enum skl_disp_power_wells {
3591#define BLM_PHASE_IN_COUNT_MASK (0xff << 8) 3643#define BLM_PHASE_IN_COUNT_MASK (0xff << 8)
3592#define BLM_PHASE_IN_INCR_SHIFT (0) 3644#define BLM_PHASE_IN_INCR_SHIFT (0)
3593#define BLM_PHASE_IN_INCR_MASK (0xff << 0) 3645#define BLM_PHASE_IN_INCR_MASK (0xff << 0)
3594#define BLC_PWM_CTL (dev_priv->info.display_mmio_offset + 0x61254) 3646#define BLC_PWM_CTL _MMIO(dev_priv->info.display_mmio_offset + 0x61254)
3595/* 3647/*
3596 * This is the most significant 15 bits of the number of backlight cycles in a 3648 * This is the most significant 15 bits of the number of backlight cycles in a
3597 * complete cycle of the modulated backlight control. 3649 * complete cycle of the modulated backlight control.
@@ -3613,25 +3665,25 @@ enum skl_disp_power_wells {
3613#define BACKLIGHT_DUTY_CYCLE_MASK_PNV (0xfffe) 3665#define BACKLIGHT_DUTY_CYCLE_MASK_PNV (0xfffe)
3614#define BLM_POLARITY_PNV (1 << 0) /* pnv only */ 3666#define BLM_POLARITY_PNV (1 << 0) /* pnv only */
3615 3667
3616#define BLC_HIST_CTL (dev_priv->info.display_mmio_offset + 0x61260) 3668#define BLC_HIST_CTL _MMIO(dev_priv->info.display_mmio_offset + 0x61260)
3617#define BLM_HISTOGRAM_ENABLE (1 << 31) 3669#define BLM_HISTOGRAM_ENABLE (1 << 31)
3618 3670
3619/* New registers for PCH-split platforms. Safe where new bits show up, the 3671/* New registers for PCH-split platforms. Safe where new bits show up, the
3620 * register layout machtes with gen4 BLC_PWM_CTL[12]. */ 3672 * register layout machtes with gen4 BLC_PWM_CTL[12]. */
3621#define BLC_PWM_CPU_CTL2 0x48250 3673#define BLC_PWM_CPU_CTL2 _MMIO(0x48250)
3622#define BLC_PWM_CPU_CTL 0x48254 3674#define BLC_PWM_CPU_CTL _MMIO(0x48254)
3623 3675
3624#define HSW_BLC_PWM2_CTL 0x48350 3676#define HSW_BLC_PWM2_CTL _MMIO(0x48350)
3625 3677
3626/* PCH CTL1 is totally different, all but the below bits are reserved. CTL2 is 3678/* PCH CTL1 is totally different, all but the below bits are reserved. CTL2 is
3627 * like the normal CTL from gen4 and earlier. Hooray for confusing naming. */ 3679 * like the normal CTL from gen4 and earlier. Hooray for confusing naming. */
3628#define BLC_PWM_PCH_CTL1 0xc8250 3680#define BLC_PWM_PCH_CTL1 _MMIO(0xc8250)
3629#define BLM_PCH_PWM_ENABLE (1 << 31) 3681#define BLM_PCH_PWM_ENABLE (1 << 31)
3630#define BLM_PCH_OVERRIDE_ENABLE (1 << 30) 3682#define BLM_PCH_OVERRIDE_ENABLE (1 << 30)
3631#define BLM_PCH_POLARITY (1 << 29) 3683#define BLM_PCH_POLARITY (1 << 29)
3632#define BLC_PWM_PCH_CTL2 0xc8254 3684#define BLC_PWM_PCH_CTL2 _MMIO(0xc8254)
3633 3685
3634#define UTIL_PIN_CTL 0x48400 3686#define UTIL_PIN_CTL _MMIO(0x48400)
3635#define UTIL_PIN_ENABLE (1 << 31) 3687#define UTIL_PIN_ENABLE (1 << 31)
3636 3688
3637#define UTIL_PIN_PIPE(x) ((x) << 29) 3689#define UTIL_PIN_PIPE(x) ((x) << 29)
@@ -3651,18 +3703,18 @@ enum skl_disp_power_wells {
3651#define _BXT_BLC_PWM_FREQ2 0xC8354 3703#define _BXT_BLC_PWM_FREQ2 0xC8354
3652#define _BXT_BLC_PWM_DUTY2 0xC8358 3704#define _BXT_BLC_PWM_DUTY2 0xC8358
3653 3705
3654#define BXT_BLC_PWM_CTL(controller) _PIPE(controller, \ 3706#define BXT_BLC_PWM_CTL(controller) _MMIO_PIPE(controller, \
3655 _BXT_BLC_PWM_CTL1, _BXT_BLC_PWM_CTL2) 3707 _BXT_BLC_PWM_CTL1, _BXT_BLC_PWM_CTL2)
3656#define BXT_BLC_PWM_FREQ(controller) _PIPE(controller, \ 3708#define BXT_BLC_PWM_FREQ(controller) _MMIO_PIPE(controller, \
3657 _BXT_BLC_PWM_FREQ1, _BXT_BLC_PWM_FREQ2) 3709 _BXT_BLC_PWM_FREQ1, _BXT_BLC_PWM_FREQ2)
3658#define BXT_BLC_PWM_DUTY(controller) _PIPE(controller, \ 3710#define BXT_BLC_PWM_DUTY(controller) _MMIO_PIPE(controller, \
3659 _BXT_BLC_PWM_DUTY1, _BXT_BLC_PWM_DUTY2) 3711 _BXT_BLC_PWM_DUTY1, _BXT_BLC_PWM_DUTY2)
3660 3712
3661#define PCH_GTC_CTL 0xe7000 3713#define PCH_GTC_CTL _MMIO(0xe7000)
3662#define PCH_GTC_ENABLE (1 << 31) 3714#define PCH_GTC_ENABLE (1 << 31)
3663 3715
3664/* TV port control */ 3716/* TV port control */
3665#define TV_CTL 0x68000 3717#define TV_CTL _MMIO(0x68000)
3666/* Enables the TV encoder */ 3718/* Enables the TV encoder */
3667# define TV_ENC_ENABLE (1 << 31) 3719# define TV_ENC_ENABLE (1 << 31)
3668/* Sources the TV encoder input from pipe B instead of A. */ 3720/* Sources the TV encoder input from pipe B instead of A. */
@@ -3729,7 +3781,7 @@ enum skl_disp_power_wells {
3729# define TV_TEST_MODE_MONITOR_DETECT (7 << 0) 3781# define TV_TEST_MODE_MONITOR_DETECT (7 << 0)
3730# define TV_TEST_MODE_MASK (7 << 0) 3782# define TV_TEST_MODE_MASK (7 << 0)
3731 3783
3732#define TV_DAC 0x68004 3784#define TV_DAC _MMIO(0x68004)
3733# define TV_DAC_SAVE 0x00ffff00 3785# define TV_DAC_SAVE 0x00ffff00
3734/* 3786/*
3735 * Reports that DAC state change logic has reported change (RO). 3787 * Reports that DAC state change logic has reported change (RO).
@@ -3780,13 +3832,13 @@ enum skl_disp_power_wells {
3780 * where 2-bit exponents are unsigned n, and 3-bit exponents are signed n with 3832 * where 2-bit exponents are unsigned n, and 3-bit exponents are signed n with
3781 * -1 (0x3) being the only legal negative value. 3833 * -1 (0x3) being the only legal negative value.
3782 */ 3834 */
3783#define TV_CSC_Y 0x68010 3835#define TV_CSC_Y _MMIO(0x68010)
3784# define TV_RY_MASK 0x07ff0000 3836# define TV_RY_MASK 0x07ff0000
3785# define TV_RY_SHIFT 16 3837# define TV_RY_SHIFT 16
3786# define TV_GY_MASK 0x00000fff 3838# define TV_GY_MASK 0x00000fff
3787# define TV_GY_SHIFT 0 3839# define TV_GY_SHIFT 0
3788 3840
3789#define TV_CSC_Y2 0x68014 3841#define TV_CSC_Y2 _MMIO(0x68014)
3790# define TV_BY_MASK 0x07ff0000 3842# define TV_BY_MASK 0x07ff0000
3791# define TV_BY_SHIFT 16 3843# define TV_BY_SHIFT 16
3792/* 3844/*
@@ -3797,13 +3849,13 @@ enum skl_disp_power_wells {
3797# define TV_AY_MASK 0x000003ff 3849# define TV_AY_MASK 0x000003ff
3798# define TV_AY_SHIFT 0 3850# define TV_AY_SHIFT 0
3799 3851
3800#define TV_CSC_U 0x68018 3852#define TV_CSC_U _MMIO(0x68018)
3801# define TV_RU_MASK 0x07ff0000 3853# define TV_RU_MASK 0x07ff0000
3802# define TV_RU_SHIFT 16 3854# define TV_RU_SHIFT 16
3803# define TV_GU_MASK 0x000007ff 3855# define TV_GU_MASK 0x000007ff
3804# define TV_GU_SHIFT 0 3856# define TV_GU_SHIFT 0
3805 3857
3806#define TV_CSC_U2 0x6801c 3858#define TV_CSC_U2 _MMIO(0x6801c)
3807# define TV_BU_MASK 0x07ff0000 3859# define TV_BU_MASK 0x07ff0000
3808# define TV_BU_SHIFT 16 3860# define TV_BU_SHIFT 16
3809/* 3861/*
@@ -3814,13 +3866,13 @@ enum skl_disp_power_wells {
3814# define TV_AU_MASK 0x000003ff 3866# define TV_AU_MASK 0x000003ff
3815# define TV_AU_SHIFT 0 3867# define TV_AU_SHIFT 0
3816 3868
3817#define TV_CSC_V 0x68020 3869#define TV_CSC_V _MMIO(0x68020)
3818# define TV_RV_MASK 0x0fff0000 3870# define TV_RV_MASK 0x0fff0000
3819# define TV_RV_SHIFT 16 3871# define TV_RV_SHIFT 16
3820# define TV_GV_MASK 0x000007ff 3872# define TV_GV_MASK 0x000007ff
3821# define TV_GV_SHIFT 0 3873# define TV_GV_SHIFT 0
3822 3874
3823#define TV_CSC_V2 0x68024 3875#define TV_CSC_V2 _MMIO(0x68024)
3824# define TV_BV_MASK 0x07ff0000 3876# define TV_BV_MASK 0x07ff0000
3825# define TV_BV_SHIFT 16 3877# define TV_BV_SHIFT 16
3826/* 3878/*
@@ -3831,7 +3883,7 @@ enum skl_disp_power_wells {
3831# define TV_AV_MASK 0x000007ff 3883# define TV_AV_MASK 0x000007ff
3832# define TV_AV_SHIFT 0 3884# define TV_AV_SHIFT 0
3833 3885
3834#define TV_CLR_KNOBS 0x68028 3886#define TV_CLR_KNOBS _MMIO(0x68028)
3835/* 2s-complement brightness adjustment */ 3887/* 2s-complement brightness adjustment */
3836# define TV_BRIGHTNESS_MASK 0xff000000 3888# define TV_BRIGHTNESS_MASK 0xff000000
3837# define TV_BRIGHTNESS_SHIFT 24 3889# define TV_BRIGHTNESS_SHIFT 24
@@ -3845,7 +3897,7 @@ enum skl_disp_power_wells {
3845# define TV_HUE_MASK 0x000000ff 3897# define TV_HUE_MASK 0x000000ff
3846# define TV_HUE_SHIFT 0 3898# define TV_HUE_SHIFT 0
3847 3899
3848#define TV_CLR_LEVEL 0x6802c 3900#define TV_CLR_LEVEL _MMIO(0x6802c)
3849/* Controls the DAC level for black */ 3901/* Controls the DAC level for black */
3850# define TV_BLACK_LEVEL_MASK 0x01ff0000 3902# define TV_BLACK_LEVEL_MASK 0x01ff0000
3851# define TV_BLACK_LEVEL_SHIFT 16 3903# define TV_BLACK_LEVEL_SHIFT 16
@@ -3853,7 +3905,7 @@ enum skl_disp_power_wells {
3853# define TV_BLANK_LEVEL_MASK 0x000001ff 3905# define TV_BLANK_LEVEL_MASK 0x000001ff
3854# define TV_BLANK_LEVEL_SHIFT 0 3906# define TV_BLANK_LEVEL_SHIFT 0
3855 3907
3856#define TV_H_CTL_1 0x68030 3908#define TV_H_CTL_1 _MMIO(0x68030)
3857/* Number of pixels in the hsync. */ 3909/* Number of pixels in the hsync. */
3858# define TV_HSYNC_END_MASK 0x1fff0000 3910# define TV_HSYNC_END_MASK 0x1fff0000
3859# define TV_HSYNC_END_SHIFT 16 3911# define TV_HSYNC_END_SHIFT 16
@@ -3861,7 +3913,7 @@ enum skl_disp_power_wells {
3861# define TV_HTOTAL_MASK 0x00001fff 3913# define TV_HTOTAL_MASK 0x00001fff
3862# define TV_HTOTAL_SHIFT 0 3914# define TV_HTOTAL_SHIFT 0
3863 3915
3864#define TV_H_CTL_2 0x68034 3916#define TV_H_CTL_2 _MMIO(0x68034)
3865/* Enables the colorburst (needed for non-component color) */ 3917/* Enables the colorburst (needed for non-component color) */
3866# define TV_BURST_ENA (1 << 31) 3918# define TV_BURST_ENA (1 << 31)
3867/* Offset of the colorburst from the start of hsync, in pixels minus one. */ 3919/* Offset of the colorburst from the start of hsync, in pixels minus one. */
@@ -3871,7 +3923,7 @@ enum skl_disp_power_wells {
3871# define TV_HBURST_LEN_SHIFT 0 3923# define TV_HBURST_LEN_SHIFT 0
3872# define TV_HBURST_LEN_MASK 0x0001fff 3924# define TV_HBURST_LEN_MASK 0x0001fff
3873 3925
3874#define TV_H_CTL_3 0x68038 3926#define TV_H_CTL_3 _MMIO(0x68038)
3875/* End of hblank, measured in pixels minus one from start of hsync */ 3927/* End of hblank, measured in pixels minus one from start of hsync */
3876# define TV_HBLANK_END_SHIFT 16 3928# define TV_HBLANK_END_SHIFT 16
3877# define TV_HBLANK_END_MASK 0x1fff0000 3929# define TV_HBLANK_END_MASK 0x1fff0000
@@ -3879,7 +3931,7 @@ enum skl_disp_power_wells {
3879# define TV_HBLANK_START_SHIFT 0 3931# define TV_HBLANK_START_SHIFT 0
3880# define TV_HBLANK_START_MASK 0x0001fff 3932# define TV_HBLANK_START_MASK 0x0001fff
3881 3933
3882#define TV_V_CTL_1 0x6803c 3934#define TV_V_CTL_1 _MMIO(0x6803c)
3883/* XXX */ 3935/* XXX */
3884# define TV_NBR_END_SHIFT 16 3936# define TV_NBR_END_SHIFT 16
3885# define TV_NBR_END_MASK 0x07ff0000 3937# define TV_NBR_END_MASK 0x07ff0000
@@ -3890,7 +3942,7 @@ enum skl_disp_power_wells {
3890# define TV_VI_END_F2_SHIFT 0 3942# define TV_VI_END_F2_SHIFT 0
3891# define TV_VI_END_F2_MASK 0x0000003f 3943# define TV_VI_END_F2_MASK 0x0000003f
3892 3944
3893#define TV_V_CTL_2 0x68040 3945#define TV_V_CTL_2 _MMIO(0x68040)
3894/* Length of vsync, in half lines */ 3946/* Length of vsync, in half lines */
3895# define TV_VSYNC_LEN_MASK 0x07ff0000 3947# define TV_VSYNC_LEN_MASK 0x07ff0000
3896# define TV_VSYNC_LEN_SHIFT 16 3948# define TV_VSYNC_LEN_SHIFT 16
@@ -3906,7 +3958,7 @@ enum skl_disp_power_wells {
3906# define TV_VSYNC_START_F2_MASK 0x0000007f 3958# define TV_VSYNC_START_F2_MASK 0x0000007f
3907# define TV_VSYNC_START_F2_SHIFT 0 3959# define TV_VSYNC_START_F2_SHIFT 0
3908 3960
3909#define TV_V_CTL_3 0x68044 3961#define TV_V_CTL_3 _MMIO(0x68044)
3910/* Enables generation of the equalization signal */ 3962/* Enables generation of the equalization signal */
3911# define TV_EQUAL_ENA (1 << 31) 3963# define TV_EQUAL_ENA (1 << 31)
3912/* Length of vsync, in half lines */ 3964/* Length of vsync, in half lines */
@@ -3924,7 +3976,7 @@ enum skl_disp_power_wells {
3924# define TV_VEQ_START_F2_MASK 0x000007f 3976# define TV_VEQ_START_F2_MASK 0x000007f
3925# define TV_VEQ_START_F2_SHIFT 0 3977# define TV_VEQ_START_F2_SHIFT 0
3926 3978
3927#define TV_V_CTL_4 0x68048 3979#define TV_V_CTL_4 _MMIO(0x68048)
3928/* 3980/*
3929 * Offset to start of vertical colorburst, measured in one less than the 3981 * Offset to start of vertical colorburst, measured in one less than the
3930 * number of lines from vertical start. 3982 * number of lines from vertical start.
@@ -3938,7 +3990,7 @@ enum skl_disp_power_wells {
3938# define TV_VBURST_END_F1_MASK 0x000000ff 3990# define TV_VBURST_END_F1_MASK 0x000000ff
3939# define TV_VBURST_END_F1_SHIFT 0 3991# define TV_VBURST_END_F1_SHIFT 0
3940 3992
3941#define TV_V_CTL_5 0x6804c 3993#define TV_V_CTL_5 _MMIO(0x6804c)
3942/* 3994/*
3943 * Offset to start of vertical colorburst, measured in one less than the 3995 * Offset to start of vertical colorburst, measured in one less than the
3944 * number of lines from vertical start. 3996 * number of lines from vertical start.
@@ -3952,7 +4004,7 @@ enum skl_disp_power_wells {
3952# define TV_VBURST_END_F2_MASK 0x000000ff 4004# define TV_VBURST_END_F2_MASK 0x000000ff
3953# define TV_VBURST_END_F2_SHIFT 0 4005# define TV_VBURST_END_F2_SHIFT 0
3954 4006
3955#define TV_V_CTL_6 0x68050 4007#define TV_V_CTL_6 _MMIO(0x68050)
3956/* 4008/*
3957 * Offset to start of vertical colorburst, measured in one less than the 4009 * Offset to start of vertical colorburst, measured in one less than the
3958 * number of lines from vertical start. 4010 * number of lines from vertical start.
@@ -3966,7 +4018,7 @@ enum skl_disp_power_wells {
3966# define TV_VBURST_END_F3_MASK 0x000000ff 4018# define TV_VBURST_END_F3_MASK 0x000000ff
3967# define TV_VBURST_END_F3_SHIFT 0 4019# define TV_VBURST_END_F3_SHIFT 0
3968 4020
3969#define TV_V_CTL_7 0x68054 4021#define TV_V_CTL_7 _MMIO(0x68054)
3970/* 4022/*
3971 * Offset to start of vertical colorburst, measured in one less than the 4023 * Offset to start of vertical colorburst, measured in one less than the
3972 * number of lines from vertical start. 4024 * number of lines from vertical start.
@@ -3980,7 +4032,7 @@ enum skl_disp_power_wells {
3980# define TV_VBURST_END_F4_MASK 0x000000ff 4032# define TV_VBURST_END_F4_MASK 0x000000ff
3981# define TV_VBURST_END_F4_SHIFT 0 4033# define TV_VBURST_END_F4_SHIFT 0
3982 4034
3983#define TV_SC_CTL_1 0x68060 4035#define TV_SC_CTL_1 _MMIO(0x68060)
3984/* Turns on the first subcarrier phase generation DDA */ 4036/* Turns on the first subcarrier phase generation DDA */
3985# define TV_SC_DDA1_EN (1 << 31) 4037# define TV_SC_DDA1_EN (1 << 31)
3986/* Turns on the first subcarrier phase generation DDA */ 4038/* Turns on the first subcarrier phase generation DDA */
@@ -4002,7 +4054,7 @@ enum skl_disp_power_wells {
4002# define TV_SCDDA1_INC_MASK 0x00000fff 4054# define TV_SCDDA1_INC_MASK 0x00000fff
4003# define TV_SCDDA1_INC_SHIFT 0 4055# define TV_SCDDA1_INC_SHIFT 0
4004 4056
4005#define TV_SC_CTL_2 0x68064 4057#define TV_SC_CTL_2 _MMIO(0x68064)
4006/* Sets the rollover for the second subcarrier phase generation DDA */ 4058/* Sets the rollover for the second subcarrier phase generation DDA */
4007# define TV_SCDDA2_SIZE_MASK 0x7fff0000 4059# define TV_SCDDA2_SIZE_MASK 0x7fff0000
4008# define TV_SCDDA2_SIZE_SHIFT 16 4060# define TV_SCDDA2_SIZE_SHIFT 16
@@ -4010,7 +4062,7 @@ enum skl_disp_power_wells {
4010# define TV_SCDDA2_INC_MASK 0x00007fff 4062# define TV_SCDDA2_INC_MASK 0x00007fff
4011# define TV_SCDDA2_INC_SHIFT 0 4063# define TV_SCDDA2_INC_SHIFT 0
4012 4064
4013#define TV_SC_CTL_3 0x68068 4065#define TV_SC_CTL_3 _MMIO(0x68068)
4014/* Sets the rollover for the third subcarrier phase generation DDA */ 4066/* Sets the rollover for the third subcarrier phase generation DDA */
4015# define TV_SCDDA3_SIZE_MASK 0x7fff0000 4067# define TV_SCDDA3_SIZE_MASK 0x7fff0000
4016# define TV_SCDDA3_SIZE_SHIFT 16 4068# define TV_SCDDA3_SIZE_SHIFT 16
@@ -4018,7 +4070,7 @@ enum skl_disp_power_wells {
4018# define TV_SCDDA3_INC_MASK 0x00007fff 4070# define TV_SCDDA3_INC_MASK 0x00007fff
4019# define TV_SCDDA3_INC_SHIFT 0 4071# define TV_SCDDA3_INC_SHIFT 0
4020 4072
4021#define TV_WIN_POS 0x68070 4073#define TV_WIN_POS _MMIO(0x68070)
4022/* X coordinate of the display from the start of horizontal active */ 4074/* X coordinate of the display from the start of horizontal active */
4023# define TV_XPOS_MASK 0x1fff0000 4075# define TV_XPOS_MASK 0x1fff0000
4024# define TV_XPOS_SHIFT 16 4076# define TV_XPOS_SHIFT 16
@@ -4026,7 +4078,7 @@ enum skl_disp_power_wells {
4026# define TV_YPOS_MASK 0x00000fff 4078# define TV_YPOS_MASK 0x00000fff
4027# define TV_YPOS_SHIFT 0 4079# define TV_YPOS_SHIFT 0
4028 4080
4029#define TV_WIN_SIZE 0x68074 4081#define TV_WIN_SIZE _MMIO(0x68074)
4030/* Horizontal size of the display window, measured in pixels*/ 4082/* Horizontal size of the display window, measured in pixels*/
4031# define TV_XSIZE_MASK 0x1fff0000 4083# define TV_XSIZE_MASK 0x1fff0000
4032# define TV_XSIZE_SHIFT 16 4084# define TV_XSIZE_SHIFT 16
@@ -4038,7 +4090,7 @@ enum skl_disp_power_wells {
4038# define TV_YSIZE_MASK 0x00000fff 4090# define TV_YSIZE_MASK 0x00000fff
4039# define TV_YSIZE_SHIFT 0 4091# define TV_YSIZE_SHIFT 0
4040 4092
4041#define TV_FILTER_CTL_1 0x68080 4093#define TV_FILTER_CTL_1 _MMIO(0x68080)
4042/* 4094/*
4043 * Enables automatic scaling calculation. 4095 * Enables automatic scaling calculation.
4044 * 4096 *
@@ -4071,7 +4123,7 @@ enum skl_disp_power_wells {
4071# define TV_HSCALE_FRAC_MASK 0x00003fff 4123# define TV_HSCALE_FRAC_MASK 0x00003fff
4072# define TV_HSCALE_FRAC_SHIFT 0 4124# define TV_HSCALE_FRAC_SHIFT 0
4073 4125
4074#define TV_FILTER_CTL_2 0x68084 4126#define TV_FILTER_CTL_2 _MMIO(0x68084)
4075/* 4127/*
4076 * Sets the integer part of the 3.15 fixed-point vertical scaling factor. 4128 * Sets the integer part of the 3.15 fixed-point vertical scaling factor.
4077 * 4129 *
@@ -4087,7 +4139,7 @@ enum skl_disp_power_wells {
4087# define TV_VSCALE_FRAC_MASK 0x00007fff 4139# define TV_VSCALE_FRAC_MASK 0x00007fff
4088# define TV_VSCALE_FRAC_SHIFT 0 4140# define TV_VSCALE_FRAC_SHIFT 0
4089 4141
4090#define TV_FILTER_CTL_3 0x68088 4142#define TV_FILTER_CTL_3 _MMIO(0x68088)
4091/* 4143/*
4092 * Sets the integer part of the 3.15 fixed-point vertical scaling factor. 4144 * Sets the integer part of the 3.15 fixed-point vertical scaling factor.
4093 * 4145 *
@@ -4107,7 +4159,7 @@ enum skl_disp_power_wells {
4107# define TV_VSCALE_IP_FRAC_MASK 0x00007fff 4159# define TV_VSCALE_IP_FRAC_MASK 0x00007fff
4108# define TV_VSCALE_IP_FRAC_SHIFT 0 4160# define TV_VSCALE_IP_FRAC_SHIFT 0
4109 4161
4110#define TV_CC_CONTROL 0x68090 4162#define TV_CC_CONTROL _MMIO(0x68090)
4111# define TV_CC_ENABLE (1 << 31) 4163# define TV_CC_ENABLE (1 << 31)
4112/* 4164/*
4113 * Specifies which field to send the CC data in. 4165 * Specifies which field to send the CC data in.
@@ -4123,7 +4175,7 @@ enum skl_disp_power_wells {
4123# define TV_CC_LINE_MASK 0x0000003f 4175# define TV_CC_LINE_MASK 0x0000003f
4124# define TV_CC_LINE_SHIFT 0 4176# define TV_CC_LINE_SHIFT 0
4125 4177
4126#define TV_CC_DATA 0x68094 4178#define TV_CC_DATA _MMIO(0x68094)
4127# define TV_CC_RDY (1 << 31) 4179# define TV_CC_RDY (1 << 31)
4128/* Second word of CC data to be transmitted. */ 4180/* Second word of CC data to be transmitted. */
4129# define TV_CC_DATA_2_MASK 0x007f0000 4181# define TV_CC_DATA_2_MASK 0x007f0000
@@ -4132,20 +4184,20 @@ enum skl_disp_power_wells {
4132# define TV_CC_DATA_1_MASK 0x0000007f 4184# define TV_CC_DATA_1_MASK 0x0000007f
4133# define TV_CC_DATA_1_SHIFT 0 4185# define TV_CC_DATA_1_SHIFT 0
4134 4186
4135#define TV_H_LUMA(i) (0x68100 + (i) * 4) /* 60 registers */ 4187#define TV_H_LUMA(i) _MMIO(0x68100 + (i) * 4) /* 60 registers */
4136#define TV_H_CHROMA(i) (0x68200 + (i) * 4) /* 60 registers */ 4188#define TV_H_CHROMA(i) _MMIO(0x68200 + (i) * 4) /* 60 registers */
4137#define TV_V_LUMA(i) (0x68300 + (i) * 4) /* 43 registers */ 4189#define TV_V_LUMA(i) _MMIO(0x68300 + (i) * 4) /* 43 registers */
4138#define TV_V_CHROMA(i) (0x68400 + (i) * 4) /* 43 registers */ 4190#define TV_V_CHROMA(i) _MMIO(0x68400 + (i) * 4) /* 43 registers */
4139 4191
4140/* Display Port */ 4192/* Display Port */
4141#define DP_A 0x64000 /* eDP */ 4193#define DP_A _MMIO(0x64000) /* eDP */
4142#define DP_B 0x64100 4194#define DP_B _MMIO(0x64100)
4143#define DP_C 0x64200 4195#define DP_C _MMIO(0x64200)
4144#define DP_D 0x64300 4196#define DP_D _MMIO(0x64300)
4145 4197
4146#define VLV_DP_B (VLV_DISPLAY_BASE + DP_B) 4198#define VLV_DP_B _MMIO(VLV_DISPLAY_BASE + 0x64100)
4147#define VLV_DP_C (VLV_DISPLAY_BASE + DP_C) 4199#define VLV_DP_C _MMIO(VLV_DISPLAY_BASE + 0x64200)
4148#define CHV_DP_D (VLV_DISPLAY_BASE + DP_D) 4200#define CHV_DP_D _MMIO(VLV_DISPLAY_BASE + 0x64300)
4149 4201
4150#define DP_PORT_EN (1 << 31) 4202#define DP_PORT_EN (1 << 31)
4151#define DP_PIPEB_SELECT (1 << 30) 4203#define DP_PIPEB_SELECT (1 << 30)
@@ -4199,7 +4251,7 @@ enum skl_disp_power_wells {
4199 4251
4200/* eDP */ 4252/* eDP */
4201#define DP_PLL_FREQ_270MHZ (0 << 16) 4253#define DP_PLL_FREQ_270MHZ (0 << 16)
4202#define DP_PLL_FREQ_160MHZ (1 << 16) 4254#define DP_PLL_FREQ_162MHZ (1 << 16)
4203#define DP_PLL_FREQ_MASK (3 << 16) 4255#define DP_PLL_FREQ_MASK (3 << 16)
4204 4256
4205/* locked once port is enabled */ 4257/* locked once port is enabled */
@@ -4232,33 +4284,36 @@ enum skl_disp_power_wells {
4232 * is 20 bytes in each direction, hence the 5 fixed 4284 * is 20 bytes in each direction, hence the 5 fixed
4233 * data registers 4285 * data registers
4234 */ 4286 */
4235#define DPA_AUX_CH_CTL 0x64010 4287#define _DPA_AUX_CH_CTL (dev_priv->info.display_mmio_offset + 0x64010)
4236#define DPA_AUX_CH_DATA1 0x64014 4288#define _DPA_AUX_CH_DATA1 (dev_priv->info.display_mmio_offset + 0x64014)
4237#define DPA_AUX_CH_DATA2 0x64018 4289#define _DPA_AUX_CH_DATA2 (dev_priv->info.display_mmio_offset + 0x64018)
4238#define DPA_AUX_CH_DATA3 0x6401c 4290#define _DPA_AUX_CH_DATA3 (dev_priv->info.display_mmio_offset + 0x6401c)
4239#define DPA_AUX_CH_DATA4 0x64020 4291#define _DPA_AUX_CH_DATA4 (dev_priv->info.display_mmio_offset + 0x64020)
4240#define DPA_AUX_CH_DATA5 0x64024 4292#define _DPA_AUX_CH_DATA5 (dev_priv->info.display_mmio_offset + 0x64024)
4241 4293
4242#define DPB_AUX_CH_CTL 0x64110 4294#define _DPB_AUX_CH_CTL (dev_priv->info.display_mmio_offset + 0x64110)
4243#define DPB_AUX_CH_DATA1 0x64114 4295#define _DPB_AUX_CH_DATA1 (dev_priv->info.display_mmio_offset + 0x64114)
4244#define DPB_AUX_CH_DATA2 0x64118 4296#define _DPB_AUX_CH_DATA2 (dev_priv->info.display_mmio_offset + 0x64118)
4245#define DPB_AUX_CH_DATA3 0x6411c 4297#define _DPB_AUX_CH_DATA3 (dev_priv->info.display_mmio_offset + 0x6411c)
4246#define DPB_AUX_CH_DATA4 0x64120 4298#define _DPB_AUX_CH_DATA4 (dev_priv->info.display_mmio_offset + 0x64120)
4247#define DPB_AUX_CH_DATA5 0x64124 4299#define _DPB_AUX_CH_DATA5 (dev_priv->info.display_mmio_offset + 0x64124)
4248 4300
4249#define DPC_AUX_CH_CTL 0x64210 4301#define _DPC_AUX_CH_CTL (dev_priv->info.display_mmio_offset + 0x64210)
4250#define DPC_AUX_CH_DATA1 0x64214 4302#define _DPC_AUX_CH_DATA1 (dev_priv->info.display_mmio_offset + 0x64214)
4251#define DPC_AUX_CH_DATA2 0x64218 4303#define _DPC_AUX_CH_DATA2 (dev_priv->info.display_mmio_offset + 0x64218)
4252#define DPC_AUX_CH_DATA3 0x6421c 4304#define _DPC_AUX_CH_DATA3 (dev_priv->info.display_mmio_offset + 0x6421c)
4253#define DPC_AUX_CH_DATA4 0x64220 4305#define _DPC_AUX_CH_DATA4 (dev_priv->info.display_mmio_offset + 0x64220)
4254#define DPC_AUX_CH_DATA5 0x64224 4306#define _DPC_AUX_CH_DATA5 (dev_priv->info.display_mmio_offset + 0x64224)
4255 4307
4256#define DPD_AUX_CH_CTL 0x64310 4308#define _DPD_AUX_CH_CTL (dev_priv->info.display_mmio_offset + 0x64310)
4257#define DPD_AUX_CH_DATA1 0x64314 4309#define _DPD_AUX_CH_DATA1 (dev_priv->info.display_mmio_offset + 0x64314)
4258#define DPD_AUX_CH_DATA2 0x64318 4310#define _DPD_AUX_CH_DATA2 (dev_priv->info.display_mmio_offset + 0x64318)
4259#define DPD_AUX_CH_DATA3 0x6431c 4311#define _DPD_AUX_CH_DATA3 (dev_priv->info.display_mmio_offset + 0x6431c)
4260#define DPD_AUX_CH_DATA4 0x64320 4312#define _DPD_AUX_CH_DATA4 (dev_priv->info.display_mmio_offset + 0x64320)
4261#define DPD_AUX_CH_DATA5 0x64324 4313#define _DPD_AUX_CH_DATA5 (dev_priv->info.display_mmio_offset + 0x64324)
4314
4315#define DP_AUX_CH_CTL(port) _MMIO_PORT(port, _DPA_AUX_CH_CTL, _DPB_AUX_CH_CTL)
4316#define DP_AUX_CH_DATA(port, i) _MMIO(_PORT(port, _DPA_AUX_CH_DATA1, _DPB_AUX_CH_DATA1) + (i) * 4) /* 5 registers */
4262 4317
4263#define DP_AUX_CH_CTL_SEND_BUSY (1 << 31) 4318#define DP_AUX_CH_CTL_SEND_BUSY (1 << 31)
4264#define DP_AUX_CH_CTL_DONE (1 << 30) 4319#define DP_AUX_CH_CTL_DONE (1 << 30)
@@ -4335,10 +4390,10 @@ enum skl_disp_power_wells {
4335#define _PIPEB_LINK_N_G4X 0x71064 4390#define _PIPEB_LINK_N_G4X 0x71064
4336#define PIPEA_DP_LINK_N_MASK (0xffffff) 4391#define PIPEA_DP_LINK_N_MASK (0xffffff)
4337 4392
4338#define PIPE_DATA_M_G4X(pipe) _PIPE(pipe, _PIPEA_DATA_M_G4X, _PIPEB_DATA_M_G4X) 4393#define PIPE_DATA_M_G4X(pipe) _MMIO_PIPE(pipe, _PIPEA_DATA_M_G4X, _PIPEB_DATA_M_G4X)
4339#define PIPE_DATA_N_G4X(pipe) _PIPE(pipe, _PIPEA_DATA_N_G4X, _PIPEB_DATA_N_G4X) 4394#define PIPE_DATA_N_G4X(pipe) _MMIO_PIPE(pipe, _PIPEA_DATA_N_G4X, _PIPEB_DATA_N_G4X)
4340#define PIPE_LINK_M_G4X(pipe) _PIPE(pipe, _PIPEA_LINK_M_G4X, _PIPEB_LINK_M_G4X) 4395#define PIPE_LINK_M_G4X(pipe) _MMIO_PIPE(pipe, _PIPEA_LINK_M_G4X, _PIPEB_LINK_M_G4X)
4341#define PIPE_LINK_N_G4X(pipe) _PIPE(pipe, _PIPEA_LINK_N_G4X, _PIPEB_LINK_N_G4X) 4396#define PIPE_LINK_N_G4X(pipe) _MMIO_PIPE(pipe, _PIPEA_LINK_N_G4X, _PIPEB_LINK_N_G4X)
4342 4397
4343/* Display & cursor control */ 4398/* Display & cursor control */
4344 4399
@@ -4454,15 +4509,15 @@ enum skl_disp_power_wells {
4454 */ 4509 */
4455#define PIPE_EDP_OFFSET 0x7f000 4510#define PIPE_EDP_OFFSET 0x7f000
4456 4511
4457#define _PIPE2(pipe, reg) (dev_priv->info.pipe_offsets[pipe] - \ 4512#define _MMIO_PIPE2(pipe, reg) _MMIO(dev_priv->info.pipe_offsets[pipe] - \
4458 dev_priv->info.pipe_offsets[PIPE_A] + (reg) + \ 4513 dev_priv->info.pipe_offsets[PIPE_A] + (reg) + \
4459 dev_priv->info.display_mmio_offset) 4514 dev_priv->info.display_mmio_offset)
4460 4515
4461#define PIPECONF(pipe) _PIPE2(pipe, _PIPEACONF) 4516#define PIPECONF(pipe) _MMIO_PIPE2(pipe, _PIPEACONF)
4462#define PIPEDSL(pipe) _PIPE2(pipe, _PIPEADSL) 4517#define PIPEDSL(pipe) _MMIO_PIPE2(pipe, _PIPEADSL)
4463#define PIPEFRAME(pipe) _PIPE2(pipe, _PIPEAFRAMEHIGH) 4518#define PIPEFRAME(pipe) _MMIO_PIPE2(pipe, _PIPEAFRAMEHIGH)
4464#define PIPEFRAMEPIXEL(pipe) _PIPE2(pipe, _PIPEAFRAMEPIXEL) 4519#define PIPEFRAMEPIXEL(pipe) _MMIO_PIPE2(pipe, _PIPEAFRAMEPIXEL)
4465#define PIPESTAT(pipe) _PIPE2(pipe, _PIPEASTAT) 4520#define PIPESTAT(pipe) _MMIO_PIPE2(pipe, _PIPEASTAT)
4466 4521
4467#define _PIPE_MISC_A 0x70030 4522#define _PIPE_MISC_A 0x70030
4468#define _PIPE_MISC_B 0x71030 4523#define _PIPE_MISC_B 0x71030
@@ -4474,9 +4529,9 @@ enum skl_disp_power_wells {
4474#define PIPEMISC_DITHER_ENABLE (1<<4) 4529#define PIPEMISC_DITHER_ENABLE (1<<4)
4475#define PIPEMISC_DITHER_TYPE_MASK (3<<2) 4530#define PIPEMISC_DITHER_TYPE_MASK (3<<2)
4476#define PIPEMISC_DITHER_TYPE_SP (0<<2) 4531#define PIPEMISC_DITHER_TYPE_SP (0<<2)
4477#define PIPEMISC(pipe) _PIPE2(pipe, _PIPE_MISC_A) 4532#define PIPEMISC(pipe) _MMIO_PIPE2(pipe, _PIPE_MISC_A)
4478 4533
4479#define VLV_DPFLIPSTAT (VLV_DISPLAY_BASE + 0x70028) 4534#define VLV_DPFLIPSTAT _MMIO(VLV_DISPLAY_BASE + 0x70028)
4480#define PIPEB_LINE_COMPARE_INT_EN (1<<29) 4535#define PIPEB_LINE_COMPARE_INT_EN (1<<29)
4481#define PIPEB_HLINE_INT_EN (1<<28) 4536#define PIPEB_HLINE_INT_EN (1<<28)
4482#define PIPEB_VBLANK_INT_EN (1<<27) 4537#define PIPEB_VBLANK_INT_EN (1<<27)
@@ -4497,7 +4552,7 @@ enum skl_disp_power_wells {
4497#define SPRITEE_FLIPDONE_INT_EN (1<<9) 4552#define SPRITEE_FLIPDONE_INT_EN (1<<9)
4498#define PLANEC_FLIPDONE_INT_EN (1<<8) 4553#define PLANEC_FLIPDONE_INT_EN (1<<8)
4499 4554
4500#define DPINVGTT (VLV_DISPLAY_BASE + 0x7002c) /* VLV/CHV only */ 4555#define DPINVGTT _MMIO(VLV_DISPLAY_BASE + 0x7002c) /* VLV/CHV only */
4501#define SPRITEF_INVALID_GTT_INT_EN (1<<27) 4556#define SPRITEF_INVALID_GTT_INT_EN (1<<27)
4502#define SPRITEE_INVALID_GTT_INT_EN (1<<26) 4557#define SPRITEE_INVALID_GTT_INT_EN (1<<26)
4503#define PLANEC_INVALID_GTT_INT_EN (1<<25) 4558#define PLANEC_INVALID_GTT_INT_EN (1<<25)
@@ -4527,7 +4582,7 @@ enum skl_disp_power_wells {
4527#define DPINVGTT_STATUS_MASK 0xff 4582#define DPINVGTT_STATUS_MASK 0xff
4528#define DPINVGTT_STATUS_MASK_CHV 0xfff 4583#define DPINVGTT_STATUS_MASK_CHV 0xfff
4529 4584
4530#define DSPARB (dev_priv->info.display_mmio_offset + 0x70030) 4585#define DSPARB _MMIO(dev_priv->info.display_mmio_offset + 0x70030)
4531#define DSPARB_CSTART_MASK (0x7f << 7) 4586#define DSPARB_CSTART_MASK (0x7f << 7)
4532#define DSPARB_CSTART_SHIFT 7 4587#define DSPARB_CSTART_SHIFT 7
4533#define DSPARB_BSTART_MASK (0x7f) 4588#define DSPARB_BSTART_MASK (0x7f)
@@ -4542,7 +4597,7 @@ enum skl_disp_power_wells {
4542#define DSPARB_SPRITEC_MASK_VLV (0xff << 16) 4597#define DSPARB_SPRITEC_MASK_VLV (0xff << 16)
4543#define DSPARB_SPRITED_SHIFT_VLV 24 4598#define DSPARB_SPRITED_SHIFT_VLV 24
4544#define DSPARB_SPRITED_MASK_VLV (0xff << 24) 4599#define DSPARB_SPRITED_MASK_VLV (0xff << 24)
4545#define DSPARB2 (VLV_DISPLAY_BASE + 0x70060) /* vlv/chv */ 4600#define DSPARB2 _MMIO(VLV_DISPLAY_BASE + 0x70060) /* vlv/chv */
4546#define DSPARB_SPRITEA_HI_SHIFT_VLV 0 4601#define DSPARB_SPRITEA_HI_SHIFT_VLV 0
4547#define DSPARB_SPRITEA_HI_MASK_VLV (0x1 << 0) 4602#define DSPARB_SPRITEA_HI_MASK_VLV (0x1 << 0)
4548#define DSPARB_SPRITEB_HI_SHIFT_VLV 4 4603#define DSPARB_SPRITEB_HI_SHIFT_VLV 4
@@ -4555,14 +4610,14 @@ enum skl_disp_power_wells {
4555#define DSPARB_SPRITEE_HI_MASK_VLV (0x1 << 16) 4610#define DSPARB_SPRITEE_HI_MASK_VLV (0x1 << 16)
4556#define DSPARB_SPRITEF_HI_SHIFT_VLV 20 4611#define DSPARB_SPRITEF_HI_SHIFT_VLV 20
4557#define DSPARB_SPRITEF_HI_MASK_VLV (0x1 << 20) 4612#define DSPARB_SPRITEF_HI_MASK_VLV (0x1 << 20)
4558#define DSPARB3 (VLV_DISPLAY_BASE + 0x7006c) /* chv */ 4613#define DSPARB3 _MMIO(VLV_DISPLAY_BASE + 0x7006c) /* chv */
4559#define DSPARB_SPRITEE_SHIFT_VLV 0 4614#define DSPARB_SPRITEE_SHIFT_VLV 0
4560#define DSPARB_SPRITEE_MASK_VLV (0xff << 0) 4615#define DSPARB_SPRITEE_MASK_VLV (0xff << 0)
4561#define DSPARB_SPRITEF_SHIFT_VLV 8 4616#define DSPARB_SPRITEF_SHIFT_VLV 8
4562#define DSPARB_SPRITEF_MASK_VLV (0xff << 8) 4617#define DSPARB_SPRITEF_MASK_VLV (0xff << 8)
4563 4618
4564/* pnv/gen4/g4x/vlv/chv */ 4619/* pnv/gen4/g4x/vlv/chv */
4565#define DSPFW1 (dev_priv->info.display_mmio_offset + 0x70034) 4620#define DSPFW1 _MMIO(dev_priv->info.display_mmio_offset + 0x70034)
4566#define DSPFW_SR_SHIFT 23 4621#define DSPFW_SR_SHIFT 23
4567#define DSPFW_SR_MASK (0x1ff<<23) 4622#define DSPFW_SR_MASK (0x1ff<<23)
4568#define DSPFW_CURSORB_SHIFT 16 4623#define DSPFW_CURSORB_SHIFT 16
@@ -4573,7 +4628,7 @@ enum skl_disp_power_wells {
4573#define DSPFW_PLANEA_SHIFT 0 4628#define DSPFW_PLANEA_SHIFT 0
4574#define DSPFW_PLANEA_MASK (0x7f<<0) 4629#define DSPFW_PLANEA_MASK (0x7f<<0)
4575#define DSPFW_PLANEA_MASK_VLV (0xff<<0) /* vlv/chv */ 4630#define DSPFW_PLANEA_MASK_VLV (0xff<<0) /* vlv/chv */
4576#define DSPFW2 (dev_priv->info.display_mmio_offset + 0x70038) 4631#define DSPFW2 _MMIO(dev_priv->info.display_mmio_offset + 0x70038)
4577#define DSPFW_FBC_SR_EN (1<<31) /* g4x */ 4632#define DSPFW_FBC_SR_EN (1<<31) /* g4x */
4578#define DSPFW_FBC_SR_SHIFT 28 4633#define DSPFW_FBC_SR_SHIFT 28
4579#define DSPFW_FBC_SR_MASK (0x7<<28) /* g4x */ 4634#define DSPFW_FBC_SR_MASK (0x7<<28) /* g4x */
@@ -4589,7 +4644,7 @@ enum skl_disp_power_wells {
4589#define DSPFW_SPRITEA_SHIFT 0 4644#define DSPFW_SPRITEA_SHIFT 0
4590#define DSPFW_SPRITEA_MASK (0x7f<<0) /* g4x */ 4645#define DSPFW_SPRITEA_MASK (0x7f<<0) /* g4x */
4591#define DSPFW_SPRITEA_MASK_VLV (0xff<<0) /* vlv/chv */ 4646#define DSPFW_SPRITEA_MASK_VLV (0xff<<0) /* vlv/chv */
4592#define DSPFW3 (dev_priv->info.display_mmio_offset + 0x7003c) 4647#define DSPFW3 _MMIO(dev_priv->info.display_mmio_offset + 0x7003c)
4593#define DSPFW_HPLL_SR_EN (1<<31) 4648#define DSPFW_HPLL_SR_EN (1<<31)
4594#define PINEVIEW_SELF_REFRESH_EN (1<<30) 4649#define PINEVIEW_SELF_REFRESH_EN (1<<30)
4595#define DSPFW_CURSOR_SR_SHIFT 24 4650#define DSPFW_CURSOR_SR_SHIFT 24
@@ -4600,14 +4655,14 @@ enum skl_disp_power_wells {
4600#define DSPFW_HPLL_SR_MASK (0x1ff<<0) 4655#define DSPFW_HPLL_SR_MASK (0x1ff<<0)
4601 4656
4602/* vlv/chv */ 4657/* vlv/chv */
4603#define DSPFW4 (VLV_DISPLAY_BASE + 0x70070) 4658#define DSPFW4 _MMIO(VLV_DISPLAY_BASE + 0x70070)
4604#define DSPFW_SPRITEB_WM1_SHIFT 16 4659#define DSPFW_SPRITEB_WM1_SHIFT 16
4605#define DSPFW_SPRITEB_WM1_MASK (0xff<<16) 4660#define DSPFW_SPRITEB_WM1_MASK (0xff<<16)
4606#define DSPFW_CURSORA_WM1_SHIFT 8 4661#define DSPFW_CURSORA_WM1_SHIFT 8
4607#define DSPFW_CURSORA_WM1_MASK (0x3f<<8) 4662#define DSPFW_CURSORA_WM1_MASK (0x3f<<8)
4608#define DSPFW_SPRITEA_WM1_SHIFT 0 4663#define DSPFW_SPRITEA_WM1_SHIFT 0
4609#define DSPFW_SPRITEA_WM1_MASK (0xff<<0) 4664#define DSPFW_SPRITEA_WM1_MASK (0xff<<0)
4610#define DSPFW5 (VLV_DISPLAY_BASE + 0x70074) 4665#define DSPFW5 _MMIO(VLV_DISPLAY_BASE + 0x70074)
4611#define DSPFW_PLANEB_WM1_SHIFT 24 4666#define DSPFW_PLANEB_WM1_SHIFT 24
4612#define DSPFW_PLANEB_WM1_MASK (0xff<<24) 4667#define DSPFW_PLANEB_WM1_MASK (0xff<<24)
4613#define DSPFW_PLANEA_WM1_SHIFT 16 4668#define DSPFW_PLANEA_WM1_SHIFT 16
@@ -4616,11 +4671,11 @@ enum skl_disp_power_wells {
4616#define DSPFW_CURSORB_WM1_MASK (0x3f<<8) 4671#define DSPFW_CURSORB_WM1_MASK (0x3f<<8)
4617#define DSPFW_CURSOR_SR_WM1_SHIFT 0 4672#define DSPFW_CURSOR_SR_WM1_SHIFT 0
4618#define DSPFW_CURSOR_SR_WM1_MASK (0x3f<<0) 4673#define DSPFW_CURSOR_SR_WM1_MASK (0x3f<<0)
4619#define DSPFW6 (VLV_DISPLAY_BASE + 0x70078) 4674#define DSPFW6 _MMIO(VLV_DISPLAY_BASE + 0x70078)
4620#define DSPFW_SR_WM1_SHIFT 0 4675#define DSPFW_SR_WM1_SHIFT 0
4621#define DSPFW_SR_WM1_MASK (0x1ff<<0) 4676#define DSPFW_SR_WM1_MASK (0x1ff<<0)
4622#define DSPFW7 (VLV_DISPLAY_BASE + 0x7007c) 4677#define DSPFW7 _MMIO(VLV_DISPLAY_BASE + 0x7007c)
4623#define DSPFW7_CHV (VLV_DISPLAY_BASE + 0x700b4) /* wtf #1? */ 4678#define DSPFW7_CHV _MMIO(VLV_DISPLAY_BASE + 0x700b4) /* wtf #1? */
4624#define DSPFW_SPRITED_WM1_SHIFT 24 4679#define DSPFW_SPRITED_WM1_SHIFT 24
4625#define DSPFW_SPRITED_WM1_MASK (0xff<<24) 4680#define DSPFW_SPRITED_WM1_MASK (0xff<<24)
4626#define DSPFW_SPRITED_SHIFT 16 4681#define DSPFW_SPRITED_SHIFT 16
@@ -4629,7 +4684,7 @@ enum skl_disp_power_wells {
4629#define DSPFW_SPRITEC_WM1_MASK (0xff<<8) 4684#define DSPFW_SPRITEC_WM1_MASK (0xff<<8)
4630#define DSPFW_SPRITEC_SHIFT 0 4685#define DSPFW_SPRITEC_SHIFT 0
4631#define DSPFW_SPRITEC_MASK_VLV (0xff<<0) 4686#define DSPFW_SPRITEC_MASK_VLV (0xff<<0)
4632#define DSPFW8_CHV (VLV_DISPLAY_BASE + 0x700b8) 4687#define DSPFW8_CHV _MMIO(VLV_DISPLAY_BASE + 0x700b8)
4633#define DSPFW_SPRITEF_WM1_SHIFT 24 4688#define DSPFW_SPRITEF_WM1_SHIFT 24
4634#define DSPFW_SPRITEF_WM1_MASK (0xff<<24) 4689#define DSPFW_SPRITEF_WM1_MASK (0xff<<24)
4635#define DSPFW_SPRITEF_SHIFT 16 4690#define DSPFW_SPRITEF_SHIFT 16
@@ -4638,7 +4693,7 @@ enum skl_disp_power_wells {
4638#define DSPFW_SPRITEE_WM1_MASK (0xff<<8) 4693#define DSPFW_SPRITEE_WM1_MASK (0xff<<8)
4639#define DSPFW_SPRITEE_SHIFT 0 4694#define DSPFW_SPRITEE_SHIFT 0
4640#define DSPFW_SPRITEE_MASK_VLV (0xff<<0) 4695#define DSPFW_SPRITEE_MASK_VLV (0xff<<0)
4641#define DSPFW9_CHV (VLV_DISPLAY_BASE + 0x7007c) /* wtf #2? */ 4696#define DSPFW9_CHV _MMIO(VLV_DISPLAY_BASE + 0x7007c) /* wtf #2? */
4642#define DSPFW_PLANEC_WM1_SHIFT 24 4697#define DSPFW_PLANEC_WM1_SHIFT 24
4643#define DSPFW_PLANEC_WM1_MASK (0xff<<24) 4698#define DSPFW_PLANEC_WM1_MASK (0xff<<24)
4644#define DSPFW_PLANEC_SHIFT 16 4699#define DSPFW_PLANEC_SHIFT 16
@@ -4649,7 +4704,7 @@ enum skl_disp_power_wells {
4649#define DSPFW_CURSORC_MASK (0x3f<<0) 4704#define DSPFW_CURSORC_MASK (0x3f<<0)
4650 4705
4651/* vlv/chv high order bits */ 4706/* vlv/chv high order bits */
4652#define DSPHOWM (VLV_DISPLAY_BASE + 0x70064) 4707#define DSPHOWM _MMIO(VLV_DISPLAY_BASE + 0x70064)
4653#define DSPFW_SR_HI_SHIFT 24 4708#define DSPFW_SR_HI_SHIFT 24
4654#define DSPFW_SR_HI_MASK (3<<24) /* 2 bits for chv, 1 for vlv */ 4709#define DSPFW_SR_HI_MASK (3<<24) /* 2 bits for chv, 1 for vlv */
4655#define DSPFW_SPRITEF_HI_SHIFT 23 4710#define DSPFW_SPRITEF_HI_SHIFT 23
@@ -4670,7 +4725,7 @@ enum skl_disp_power_wells {
4670#define DSPFW_SPRITEA_HI_MASK (1<<4) 4725#define DSPFW_SPRITEA_HI_MASK (1<<4)
4671#define DSPFW_PLANEA_HI_SHIFT 0 4726#define DSPFW_PLANEA_HI_SHIFT 0
4672#define DSPFW_PLANEA_HI_MASK (1<<0) 4727#define DSPFW_PLANEA_HI_MASK (1<<0)
4673#define DSPHOWM1 (VLV_DISPLAY_BASE + 0x70068) 4728#define DSPHOWM1 _MMIO(VLV_DISPLAY_BASE + 0x70068)
4674#define DSPFW_SR_WM1_HI_SHIFT 24 4729#define DSPFW_SR_WM1_HI_SHIFT 24
4675#define DSPFW_SR_WM1_HI_MASK (3<<24) /* 2 bits for chv, 1 for vlv */ 4730#define DSPFW_SR_WM1_HI_MASK (3<<24) /* 2 bits for chv, 1 for vlv */
4676#define DSPFW_SPRITEF_WM1_HI_SHIFT 23 4731#define DSPFW_SPRITEF_WM1_HI_SHIFT 23
@@ -4693,7 +4748,7 @@ enum skl_disp_power_wells {
4693#define DSPFW_PLANEA_WM1_HI_MASK (1<<0) 4748#define DSPFW_PLANEA_WM1_HI_MASK (1<<0)
4694 4749
4695/* drain latency register values*/ 4750/* drain latency register values*/
4696#define VLV_DDL(pipe) (VLV_DISPLAY_BASE + 0x70050 + 4 * (pipe)) 4751#define VLV_DDL(pipe) _MMIO(VLV_DISPLAY_BASE + 0x70050 + 4 * (pipe))
4697#define DDL_CURSOR_SHIFT 24 4752#define DDL_CURSOR_SHIFT 24
4698#define DDL_SPRITE_SHIFT(sprite) (8+8*(sprite)) 4753#define DDL_SPRITE_SHIFT(sprite) (8+8*(sprite))
4699#define DDL_PLANE_SHIFT 0 4754#define DDL_PLANE_SHIFT 0
@@ -4701,7 +4756,7 @@ enum skl_disp_power_wells {
4701#define DDL_PRECISION_LOW (0<<7) 4756#define DDL_PRECISION_LOW (0<<7)
4702#define DRAIN_LATENCY_MASK 0x7f 4757#define DRAIN_LATENCY_MASK 0x7f
4703 4758
4704#define CBR1_VLV (VLV_DISPLAY_BASE + 0x70400) 4759#define CBR1_VLV _MMIO(VLV_DISPLAY_BASE + 0x70400)
4705#define CBR_PND_DEADLINE_DISABLE (1<<31) 4760#define CBR_PND_DEADLINE_DISABLE (1<<31)
4706#define CBR_PWM_CLOCK_MUX_SELECT (1<<30) 4761#define CBR_PWM_CLOCK_MUX_SELECT (1<<30)
4707 4762
@@ -4739,51 +4794,51 @@ enum skl_disp_power_wells {
4739#define I965_CURSOR_DFT_WM 8 4794#define I965_CURSOR_DFT_WM 8
4740 4795
4741/* Watermark register definitions for SKL */ 4796/* Watermark register definitions for SKL */
4742#define CUR_WM_A_0 0x70140 4797#define _CUR_WM_A_0 0x70140
4743#define CUR_WM_B_0 0x71140 4798#define _CUR_WM_B_0 0x71140
4744#define PLANE_WM_1_A_0 0x70240 4799#define _PLANE_WM_1_A_0 0x70240
4745#define PLANE_WM_1_B_0 0x71240 4800#define _PLANE_WM_1_B_0 0x71240
4746#define PLANE_WM_2_A_0 0x70340 4801#define _PLANE_WM_2_A_0 0x70340
4747#define PLANE_WM_2_B_0 0x71340 4802#define _PLANE_WM_2_B_0 0x71340
4748#define PLANE_WM_TRANS_1_A_0 0x70268 4803#define _PLANE_WM_TRANS_1_A_0 0x70268
4749#define PLANE_WM_TRANS_1_B_0 0x71268 4804#define _PLANE_WM_TRANS_1_B_0 0x71268
4750#define PLANE_WM_TRANS_2_A_0 0x70368 4805#define _PLANE_WM_TRANS_2_A_0 0x70368
4751#define PLANE_WM_TRANS_2_B_0 0x71368 4806#define _PLANE_WM_TRANS_2_B_0 0x71368
4752#define CUR_WM_TRANS_A_0 0x70168 4807#define _CUR_WM_TRANS_A_0 0x70168
4753#define CUR_WM_TRANS_B_0 0x71168 4808#define _CUR_WM_TRANS_B_0 0x71168
4754#define PLANE_WM_EN (1 << 31) 4809#define PLANE_WM_EN (1 << 31)
4755#define PLANE_WM_LINES_SHIFT 14 4810#define PLANE_WM_LINES_SHIFT 14
4756#define PLANE_WM_LINES_MASK 0x1f 4811#define PLANE_WM_LINES_MASK 0x1f
4757#define PLANE_WM_BLOCKS_MASK 0x3ff 4812#define PLANE_WM_BLOCKS_MASK 0x3ff
4758 4813
4759#define CUR_WM_0(pipe) _PIPE(pipe, CUR_WM_A_0, CUR_WM_B_0) 4814#define _CUR_WM_0(pipe) _PIPE(pipe, _CUR_WM_A_0, _CUR_WM_B_0)
4760#define CUR_WM(pipe, level) (CUR_WM_0(pipe) + ((4) * (level))) 4815#define CUR_WM(pipe, level) _MMIO(_CUR_WM_0(pipe) + ((4) * (level)))
4761#define CUR_WM_TRANS(pipe) _PIPE(pipe, CUR_WM_TRANS_A_0, CUR_WM_TRANS_B_0) 4816#define CUR_WM_TRANS(pipe) _MMIO_PIPE(pipe, _CUR_WM_TRANS_A_0, _CUR_WM_TRANS_B_0)
4762 4817
4763#define _PLANE_WM_1(pipe) _PIPE(pipe, PLANE_WM_1_A_0, PLANE_WM_1_B_0) 4818#define _PLANE_WM_1(pipe) _PIPE(pipe, _PLANE_WM_1_A_0, _PLANE_WM_1_B_0)
4764#define _PLANE_WM_2(pipe) _PIPE(pipe, PLANE_WM_2_A_0, PLANE_WM_2_B_0) 4819#define _PLANE_WM_2(pipe) _PIPE(pipe, _PLANE_WM_2_A_0, _PLANE_WM_2_B_0)
4765#define _PLANE_WM_BASE(pipe, plane) \ 4820#define _PLANE_WM_BASE(pipe, plane) \
4766 _PLANE(plane, _PLANE_WM_1(pipe), _PLANE_WM_2(pipe)) 4821 _PLANE(plane, _PLANE_WM_1(pipe), _PLANE_WM_2(pipe))
4767#define PLANE_WM(pipe, plane, level) \ 4822#define PLANE_WM(pipe, plane, level) \
4768 (_PLANE_WM_BASE(pipe, plane) + ((4) * (level))) 4823 _MMIO(_PLANE_WM_BASE(pipe, plane) + ((4) * (level)))
4769#define _PLANE_WM_TRANS_1(pipe) \ 4824#define _PLANE_WM_TRANS_1(pipe) \
4770 _PIPE(pipe, PLANE_WM_TRANS_1_A_0, PLANE_WM_TRANS_1_B_0) 4825 _PIPE(pipe, _PLANE_WM_TRANS_1_A_0, _PLANE_WM_TRANS_1_B_0)
4771#define _PLANE_WM_TRANS_2(pipe) \ 4826#define _PLANE_WM_TRANS_2(pipe) \
4772 _PIPE(pipe, PLANE_WM_TRANS_2_A_0, PLANE_WM_TRANS_2_B_0) 4827 _PIPE(pipe, _PLANE_WM_TRANS_2_A_0, _PLANE_WM_TRANS_2_B_0)
4773#define PLANE_WM_TRANS(pipe, plane) \ 4828#define PLANE_WM_TRANS(pipe, plane) \
4774 _PLANE(plane, _PLANE_WM_TRANS_1(pipe), _PLANE_WM_TRANS_2(pipe)) 4829 _MMIO(_PLANE(plane, _PLANE_WM_TRANS_1(pipe), _PLANE_WM_TRANS_2(pipe)))
4775 4830
4776/* define the Watermark register on Ironlake */ 4831/* define the Watermark register on Ironlake */
4777#define WM0_PIPEA_ILK 0x45100 4832#define WM0_PIPEA_ILK _MMIO(0x45100)
4778#define WM0_PIPE_PLANE_MASK (0xffff<<16) 4833#define WM0_PIPE_PLANE_MASK (0xffff<<16)
4779#define WM0_PIPE_PLANE_SHIFT 16 4834#define WM0_PIPE_PLANE_SHIFT 16
4780#define WM0_PIPE_SPRITE_MASK (0xff<<8) 4835#define WM0_PIPE_SPRITE_MASK (0xff<<8)
4781#define WM0_PIPE_SPRITE_SHIFT 8 4836#define WM0_PIPE_SPRITE_SHIFT 8
4782#define WM0_PIPE_CURSOR_MASK (0xff) 4837#define WM0_PIPE_CURSOR_MASK (0xff)
4783 4838
4784#define WM0_PIPEB_ILK 0x45104 4839#define WM0_PIPEB_ILK _MMIO(0x45104)
4785#define WM0_PIPEC_IVB 0x45200 4840#define WM0_PIPEC_IVB _MMIO(0x45200)
4786#define WM1_LP_ILK 0x45108 4841#define WM1_LP_ILK _MMIO(0x45108)
4787#define WM1_LP_SR_EN (1<<31) 4842#define WM1_LP_SR_EN (1<<31)
4788#define WM1_LP_LATENCY_SHIFT 24 4843#define WM1_LP_LATENCY_SHIFT 24
4789#define WM1_LP_LATENCY_MASK (0x7f<<24) 4844#define WM1_LP_LATENCY_MASK (0x7f<<24)
@@ -4793,13 +4848,13 @@ enum skl_disp_power_wells {
4793#define WM1_LP_SR_MASK (0x7ff<<8) 4848#define WM1_LP_SR_MASK (0x7ff<<8)
4794#define WM1_LP_SR_SHIFT 8 4849#define WM1_LP_SR_SHIFT 8
4795#define WM1_LP_CURSOR_MASK (0xff) 4850#define WM1_LP_CURSOR_MASK (0xff)
4796#define WM2_LP_ILK 0x4510c 4851#define WM2_LP_ILK _MMIO(0x4510c)
4797#define WM2_LP_EN (1<<31) 4852#define WM2_LP_EN (1<<31)
4798#define WM3_LP_ILK 0x45110 4853#define WM3_LP_ILK _MMIO(0x45110)
4799#define WM3_LP_EN (1<<31) 4854#define WM3_LP_EN (1<<31)
4800#define WM1S_LP_ILK 0x45120 4855#define WM1S_LP_ILK _MMIO(0x45120)
4801#define WM2S_LP_IVB 0x45124 4856#define WM2S_LP_IVB _MMIO(0x45124)
4802#define WM3S_LP_IVB 0x45128 4857#define WM3S_LP_IVB _MMIO(0x45128)
4803#define WM1S_LP_EN (1<<31) 4858#define WM1S_LP_EN (1<<31)
4804 4859
4805#define HSW_WM_LP_VAL(lat, fbc, pri, cur) \ 4860#define HSW_WM_LP_VAL(lat, fbc, pri, cur) \
@@ -4807,7 +4862,7 @@ enum skl_disp_power_wells {
4807 ((fbc) << WM1_LP_FBC_SHIFT) | ((pri) << WM1_LP_SR_SHIFT) | (cur)) 4862 ((fbc) << WM1_LP_FBC_SHIFT) | ((pri) << WM1_LP_SR_SHIFT) | (cur))
4808 4863
4809/* Memory latency timer register */ 4864/* Memory latency timer register */
4810#define MLTR_ILK 0x11222 4865#define MLTR_ILK _MMIO(0x11222)
4811#define MLTR_WM1_SHIFT 0 4866#define MLTR_WM1_SHIFT 0
4812#define MLTR_WM2_SHIFT 8 4867#define MLTR_WM2_SHIFT 8
4813/* the unit of memory self-refresh latency time is 0.5us */ 4868/* the unit of memory self-refresh latency time is 0.5us */
@@ -4815,7 +4870,7 @@ enum skl_disp_power_wells {
4815 4870
4816 4871
4817/* the address where we get all kinds of latency value */ 4872/* the address where we get all kinds of latency value */
4818#define SSKPD 0x5d10 4873#define SSKPD _MMIO(0x5d10)
4819#define SSKPD_WM_MASK 0x3f 4874#define SSKPD_WM_MASK 0x3f
4820#define SSKPD_WM0_SHIFT 0 4875#define SSKPD_WM0_SHIFT 0
4821#define SSKPD_WM1_SHIFT 8 4876#define SSKPD_WM1_SHIFT 8
@@ -4848,8 +4903,8 @@ enum skl_disp_power_wells {
4848/* GM45+ just has to be different */ 4903/* GM45+ just has to be different */
4849#define _PIPEA_FRMCOUNT_G4X 0x70040 4904#define _PIPEA_FRMCOUNT_G4X 0x70040
4850#define _PIPEA_FLIPCOUNT_G4X 0x70044 4905#define _PIPEA_FLIPCOUNT_G4X 0x70044
4851#define PIPE_FRMCOUNT_G4X(pipe) _PIPE2(pipe, _PIPEA_FRMCOUNT_G4X) 4906#define PIPE_FRMCOUNT_G4X(pipe) _MMIO_PIPE2(pipe, _PIPEA_FRMCOUNT_G4X)
4852#define PIPE_FLIPCOUNT_G4X(pipe) _PIPE2(pipe, _PIPEA_FLIPCOUNT_G4X) 4907#define PIPE_FLIPCOUNT_G4X(pipe) _MMIO_PIPE2(pipe, _PIPEA_FLIPCOUNT_G4X)
4853 4908
4854/* Cursor A & B regs */ 4909/* Cursor A & B regs */
4855#define _CURACNTR 0x70080 4910#define _CURACNTR 0x70080
@@ -4887,7 +4942,7 @@ enum skl_disp_power_wells {
4887#define CURSOR_POS_SIGN 0x8000 4942#define CURSOR_POS_SIGN 0x8000
4888#define CURSOR_X_SHIFT 0 4943#define CURSOR_X_SHIFT 0
4889#define CURSOR_Y_SHIFT 16 4944#define CURSOR_Y_SHIFT 16
4890#define CURSIZE 0x700a0 4945#define CURSIZE _MMIO(0x700a0)
4891#define _CURBCNTR 0x700c0 4946#define _CURBCNTR 0x700c0
4892#define _CURBBASE 0x700c4 4947#define _CURBBASE 0x700c4
4893#define _CURBPOS 0x700c8 4948#define _CURBPOS 0x700c8
@@ -4896,7 +4951,7 @@ enum skl_disp_power_wells {
4896#define _CURBBASE_IVB 0x71084 4951#define _CURBBASE_IVB 0x71084
4897#define _CURBPOS_IVB 0x71088 4952#define _CURBPOS_IVB 0x71088
4898 4953
4899#define _CURSOR2(pipe, reg) (dev_priv->info.cursor_offsets[(pipe)] - \ 4954#define _CURSOR2(pipe, reg) _MMIO(dev_priv->info.cursor_offsets[(pipe)] - \
4900 dev_priv->info.cursor_offsets[PIPE_A] + (reg) + \ 4955 dev_priv->info.cursor_offsets[PIPE_A] + (reg) + \
4901 dev_priv->info.display_mmio_offset) 4956 dev_priv->info.display_mmio_offset)
4902 4957
@@ -4957,16 +5012,16 @@ enum skl_disp_power_wells {
4957#define _DSPAOFFSET 0x701A4 /* HSW */ 5012#define _DSPAOFFSET 0x701A4 /* HSW */
4958#define _DSPASURFLIVE 0x701AC 5013#define _DSPASURFLIVE 0x701AC
4959 5014
4960#define DSPCNTR(plane) _PIPE2(plane, _DSPACNTR) 5015#define DSPCNTR(plane) _MMIO_PIPE2(plane, _DSPACNTR)
4961#define DSPADDR(plane) _PIPE2(plane, _DSPAADDR) 5016#define DSPADDR(plane) _MMIO_PIPE2(plane, _DSPAADDR)
4962#define DSPSTRIDE(plane) _PIPE2(plane, _DSPASTRIDE) 5017#define DSPSTRIDE(plane) _MMIO_PIPE2(plane, _DSPASTRIDE)
4963#define DSPPOS(plane) _PIPE2(plane, _DSPAPOS) 5018#define DSPPOS(plane) _MMIO_PIPE2(plane, _DSPAPOS)
4964#define DSPSIZE(plane) _PIPE2(plane, _DSPASIZE) 5019#define DSPSIZE(plane) _MMIO_PIPE2(plane, _DSPASIZE)
4965#define DSPSURF(plane) _PIPE2(plane, _DSPASURF) 5020#define DSPSURF(plane) _MMIO_PIPE2(plane, _DSPASURF)
4966#define DSPTILEOFF(plane) _PIPE2(plane, _DSPATILEOFF) 5021#define DSPTILEOFF(plane) _MMIO_PIPE2(plane, _DSPATILEOFF)
4967#define DSPLINOFF(plane) DSPADDR(plane) 5022#define DSPLINOFF(plane) DSPADDR(plane)
4968#define DSPOFFSET(plane) _PIPE2(plane, _DSPAOFFSET) 5023#define DSPOFFSET(plane) _MMIO_PIPE2(plane, _DSPAOFFSET)
4969#define DSPSURFLIVE(plane) _PIPE2(plane, _DSPASURFLIVE) 5024#define DSPSURFLIVE(plane) _MMIO_PIPE2(plane, _DSPASURFLIVE)
4970 5025
4971/* CHV pipe B blender and primary plane */ 5026/* CHV pipe B blender and primary plane */
4972#define _CHV_BLEND_A 0x60a00 5027#define _CHV_BLEND_A 0x60a00
@@ -4980,11 +5035,11 @@ enum skl_disp_power_wells {
4980#define _PRIMCNSTALPHA_A 0x60a10 5035#define _PRIMCNSTALPHA_A 0x60a10
4981#define PRIM_CONST_ALPHA_ENABLE (1<<31) 5036#define PRIM_CONST_ALPHA_ENABLE (1<<31)
4982 5037
4983#define CHV_BLEND(pipe) _TRANSCODER2(pipe, _CHV_BLEND_A) 5038#define CHV_BLEND(pipe) _MMIO_TRANS2(pipe, _CHV_BLEND_A)
4984#define CHV_CANVAS(pipe) _TRANSCODER2(pipe, _CHV_CANVAS_A) 5039#define CHV_CANVAS(pipe) _MMIO_TRANS2(pipe, _CHV_CANVAS_A)
4985#define PRIMPOS(plane) _TRANSCODER2(plane, _PRIMPOS_A) 5040#define PRIMPOS(plane) _MMIO_TRANS2(plane, _PRIMPOS_A)
4986#define PRIMSIZE(plane) _TRANSCODER2(plane, _PRIMSIZE_A) 5041#define PRIMSIZE(plane) _MMIO_TRANS2(plane, _PRIMSIZE_A)
4987#define PRIMCNSTALPHA(plane) _TRANSCODER2(plane, _PRIMCNSTALPHA_A) 5042#define PRIMCNSTALPHA(plane) _MMIO_TRANS2(plane, _PRIMCNSTALPHA_A)
4988 5043
4989/* Display/Sprite base address macros */ 5044/* Display/Sprite base address macros */
4990#define DISP_BASEADDR_MASK (0xfffff000) 5045#define DISP_BASEADDR_MASK (0xfffff000)
@@ -5002,9 +5057,10 @@ enum skl_disp_power_wells {
5002 * [10:1f] all 5057 * [10:1f] all
5003 * [30:32] all 5058 * [30:32] all
5004 */ 5059 */
5005#define SWF0(i) (dev_priv->info.display_mmio_offset + 0x70410 + (i) * 4) 5060#define SWF0(i) _MMIO(dev_priv->info.display_mmio_offset + 0x70410 + (i) * 4)
5006#define SWF1(i) (dev_priv->info.display_mmio_offset + 0x71410 + (i) * 4) 5061#define SWF1(i) _MMIO(dev_priv->info.display_mmio_offset + 0x71410 + (i) * 4)
5007#define SWF3(i) (dev_priv->info.display_mmio_offset + 0x72414 + (i) * 4) 5062#define SWF3(i) _MMIO(dev_priv->info.display_mmio_offset + 0x72414 + (i) * 4)
5063#define SWF_ILK(i) _MMIO(0x4F000 + (i) * 4)
5008 5064
5009/* Pipe B */ 5065/* Pipe B */
5010#define _PIPEBDSL (dev_priv->info.display_mmio_offset + 0x71000) 5066#define _PIPEBDSL (dev_priv->info.display_mmio_offset + 0x71000)
@@ -5086,18 +5142,18 @@ enum skl_disp_power_wells {
5086#define _DVSBSCALE 0x73204 5142#define _DVSBSCALE 0x73204
5087#define _DVSBGAMC 0x73300 5143#define _DVSBGAMC 0x73300
5088 5144
5089#define DVSCNTR(pipe) _PIPE(pipe, _DVSACNTR, _DVSBCNTR) 5145#define DVSCNTR(pipe) _MMIO_PIPE(pipe, _DVSACNTR, _DVSBCNTR)
5090#define DVSLINOFF(pipe) _PIPE(pipe, _DVSALINOFF, _DVSBLINOFF) 5146#define DVSLINOFF(pipe) _MMIO_PIPE(pipe, _DVSALINOFF, _DVSBLINOFF)
5091#define DVSSTRIDE(pipe) _PIPE(pipe, _DVSASTRIDE, _DVSBSTRIDE) 5147#define DVSSTRIDE(pipe) _MMIO_PIPE(pipe, _DVSASTRIDE, _DVSBSTRIDE)
5092#define DVSPOS(pipe) _PIPE(pipe, _DVSAPOS, _DVSBPOS) 5148#define DVSPOS(pipe) _MMIO_PIPE(pipe, _DVSAPOS, _DVSBPOS)
5093#define DVSSURF(pipe) _PIPE(pipe, _DVSASURF, _DVSBSURF) 5149#define DVSSURF(pipe) _MMIO_PIPE(pipe, _DVSASURF, _DVSBSURF)
5094#define DVSKEYMAX(pipe) _PIPE(pipe, _DVSAKEYMAXVAL, _DVSBKEYMAXVAL) 5150#define DVSKEYMAX(pipe) _MMIO_PIPE(pipe, _DVSAKEYMAXVAL, _DVSBKEYMAXVAL)
5095#define DVSSIZE(pipe) _PIPE(pipe, _DVSASIZE, _DVSBSIZE) 5151#define DVSSIZE(pipe) _MMIO_PIPE(pipe, _DVSASIZE, _DVSBSIZE)
5096#define DVSSCALE(pipe) _PIPE(pipe, _DVSASCALE, _DVSBSCALE) 5152#define DVSSCALE(pipe) _MMIO_PIPE(pipe, _DVSASCALE, _DVSBSCALE)
5097#define DVSTILEOFF(pipe) _PIPE(pipe, _DVSATILEOFF, _DVSBTILEOFF) 5153#define DVSTILEOFF(pipe) _MMIO_PIPE(pipe, _DVSATILEOFF, _DVSBTILEOFF)
5098#define DVSKEYVAL(pipe) _PIPE(pipe, _DVSAKEYVAL, _DVSBKEYVAL) 5154#define DVSKEYVAL(pipe) _MMIO_PIPE(pipe, _DVSAKEYVAL, _DVSBKEYVAL)
5099#define DVSKEYMSK(pipe) _PIPE(pipe, _DVSAKEYMSK, _DVSBKEYMSK) 5155#define DVSKEYMSK(pipe) _MMIO_PIPE(pipe, _DVSAKEYMSK, _DVSBKEYMSK)
5100#define DVSSURFLIVE(pipe) _PIPE(pipe, _DVSASURFLIVE, _DVSBSURFLIVE) 5156#define DVSSURFLIVE(pipe) _MMIO_PIPE(pipe, _DVSASURFLIVE, _DVSBSURFLIVE)
5101 5157
5102#define _SPRA_CTL 0x70280 5158#define _SPRA_CTL 0x70280
5103#define SPRITE_ENABLE (1<<31) 5159#define SPRITE_ENABLE (1<<31)
@@ -5160,20 +5216,20 @@ enum skl_disp_power_wells {
5160#define _SPRB_SCALE 0x71304 5216#define _SPRB_SCALE 0x71304
5161#define _SPRB_GAMC 0x71400 5217#define _SPRB_GAMC 0x71400
5162 5218
5163#define SPRCTL(pipe) _PIPE(pipe, _SPRA_CTL, _SPRB_CTL) 5219#define SPRCTL(pipe) _MMIO_PIPE(pipe, _SPRA_CTL, _SPRB_CTL)
5164#define SPRLINOFF(pipe) _PIPE(pipe, _SPRA_LINOFF, _SPRB_LINOFF) 5220#define SPRLINOFF(pipe) _MMIO_PIPE(pipe, _SPRA_LINOFF, _SPRB_LINOFF)
5165#define SPRSTRIDE(pipe) _PIPE(pipe, _SPRA_STRIDE, _SPRB_STRIDE) 5221#define SPRSTRIDE(pipe) _MMIO_PIPE(pipe, _SPRA_STRIDE, _SPRB_STRIDE)
5166#define SPRPOS(pipe) _PIPE(pipe, _SPRA_POS, _SPRB_POS) 5222#define SPRPOS(pipe) _MMIO_PIPE(pipe, _SPRA_POS, _SPRB_POS)
5167#define SPRSIZE(pipe) _PIPE(pipe, _SPRA_SIZE, _SPRB_SIZE) 5223#define SPRSIZE(pipe) _MMIO_PIPE(pipe, _SPRA_SIZE, _SPRB_SIZE)
5168#define SPRKEYVAL(pipe) _PIPE(pipe, _SPRA_KEYVAL, _SPRB_KEYVAL) 5224#define SPRKEYVAL(pipe) _MMIO_PIPE(pipe, _SPRA_KEYVAL, _SPRB_KEYVAL)
5169#define SPRKEYMSK(pipe) _PIPE(pipe, _SPRA_KEYMSK, _SPRB_KEYMSK) 5225#define SPRKEYMSK(pipe) _MMIO_PIPE(pipe, _SPRA_KEYMSK, _SPRB_KEYMSK)
5170#define SPRSURF(pipe) _PIPE(pipe, _SPRA_SURF, _SPRB_SURF) 5226#define SPRSURF(pipe) _MMIO_PIPE(pipe, _SPRA_SURF, _SPRB_SURF)
5171#define SPRKEYMAX(pipe) _PIPE(pipe, _SPRA_KEYMAX, _SPRB_KEYMAX) 5227#define SPRKEYMAX(pipe) _MMIO_PIPE(pipe, _SPRA_KEYMAX, _SPRB_KEYMAX)
5172#define SPRTILEOFF(pipe) _PIPE(pipe, _SPRA_TILEOFF, _SPRB_TILEOFF) 5228#define SPRTILEOFF(pipe) _MMIO_PIPE(pipe, _SPRA_TILEOFF, _SPRB_TILEOFF)
5173#define SPROFFSET(pipe) _PIPE(pipe, _SPRA_OFFSET, _SPRB_OFFSET) 5229#define SPROFFSET(pipe) _MMIO_PIPE(pipe, _SPRA_OFFSET, _SPRB_OFFSET)
5174#define SPRSCALE(pipe) _PIPE(pipe, _SPRA_SCALE, _SPRB_SCALE) 5230#define SPRSCALE(pipe) _MMIO_PIPE(pipe, _SPRA_SCALE, _SPRB_SCALE)
5175#define SPRGAMC(pipe) _PIPE(pipe, _SPRA_GAMC, _SPRB_GAMC) 5231#define SPRGAMC(pipe) _MMIO_PIPE(pipe, _SPRA_GAMC, _SPRB_GAMC)
5176#define SPRSURFLIVE(pipe) _PIPE(pipe, _SPRA_SURFLIVE, _SPRB_SURFLIVE) 5232#define SPRSURFLIVE(pipe) _MMIO_PIPE(pipe, _SPRA_SURFLIVE, _SPRB_SURFLIVE)
5177 5233
5178#define _SPACNTR (VLV_DISPLAY_BASE + 0x72180) 5234#define _SPACNTR (VLV_DISPLAY_BASE + 0x72180)
5179#define SP_ENABLE (1<<31) 5235#define SP_ENABLE (1<<31)
@@ -5223,18 +5279,18 @@ enum skl_disp_power_wells {
5223#define _SPBCONSTALPHA (VLV_DISPLAY_BASE + 0x722a8) 5279#define _SPBCONSTALPHA (VLV_DISPLAY_BASE + 0x722a8)
5224#define _SPBGAMC (VLV_DISPLAY_BASE + 0x722f4) 5280#define _SPBGAMC (VLV_DISPLAY_BASE + 0x722f4)
5225 5281
5226#define SPCNTR(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPACNTR, _SPBCNTR) 5282#define SPCNTR(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPACNTR, _SPBCNTR)
5227#define SPLINOFF(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPALINOFF, _SPBLINOFF) 5283#define SPLINOFF(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPALINOFF, _SPBLINOFF)
5228#define SPSTRIDE(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPASTRIDE, _SPBSTRIDE) 5284#define SPSTRIDE(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPASTRIDE, _SPBSTRIDE)
5229#define SPPOS(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPAPOS, _SPBPOS) 5285#define SPPOS(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPAPOS, _SPBPOS)
5230#define SPSIZE(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPASIZE, _SPBSIZE) 5286#define SPSIZE(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPASIZE, _SPBSIZE)
5231#define SPKEYMINVAL(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPAKEYMINVAL, _SPBKEYMINVAL) 5287#define SPKEYMINVAL(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPAKEYMINVAL, _SPBKEYMINVAL)
5232#define SPKEYMSK(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPAKEYMSK, _SPBKEYMSK) 5288#define SPKEYMSK(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPAKEYMSK, _SPBKEYMSK)
5233#define SPSURF(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPASURF, _SPBSURF) 5289#define SPSURF(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPASURF, _SPBSURF)
5234#define SPKEYMAXVAL(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPAKEYMAXVAL, _SPBKEYMAXVAL) 5290#define SPKEYMAXVAL(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPAKEYMAXVAL, _SPBKEYMAXVAL)
5235#define SPTILEOFF(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPATILEOFF, _SPBTILEOFF) 5291#define SPTILEOFF(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPATILEOFF, _SPBTILEOFF)
5236#define SPCONSTALPHA(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPACONSTALPHA, _SPBCONSTALPHA) 5292#define SPCONSTALPHA(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPACONSTALPHA, _SPBCONSTALPHA)
5237#define SPGAMC(pipe, plane) _PIPE((pipe) * 2 + (plane), _SPAGAMC, _SPBGAMC) 5293#define SPGAMC(pipe, plane) _MMIO_PIPE((pipe) * 2 + (plane), _SPAGAMC, _SPBGAMC)
5238 5294
5239/* 5295/*
5240 * CHV pipe B sprite CSC 5296 * CHV pipe B sprite CSC
@@ -5243,29 +5299,29 @@ enum skl_disp_power_wells {
5243 * |yg| = |c3 c4 c5| x |yg + yg_ioff| + |yg_ooff| 5299 * |yg| = |c3 c4 c5| x |yg + yg_ioff| + |yg_ooff|
5244 * |cb| |c6 c7 c8| |cb + cr_ioff| |cb_ooff| 5300 * |cb| |c6 c7 c8| |cb + cr_ioff| |cb_ooff|
5245 */ 5301 */
5246#define SPCSCYGOFF(sprite) (VLV_DISPLAY_BASE + 0x6d900 + (sprite) * 0x1000) 5302#define SPCSCYGOFF(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d900 + (sprite) * 0x1000)
5247#define SPCSCCBOFF(sprite) (VLV_DISPLAY_BASE + 0x6d904 + (sprite) * 0x1000) 5303#define SPCSCCBOFF(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d904 + (sprite) * 0x1000)
5248#define SPCSCCROFF(sprite) (VLV_DISPLAY_BASE + 0x6d908 + (sprite) * 0x1000) 5304#define SPCSCCROFF(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d908 + (sprite) * 0x1000)
5249#define SPCSC_OOFF(x) (((x) & 0x7ff) << 16) /* s11 */ 5305#define SPCSC_OOFF(x) (((x) & 0x7ff) << 16) /* s11 */
5250#define SPCSC_IOFF(x) (((x) & 0x7ff) << 0) /* s11 */ 5306#define SPCSC_IOFF(x) (((x) & 0x7ff) << 0) /* s11 */
5251 5307
5252#define SPCSCC01(sprite) (VLV_DISPLAY_BASE + 0x6d90c + (sprite) * 0x1000) 5308#define SPCSCC01(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d90c + (sprite) * 0x1000)
5253#define SPCSCC23(sprite) (VLV_DISPLAY_BASE + 0x6d910 + (sprite) * 0x1000) 5309#define SPCSCC23(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d910 + (sprite) * 0x1000)
5254#define SPCSCC45(sprite) (VLV_DISPLAY_BASE + 0x6d914 + (sprite) * 0x1000) 5310#define SPCSCC45(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d914 + (sprite) * 0x1000)
5255#define SPCSCC67(sprite) (VLV_DISPLAY_BASE + 0x6d918 + (sprite) * 0x1000) 5311#define SPCSCC67(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d918 + (sprite) * 0x1000)
5256#define SPCSCC8(sprite) (VLV_DISPLAY_BASE + 0x6d91c + (sprite) * 0x1000) 5312#define SPCSCC8(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d91c + (sprite) * 0x1000)
5257#define SPCSC_C1(x) (((x) & 0x7fff) << 16) /* s3.12 */ 5313#define SPCSC_C1(x) (((x) & 0x7fff) << 16) /* s3.12 */
5258#define SPCSC_C0(x) (((x) & 0x7fff) << 0) /* s3.12 */ 5314#define SPCSC_C0(x) (((x) & 0x7fff) << 0) /* s3.12 */
5259 5315
5260#define SPCSCYGICLAMP(sprite) (VLV_DISPLAY_BASE + 0x6d920 + (sprite) * 0x1000) 5316#define SPCSCYGICLAMP(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d920 + (sprite) * 0x1000)
5261#define SPCSCCBICLAMP(sprite) (VLV_DISPLAY_BASE + 0x6d924 + (sprite) * 0x1000) 5317#define SPCSCCBICLAMP(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d924 + (sprite) * 0x1000)
5262#define SPCSCCRICLAMP(sprite) (VLV_DISPLAY_BASE + 0x6d928 + (sprite) * 0x1000) 5318#define SPCSCCRICLAMP(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d928 + (sprite) * 0x1000)
5263#define SPCSC_IMAX(x) (((x) & 0x7ff) << 16) /* s11 */ 5319#define SPCSC_IMAX(x) (((x) & 0x7ff) << 16) /* s11 */
5264#define SPCSC_IMIN(x) (((x) & 0x7ff) << 0) /* s11 */ 5320#define SPCSC_IMIN(x) (((x) & 0x7ff) << 0) /* s11 */
5265 5321
5266#define SPCSCYGOCLAMP(sprite) (VLV_DISPLAY_BASE + 0x6d92c + (sprite) * 0x1000) 5322#define SPCSCYGOCLAMP(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d92c + (sprite) * 0x1000)
5267#define SPCSCCBOCLAMP(sprite) (VLV_DISPLAY_BASE + 0x6d930 + (sprite) * 0x1000) 5323#define SPCSCCBOCLAMP(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d930 + (sprite) * 0x1000)
5268#define SPCSCCROCLAMP(sprite) (VLV_DISPLAY_BASE + 0x6d934 + (sprite) * 0x1000) 5324#define SPCSCCROCLAMP(sprite) _MMIO(VLV_DISPLAY_BASE + 0x6d934 + (sprite) * 0x1000)
5269#define SPCSC_OMAX(x) ((x) << 16) /* u10 */ 5325#define SPCSC_OMAX(x) ((x) << 16) /* u10 */
5270#define SPCSC_OMIN(x) ((x) << 0) /* u10 */ 5326#define SPCSC_OMIN(x) ((x) << 0) /* u10 */
5271 5327
@@ -5346,7 +5402,7 @@ enum skl_disp_power_wells {
5346#define _PLANE_CTL_2(pipe) _PIPE(pipe, _PLANE_CTL_2_A, _PLANE_CTL_2_B) 5402#define _PLANE_CTL_2(pipe) _PIPE(pipe, _PLANE_CTL_2_A, _PLANE_CTL_2_B)
5347#define _PLANE_CTL_3(pipe) _PIPE(pipe, _PLANE_CTL_3_A, _PLANE_CTL_3_B) 5403#define _PLANE_CTL_3(pipe) _PIPE(pipe, _PLANE_CTL_3_A, _PLANE_CTL_3_B)
5348#define PLANE_CTL(pipe, plane) \ 5404#define PLANE_CTL(pipe, plane) \
5349 _PLANE(plane, _PLANE_CTL_1(pipe), _PLANE_CTL_2(pipe)) 5405 _MMIO_PLANE(plane, _PLANE_CTL_1(pipe), _PLANE_CTL_2(pipe))
5350 5406
5351#define _PLANE_STRIDE_1_B 0x71188 5407#define _PLANE_STRIDE_1_B 0x71188
5352#define _PLANE_STRIDE_2_B 0x71288 5408#define _PLANE_STRIDE_2_B 0x71288
@@ -5358,7 +5414,7 @@ enum skl_disp_power_wells {
5358#define _PLANE_STRIDE_3(pipe) \ 5414#define _PLANE_STRIDE_3(pipe) \
5359 _PIPE(pipe, _PLANE_STRIDE_3_A, _PLANE_STRIDE_3_B) 5415 _PIPE(pipe, _PLANE_STRIDE_3_A, _PLANE_STRIDE_3_B)
5360#define PLANE_STRIDE(pipe, plane) \ 5416#define PLANE_STRIDE(pipe, plane) \
5361 _PLANE(plane, _PLANE_STRIDE_1(pipe), _PLANE_STRIDE_2(pipe)) 5417 _MMIO_PLANE(plane, _PLANE_STRIDE_1(pipe), _PLANE_STRIDE_2(pipe))
5362 5418
5363#define _PLANE_POS_1_B 0x7118c 5419#define _PLANE_POS_1_B 0x7118c
5364#define _PLANE_POS_2_B 0x7128c 5420#define _PLANE_POS_2_B 0x7128c
@@ -5367,7 +5423,7 @@ enum skl_disp_power_wells {
5367#define _PLANE_POS_2(pipe) _PIPE(pipe, _PLANE_POS_2_A, _PLANE_POS_2_B) 5423#define _PLANE_POS_2(pipe) _PIPE(pipe, _PLANE_POS_2_A, _PLANE_POS_2_B)
5368#define _PLANE_POS_3(pipe) _PIPE(pipe, _PLANE_POS_3_A, _PLANE_POS_3_B) 5424#define _PLANE_POS_3(pipe) _PIPE(pipe, _PLANE_POS_3_A, _PLANE_POS_3_B)
5369#define PLANE_POS(pipe, plane) \ 5425#define PLANE_POS(pipe, plane) \
5370 _PLANE(plane, _PLANE_POS_1(pipe), _PLANE_POS_2(pipe)) 5426 _MMIO_PLANE(plane, _PLANE_POS_1(pipe), _PLANE_POS_2(pipe))
5371 5427
5372#define _PLANE_SIZE_1_B 0x71190 5428#define _PLANE_SIZE_1_B 0x71190
5373#define _PLANE_SIZE_2_B 0x71290 5429#define _PLANE_SIZE_2_B 0x71290
@@ -5376,7 +5432,7 @@ enum skl_disp_power_wells {
5376#define _PLANE_SIZE_2(pipe) _PIPE(pipe, _PLANE_SIZE_2_A, _PLANE_SIZE_2_B) 5432#define _PLANE_SIZE_2(pipe) _PIPE(pipe, _PLANE_SIZE_2_A, _PLANE_SIZE_2_B)
5377#define _PLANE_SIZE_3(pipe) _PIPE(pipe, _PLANE_SIZE_3_A, _PLANE_SIZE_3_B) 5433#define _PLANE_SIZE_3(pipe) _PIPE(pipe, _PLANE_SIZE_3_A, _PLANE_SIZE_3_B)
5378#define PLANE_SIZE(pipe, plane) \ 5434#define PLANE_SIZE(pipe, plane) \
5379 _PLANE(plane, _PLANE_SIZE_1(pipe), _PLANE_SIZE_2(pipe)) 5435 _MMIO_PLANE(plane, _PLANE_SIZE_1(pipe), _PLANE_SIZE_2(pipe))
5380 5436
5381#define _PLANE_SURF_1_B 0x7119c 5437#define _PLANE_SURF_1_B 0x7119c
5382#define _PLANE_SURF_2_B 0x7129c 5438#define _PLANE_SURF_2_B 0x7129c
@@ -5385,35 +5441,35 @@ enum skl_disp_power_wells {
5385#define _PLANE_SURF_2(pipe) _PIPE(pipe, _PLANE_SURF_2_A, _PLANE_SURF_2_B) 5441#define _PLANE_SURF_2(pipe) _PIPE(pipe, _PLANE_SURF_2_A, _PLANE_SURF_2_B)
5386#define _PLANE_SURF_3(pipe) _PIPE(pipe, _PLANE_SURF_3_A, _PLANE_SURF_3_B) 5442#define _PLANE_SURF_3(pipe) _PIPE(pipe, _PLANE_SURF_3_A, _PLANE_SURF_3_B)
5387#define PLANE_SURF(pipe, plane) \ 5443#define PLANE_SURF(pipe, plane) \
5388 _PLANE(plane, _PLANE_SURF_1(pipe), _PLANE_SURF_2(pipe)) 5444 _MMIO_PLANE(plane, _PLANE_SURF_1(pipe), _PLANE_SURF_2(pipe))
5389 5445
5390#define _PLANE_OFFSET_1_B 0x711a4 5446#define _PLANE_OFFSET_1_B 0x711a4
5391#define _PLANE_OFFSET_2_B 0x712a4 5447#define _PLANE_OFFSET_2_B 0x712a4
5392#define _PLANE_OFFSET_1(pipe) _PIPE(pipe, _PLANE_OFFSET_1_A, _PLANE_OFFSET_1_B) 5448#define _PLANE_OFFSET_1(pipe) _PIPE(pipe, _PLANE_OFFSET_1_A, _PLANE_OFFSET_1_B)
5393#define _PLANE_OFFSET_2(pipe) _PIPE(pipe, _PLANE_OFFSET_2_A, _PLANE_OFFSET_2_B) 5449#define _PLANE_OFFSET_2(pipe) _PIPE(pipe, _PLANE_OFFSET_2_A, _PLANE_OFFSET_2_B)
5394#define PLANE_OFFSET(pipe, plane) \ 5450#define PLANE_OFFSET(pipe, plane) \
5395 _PLANE(plane, _PLANE_OFFSET_1(pipe), _PLANE_OFFSET_2(pipe)) 5451 _MMIO_PLANE(plane, _PLANE_OFFSET_1(pipe), _PLANE_OFFSET_2(pipe))
5396 5452
5397#define _PLANE_KEYVAL_1_B 0x71194 5453#define _PLANE_KEYVAL_1_B 0x71194
5398#define _PLANE_KEYVAL_2_B 0x71294 5454#define _PLANE_KEYVAL_2_B 0x71294
5399#define _PLANE_KEYVAL_1(pipe) _PIPE(pipe, _PLANE_KEYVAL_1_A, _PLANE_KEYVAL_1_B) 5455#define _PLANE_KEYVAL_1(pipe) _PIPE(pipe, _PLANE_KEYVAL_1_A, _PLANE_KEYVAL_1_B)
5400#define _PLANE_KEYVAL_2(pipe) _PIPE(pipe, _PLANE_KEYVAL_2_A, _PLANE_KEYVAL_2_B) 5456#define _PLANE_KEYVAL_2(pipe) _PIPE(pipe, _PLANE_KEYVAL_2_A, _PLANE_KEYVAL_2_B)
5401#define PLANE_KEYVAL(pipe, plane) \ 5457#define PLANE_KEYVAL(pipe, plane) \
5402 _PLANE(plane, _PLANE_KEYVAL_1(pipe), _PLANE_KEYVAL_2(pipe)) 5458 _MMIO_PLANE(plane, _PLANE_KEYVAL_1(pipe), _PLANE_KEYVAL_2(pipe))
5403 5459
5404#define _PLANE_KEYMSK_1_B 0x71198 5460#define _PLANE_KEYMSK_1_B 0x71198
5405#define _PLANE_KEYMSK_2_B 0x71298 5461#define _PLANE_KEYMSK_2_B 0x71298
5406#define _PLANE_KEYMSK_1(pipe) _PIPE(pipe, _PLANE_KEYMSK_1_A, _PLANE_KEYMSK_1_B) 5462#define _PLANE_KEYMSK_1(pipe) _PIPE(pipe, _PLANE_KEYMSK_1_A, _PLANE_KEYMSK_1_B)
5407#define _PLANE_KEYMSK_2(pipe) _PIPE(pipe, _PLANE_KEYMSK_2_A, _PLANE_KEYMSK_2_B) 5463#define _PLANE_KEYMSK_2(pipe) _PIPE(pipe, _PLANE_KEYMSK_2_A, _PLANE_KEYMSK_2_B)
5408#define PLANE_KEYMSK(pipe, plane) \ 5464#define PLANE_KEYMSK(pipe, plane) \
5409 _PLANE(plane, _PLANE_KEYMSK_1(pipe), _PLANE_KEYMSK_2(pipe)) 5465 _MMIO_PLANE(plane, _PLANE_KEYMSK_1(pipe), _PLANE_KEYMSK_2(pipe))
5410 5466
5411#define _PLANE_KEYMAX_1_B 0x711a0 5467#define _PLANE_KEYMAX_1_B 0x711a0
5412#define _PLANE_KEYMAX_2_B 0x712a0 5468#define _PLANE_KEYMAX_2_B 0x712a0
5413#define _PLANE_KEYMAX_1(pipe) _PIPE(pipe, _PLANE_KEYMAX_1_A, _PLANE_KEYMAX_1_B) 5469#define _PLANE_KEYMAX_1(pipe) _PIPE(pipe, _PLANE_KEYMAX_1_A, _PLANE_KEYMAX_1_B)
5414#define _PLANE_KEYMAX_2(pipe) _PIPE(pipe, _PLANE_KEYMAX_2_A, _PLANE_KEYMAX_2_B) 5470#define _PLANE_KEYMAX_2(pipe) _PIPE(pipe, _PLANE_KEYMAX_2_A, _PLANE_KEYMAX_2_B)
5415#define PLANE_KEYMAX(pipe, plane) \ 5471#define PLANE_KEYMAX(pipe, plane) \
5416 _PLANE(plane, _PLANE_KEYMAX_1(pipe), _PLANE_KEYMAX_2(pipe)) 5472 _MMIO_PLANE(plane, _PLANE_KEYMAX_1(pipe), _PLANE_KEYMAX_2(pipe))
5417 5473
5418#define _PLANE_BUF_CFG_1_B 0x7127c 5474#define _PLANE_BUF_CFG_1_B 0x7127c
5419#define _PLANE_BUF_CFG_2_B 0x7137c 5475#define _PLANE_BUF_CFG_2_B 0x7137c
@@ -5422,7 +5478,7 @@ enum skl_disp_power_wells {
5422#define _PLANE_BUF_CFG_2(pipe) \ 5478#define _PLANE_BUF_CFG_2(pipe) \
5423 _PIPE(pipe, _PLANE_BUF_CFG_2_A, _PLANE_BUF_CFG_2_B) 5479 _PIPE(pipe, _PLANE_BUF_CFG_2_A, _PLANE_BUF_CFG_2_B)
5424#define PLANE_BUF_CFG(pipe, plane) \ 5480#define PLANE_BUF_CFG(pipe, plane) \
5425 _PLANE(plane, _PLANE_BUF_CFG_1(pipe), _PLANE_BUF_CFG_2(pipe)) 5481 _MMIO_PLANE(plane, _PLANE_BUF_CFG_1(pipe), _PLANE_BUF_CFG_2(pipe))
5426 5482
5427#define _PLANE_NV12_BUF_CFG_1_B 0x71278 5483#define _PLANE_NV12_BUF_CFG_1_B 0x71278
5428#define _PLANE_NV12_BUF_CFG_2_B 0x71378 5484#define _PLANE_NV12_BUF_CFG_2_B 0x71378
@@ -5431,26 +5487,26 @@ enum skl_disp_power_wells {
5431#define _PLANE_NV12_BUF_CFG_2(pipe) \ 5487#define _PLANE_NV12_BUF_CFG_2(pipe) \
5432 _PIPE(pipe, _PLANE_NV12_BUF_CFG_2_A, _PLANE_NV12_BUF_CFG_2_B) 5488 _PIPE(pipe, _PLANE_NV12_BUF_CFG_2_A, _PLANE_NV12_BUF_CFG_2_B)
5433#define PLANE_NV12_BUF_CFG(pipe, plane) \ 5489#define PLANE_NV12_BUF_CFG(pipe, plane) \
5434 _PLANE(plane, _PLANE_NV12_BUF_CFG_1(pipe), _PLANE_NV12_BUF_CFG_2(pipe)) 5490 _MMIO_PLANE(plane, _PLANE_NV12_BUF_CFG_1(pipe), _PLANE_NV12_BUF_CFG_2(pipe))
5435 5491
5436/* SKL new cursor registers */ 5492/* SKL new cursor registers */
5437#define _CUR_BUF_CFG_A 0x7017c 5493#define _CUR_BUF_CFG_A 0x7017c
5438#define _CUR_BUF_CFG_B 0x7117c 5494#define _CUR_BUF_CFG_B 0x7117c
5439#define CUR_BUF_CFG(pipe) _PIPE(pipe, _CUR_BUF_CFG_A, _CUR_BUF_CFG_B) 5495#define CUR_BUF_CFG(pipe) _MMIO_PIPE(pipe, _CUR_BUF_CFG_A, _CUR_BUF_CFG_B)
5440 5496
5441/* VBIOS regs */ 5497/* VBIOS regs */
5442#define VGACNTRL 0x71400 5498#define VGACNTRL _MMIO(0x71400)
5443# define VGA_DISP_DISABLE (1 << 31) 5499# define VGA_DISP_DISABLE (1 << 31)
5444# define VGA_2X_MODE (1 << 30) 5500# define VGA_2X_MODE (1 << 30)
5445# define VGA_PIPE_B_SELECT (1 << 29) 5501# define VGA_PIPE_B_SELECT (1 << 29)
5446 5502
5447#define VLV_VGACNTRL (VLV_DISPLAY_BASE + 0x71400) 5503#define VLV_VGACNTRL _MMIO(VLV_DISPLAY_BASE + 0x71400)
5448 5504
5449/* Ironlake */ 5505/* Ironlake */
5450 5506
5451#define CPU_VGACNTRL 0x41000 5507#define CPU_VGACNTRL _MMIO(0x41000)
5452 5508
5453#define DIGITAL_PORT_HOTPLUG_CNTRL 0x44030 5509#define DIGITAL_PORT_HOTPLUG_CNTRL _MMIO(0x44030)
5454#define DIGITAL_PORTA_HOTPLUG_ENABLE (1 << 4) 5510#define DIGITAL_PORTA_HOTPLUG_ENABLE (1 << 4)
5455#define DIGITAL_PORTA_PULSE_DURATION_2ms (0 << 2) /* pre-HSW */ 5511#define DIGITAL_PORTA_PULSE_DURATION_2ms (0 << 2) /* pre-HSW */
5456#define DIGITAL_PORTA_PULSE_DURATION_4_5ms (1 << 2) /* pre-HSW */ 5512#define DIGITAL_PORTA_PULSE_DURATION_4_5ms (1 << 2) /* pre-HSW */
@@ -5463,26 +5519,26 @@ enum skl_disp_power_wells {
5463#define DIGITAL_PORTA_HOTPLUG_LONG_DETECT (2 << 0) 5519#define DIGITAL_PORTA_HOTPLUG_LONG_DETECT (2 << 0)
5464 5520
5465/* refresh rate hardware control */ 5521/* refresh rate hardware control */
5466#define RR_HW_CTL 0x45300 5522#define RR_HW_CTL _MMIO(0x45300)
5467#define RR_HW_LOW_POWER_FRAMES_MASK 0xff 5523#define RR_HW_LOW_POWER_FRAMES_MASK 0xff
5468#define RR_HW_HIGH_POWER_FRAMES_MASK 0xff00 5524#define RR_HW_HIGH_POWER_FRAMES_MASK 0xff00
5469 5525
5470#define FDI_PLL_BIOS_0 0x46000 5526#define FDI_PLL_BIOS_0 _MMIO(0x46000)
5471#define FDI_PLL_FB_CLOCK_MASK 0xff 5527#define FDI_PLL_FB_CLOCK_MASK 0xff
5472#define FDI_PLL_BIOS_1 0x46004 5528#define FDI_PLL_BIOS_1 _MMIO(0x46004)
5473#define FDI_PLL_BIOS_2 0x46008 5529#define FDI_PLL_BIOS_2 _MMIO(0x46008)
5474#define DISPLAY_PORT_PLL_BIOS_0 0x4600c 5530#define DISPLAY_PORT_PLL_BIOS_0 _MMIO(0x4600c)
5475#define DISPLAY_PORT_PLL_BIOS_1 0x46010 5531#define DISPLAY_PORT_PLL_BIOS_1 _MMIO(0x46010)
5476#define DISPLAY_PORT_PLL_BIOS_2 0x46014 5532#define DISPLAY_PORT_PLL_BIOS_2 _MMIO(0x46014)
5477 5533
5478#define PCH_3DCGDIS0 0x46020 5534#define PCH_3DCGDIS0 _MMIO(0x46020)
5479# define MARIUNIT_CLOCK_GATE_DISABLE (1 << 18) 5535# define MARIUNIT_CLOCK_GATE_DISABLE (1 << 18)
5480# define SVSMUNIT_CLOCK_GATE_DISABLE (1 << 1) 5536# define SVSMUNIT_CLOCK_GATE_DISABLE (1 << 1)
5481 5537
5482#define PCH_3DCGDIS1 0x46024 5538#define PCH_3DCGDIS1 _MMIO(0x46024)
5483# define VFMUNIT_CLOCK_GATE_DISABLE (1 << 11) 5539# define VFMUNIT_CLOCK_GATE_DISABLE (1 << 11)
5484 5540
5485#define FDI_PLL_FREQ_CTL 0x46030 5541#define FDI_PLL_FREQ_CTL _MMIO(0x46030)
5486#define FDI_PLL_FREQ_CHANGE_REQUEST (1<<24) 5542#define FDI_PLL_FREQ_CHANGE_REQUEST (1<<24)
5487#define FDI_PLL_FREQ_LOCK_LIMIT_MASK 0xfff00 5543#define FDI_PLL_FREQ_LOCK_LIMIT_MASK 0xfff00
5488#define FDI_PLL_FREQ_DISABLE_COUNT_LIMIT_MASK 0xff 5544#define FDI_PLL_FREQ_DISABLE_COUNT_LIMIT_MASK 0xff
@@ -5519,14 +5575,14 @@ enum skl_disp_power_wells {
5519#define _PIPEB_LINK_M2 0x61048 5575#define _PIPEB_LINK_M2 0x61048
5520#define _PIPEB_LINK_N2 0x6104c 5576#define _PIPEB_LINK_N2 0x6104c
5521 5577
5522#define PIPE_DATA_M1(tran) _TRANSCODER2(tran, _PIPEA_DATA_M1) 5578#define PIPE_DATA_M1(tran) _MMIO_TRANS2(tran, _PIPEA_DATA_M1)
5523#define PIPE_DATA_N1(tran) _TRANSCODER2(tran, _PIPEA_DATA_N1) 5579#define PIPE_DATA_N1(tran) _MMIO_TRANS2(tran, _PIPEA_DATA_N1)
5524#define PIPE_DATA_M2(tran) _TRANSCODER2(tran, _PIPEA_DATA_M2) 5580#define PIPE_DATA_M2(tran) _MMIO_TRANS2(tran, _PIPEA_DATA_M2)
5525#define PIPE_DATA_N2(tran) _TRANSCODER2(tran, _PIPEA_DATA_N2) 5581#define PIPE_DATA_N2(tran) _MMIO_TRANS2(tran, _PIPEA_DATA_N2)
5526#define PIPE_LINK_M1(tran) _TRANSCODER2(tran, _PIPEA_LINK_M1) 5582#define PIPE_LINK_M1(tran) _MMIO_TRANS2(tran, _PIPEA_LINK_M1)
5527#define PIPE_LINK_N1(tran) _TRANSCODER2(tran, _PIPEA_LINK_N1) 5583#define PIPE_LINK_N1(tran) _MMIO_TRANS2(tran, _PIPEA_LINK_N1)
5528#define PIPE_LINK_M2(tran) _TRANSCODER2(tran, _PIPEA_LINK_M2) 5584#define PIPE_LINK_M2(tran) _MMIO_TRANS2(tran, _PIPEA_LINK_M2)
5529#define PIPE_LINK_N2(tran) _TRANSCODER2(tran, _PIPEA_LINK_N2) 5585#define PIPE_LINK_N2(tran) _MMIO_TRANS2(tran, _PIPEA_LINK_N2)
5530 5586
5531/* CPU panel fitter */ 5587/* CPU panel fitter */
5532/* IVB+ has 3 fitters, 0 is 7x5 capable, the other two only 3x3 */ 5588/* IVB+ has 3 fitters, 0 is 7x5 capable, the other two only 3x3 */
@@ -5549,11 +5605,11 @@ enum skl_disp_power_wells {
5549#define _PFA_HSCALE 0x68090 5605#define _PFA_HSCALE 0x68090
5550#define _PFB_HSCALE 0x68890 5606#define _PFB_HSCALE 0x68890
5551 5607
5552#define PF_CTL(pipe) _PIPE(pipe, _PFA_CTL_1, _PFB_CTL_1) 5608#define PF_CTL(pipe) _MMIO_PIPE(pipe, _PFA_CTL_1, _PFB_CTL_1)
5553#define PF_WIN_SZ(pipe) _PIPE(pipe, _PFA_WIN_SZ, _PFB_WIN_SZ) 5609#define PF_WIN_SZ(pipe) _MMIO_PIPE(pipe, _PFA_WIN_SZ, _PFB_WIN_SZ)
5554#define PF_WIN_POS(pipe) _PIPE(pipe, _PFA_WIN_POS, _PFB_WIN_POS) 5610#define PF_WIN_POS(pipe) _MMIO_PIPE(pipe, _PFA_WIN_POS, _PFB_WIN_POS)
5555#define PF_VSCALE(pipe) _PIPE(pipe, _PFA_VSCALE, _PFB_VSCALE) 5611#define PF_VSCALE(pipe) _MMIO_PIPE(pipe, _PFA_VSCALE, _PFB_VSCALE)
5556#define PF_HSCALE(pipe) _PIPE(pipe, _PFA_HSCALE, _PFB_HSCALE) 5612#define PF_HSCALE(pipe) _MMIO_PIPE(pipe, _PFA_HSCALE, _PFB_HSCALE)
5557 5613
5558#define _PSA_CTL 0x68180 5614#define _PSA_CTL 0x68180
5559#define _PSB_CTL 0x68980 5615#define _PSB_CTL 0x68980
@@ -5563,9 +5619,9 @@ enum skl_disp_power_wells {
5563#define _PSA_WIN_POS 0x68170 5619#define _PSA_WIN_POS 0x68170
5564#define _PSB_WIN_POS 0x68970 5620#define _PSB_WIN_POS 0x68970
5565 5621
5566#define PS_CTL(pipe) _PIPE(pipe, _PSA_CTL, _PSB_CTL) 5622#define PS_CTL(pipe) _MMIO_PIPE(pipe, _PSA_CTL, _PSB_CTL)
5567#define PS_WIN_SZ(pipe) _PIPE(pipe, _PSA_WIN_SZ, _PSB_WIN_SZ) 5623#define PS_WIN_SZ(pipe) _MMIO_PIPE(pipe, _PSA_WIN_SZ, _PSB_WIN_SZ)
5568#define PS_WIN_POS(pipe) _PIPE(pipe, _PSA_WIN_POS, _PSB_WIN_POS) 5624#define PS_WIN_POS(pipe) _MMIO_PIPE(pipe, _PSA_WIN_POS, _PSB_WIN_POS)
5569 5625
5570/* 5626/*
5571 * Skylake scalers 5627 * Skylake scalers
@@ -5654,48 +5710,63 @@ enum skl_disp_power_wells {
5654#define _PS_ECC_STAT_1C 0x691D0 5710#define _PS_ECC_STAT_1C 0x691D0
5655 5711
5656#define _ID(id, a, b) ((a) + (id)*((b)-(a))) 5712#define _ID(id, a, b) ((a) + (id)*((b)-(a)))
5657#define SKL_PS_CTRL(pipe, id) _PIPE(pipe, \ 5713#define SKL_PS_CTRL(pipe, id) _MMIO_PIPE(pipe, \
5658 _ID(id, _PS_1A_CTRL, _PS_2A_CTRL), \ 5714 _ID(id, _PS_1A_CTRL, _PS_2A_CTRL), \
5659 _ID(id, _PS_1B_CTRL, _PS_2B_CTRL)) 5715 _ID(id, _PS_1B_CTRL, _PS_2B_CTRL))
5660#define SKL_PS_PWR_GATE(pipe, id) _PIPE(pipe, \ 5716#define SKL_PS_PWR_GATE(pipe, id) _MMIO_PIPE(pipe, \
5661 _ID(id, _PS_PWR_GATE_1A, _PS_PWR_GATE_2A), \ 5717 _ID(id, _PS_PWR_GATE_1A, _PS_PWR_GATE_2A), \
5662 _ID(id, _PS_PWR_GATE_1B, _PS_PWR_GATE_2B)) 5718 _ID(id, _PS_PWR_GATE_1B, _PS_PWR_GATE_2B))
5663#define SKL_PS_WIN_POS(pipe, id) _PIPE(pipe, \ 5719#define SKL_PS_WIN_POS(pipe, id) _MMIO_PIPE(pipe, \
5664 _ID(id, _PS_WIN_POS_1A, _PS_WIN_POS_2A), \ 5720 _ID(id, _PS_WIN_POS_1A, _PS_WIN_POS_2A), \
5665 _ID(id, _PS_WIN_POS_1B, _PS_WIN_POS_2B)) 5721 _ID(id, _PS_WIN_POS_1B, _PS_WIN_POS_2B))
5666#define SKL_PS_WIN_SZ(pipe, id) _PIPE(pipe, \ 5722#define SKL_PS_WIN_SZ(pipe, id) _MMIO_PIPE(pipe, \
5667 _ID(id, _PS_WIN_SZ_1A, _PS_WIN_SZ_2A), \ 5723 _ID(id, _PS_WIN_SZ_1A, _PS_WIN_SZ_2A), \
5668 _ID(id, _PS_WIN_SZ_1B, _PS_WIN_SZ_2B)) 5724 _ID(id, _PS_WIN_SZ_1B, _PS_WIN_SZ_2B))
5669#define SKL_PS_VSCALE(pipe, id) _PIPE(pipe, \ 5725#define SKL_PS_VSCALE(pipe, id) _MMIO_PIPE(pipe, \
5670 _ID(id, _PS_VSCALE_1A, _PS_VSCALE_2A), \ 5726 _ID(id, _PS_VSCALE_1A, _PS_VSCALE_2A), \
5671 _ID(id, _PS_VSCALE_1B, _PS_VSCALE_2B)) 5727 _ID(id, _PS_VSCALE_1B, _PS_VSCALE_2B))
5672#define SKL_PS_HSCALE(pipe, id) _PIPE(pipe, \ 5728#define SKL_PS_HSCALE(pipe, id) _MMIO_PIPE(pipe, \
5673 _ID(id, _PS_HSCALE_1A, _PS_HSCALE_2A), \ 5729 _ID(id, _PS_HSCALE_1A, _PS_HSCALE_2A), \
5674 _ID(id, _PS_HSCALE_1B, _PS_HSCALE_2B)) 5730 _ID(id, _PS_HSCALE_1B, _PS_HSCALE_2B))
5675#define SKL_PS_VPHASE(pipe, id) _PIPE(pipe, \ 5731#define SKL_PS_VPHASE(pipe, id) _MMIO_PIPE(pipe, \
5676 _ID(id, _PS_VPHASE_1A, _PS_VPHASE_2A), \ 5732 _ID(id, _PS_VPHASE_1A, _PS_VPHASE_2A), \
5677 _ID(id, _PS_VPHASE_1B, _PS_VPHASE_2B)) 5733 _ID(id, _PS_VPHASE_1B, _PS_VPHASE_2B))
5678#define SKL_PS_HPHASE(pipe, id) _PIPE(pipe, \ 5734#define SKL_PS_HPHASE(pipe, id) _MMIO_PIPE(pipe, \
5679 _ID(id, _PS_HPHASE_1A, _PS_HPHASE_2A), \ 5735 _ID(id, _PS_HPHASE_1A, _PS_HPHASE_2A), \
5680 _ID(id, _PS_HPHASE_1B, _PS_HPHASE_2B)) 5736 _ID(id, _PS_HPHASE_1B, _PS_HPHASE_2B))
5681#define SKL_PS_ECC_STAT(pipe, id) _PIPE(pipe, \ 5737#define SKL_PS_ECC_STAT(pipe, id) _MMIO_PIPE(pipe, \
5682 _ID(id, _PS_ECC_STAT_1A, _PS_ECC_STAT_2A), \ 5738 _ID(id, _PS_ECC_STAT_1A, _PS_ECC_STAT_2A), \
5683 _ID(id, _PS_ECC_STAT_1B, _PS_ECC_STAT_2B) 5739 _ID(id, _PS_ECC_STAT_1B, _PS_ECC_STAT_2B))
5684 5740
5685/* legacy palette */ 5741/* legacy palette */
5686#define _LGC_PALETTE_A 0x4a000 5742#define _LGC_PALETTE_A 0x4a000
5687#define _LGC_PALETTE_B 0x4a800 5743#define _LGC_PALETTE_B 0x4a800
5688#define LGC_PALETTE(pipe, i) (_PIPE(pipe, _LGC_PALETTE_A, _LGC_PALETTE_B) + (i) * 4) 5744#define LGC_PALETTE(pipe, i) _MMIO(_PIPE(pipe, _LGC_PALETTE_A, _LGC_PALETTE_B) + (i) * 4)
5689 5745
5690#define _GAMMA_MODE_A 0x4a480 5746#define _GAMMA_MODE_A 0x4a480
5691#define _GAMMA_MODE_B 0x4ac80 5747#define _GAMMA_MODE_B 0x4ac80
5692#define GAMMA_MODE(pipe) _PIPE(pipe, _GAMMA_MODE_A, _GAMMA_MODE_B) 5748#define GAMMA_MODE(pipe) _MMIO_PIPE(pipe, _GAMMA_MODE_A, _GAMMA_MODE_B)
5693#define GAMMA_MODE_MODE_MASK (3 << 0) 5749#define GAMMA_MODE_MODE_MASK (3 << 0)
5694#define GAMMA_MODE_MODE_8BIT (0 << 0) 5750#define GAMMA_MODE_MODE_8BIT (0 << 0)
5695#define GAMMA_MODE_MODE_10BIT (1 << 0) 5751#define GAMMA_MODE_MODE_10BIT (1 << 0)
5696#define GAMMA_MODE_MODE_12BIT (2 << 0) 5752#define GAMMA_MODE_MODE_12BIT (2 << 0)
5697#define GAMMA_MODE_MODE_SPLIT (3 << 0) 5753#define GAMMA_MODE_MODE_SPLIT (3 << 0)
5698 5754
5755/* DMC/CSR */
5756#define CSR_PROGRAM(i) _MMIO(0x80000 + (i) * 4)
5757#define CSR_SSP_BASE_ADDR_GEN9 0x00002FC0
5758#define CSR_HTP_ADDR_SKL 0x00500034
5759#define CSR_SSP_BASE _MMIO(0x8F074)
5760#define CSR_HTP_SKL _MMIO(0x8F004)
5761#define CSR_LAST_WRITE _MMIO(0x8F034)
5762#define CSR_LAST_WRITE_VALUE 0xc003b400
5763/* MMIO address range for CSR program (0x80000 - 0x82FFF) */
5764#define CSR_MMIO_START_RANGE 0x80000
5765#define CSR_MMIO_END_RANGE 0x8FFFF
5766#define SKL_CSR_DC3_DC5_COUNT _MMIO(0x80030)
5767#define SKL_CSR_DC5_DC6_COUNT _MMIO(0x8002C)
5768#define BXT_CSR_DC3_DC5_COUNT _MMIO(0x80038)
5769
5699/* interrupts */ 5770/* interrupts */
5700#define DE_MASTER_IRQ_CONTROL (1 << 31) 5771#define DE_MASTER_IRQ_CONTROL (1 << 31)
5701#define DE_SPRITEB_FLIP_DONE (1 << 29) 5772#define DE_SPRITEB_FLIP_DONE (1 << 29)
@@ -5747,20 +5818,20 @@ enum skl_disp_power_wells {
5747#define DE_PIPEA_VBLANK_IVB (1<<0) 5818#define DE_PIPEA_VBLANK_IVB (1<<0)
5748#define DE_PIPE_VBLANK_IVB(pipe) (1 << ((pipe) * 5)) 5819#define DE_PIPE_VBLANK_IVB(pipe) (1 << ((pipe) * 5))
5749 5820
5750#define VLV_MASTER_IER 0x4400c /* Gunit master IER */ 5821#define VLV_MASTER_IER _MMIO(0x4400c) /* Gunit master IER */
5751#define MASTER_INTERRUPT_ENABLE (1<<31) 5822#define MASTER_INTERRUPT_ENABLE (1<<31)
5752 5823
5753#define DEISR 0x44000 5824#define DEISR _MMIO(0x44000)
5754#define DEIMR 0x44004 5825#define DEIMR _MMIO(0x44004)
5755#define DEIIR 0x44008 5826#define DEIIR _MMIO(0x44008)
5756#define DEIER 0x4400c 5827#define DEIER _MMIO(0x4400c)
5757 5828
5758#define GTISR 0x44010 5829#define GTISR _MMIO(0x44010)
5759#define GTIMR 0x44014 5830#define GTIMR _MMIO(0x44014)
5760#define GTIIR 0x44018 5831#define GTIIR _MMIO(0x44018)
5761#define GTIER 0x4401c 5832#define GTIER _MMIO(0x4401c)
5762 5833
5763#define GEN8_MASTER_IRQ 0x44200 5834#define GEN8_MASTER_IRQ _MMIO(0x44200)
5764#define GEN8_MASTER_IRQ_CONTROL (1<<31) 5835#define GEN8_MASTER_IRQ_CONTROL (1<<31)
5765#define GEN8_PCU_IRQ (1<<30) 5836#define GEN8_PCU_IRQ (1<<30)
5766#define GEN8_DE_PCH_IRQ (1<<23) 5837#define GEN8_DE_PCH_IRQ (1<<23)
@@ -5777,10 +5848,10 @@ enum skl_disp_power_wells {
5777#define GEN8_GT_BCS_IRQ (1<<1) 5848#define GEN8_GT_BCS_IRQ (1<<1)
5778#define GEN8_GT_RCS_IRQ (1<<0) 5849#define GEN8_GT_RCS_IRQ (1<<0)
5779 5850
5780#define GEN8_GT_ISR(which) (0x44300 + (0x10 * (which))) 5851#define GEN8_GT_ISR(which) _MMIO(0x44300 + (0x10 * (which)))
5781#define GEN8_GT_IMR(which) (0x44304 + (0x10 * (which))) 5852#define GEN8_GT_IMR(which) _MMIO(0x44304 + (0x10 * (which)))
5782#define GEN8_GT_IIR(which) (0x44308 + (0x10 * (which))) 5853#define GEN8_GT_IIR(which) _MMIO(0x44308 + (0x10 * (which)))
5783#define GEN8_GT_IER(which) (0x4430c + (0x10 * (which))) 5854#define GEN8_GT_IER(which) _MMIO(0x4430c + (0x10 * (which)))
5784 5855
5785#define GEN8_RCS_IRQ_SHIFT 0 5856#define GEN8_RCS_IRQ_SHIFT 0
5786#define GEN8_BCS_IRQ_SHIFT 16 5857#define GEN8_BCS_IRQ_SHIFT 16
@@ -5789,10 +5860,10 @@ enum skl_disp_power_wells {
5789#define GEN8_VECS_IRQ_SHIFT 0 5860#define GEN8_VECS_IRQ_SHIFT 0
5790#define GEN8_WD_IRQ_SHIFT 16 5861#define GEN8_WD_IRQ_SHIFT 16
5791 5862
5792#define GEN8_DE_PIPE_ISR(pipe) (0x44400 + (0x10 * (pipe))) 5863#define GEN8_DE_PIPE_ISR(pipe) _MMIO(0x44400 + (0x10 * (pipe)))
5793#define GEN8_DE_PIPE_IMR(pipe) (0x44404 + (0x10 * (pipe))) 5864#define GEN8_DE_PIPE_IMR(pipe) _MMIO(0x44404 + (0x10 * (pipe)))
5794#define GEN8_DE_PIPE_IIR(pipe) (0x44408 + (0x10 * (pipe))) 5865#define GEN8_DE_PIPE_IIR(pipe) _MMIO(0x44408 + (0x10 * (pipe)))
5795#define GEN8_DE_PIPE_IER(pipe) (0x4440c + (0x10 * (pipe))) 5866#define GEN8_DE_PIPE_IER(pipe) _MMIO(0x4440c + (0x10 * (pipe)))
5796#define GEN8_PIPE_FIFO_UNDERRUN (1 << 31) 5867#define GEN8_PIPE_FIFO_UNDERRUN (1 << 31)
5797#define GEN8_PIPE_CDCLK_CRC_ERROR (1 << 29) 5868#define GEN8_PIPE_CDCLK_CRC_ERROR (1 << 29)
5798#define GEN8_PIPE_CDCLK_CRC_DONE (1 << 28) 5869#define GEN8_PIPE_CDCLK_CRC_DONE (1 << 28)
@@ -5825,10 +5896,10 @@ enum skl_disp_power_wells {
5825 GEN9_PIPE_PLANE2_FAULT | \ 5896 GEN9_PIPE_PLANE2_FAULT | \
5826 GEN9_PIPE_PLANE1_FAULT) 5897 GEN9_PIPE_PLANE1_FAULT)
5827 5898
5828#define GEN8_DE_PORT_ISR 0x44440 5899#define GEN8_DE_PORT_ISR _MMIO(0x44440)
5829#define GEN8_DE_PORT_IMR 0x44444 5900#define GEN8_DE_PORT_IMR _MMIO(0x44444)
5830#define GEN8_DE_PORT_IIR 0x44448 5901#define GEN8_DE_PORT_IIR _MMIO(0x44448)
5831#define GEN8_DE_PORT_IER 0x4444c 5902#define GEN8_DE_PORT_IER _MMIO(0x4444c)
5832#define GEN9_AUX_CHANNEL_D (1 << 27) 5903#define GEN9_AUX_CHANNEL_D (1 << 27)
5833#define GEN9_AUX_CHANNEL_C (1 << 26) 5904#define GEN9_AUX_CHANNEL_C (1 << 26)
5834#define GEN9_AUX_CHANNEL_B (1 << 25) 5905#define GEN9_AUX_CHANNEL_B (1 << 25)
@@ -5842,23 +5913,23 @@ enum skl_disp_power_wells {
5842#define BXT_DE_PORT_GMBUS (1 << 1) 5913#define BXT_DE_PORT_GMBUS (1 << 1)
5843#define GEN8_AUX_CHANNEL_A (1 << 0) 5914#define GEN8_AUX_CHANNEL_A (1 << 0)
5844 5915
5845#define GEN8_DE_MISC_ISR 0x44460 5916#define GEN8_DE_MISC_ISR _MMIO(0x44460)
5846#define GEN8_DE_MISC_IMR 0x44464 5917#define GEN8_DE_MISC_IMR _MMIO(0x44464)
5847#define GEN8_DE_MISC_IIR 0x44468 5918#define GEN8_DE_MISC_IIR _MMIO(0x44468)
5848#define GEN8_DE_MISC_IER 0x4446c 5919#define GEN8_DE_MISC_IER _MMIO(0x4446c)
5849#define GEN8_DE_MISC_GSE (1 << 27) 5920#define GEN8_DE_MISC_GSE (1 << 27)
5850 5921
5851#define GEN8_PCU_ISR 0x444e0 5922#define GEN8_PCU_ISR _MMIO(0x444e0)
5852#define GEN8_PCU_IMR 0x444e4 5923#define GEN8_PCU_IMR _MMIO(0x444e4)
5853#define GEN8_PCU_IIR 0x444e8 5924#define GEN8_PCU_IIR _MMIO(0x444e8)
5854#define GEN8_PCU_IER 0x444ec 5925#define GEN8_PCU_IER _MMIO(0x444ec)
5855 5926
5856#define ILK_DISPLAY_CHICKEN2 0x42004 5927#define ILK_DISPLAY_CHICKEN2 _MMIO(0x42004)
5857/* Required on all Ironlake and Sandybridge according to the B-Spec. */ 5928/* Required on all Ironlake and Sandybridge according to the B-Spec. */
5858#define ILK_ELPIN_409_SELECT (1 << 25) 5929#define ILK_ELPIN_409_SELECT (1 << 25)
5859#define ILK_DPARB_GATE (1<<22) 5930#define ILK_DPARB_GATE (1<<22)
5860#define ILK_VSDPFD_FULL (1<<21) 5931#define ILK_VSDPFD_FULL (1<<21)
5861#define FUSE_STRAP 0x42014 5932#define FUSE_STRAP _MMIO(0x42014)
5862#define ILK_INTERNAL_GRAPHICS_DISABLE (1 << 31) 5933#define ILK_INTERNAL_GRAPHICS_DISABLE (1 << 31)
5863#define ILK_INTERNAL_DISPLAY_DISABLE (1 << 30) 5934#define ILK_INTERNAL_DISPLAY_DISABLE (1 << 30)
5864#define ILK_DISPLAY_DEBUG_DISABLE (1 << 29) 5935#define ILK_DISPLAY_DEBUG_DISABLE (1 << 29)
@@ -5867,18 +5938,18 @@ enum skl_disp_power_wells {
5867#define HSW_CDCLK_LIMIT (1 << 24) 5938#define HSW_CDCLK_LIMIT (1 << 24)
5868#define ILK_DESKTOP (1 << 23) 5939#define ILK_DESKTOP (1 << 23)
5869 5940
5870#define ILK_DSPCLK_GATE_D 0x42020 5941#define ILK_DSPCLK_GATE_D _MMIO(0x42020)
5871#define ILK_VRHUNIT_CLOCK_GATE_DISABLE (1 << 28) 5942#define ILK_VRHUNIT_CLOCK_GATE_DISABLE (1 << 28)
5872#define ILK_DPFCUNIT_CLOCK_GATE_DISABLE (1 << 9) 5943#define ILK_DPFCUNIT_CLOCK_GATE_DISABLE (1 << 9)
5873#define ILK_DPFCRUNIT_CLOCK_GATE_DISABLE (1 << 8) 5944#define ILK_DPFCRUNIT_CLOCK_GATE_DISABLE (1 << 8)
5874#define ILK_DPFDUNIT_CLOCK_GATE_ENABLE (1 << 7) 5945#define ILK_DPFDUNIT_CLOCK_GATE_ENABLE (1 << 7)
5875#define ILK_DPARBUNIT_CLOCK_GATE_ENABLE (1 << 5) 5946#define ILK_DPARBUNIT_CLOCK_GATE_ENABLE (1 << 5)
5876 5947
5877#define IVB_CHICKEN3 0x4200c 5948#define IVB_CHICKEN3 _MMIO(0x4200c)
5878# define CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE (1 << 5) 5949# define CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE (1 << 5)
5879# define CHICKEN3_DGMG_DONE_FIX_DISABLE (1 << 2) 5950# define CHICKEN3_DGMG_DONE_FIX_DISABLE (1 << 2)
5880 5951
5881#define CHICKEN_PAR1_1 0x42080 5952#define CHICKEN_PAR1_1 _MMIO(0x42080)
5882#define DPA_MASK_VBLANK_SRD (1 << 15) 5953#define DPA_MASK_VBLANK_SRD (1 << 15)
5883#define FORCE_ARB_IDLE_PLANES (1 << 14) 5954#define FORCE_ARB_IDLE_PLANES (1 << 14)
5884 5955
@@ -5886,70 +5957,70 @@ enum skl_disp_power_wells {
5886#define _CHICKEN_PIPESL_1_B 0x420b4 5957#define _CHICKEN_PIPESL_1_B 0x420b4
5887#define HSW_FBCQ_DIS (1 << 22) 5958#define HSW_FBCQ_DIS (1 << 22)
5888#define BDW_DPRS_MASK_VBLANK_SRD (1 << 0) 5959#define BDW_DPRS_MASK_VBLANK_SRD (1 << 0)
5889#define CHICKEN_PIPESL_1(pipe) _PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B) 5960#define CHICKEN_PIPESL_1(pipe) _MMIO_PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B)
5890 5961
5891#define DISP_ARB_CTL 0x45000 5962#define DISP_ARB_CTL _MMIO(0x45000)
5892#define DISP_TILE_SURFACE_SWIZZLING (1<<13) 5963#define DISP_TILE_SURFACE_SWIZZLING (1<<13)
5893#define DISP_FBC_WM_DIS (1<<15) 5964#define DISP_FBC_WM_DIS (1<<15)
5894#define DISP_ARB_CTL2 0x45004 5965#define DISP_ARB_CTL2 _MMIO(0x45004)
5895#define DISP_DATA_PARTITION_5_6 (1<<6) 5966#define DISP_DATA_PARTITION_5_6 (1<<6)
5896#define DBUF_CTL 0x45008 5967#define DBUF_CTL _MMIO(0x45008)
5897#define DBUF_POWER_REQUEST (1<<31) 5968#define DBUF_POWER_REQUEST (1<<31)
5898#define DBUF_POWER_STATE (1<<30) 5969#define DBUF_POWER_STATE (1<<30)
5899#define GEN7_MSG_CTL 0x45010 5970#define GEN7_MSG_CTL _MMIO(0x45010)
5900#define WAIT_FOR_PCH_RESET_ACK (1<<1) 5971#define WAIT_FOR_PCH_RESET_ACK (1<<1)
5901#define WAIT_FOR_PCH_FLR_ACK (1<<0) 5972#define WAIT_FOR_PCH_FLR_ACK (1<<0)
5902#define HSW_NDE_RSTWRN_OPT 0x46408 5973#define HSW_NDE_RSTWRN_OPT _MMIO(0x46408)
5903#define RESET_PCH_HANDSHAKE_ENABLE (1<<4) 5974#define RESET_PCH_HANDSHAKE_ENABLE (1<<4)
5904 5975
5905#define SKL_DFSM 0x51000 5976#define SKL_DFSM _MMIO(0x51000)
5906#define SKL_DFSM_CDCLK_LIMIT_MASK (3 << 23) 5977#define SKL_DFSM_CDCLK_LIMIT_MASK (3 << 23)
5907#define SKL_DFSM_CDCLK_LIMIT_675 (0 << 23) 5978#define SKL_DFSM_CDCLK_LIMIT_675 (0 << 23)
5908#define SKL_DFSM_CDCLK_LIMIT_540 (1 << 23) 5979#define SKL_DFSM_CDCLK_LIMIT_540 (1 << 23)
5909#define SKL_DFSM_CDCLK_LIMIT_450 (2 << 23) 5980#define SKL_DFSM_CDCLK_LIMIT_450 (2 << 23)
5910#define SKL_DFSM_CDCLK_LIMIT_337_5 (3 << 23) 5981#define SKL_DFSM_CDCLK_LIMIT_337_5 (3 << 23)
5911 5982
5912#define FF_SLICE_CS_CHICKEN2 0x20e4 5983#define FF_SLICE_CS_CHICKEN2 _MMIO(0x20e4)
5913#define GEN9_TSG_BARRIER_ACK_DISABLE (1<<8) 5984#define GEN9_TSG_BARRIER_ACK_DISABLE (1<<8)
5914 5985
5915/* GEN7 chicken */ 5986/* GEN7 chicken */
5916#define GEN7_COMMON_SLICE_CHICKEN1 0x7010 5987#define GEN7_COMMON_SLICE_CHICKEN1 _MMIO(0x7010)
5917# define GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC ((1<<10) | (1<<26)) 5988# define GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC ((1<<10) | (1<<26))
5918# define GEN9_RHWO_OPTIMIZATION_DISABLE (1<<14) 5989# define GEN9_RHWO_OPTIMIZATION_DISABLE (1<<14)
5919#define COMMON_SLICE_CHICKEN2 0x7014 5990#define COMMON_SLICE_CHICKEN2 _MMIO(0x7014)
5920# define GEN8_CSC2_SBE_VUE_CACHE_CONSERVATIVE (1<<0) 5991# define GEN8_CSC2_SBE_VUE_CACHE_CONSERVATIVE (1<<0)
5921 5992
5922#define HIZ_CHICKEN 0x7018 5993#define HIZ_CHICKEN _MMIO(0x7018)
5923# define CHV_HZ_8X8_MODE_IN_1X (1<<15) 5994# define CHV_HZ_8X8_MODE_IN_1X (1<<15)
5924# define BDW_HIZ_POWER_COMPILER_CLOCK_GATING_DISABLE (1<<3) 5995# define BDW_HIZ_POWER_COMPILER_CLOCK_GATING_DISABLE (1<<3)
5925 5996
5926#define GEN9_SLICE_COMMON_ECO_CHICKEN0 0x7308 5997#define GEN9_SLICE_COMMON_ECO_CHICKEN0 _MMIO(0x7308)
5927#define DISABLE_PIXEL_MASK_CAMMING (1<<14) 5998#define DISABLE_PIXEL_MASK_CAMMING (1<<14)
5928 5999
5929#define GEN7_L3SQCREG1 0xB010 6000#define GEN7_L3SQCREG1 _MMIO(0xB010)
5930#define VLV_B0_WA_L3SQCREG1_VALUE 0x00D30000 6001#define VLV_B0_WA_L3SQCREG1_VALUE 0x00D30000
5931 6002
5932#define GEN8_L3SQCREG1 0xB100 6003#define GEN8_L3SQCREG1 _MMIO(0xB100)
5933#define BDW_WA_L3SQCREG1_DEFAULT 0x784000 6004#define BDW_WA_L3SQCREG1_DEFAULT 0x784000
5934 6005
5935#define GEN7_L3CNTLREG1 0xB01C 6006#define GEN7_L3CNTLREG1 _MMIO(0xB01C)
5936#define GEN7_WA_FOR_GEN7_L3_CONTROL 0x3C47FF8C 6007#define GEN7_WA_FOR_GEN7_L3_CONTROL 0x3C47FF8C
5937#define GEN7_L3AGDIS (1<<19) 6008#define GEN7_L3AGDIS (1<<19)
5938#define GEN7_L3CNTLREG2 0xB020 6009#define GEN7_L3CNTLREG2 _MMIO(0xB020)
5939#define GEN7_L3CNTLREG3 0xB024 6010#define GEN7_L3CNTLREG3 _MMIO(0xB024)
5940 6011
5941#define GEN7_L3_CHICKEN_MODE_REGISTER 0xB030 6012#define GEN7_L3_CHICKEN_MODE_REGISTER _MMIO(0xB030)
5942#define GEN7_WA_L3_CHICKEN_MODE 0x20000000 6013#define GEN7_WA_L3_CHICKEN_MODE 0x20000000
5943 6014
5944#define GEN7_L3SQCREG4 0xb034 6015#define GEN7_L3SQCREG4 _MMIO(0xb034)
5945#define L3SQ_URB_READ_CAM_MATCH_DISABLE (1<<27) 6016#define L3SQ_URB_READ_CAM_MATCH_DISABLE (1<<27)
5946 6017
5947#define GEN8_L3SQCREG4 0xb118 6018#define GEN8_L3SQCREG4 _MMIO(0xb118)
5948#define GEN8_LQSC_RO_PERF_DIS (1<<27) 6019#define GEN8_LQSC_RO_PERF_DIS (1<<27)
5949#define GEN8_LQSC_FLUSH_COHERENT_LINES (1<<21) 6020#define GEN8_LQSC_FLUSH_COHERENT_LINES (1<<21)
5950 6021
5951/* GEN8 chicken */ 6022/* GEN8 chicken */
5952#define HDC_CHICKEN0 0x7300 6023#define HDC_CHICKEN0 _MMIO(0x7300)
5953#define HDC_FORCE_CSR_NON_COHERENT_OVR_DISABLE (1<<15) 6024#define HDC_FORCE_CSR_NON_COHERENT_OVR_DISABLE (1<<15)
5954#define HDC_FENCE_DEST_SLM_DISABLE (1<<14) 6025#define HDC_FENCE_DEST_SLM_DISABLE (1<<14)
5955#define HDC_DONOT_FETCH_MEM_WHEN_MASKED (1<<11) 6026#define HDC_DONOT_FETCH_MEM_WHEN_MASKED (1<<11)
@@ -5958,17 +6029,17 @@ enum skl_disp_power_wells {
5958#define HDC_BARRIER_PERFORMANCE_DISABLE (1<<10) 6029#define HDC_BARRIER_PERFORMANCE_DISABLE (1<<10)
5959 6030
5960/* GEN9 chicken */ 6031/* GEN9 chicken */
5961#define SLICE_ECO_CHICKEN0 0x7308 6032#define SLICE_ECO_CHICKEN0 _MMIO(0x7308)
5962#define PIXEL_MASK_CAMMING_DISABLE (1 << 14) 6033#define PIXEL_MASK_CAMMING_DISABLE (1 << 14)
5963 6034
5964/* WaCatErrorRejectionIssue */ 6035/* WaCatErrorRejectionIssue */
5965#define GEN7_SQ_CHICKEN_MBCUNIT_CONFIG 0x9030 6036#define GEN7_SQ_CHICKEN_MBCUNIT_CONFIG _MMIO(0x9030)
5966#define GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB (1<<11) 6037#define GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB (1<<11)
5967 6038
5968#define HSW_SCRATCH1 0xb038 6039#define HSW_SCRATCH1 _MMIO(0xb038)
5969#define HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE (1<<27) 6040#define HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE (1<<27)
5970 6041
5971#define BDW_SCRATCH1 0xb11c 6042#define BDW_SCRATCH1 _MMIO(0xb11c)
5972#define GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE (1<<2) 6043#define GEN9_LBS_SLA_RETRY_TIMER_DECREMENT_ENABLE (1<<2)
5973 6044
5974/* PCH */ 6045/* PCH */
@@ -6062,12 +6133,12 @@ enum skl_disp_power_wells {
6062 SDE_FDI_RXB_CPT | \ 6133 SDE_FDI_RXB_CPT | \
6063 SDE_FDI_RXA_CPT) 6134 SDE_FDI_RXA_CPT)
6064 6135
6065#define SDEISR 0xc4000 6136#define SDEISR _MMIO(0xc4000)
6066#define SDEIMR 0xc4004 6137#define SDEIMR _MMIO(0xc4004)
6067#define SDEIIR 0xc4008 6138#define SDEIIR _MMIO(0xc4008)
6068#define SDEIER 0xc400c 6139#define SDEIER _MMIO(0xc400c)
6069 6140
6070#define SERR_INT 0xc4040 6141#define SERR_INT _MMIO(0xc4040)
6071#define SERR_INT_POISON (1<<31) 6142#define SERR_INT_POISON (1<<31)
6072#define SERR_INT_TRANS_C_FIFO_UNDERRUN (1<<6) 6143#define SERR_INT_TRANS_C_FIFO_UNDERRUN (1<<6)
6073#define SERR_INT_TRANS_B_FIFO_UNDERRUN (1<<3) 6144#define SERR_INT_TRANS_B_FIFO_UNDERRUN (1<<3)
@@ -6075,7 +6146,7 @@ enum skl_disp_power_wells {
6075#define SERR_INT_TRANS_FIFO_UNDERRUN(pipe) (1<<((pipe)*3)) 6146#define SERR_INT_TRANS_FIFO_UNDERRUN(pipe) (1<<((pipe)*3))
6076 6147
6077/* digital port hotplug */ 6148/* digital port hotplug */
6078#define PCH_PORT_HOTPLUG 0xc4030 /* SHOTPLUG_CTL */ 6149#define PCH_PORT_HOTPLUG _MMIO(0xc4030) /* SHOTPLUG_CTL */
6079#define PORTA_HOTPLUG_ENABLE (1 << 28) /* LPT:LP+ & BXT */ 6150#define PORTA_HOTPLUG_ENABLE (1 << 28) /* LPT:LP+ & BXT */
6080#define PORTA_HOTPLUG_STATUS_MASK (3 << 24) /* SPT+ & BXT */ 6151#define PORTA_HOTPLUG_STATUS_MASK (3 << 24) /* SPT+ & BXT */
6081#define PORTA_HOTPLUG_NO_DETECT (0 << 24) /* SPT+ & BXT */ 6152#define PORTA_HOTPLUG_NO_DETECT (0 << 24) /* SPT+ & BXT */
@@ -6112,42 +6183,42 @@ enum skl_disp_power_wells {
6112#define PORTB_HOTPLUG_SHORT_DETECT (1 << 0) 6183#define PORTB_HOTPLUG_SHORT_DETECT (1 << 0)
6113#define PORTB_HOTPLUG_LONG_DETECT (2 << 0) 6184#define PORTB_HOTPLUG_LONG_DETECT (2 << 0)
6114 6185
6115#define PCH_PORT_HOTPLUG2 0xc403C /* SHOTPLUG_CTL2 SPT+ */ 6186#define PCH_PORT_HOTPLUG2 _MMIO(0xc403C) /* SHOTPLUG_CTL2 SPT+ */
6116#define PORTE_HOTPLUG_ENABLE (1 << 4) 6187#define PORTE_HOTPLUG_ENABLE (1 << 4)
6117#define PORTE_HOTPLUG_STATUS_MASK (3 << 0) 6188#define PORTE_HOTPLUG_STATUS_MASK (3 << 0)
6118#define PORTE_HOTPLUG_NO_DETECT (0 << 0) 6189#define PORTE_HOTPLUG_NO_DETECT (0 << 0)
6119#define PORTE_HOTPLUG_SHORT_DETECT (1 << 0) 6190#define PORTE_HOTPLUG_SHORT_DETECT (1 << 0)
6120#define PORTE_HOTPLUG_LONG_DETECT (2 << 0) 6191#define PORTE_HOTPLUG_LONG_DETECT (2 << 0)
6121 6192
6122#define PCH_GPIOA 0xc5010 6193#define PCH_GPIOA _MMIO(0xc5010)
6123#define PCH_GPIOB 0xc5014 6194#define PCH_GPIOB _MMIO(0xc5014)
6124#define PCH_GPIOC 0xc5018 6195#define PCH_GPIOC _MMIO(0xc5018)
6125#define PCH_GPIOD 0xc501c 6196#define PCH_GPIOD _MMIO(0xc501c)
6126#define PCH_GPIOE 0xc5020 6197#define PCH_GPIOE _MMIO(0xc5020)
6127#define PCH_GPIOF 0xc5024 6198#define PCH_GPIOF _MMIO(0xc5024)
6128 6199
6129#define PCH_GMBUS0 0xc5100 6200#define PCH_GMBUS0 _MMIO(0xc5100)
6130#define PCH_GMBUS1 0xc5104 6201#define PCH_GMBUS1 _MMIO(0xc5104)
6131#define PCH_GMBUS2 0xc5108 6202#define PCH_GMBUS2 _MMIO(0xc5108)
6132#define PCH_GMBUS3 0xc510c 6203#define PCH_GMBUS3 _MMIO(0xc510c)
6133#define PCH_GMBUS4 0xc5110 6204#define PCH_GMBUS4 _MMIO(0xc5110)
6134#define PCH_GMBUS5 0xc5120 6205#define PCH_GMBUS5 _MMIO(0xc5120)
6135 6206
6136#define _PCH_DPLL_A 0xc6014 6207#define _PCH_DPLL_A 0xc6014
6137#define _PCH_DPLL_B 0xc6018 6208#define _PCH_DPLL_B 0xc6018
6138#define PCH_DPLL(pll) (pll == 0 ? _PCH_DPLL_A : _PCH_DPLL_B) 6209#define PCH_DPLL(pll) _MMIO(pll == 0 ? _PCH_DPLL_A : _PCH_DPLL_B)
6139 6210
6140#define _PCH_FPA0 0xc6040 6211#define _PCH_FPA0 0xc6040
6141#define FP_CB_TUNE (0x3<<22) 6212#define FP_CB_TUNE (0x3<<22)
6142#define _PCH_FPA1 0xc6044 6213#define _PCH_FPA1 0xc6044
6143#define _PCH_FPB0 0xc6048 6214#define _PCH_FPB0 0xc6048
6144#define _PCH_FPB1 0xc604c 6215#define _PCH_FPB1 0xc604c
6145#define PCH_FP0(pll) (pll == 0 ? _PCH_FPA0 : _PCH_FPB0) 6216#define PCH_FP0(pll) _MMIO(pll == 0 ? _PCH_FPA0 : _PCH_FPB0)
6146#define PCH_FP1(pll) (pll == 0 ? _PCH_FPA1 : _PCH_FPB1) 6217#define PCH_FP1(pll) _MMIO(pll == 0 ? _PCH_FPA1 : _PCH_FPB1)
6147 6218
6148#define PCH_DPLL_TEST 0xc606c 6219#define PCH_DPLL_TEST _MMIO(0xc606c)
6149 6220
6150#define PCH_DREF_CONTROL 0xC6200 6221#define PCH_DREF_CONTROL _MMIO(0xC6200)
6151#define DREF_CONTROL_MASK 0x7fc3 6222#define DREF_CONTROL_MASK 0x7fc3
6152#define DREF_CPU_SOURCE_OUTPUT_DISABLE (0<<13) 6223#define DREF_CPU_SOURCE_OUTPUT_DISABLE (0<<13)
6153#define DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD (2<<13) 6224#define DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD (2<<13)
@@ -6170,19 +6241,19 @@ enum skl_disp_power_wells {
6170#define DREF_SSC4_DISABLE (0) 6241#define DREF_SSC4_DISABLE (0)
6171#define DREF_SSC4_ENABLE (1) 6242#define DREF_SSC4_ENABLE (1)
6172 6243
6173#define PCH_RAWCLK_FREQ 0xc6204 6244#define PCH_RAWCLK_FREQ _MMIO(0xc6204)
6174#define FDL_TP1_TIMER_SHIFT 12 6245#define FDL_TP1_TIMER_SHIFT 12
6175#define FDL_TP1_TIMER_MASK (3<<12) 6246#define FDL_TP1_TIMER_MASK (3<<12)
6176#define FDL_TP2_TIMER_SHIFT 10 6247#define FDL_TP2_TIMER_SHIFT 10
6177#define FDL_TP2_TIMER_MASK (3<<10) 6248#define FDL_TP2_TIMER_MASK (3<<10)
6178#define RAWCLK_FREQ_MASK 0x3ff 6249#define RAWCLK_FREQ_MASK 0x3ff
6179 6250
6180#define PCH_DPLL_TMR_CFG 0xc6208 6251#define PCH_DPLL_TMR_CFG _MMIO(0xc6208)
6181 6252
6182#define PCH_SSC4_PARMS 0xc6210 6253#define PCH_SSC4_PARMS _MMIO(0xc6210)
6183#define PCH_SSC4_AUX_PARMS 0xc6214 6254#define PCH_SSC4_AUX_PARMS _MMIO(0xc6214)
6184 6255
6185#define PCH_DPLL_SEL 0xc7000 6256#define PCH_DPLL_SEL _MMIO(0xc7000)
6186#define TRANS_DPLLB_SEL(pipe) (1 << ((pipe) * 4)) 6257#define TRANS_DPLLB_SEL(pipe) (1 << ((pipe) * 4))
6187#define TRANS_DPLLA_SEL(pipe) 0 6258#define TRANS_DPLLA_SEL(pipe) 0
6188#define TRANS_DPLL_ENABLE(pipe) (1 << ((pipe) * 4 + 3)) 6259#define TRANS_DPLL_ENABLE(pipe) (1 << ((pipe) * 4 + 3))
@@ -6230,79 +6301,73 @@ enum skl_disp_power_wells {
6230#define _VIDEO_DIP_DATA_B 0xe1208 6301#define _VIDEO_DIP_DATA_B 0xe1208
6231#define _VIDEO_DIP_GCP_B 0xe1210 6302#define _VIDEO_DIP_GCP_B 0xe1210
6232 6303
6233#define TVIDEO_DIP_CTL(pipe) _PIPE(pipe, _VIDEO_DIP_CTL_A, _VIDEO_DIP_CTL_B) 6304#define TVIDEO_DIP_CTL(pipe) _MMIO_PIPE(pipe, _VIDEO_DIP_CTL_A, _VIDEO_DIP_CTL_B)
6234#define TVIDEO_DIP_DATA(pipe) _PIPE(pipe, _VIDEO_DIP_DATA_A, _VIDEO_DIP_DATA_B) 6305#define TVIDEO_DIP_DATA(pipe) _MMIO_PIPE(pipe, _VIDEO_DIP_DATA_A, _VIDEO_DIP_DATA_B)
6235#define TVIDEO_DIP_GCP(pipe) _PIPE(pipe, _VIDEO_DIP_GCP_A, _VIDEO_DIP_GCP_B) 6306#define TVIDEO_DIP_GCP(pipe) _MMIO_PIPE(pipe, _VIDEO_DIP_GCP_A, _VIDEO_DIP_GCP_B)
6236 6307
6237/* Per-transcoder DIP controls (VLV) */ 6308/* Per-transcoder DIP controls (VLV) */
6238#define VLV_VIDEO_DIP_CTL_A (VLV_DISPLAY_BASE + 0x60200) 6309#define _VLV_VIDEO_DIP_CTL_A (VLV_DISPLAY_BASE + 0x60200)
6239#define VLV_VIDEO_DIP_DATA_A (VLV_DISPLAY_BASE + 0x60208) 6310#define _VLV_VIDEO_DIP_DATA_A (VLV_DISPLAY_BASE + 0x60208)
6240#define VLV_VIDEO_DIP_GDCP_PAYLOAD_A (VLV_DISPLAY_BASE + 0x60210) 6311#define _VLV_VIDEO_DIP_GDCP_PAYLOAD_A (VLV_DISPLAY_BASE + 0x60210)
6241 6312
6242#define VLV_VIDEO_DIP_CTL_B (VLV_DISPLAY_BASE + 0x61170) 6313#define _VLV_VIDEO_DIP_CTL_B (VLV_DISPLAY_BASE + 0x61170)
6243#define VLV_VIDEO_DIP_DATA_B (VLV_DISPLAY_BASE + 0x61174) 6314#define _VLV_VIDEO_DIP_DATA_B (VLV_DISPLAY_BASE + 0x61174)
6244#define VLV_VIDEO_DIP_GDCP_PAYLOAD_B (VLV_DISPLAY_BASE + 0x61178) 6315#define _VLV_VIDEO_DIP_GDCP_PAYLOAD_B (VLV_DISPLAY_BASE + 0x61178)
6245 6316
6246#define CHV_VIDEO_DIP_CTL_C (VLV_DISPLAY_BASE + 0x611f0) 6317#define _CHV_VIDEO_DIP_CTL_C (VLV_DISPLAY_BASE + 0x611f0)
6247#define CHV_VIDEO_DIP_DATA_C (VLV_DISPLAY_BASE + 0x611f4) 6318#define _CHV_VIDEO_DIP_DATA_C (VLV_DISPLAY_BASE + 0x611f4)
6248#define CHV_VIDEO_DIP_GDCP_PAYLOAD_C (VLV_DISPLAY_BASE + 0x611f8) 6319#define _CHV_VIDEO_DIP_GDCP_PAYLOAD_C (VLV_DISPLAY_BASE + 0x611f8)
6249 6320
6250#define VLV_TVIDEO_DIP_CTL(pipe) \ 6321#define VLV_TVIDEO_DIP_CTL(pipe) \
6251 _PIPE3((pipe), VLV_VIDEO_DIP_CTL_A, \ 6322 _MMIO_PIPE3((pipe), _VLV_VIDEO_DIP_CTL_A, \
6252 VLV_VIDEO_DIP_CTL_B, CHV_VIDEO_DIP_CTL_C) 6323 _VLV_VIDEO_DIP_CTL_B, _CHV_VIDEO_DIP_CTL_C)
6253#define VLV_TVIDEO_DIP_DATA(pipe) \ 6324#define VLV_TVIDEO_DIP_DATA(pipe) \
6254 _PIPE3((pipe), VLV_VIDEO_DIP_DATA_A, \ 6325 _MMIO_PIPE3((pipe), _VLV_VIDEO_DIP_DATA_A, \
6255 VLV_VIDEO_DIP_DATA_B, CHV_VIDEO_DIP_DATA_C) 6326 _VLV_VIDEO_DIP_DATA_B, _CHV_VIDEO_DIP_DATA_C)
6256#define VLV_TVIDEO_DIP_GCP(pipe) \ 6327#define VLV_TVIDEO_DIP_GCP(pipe) \
6257 _PIPE3((pipe), VLV_VIDEO_DIP_GDCP_PAYLOAD_A, \ 6328 _MMIO_PIPE3((pipe), _VLV_VIDEO_DIP_GDCP_PAYLOAD_A, \
6258 VLV_VIDEO_DIP_GDCP_PAYLOAD_B, CHV_VIDEO_DIP_GDCP_PAYLOAD_C) 6329 _VLV_VIDEO_DIP_GDCP_PAYLOAD_B, _CHV_VIDEO_DIP_GDCP_PAYLOAD_C)
6259 6330
6260/* Haswell DIP controls */ 6331/* Haswell DIP controls */
6261#define HSW_VIDEO_DIP_CTL_A 0x60200 6332
6262#define HSW_VIDEO_DIP_AVI_DATA_A 0x60220 6333#define _HSW_VIDEO_DIP_CTL_A 0x60200
6263#define HSW_VIDEO_DIP_VS_DATA_A 0x60260 6334#define _HSW_VIDEO_DIP_AVI_DATA_A 0x60220
6264#define HSW_VIDEO_DIP_SPD_DATA_A 0x602A0 6335#define _HSW_VIDEO_DIP_VS_DATA_A 0x60260
6265#define HSW_VIDEO_DIP_GMP_DATA_A 0x602E0 6336#define _HSW_VIDEO_DIP_SPD_DATA_A 0x602A0
6266#define HSW_VIDEO_DIP_VSC_DATA_A 0x60320 6337#define _HSW_VIDEO_DIP_GMP_DATA_A 0x602E0
6267#define HSW_VIDEO_DIP_AVI_ECC_A 0x60240 6338#define _HSW_VIDEO_DIP_VSC_DATA_A 0x60320
6268#define HSW_VIDEO_DIP_VS_ECC_A 0x60280 6339#define _HSW_VIDEO_DIP_AVI_ECC_A 0x60240
6269#define HSW_VIDEO_DIP_SPD_ECC_A 0x602C0 6340#define _HSW_VIDEO_DIP_VS_ECC_A 0x60280
6270#define HSW_VIDEO_DIP_GMP_ECC_A 0x60300 6341#define _HSW_VIDEO_DIP_SPD_ECC_A 0x602C0
6271#define HSW_VIDEO_DIP_VSC_ECC_A 0x60344 6342#define _HSW_VIDEO_DIP_GMP_ECC_A 0x60300
6272#define HSW_VIDEO_DIP_GCP_A 0x60210 6343#define _HSW_VIDEO_DIP_VSC_ECC_A 0x60344
6273 6344#define _HSW_VIDEO_DIP_GCP_A 0x60210
6274#define HSW_VIDEO_DIP_CTL_B 0x61200 6345
6275#define HSW_VIDEO_DIP_AVI_DATA_B 0x61220 6346#define _HSW_VIDEO_DIP_CTL_B 0x61200
6276#define HSW_VIDEO_DIP_VS_DATA_B 0x61260 6347#define _HSW_VIDEO_DIP_AVI_DATA_B 0x61220
6277#define HSW_VIDEO_DIP_SPD_DATA_B 0x612A0 6348#define _HSW_VIDEO_DIP_VS_DATA_B 0x61260
6278#define HSW_VIDEO_DIP_GMP_DATA_B 0x612E0 6349#define _HSW_VIDEO_DIP_SPD_DATA_B 0x612A0
6279#define HSW_VIDEO_DIP_VSC_DATA_B 0x61320 6350#define _HSW_VIDEO_DIP_GMP_DATA_B 0x612E0
6280#define HSW_VIDEO_DIP_BVI_ECC_B 0x61240 6351#define _HSW_VIDEO_DIP_VSC_DATA_B 0x61320
6281#define HSW_VIDEO_DIP_VS_ECC_B 0x61280 6352#define _HSW_VIDEO_DIP_BVI_ECC_B 0x61240
6282#define HSW_VIDEO_DIP_SPD_ECC_B 0x612C0 6353#define _HSW_VIDEO_DIP_VS_ECC_B 0x61280
6283#define HSW_VIDEO_DIP_GMP_ECC_B 0x61300 6354#define _HSW_VIDEO_DIP_SPD_ECC_B 0x612C0
6284#define HSW_VIDEO_DIP_VSC_ECC_B 0x61344 6355#define _HSW_VIDEO_DIP_GMP_ECC_B 0x61300
6285#define HSW_VIDEO_DIP_GCP_B 0x61210 6356#define _HSW_VIDEO_DIP_VSC_ECC_B 0x61344
6286 6357#define _HSW_VIDEO_DIP_GCP_B 0x61210
6287#define HSW_TVIDEO_DIP_CTL(trans) \ 6358
6288 _TRANSCODER2(trans, HSW_VIDEO_DIP_CTL_A) 6359#define HSW_TVIDEO_DIP_CTL(trans) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_CTL_A)
6289#define HSW_TVIDEO_DIP_AVI_DATA(trans, i) \ 6360#define HSW_TVIDEO_DIP_AVI_DATA(trans, i) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_AVI_DATA_A + (i) * 4)
6290 (_TRANSCODER2(trans, HSW_VIDEO_DIP_AVI_DATA_A) + (i) * 4) 6361#define HSW_TVIDEO_DIP_VS_DATA(trans, i) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_VS_DATA_A + (i) * 4)
6291#define HSW_TVIDEO_DIP_VS_DATA(trans, i) \ 6362#define HSW_TVIDEO_DIP_SPD_DATA(trans, i) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_SPD_DATA_A + (i) * 4)
6292 (_TRANSCODER2(trans, HSW_VIDEO_DIP_VS_DATA_A) + (i) * 4) 6363#define HSW_TVIDEO_DIP_GCP(trans) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_GCP_A)
6293#define HSW_TVIDEO_DIP_SPD_DATA(trans, i) \ 6364#define HSW_TVIDEO_DIP_VSC_DATA(trans, i) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_VSC_DATA_A + (i) * 4)
6294 (_TRANSCODER2(trans, HSW_VIDEO_DIP_SPD_DATA_A) + (i) * 4) 6365
6295#define HSW_TVIDEO_DIP_GCP(trans) \ 6366#define _HSW_STEREO_3D_CTL_A 0x70020
6296 _TRANSCODER2(trans, HSW_VIDEO_DIP_GCP_A) 6367#define S3D_ENABLE (1<<31)
6297#define HSW_TVIDEO_DIP_VSC_DATA(trans, i) \ 6368#define _HSW_STEREO_3D_CTL_B 0x71020
6298 (_TRANSCODER2(trans, HSW_VIDEO_DIP_VSC_DATA_A) + (i) * 4) 6369
6299 6370#define HSW_STEREO_3D_CTL(trans) _MMIO_PIPE2(trans, _HSW_STEREO_3D_CTL_A)
6300#define HSW_STEREO_3D_CTL_A 0x70020
6301#define S3D_ENABLE (1<<31)
6302#define HSW_STEREO_3D_CTL_B 0x71020
6303
6304#define HSW_STEREO_3D_CTL(trans) \
6305 _PIPE2(trans, HSW_STEREO_3D_CTL_A)
6306 6371
6307#define _PCH_TRANS_HTOTAL_B 0xe1000 6372#define _PCH_TRANS_HTOTAL_B 0xe1000
6308#define _PCH_TRANS_HBLANK_B 0xe1004 6373#define _PCH_TRANS_HBLANK_B 0xe1004
@@ -6310,16 +6375,15 @@ enum skl_disp_power_wells {
6310#define _PCH_TRANS_VTOTAL_B 0xe100c 6375#define _PCH_TRANS_VTOTAL_B 0xe100c
6311#define _PCH_TRANS_VBLANK_B 0xe1010 6376#define _PCH_TRANS_VBLANK_B 0xe1010
6312#define _PCH_TRANS_VSYNC_B 0xe1014 6377#define _PCH_TRANS_VSYNC_B 0xe1014
6313#define _PCH_TRANS_VSYNCSHIFT_B 0xe1028 6378#define _PCH_TRANS_VSYNCSHIFT_B 0xe1028
6314 6379
6315#define PCH_TRANS_HTOTAL(pipe) _PIPE(pipe, _PCH_TRANS_HTOTAL_A, _PCH_TRANS_HTOTAL_B) 6380#define PCH_TRANS_HTOTAL(pipe) _MMIO_PIPE(pipe, _PCH_TRANS_HTOTAL_A, _PCH_TRANS_HTOTAL_B)
6316#define PCH_TRANS_HBLANK(pipe) _PIPE(pipe, _PCH_TRANS_HBLANK_A, _PCH_TRANS_HBLANK_B) 6381#define PCH_TRANS_HBLANK(pipe) _MMIO_PIPE(pipe, _PCH_TRANS_HBLANK_A, _PCH_TRANS_HBLANK_B)
6317#define PCH_TRANS_HSYNC(pipe) _PIPE(pipe, _PCH_TRANS_HSYNC_A, _PCH_TRANS_HSYNC_B) 6382#define PCH_TRANS_HSYNC(pipe) _MMIO_PIPE(pipe, _PCH_TRANS_HSYNC_A, _PCH_TRANS_HSYNC_B)
6318#define PCH_TRANS_VTOTAL(pipe) _PIPE(pipe, _PCH_TRANS_VTOTAL_A, _PCH_TRANS_VTOTAL_B) 6383#define PCH_TRANS_VTOTAL(pipe) _MMIO_PIPE(pipe, _PCH_TRANS_VTOTAL_A, _PCH_TRANS_VTOTAL_B)
6319#define PCH_TRANS_VBLANK(pipe) _PIPE(pipe, _PCH_TRANS_VBLANK_A, _PCH_TRANS_VBLANK_B) 6384#define PCH_TRANS_VBLANK(pipe) _MMIO_PIPE(pipe, _PCH_TRANS_VBLANK_A, _PCH_TRANS_VBLANK_B)
6320#define PCH_TRANS_VSYNC(pipe) _PIPE(pipe, _PCH_TRANS_VSYNC_A, _PCH_TRANS_VSYNC_B) 6385#define PCH_TRANS_VSYNC(pipe) _MMIO_PIPE(pipe, _PCH_TRANS_VSYNC_A, _PCH_TRANS_VSYNC_B)
6321#define PCH_TRANS_VSYNCSHIFT(pipe) _PIPE(pipe, _PCH_TRANS_VSYNCSHIFT_A, \ 6386#define PCH_TRANS_VSYNCSHIFT(pipe) _MMIO_PIPE(pipe, _PCH_TRANS_VSYNCSHIFT_A, _PCH_TRANS_VSYNCSHIFT_B)
6322 _PCH_TRANS_VSYNCSHIFT_B)
6323 6387
6324#define _PCH_TRANSB_DATA_M1 0xe1030 6388#define _PCH_TRANSB_DATA_M1 0xe1030
6325#define _PCH_TRANSB_DATA_N1 0xe1034 6389#define _PCH_TRANSB_DATA_N1 0xe1034
@@ -6330,19 +6394,19 @@ enum skl_disp_power_wells {
6330#define _PCH_TRANSB_LINK_M2 0xe1048 6394#define _PCH_TRANSB_LINK_M2 0xe1048
6331#define _PCH_TRANSB_LINK_N2 0xe104c 6395#define _PCH_TRANSB_LINK_N2 0xe104c
6332 6396
6333#define PCH_TRANS_DATA_M1(pipe) _PIPE(pipe, _PCH_TRANSA_DATA_M1, _PCH_TRANSB_DATA_M1) 6397#define PCH_TRANS_DATA_M1(pipe) _MMIO_PIPE(pipe, _PCH_TRANSA_DATA_M1, _PCH_TRANSB_DATA_M1)
6334#define PCH_TRANS_DATA_N1(pipe) _PIPE(pipe, _PCH_TRANSA_DATA_N1, _PCH_TRANSB_DATA_N1) 6398#define PCH_TRANS_DATA_N1(pipe) _MMIO_PIPE(pipe, _PCH_TRANSA_DATA_N1, _PCH_TRANSB_DATA_N1)
6335#define PCH_TRANS_DATA_M2(pipe) _PIPE(pipe, _PCH_TRANSA_DATA_M2, _PCH_TRANSB_DATA_M2) 6399#define PCH_TRANS_DATA_M2(pipe) _MMIO_PIPE(pipe, _PCH_TRANSA_DATA_M2, _PCH_TRANSB_DATA_M2)
6336#define PCH_TRANS_DATA_N2(pipe) _PIPE(pipe, _PCH_TRANSA_DATA_N2, _PCH_TRANSB_DATA_N2) 6400#define PCH_TRANS_DATA_N2(pipe) _MMIO_PIPE(pipe, _PCH_TRANSA_DATA_N2, _PCH_TRANSB_DATA_N2)
6337#define PCH_TRANS_LINK_M1(pipe) _PIPE(pipe, _PCH_TRANSA_LINK_M1, _PCH_TRANSB_LINK_M1) 6401#define PCH_TRANS_LINK_M1(pipe) _MMIO_PIPE(pipe, _PCH_TRANSA_LINK_M1, _PCH_TRANSB_LINK_M1)
6338#define PCH_TRANS_LINK_N1(pipe) _PIPE(pipe, _PCH_TRANSA_LINK_N1, _PCH_TRANSB_LINK_N1) 6402#define PCH_TRANS_LINK_N1(pipe) _MMIO_PIPE(pipe, _PCH_TRANSA_LINK_N1, _PCH_TRANSB_LINK_N1)
6339#define PCH_TRANS_LINK_M2(pipe) _PIPE(pipe, _PCH_TRANSA_LINK_M2, _PCH_TRANSB_LINK_M2) 6403#define PCH_TRANS_LINK_M2(pipe) _MMIO_PIPE(pipe, _PCH_TRANSA_LINK_M2, _PCH_TRANSB_LINK_M2)
6340#define PCH_TRANS_LINK_N2(pipe) _PIPE(pipe, _PCH_TRANSA_LINK_N2, _PCH_TRANSB_LINK_N2) 6404#define PCH_TRANS_LINK_N2(pipe) _MMIO_PIPE(pipe, _PCH_TRANSA_LINK_N2, _PCH_TRANSB_LINK_N2)
6341 6405
6342#define _PCH_TRANSACONF 0xf0008 6406#define _PCH_TRANSACONF 0xf0008
6343#define _PCH_TRANSBCONF 0xf1008 6407#define _PCH_TRANSBCONF 0xf1008
6344#define PCH_TRANSCONF(pipe) _PIPE(pipe, _PCH_TRANSACONF, _PCH_TRANSBCONF) 6408#define PCH_TRANSCONF(pipe) _MMIO_PIPE(pipe, _PCH_TRANSACONF, _PCH_TRANSBCONF)
6345#define LPT_TRANSCONF _PCH_TRANSACONF /* lpt has only one transcoder */ 6409#define LPT_TRANSCONF PCH_TRANSCONF(PIPE_A) /* lpt has only one transcoder */
6346#define TRANS_DISABLE (0<<31) 6410#define TRANS_DISABLE (0<<31)
6347#define TRANS_ENABLE (1<<31) 6411#define TRANS_ENABLE (1<<31)
6348#define TRANS_STATE_MASK (1<<30) 6412#define TRANS_STATE_MASK (1<<30)
@@ -6363,47 +6427,47 @@ enum skl_disp_power_wells {
6363 6427
6364#define _TRANSA_CHICKEN1 0xf0060 6428#define _TRANSA_CHICKEN1 0xf0060
6365#define _TRANSB_CHICKEN1 0xf1060 6429#define _TRANSB_CHICKEN1 0xf1060
6366#define TRANS_CHICKEN1(pipe) _PIPE(pipe, _TRANSA_CHICKEN1, _TRANSB_CHICKEN1) 6430#define TRANS_CHICKEN1(pipe) _MMIO_PIPE(pipe, _TRANSA_CHICKEN1, _TRANSB_CHICKEN1)
6367#define TRANS_CHICKEN1_HDMIUNIT_GC_DISABLE (1<<10) 6431#define TRANS_CHICKEN1_HDMIUNIT_GC_DISABLE (1<<10)
6368#define TRANS_CHICKEN1_DP0UNIT_GC_DISABLE (1<<4) 6432#define TRANS_CHICKEN1_DP0UNIT_GC_DISABLE (1<<4)
6369#define _TRANSA_CHICKEN2 0xf0064 6433#define _TRANSA_CHICKEN2 0xf0064
6370#define _TRANSB_CHICKEN2 0xf1064 6434#define _TRANSB_CHICKEN2 0xf1064
6371#define TRANS_CHICKEN2(pipe) _PIPE(pipe, _TRANSA_CHICKEN2, _TRANSB_CHICKEN2) 6435#define TRANS_CHICKEN2(pipe) _MMIO_PIPE(pipe, _TRANSA_CHICKEN2, _TRANSB_CHICKEN2)
6372#define TRANS_CHICKEN2_TIMING_OVERRIDE (1<<31) 6436#define TRANS_CHICKEN2_TIMING_OVERRIDE (1<<31)
6373#define TRANS_CHICKEN2_FDI_POLARITY_REVERSED (1<<29) 6437#define TRANS_CHICKEN2_FDI_POLARITY_REVERSED (1<<29)
6374#define TRANS_CHICKEN2_FRAME_START_DELAY_MASK (3<<27) 6438#define TRANS_CHICKEN2_FRAME_START_DELAY_MASK (3<<27)
6375#define TRANS_CHICKEN2_DISABLE_DEEP_COLOR_COUNTER (1<<26) 6439#define TRANS_CHICKEN2_DISABLE_DEEP_COLOR_COUNTER (1<<26)
6376#define TRANS_CHICKEN2_DISABLE_DEEP_COLOR_MODESWITCH (1<<25) 6440#define TRANS_CHICKEN2_DISABLE_DEEP_COLOR_MODESWITCH (1<<25)
6377 6441
6378#define SOUTH_CHICKEN1 0xc2000 6442#define SOUTH_CHICKEN1 _MMIO(0xc2000)
6379#define FDIA_PHASE_SYNC_SHIFT_OVR 19 6443#define FDIA_PHASE_SYNC_SHIFT_OVR 19
6380#define FDIA_PHASE_SYNC_SHIFT_EN 18 6444#define FDIA_PHASE_SYNC_SHIFT_EN 18
6381#define FDI_PHASE_SYNC_OVR(pipe) (1<<(FDIA_PHASE_SYNC_SHIFT_OVR - ((pipe) * 2))) 6445#define FDI_PHASE_SYNC_OVR(pipe) (1<<(FDIA_PHASE_SYNC_SHIFT_OVR - ((pipe) * 2)))
6382#define FDI_PHASE_SYNC_EN(pipe) (1<<(FDIA_PHASE_SYNC_SHIFT_EN - ((pipe) * 2))) 6446#define FDI_PHASE_SYNC_EN(pipe) (1<<(FDIA_PHASE_SYNC_SHIFT_EN - ((pipe) * 2)))
6383#define FDI_BC_BIFURCATION_SELECT (1 << 12) 6447#define FDI_BC_BIFURCATION_SELECT (1 << 12)
6384#define SPT_PWM_GRANULARITY (1<<0) 6448#define SPT_PWM_GRANULARITY (1<<0)
6385#define SOUTH_CHICKEN2 0xc2004 6449#define SOUTH_CHICKEN2 _MMIO(0xc2004)
6386#define FDI_MPHY_IOSFSB_RESET_STATUS (1<<13) 6450#define FDI_MPHY_IOSFSB_RESET_STATUS (1<<13)
6387#define FDI_MPHY_IOSFSB_RESET_CTL (1<<12) 6451#define FDI_MPHY_IOSFSB_RESET_CTL (1<<12)
6388#define LPT_PWM_GRANULARITY (1<<5) 6452#define LPT_PWM_GRANULARITY (1<<5)
6389#define DPLS_EDP_PPS_FIX_DIS (1<<0) 6453#define DPLS_EDP_PPS_FIX_DIS (1<<0)
6390 6454
6391#define _FDI_RXA_CHICKEN 0xc200c 6455#define _FDI_RXA_CHICKEN 0xc200c
6392#define _FDI_RXB_CHICKEN 0xc2010 6456#define _FDI_RXB_CHICKEN 0xc2010
6393#define FDI_RX_PHASE_SYNC_POINTER_OVR (1<<1) 6457#define FDI_RX_PHASE_SYNC_POINTER_OVR (1<<1)
6394#define FDI_RX_PHASE_SYNC_POINTER_EN (1<<0) 6458#define FDI_RX_PHASE_SYNC_POINTER_EN (1<<0)
6395#define FDI_RX_CHICKEN(pipe) _PIPE(pipe, _FDI_RXA_CHICKEN, _FDI_RXB_CHICKEN) 6459#define FDI_RX_CHICKEN(pipe) _MMIO_PIPE(pipe, _FDI_RXA_CHICKEN, _FDI_RXB_CHICKEN)
6396 6460
6397#define SOUTH_DSPCLK_GATE_D 0xc2020 6461#define SOUTH_DSPCLK_GATE_D _MMIO(0xc2020)
6398#define PCH_DPLUNIT_CLOCK_GATE_DISABLE (1<<30) 6462#define PCH_DPLUNIT_CLOCK_GATE_DISABLE (1<<30)
6399#define PCH_DPLSUNIT_CLOCK_GATE_DISABLE (1<<29) 6463#define PCH_DPLSUNIT_CLOCK_GATE_DISABLE (1<<29)
6400#define PCH_CPUNIT_CLOCK_GATE_DISABLE (1<<14) 6464#define PCH_CPUNIT_CLOCK_GATE_DISABLE (1<<14)
6401#define PCH_LP_PARTITION_LEVEL_DISABLE (1<<12) 6465#define PCH_LP_PARTITION_LEVEL_DISABLE (1<<12)
6402 6466
6403/* CPU: FDI_TX */ 6467/* CPU: FDI_TX */
6404#define _FDI_TXA_CTL 0x60100 6468#define _FDI_TXA_CTL 0x60100
6405#define _FDI_TXB_CTL 0x61100 6469#define _FDI_TXB_CTL 0x61100
6406#define FDI_TX_CTL(pipe) _PIPE(pipe, _FDI_TXA_CTL, _FDI_TXB_CTL) 6470#define FDI_TX_CTL(pipe) _MMIO_PIPE(pipe, _FDI_TXA_CTL, _FDI_TXB_CTL)
6407#define FDI_TX_DISABLE (0<<31) 6471#define FDI_TX_DISABLE (0<<31)
6408#define FDI_TX_ENABLE (1<<31) 6472#define FDI_TX_ENABLE (1<<31)
6409#define FDI_LINK_TRAIN_PATTERN_1 (0<<28) 6473#define FDI_LINK_TRAIN_PATTERN_1 (0<<28)
@@ -6453,7 +6517,7 @@ enum skl_disp_power_wells {
6453/* FDI_RX, FDI_X is hard-wired to Transcoder_X */ 6517/* FDI_RX, FDI_X is hard-wired to Transcoder_X */
6454#define _FDI_RXA_CTL 0xf000c 6518#define _FDI_RXA_CTL 0xf000c
6455#define _FDI_RXB_CTL 0xf100c 6519#define _FDI_RXB_CTL 0xf100c
6456#define FDI_RX_CTL(pipe) _PIPE(pipe, _FDI_RXA_CTL, _FDI_RXB_CTL) 6520#define FDI_RX_CTL(pipe) _MMIO_PIPE(pipe, _FDI_RXA_CTL, _FDI_RXB_CTL)
6457#define FDI_RX_ENABLE (1<<31) 6521#define FDI_RX_ENABLE (1<<31)
6458/* train, dp width same as FDI_TX */ 6522/* train, dp width same as FDI_TX */
6459#define FDI_FS_ERRC_ENABLE (1<<27) 6523#define FDI_FS_ERRC_ENABLE (1<<27)
@@ -6489,14 +6553,14 @@ enum skl_disp_power_wells {
6489#define FDI_RX_TP1_TO_TP2_48 (2<<20) 6553#define FDI_RX_TP1_TO_TP2_48 (2<<20)
6490#define FDI_RX_TP1_TO_TP2_64 (3<<20) 6554#define FDI_RX_TP1_TO_TP2_64 (3<<20)
6491#define FDI_RX_FDI_DELAY_90 (0x90<<0) 6555#define FDI_RX_FDI_DELAY_90 (0x90<<0)
6492#define FDI_RX_MISC(pipe) _PIPE(pipe, _FDI_RXA_MISC, _FDI_RXB_MISC) 6556#define FDI_RX_MISC(pipe) _MMIO_PIPE(pipe, _FDI_RXA_MISC, _FDI_RXB_MISC)
6493 6557
6494#define _FDI_RXA_TUSIZE1 0xf0030 6558#define _FDI_RXA_TUSIZE1 0xf0030
6495#define _FDI_RXA_TUSIZE2 0xf0038 6559#define _FDI_RXA_TUSIZE2 0xf0038
6496#define _FDI_RXB_TUSIZE1 0xf1030 6560#define _FDI_RXB_TUSIZE1 0xf1030
6497#define _FDI_RXB_TUSIZE2 0xf1038 6561#define _FDI_RXB_TUSIZE2 0xf1038
6498#define FDI_RX_TUSIZE1(pipe) _PIPE(pipe, _FDI_RXA_TUSIZE1, _FDI_RXB_TUSIZE1) 6562#define FDI_RX_TUSIZE1(pipe) _MMIO_PIPE(pipe, _FDI_RXA_TUSIZE1, _FDI_RXB_TUSIZE1)
6499#define FDI_RX_TUSIZE2(pipe) _PIPE(pipe, _FDI_RXA_TUSIZE2, _FDI_RXB_TUSIZE2) 6563#define FDI_RX_TUSIZE2(pipe) _MMIO_PIPE(pipe, _FDI_RXA_TUSIZE2, _FDI_RXB_TUSIZE2)
6500 6564
6501/* FDI_RX interrupt register format */ 6565/* FDI_RX interrupt register format */
6502#define FDI_RX_INTER_LANE_ALIGN (1<<10) 6566#define FDI_RX_INTER_LANE_ALIGN (1<<10)
@@ -6511,44 +6575,41 @@ enum skl_disp_power_wells {
6511#define FDI_RX_CROSS_CLOCK_OVERFLOW (1<<1) 6575#define FDI_RX_CROSS_CLOCK_OVERFLOW (1<<1)
6512#define FDI_RX_SYMBOL_QUEUE_OVERFLOW (1<<0) 6576#define FDI_RX_SYMBOL_QUEUE_OVERFLOW (1<<0)
6513 6577
6514#define _FDI_RXA_IIR 0xf0014 6578#define _FDI_RXA_IIR 0xf0014
6515#define _FDI_RXA_IMR 0xf0018 6579#define _FDI_RXA_IMR 0xf0018
6516#define _FDI_RXB_IIR 0xf1014 6580#define _FDI_RXB_IIR 0xf1014
6517#define _FDI_RXB_IMR 0xf1018 6581#define _FDI_RXB_IMR 0xf1018
6518#define FDI_RX_IIR(pipe) _PIPE(pipe, _FDI_RXA_IIR, _FDI_RXB_IIR) 6582#define FDI_RX_IIR(pipe) _MMIO_PIPE(pipe, _FDI_RXA_IIR, _FDI_RXB_IIR)
6519#define FDI_RX_IMR(pipe) _PIPE(pipe, _FDI_RXA_IMR, _FDI_RXB_IMR) 6583#define FDI_RX_IMR(pipe) _MMIO_PIPE(pipe, _FDI_RXA_IMR, _FDI_RXB_IMR)
6520 6584
6521#define FDI_PLL_CTL_1 0xfe000 6585#define FDI_PLL_CTL_1 _MMIO(0xfe000)
6522#define FDI_PLL_CTL_2 0xfe004 6586#define FDI_PLL_CTL_2 _MMIO(0xfe004)
6523 6587
6524#define PCH_LVDS 0xe1180 6588#define PCH_LVDS _MMIO(0xe1180)
6525#define LVDS_DETECTED (1 << 1) 6589#define LVDS_DETECTED (1 << 1)
6526 6590
6527/* vlv has 2 sets of panel control regs. */ 6591/* vlv has 2 sets of panel control regs. */
6528#define PIPEA_PP_STATUS (VLV_DISPLAY_BASE + 0x61200) 6592#define _PIPEA_PP_STATUS (VLV_DISPLAY_BASE + 0x61200)
6529#define PIPEA_PP_CONTROL (VLV_DISPLAY_BASE + 0x61204) 6593#define _PIPEA_PP_CONTROL (VLV_DISPLAY_BASE + 0x61204)
6530#define PIPEA_PP_ON_DELAYS (VLV_DISPLAY_BASE + 0x61208) 6594#define _PIPEA_PP_ON_DELAYS (VLV_DISPLAY_BASE + 0x61208)
6531#define PANEL_PORT_SELECT_VLV(port) ((port) << 30) 6595#define PANEL_PORT_SELECT_VLV(port) ((port) << 30)
6532#define PIPEA_PP_OFF_DELAYS (VLV_DISPLAY_BASE + 0x6120c) 6596#define _PIPEA_PP_OFF_DELAYS (VLV_DISPLAY_BASE + 0x6120c)
6533#define PIPEA_PP_DIVISOR (VLV_DISPLAY_BASE + 0x61210) 6597#define _PIPEA_PP_DIVISOR (VLV_DISPLAY_BASE + 0x61210)
6534 6598
6535#define PIPEB_PP_STATUS (VLV_DISPLAY_BASE + 0x61300) 6599#define _PIPEB_PP_STATUS (VLV_DISPLAY_BASE + 0x61300)
6536#define PIPEB_PP_CONTROL (VLV_DISPLAY_BASE + 0x61304) 6600#define _PIPEB_PP_CONTROL (VLV_DISPLAY_BASE + 0x61304)
6537#define PIPEB_PP_ON_DELAYS (VLV_DISPLAY_BASE + 0x61308) 6601#define _PIPEB_PP_ON_DELAYS (VLV_DISPLAY_BASE + 0x61308)
6538#define PIPEB_PP_OFF_DELAYS (VLV_DISPLAY_BASE + 0x6130c) 6602#define _PIPEB_PP_OFF_DELAYS (VLV_DISPLAY_BASE + 0x6130c)
6539#define PIPEB_PP_DIVISOR (VLV_DISPLAY_BASE + 0x61310) 6603#define _PIPEB_PP_DIVISOR (VLV_DISPLAY_BASE + 0x61310)
6540 6604
6541#define VLV_PIPE_PP_STATUS(pipe) _PIPE(pipe, PIPEA_PP_STATUS, PIPEB_PP_STATUS) 6605#define VLV_PIPE_PP_STATUS(pipe) _MMIO_PIPE(pipe, _PIPEA_PP_STATUS, _PIPEB_PP_STATUS)
6542#define VLV_PIPE_PP_CONTROL(pipe) _PIPE(pipe, PIPEA_PP_CONTROL, PIPEB_PP_CONTROL) 6606#define VLV_PIPE_PP_CONTROL(pipe) _MMIO_PIPE(pipe, _PIPEA_PP_CONTROL, _PIPEB_PP_CONTROL)
6543#define VLV_PIPE_PP_ON_DELAYS(pipe) \ 6607#define VLV_PIPE_PP_ON_DELAYS(pipe) _MMIO_PIPE(pipe, _PIPEA_PP_ON_DELAYS, _PIPEB_PP_ON_DELAYS)
6544 _PIPE(pipe, PIPEA_PP_ON_DELAYS, PIPEB_PP_ON_DELAYS) 6608#define VLV_PIPE_PP_OFF_DELAYS(pipe) _MMIO_PIPE(pipe, _PIPEA_PP_OFF_DELAYS, _PIPEB_PP_OFF_DELAYS)
6545#define VLV_PIPE_PP_OFF_DELAYS(pipe) \ 6609#define VLV_PIPE_PP_DIVISOR(pipe) _MMIO_PIPE(pipe, _PIPEA_PP_DIVISOR, _PIPEB_PP_DIVISOR)
6546 _PIPE(pipe, PIPEA_PP_OFF_DELAYS, PIPEB_PP_OFF_DELAYS) 6610
6547#define VLV_PIPE_PP_DIVISOR(pipe) \ 6611#define _PCH_PP_STATUS 0xc7200
6548 _PIPE(pipe, PIPEA_PP_DIVISOR, PIPEB_PP_DIVISOR) 6612#define _PCH_PP_CONTROL 0xc7204
6549
6550#define PCH_PP_STATUS 0xc7200
6551#define PCH_PP_CONTROL 0xc7204
6552#define PANEL_UNLOCK_REGS (0xabcd << 16) 6613#define PANEL_UNLOCK_REGS (0xabcd << 16)
6553#define PANEL_UNLOCK_MASK (0xffff << 16) 6614#define PANEL_UNLOCK_MASK (0xffff << 16)
6554#define BXT_POWER_CYCLE_DELAY_MASK (0x1f0) 6615#define BXT_POWER_CYCLE_DELAY_MASK (0x1f0)
@@ -6558,7 +6619,7 @@ enum skl_disp_power_wells {
6558#define PANEL_POWER_RESET (1 << 1) 6619#define PANEL_POWER_RESET (1 << 1)
6559#define PANEL_POWER_OFF (0 << 0) 6620#define PANEL_POWER_OFF (0 << 0)
6560#define PANEL_POWER_ON (1 << 0) 6621#define PANEL_POWER_ON (1 << 0)
6561#define PCH_PP_ON_DELAYS 0xc7208 6622#define _PCH_PP_ON_DELAYS 0xc7208
6562#define PANEL_PORT_SELECT_MASK (3 << 30) 6623#define PANEL_PORT_SELECT_MASK (3 << 30)
6563#define PANEL_PORT_SELECT_LVDS (0 << 30) 6624#define PANEL_PORT_SELECT_LVDS (0 << 30)
6564#define PANEL_PORT_SELECT_DPA (1 << 30) 6625#define PANEL_PORT_SELECT_DPA (1 << 30)
@@ -6569,52 +6630,64 @@ enum skl_disp_power_wells {
6569#define PANEL_LIGHT_ON_DELAY_MASK (0x1fff) 6630#define PANEL_LIGHT_ON_DELAY_MASK (0x1fff)
6570#define PANEL_LIGHT_ON_DELAY_SHIFT 0 6631#define PANEL_LIGHT_ON_DELAY_SHIFT 0
6571 6632
6572#define PCH_PP_OFF_DELAYS 0xc720c 6633#define _PCH_PP_OFF_DELAYS 0xc720c
6573#define PANEL_POWER_DOWN_DELAY_MASK (0x1fff0000) 6634#define PANEL_POWER_DOWN_DELAY_MASK (0x1fff0000)
6574#define PANEL_POWER_DOWN_DELAY_SHIFT 16 6635#define PANEL_POWER_DOWN_DELAY_SHIFT 16
6575#define PANEL_LIGHT_OFF_DELAY_MASK (0x1fff) 6636#define PANEL_LIGHT_OFF_DELAY_MASK (0x1fff)
6576#define PANEL_LIGHT_OFF_DELAY_SHIFT 0 6637#define PANEL_LIGHT_OFF_DELAY_SHIFT 0
6577 6638
6578#define PCH_PP_DIVISOR 0xc7210 6639#define _PCH_PP_DIVISOR 0xc7210
6579#define PP_REFERENCE_DIVIDER_MASK (0xffffff00) 6640#define PP_REFERENCE_DIVIDER_MASK (0xffffff00)
6580#define PP_REFERENCE_DIVIDER_SHIFT 8 6641#define PP_REFERENCE_DIVIDER_SHIFT 8
6581#define PANEL_POWER_CYCLE_DELAY_MASK (0x1f) 6642#define PANEL_POWER_CYCLE_DELAY_MASK (0x1f)
6582#define PANEL_POWER_CYCLE_DELAY_SHIFT 0 6643#define PANEL_POWER_CYCLE_DELAY_SHIFT 0
6583 6644
6645#define PCH_PP_STATUS _MMIO(_PCH_PP_STATUS)
6646#define PCH_PP_CONTROL _MMIO(_PCH_PP_CONTROL)
6647#define PCH_PP_ON_DELAYS _MMIO(_PCH_PP_ON_DELAYS)
6648#define PCH_PP_OFF_DELAYS _MMIO(_PCH_PP_OFF_DELAYS)
6649#define PCH_PP_DIVISOR _MMIO(_PCH_PP_DIVISOR)
6650
6584/* BXT PPS changes - 2nd set of PPS registers */ 6651/* BXT PPS changes - 2nd set of PPS registers */
6585#define _BXT_PP_STATUS2 0xc7300 6652#define _BXT_PP_STATUS2 0xc7300
6586#define _BXT_PP_CONTROL2 0xc7304 6653#define _BXT_PP_CONTROL2 0xc7304
6587#define _BXT_PP_ON_DELAYS2 0xc7308 6654#define _BXT_PP_ON_DELAYS2 0xc7308
6588#define _BXT_PP_OFF_DELAYS2 0xc730c 6655#define _BXT_PP_OFF_DELAYS2 0xc730c
6589 6656
6590#define BXT_PP_STATUS(n) _PIPE(n, PCH_PP_STATUS, _BXT_PP_STATUS2) 6657#define BXT_PP_STATUS(n) _MMIO_PIPE(n, _PCH_PP_STATUS, _BXT_PP_STATUS2)
6591#define BXT_PP_CONTROL(n) _PIPE(n, PCH_PP_CONTROL, _BXT_PP_CONTROL2) 6658#define BXT_PP_CONTROL(n) _MMIO_PIPE(n, _PCH_PP_CONTROL, _BXT_PP_CONTROL2)
6592#define BXT_PP_ON_DELAYS(n) _PIPE(n, PCH_PP_ON_DELAYS, _BXT_PP_ON_DELAYS2) 6659#define BXT_PP_ON_DELAYS(n) _MMIO_PIPE(n, _PCH_PP_ON_DELAYS, _BXT_PP_ON_DELAYS2)
6593#define BXT_PP_OFF_DELAYS(n) _PIPE(n, PCH_PP_OFF_DELAYS, _BXT_PP_OFF_DELAYS2) 6660#define BXT_PP_OFF_DELAYS(n) _MMIO_PIPE(n, _PCH_PP_OFF_DELAYS, _BXT_PP_OFF_DELAYS2)
6594 6661
6595#define PCH_DP_B 0xe4100 6662#define _PCH_DP_B 0xe4100
6596#define PCH_DPB_AUX_CH_CTL 0xe4110 6663#define PCH_DP_B _MMIO(_PCH_DP_B)
6597#define PCH_DPB_AUX_CH_DATA1 0xe4114 6664#define _PCH_DPB_AUX_CH_CTL 0xe4110
6598#define PCH_DPB_AUX_CH_DATA2 0xe4118 6665#define _PCH_DPB_AUX_CH_DATA1 0xe4114
6599#define PCH_DPB_AUX_CH_DATA3 0xe411c 6666#define _PCH_DPB_AUX_CH_DATA2 0xe4118
6600#define PCH_DPB_AUX_CH_DATA4 0xe4120 6667#define _PCH_DPB_AUX_CH_DATA3 0xe411c
6601#define PCH_DPB_AUX_CH_DATA5 0xe4124 6668#define _PCH_DPB_AUX_CH_DATA4 0xe4120
6602 6669#define _PCH_DPB_AUX_CH_DATA5 0xe4124
6603#define PCH_DP_C 0xe4200 6670
6604#define PCH_DPC_AUX_CH_CTL 0xe4210 6671#define _PCH_DP_C 0xe4200
6605#define PCH_DPC_AUX_CH_DATA1 0xe4214 6672#define PCH_DP_C _MMIO(_PCH_DP_C)
6606#define PCH_DPC_AUX_CH_DATA2 0xe4218 6673#define _PCH_DPC_AUX_CH_CTL 0xe4210
6607#define PCH_DPC_AUX_CH_DATA3 0xe421c 6674#define _PCH_DPC_AUX_CH_DATA1 0xe4214
6608#define PCH_DPC_AUX_CH_DATA4 0xe4220 6675#define _PCH_DPC_AUX_CH_DATA2 0xe4218
6609#define PCH_DPC_AUX_CH_DATA5 0xe4224 6676#define _PCH_DPC_AUX_CH_DATA3 0xe421c
6610 6677#define _PCH_DPC_AUX_CH_DATA4 0xe4220
6611#define PCH_DP_D 0xe4300 6678#define _PCH_DPC_AUX_CH_DATA5 0xe4224
6612#define PCH_DPD_AUX_CH_CTL 0xe4310 6679
6613#define PCH_DPD_AUX_CH_DATA1 0xe4314 6680#define _PCH_DP_D 0xe4300
6614#define PCH_DPD_AUX_CH_DATA2 0xe4318 6681#define PCH_DP_D _MMIO(_PCH_DP_D)
6615#define PCH_DPD_AUX_CH_DATA3 0xe431c 6682#define _PCH_DPD_AUX_CH_CTL 0xe4310
6616#define PCH_DPD_AUX_CH_DATA4 0xe4320 6683#define _PCH_DPD_AUX_CH_DATA1 0xe4314
6617#define PCH_DPD_AUX_CH_DATA5 0xe4324 6684#define _PCH_DPD_AUX_CH_DATA2 0xe4318
6685#define _PCH_DPD_AUX_CH_DATA3 0xe431c
6686#define _PCH_DPD_AUX_CH_DATA4 0xe4320
6687#define _PCH_DPD_AUX_CH_DATA5 0xe4324
6688
6689#define PCH_DP_AUX_CH_CTL(port) _MMIO_PORT((port) - PORT_B, _PCH_DPB_AUX_CH_CTL, _PCH_DPC_AUX_CH_CTL)
6690#define PCH_DP_AUX_CH_DATA(port, i) _MMIO(_PORT((port) - PORT_B, _PCH_DPB_AUX_CH_DATA1, _PCH_DPC_AUX_CH_DATA1) + (i) * 4) /* 5 registers */
6618 6691
6619/* CPT */ 6692/* CPT */
6620#define PORT_TRANS_A_SEL_CPT 0 6693#define PORT_TRANS_A_SEL_CPT 0
@@ -6627,10 +6700,10 @@ enum skl_disp_power_wells {
6627#define SDVO_PORT_TO_PIPE_CHV(val) (((val) & (3<<24)) >> 24) 6700#define SDVO_PORT_TO_PIPE_CHV(val) (((val) & (3<<24)) >> 24)
6628#define DP_PORT_TO_PIPE_CHV(val) (((val) & (3<<16)) >> 16) 6701#define DP_PORT_TO_PIPE_CHV(val) (((val) & (3<<16)) >> 16)
6629 6702
6630#define TRANS_DP_CTL_A 0xe0300 6703#define _TRANS_DP_CTL_A 0xe0300
6631#define TRANS_DP_CTL_B 0xe1300 6704#define _TRANS_DP_CTL_B 0xe1300
6632#define TRANS_DP_CTL_C 0xe2300 6705#define _TRANS_DP_CTL_C 0xe2300
6633#define TRANS_DP_CTL(pipe) _PIPE(pipe, TRANS_DP_CTL_A, TRANS_DP_CTL_B) 6706#define TRANS_DP_CTL(pipe) _MMIO_PIPE(pipe, _TRANS_DP_CTL_A, _TRANS_DP_CTL_B)
6634#define TRANS_DP_OUTPUT_ENABLE (1<<31) 6707#define TRANS_DP_OUTPUT_ENABLE (1<<31)
6635#define TRANS_DP_PORT_SEL_B (0<<29) 6708#define TRANS_DP_PORT_SEL_B (0<<29)
6636#define TRANS_DP_PORT_SEL_C (1<<29) 6709#define TRANS_DP_PORT_SEL_C (1<<29)
@@ -6683,40 +6756,40 @@ enum skl_disp_power_wells {
6683 6756
6684#define EDP_LINK_TRAIN_VOL_EMP_MASK_IVB (0x3f<<22) 6757#define EDP_LINK_TRAIN_VOL_EMP_MASK_IVB (0x3f<<22)
6685 6758
6686#define VLV_PMWGICZ 0x1300a4 6759#define VLV_PMWGICZ _MMIO(0x1300a4)
6687 6760
6688#define FORCEWAKE 0xA18C 6761#define FORCEWAKE _MMIO(0xA18C)
6689#define FORCEWAKE_VLV 0x1300b0 6762#define FORCEWAKE_VLV _MMIO(0x1300b0)
6690#define FORCEWAKE_ACK_VLV 0x1300b4 6763#define FORCEWAKE_ACK_VLV _MMIO(0x1300b4)
6691#define FORCEWAKE_MEDIA_VLV 0x1300b8 6764#define FORCEWAKE_MEDIA_VLV _MMIO(0x1300b8)
6692#define FORCEWAKE_ACK_MEDIA_VLV 0x1300bc 6765#define FORCEWAKE_ACK_MEDIA_VLV _MMIO(0x1300bc)
6693#define FORCEWAKE_ACK_HSW 0x130044 6766#define FORCEWAKE_ACK_HSW _MMIO(0x130044)
6694#define FORCEWAKE_ACK 0x130090 6767#define FORCEWAKE_ACK _MMIO(0x130090)
6695#define VLV_GTLC_WAKE_CTRL 0x130090 6768#define VLV_GTLC_WAKE_CTRL _MMIO(0x130090)
6696#define VLV_GTLC_RENDER_CTX_EXISTS (1 << 25) 6769#define VLV_GTLC_RENDER_CTX_EXISTS (1 << 25)
6697#define VLV_GTLC_MEDIA_CTX_EXISTS (1 << 24) 6770#define VLV_GTLC_MEDIA_CTX_EXISTS (1 << 24)
6698#define VLV_GTLC_ALLOWWAKEREQ (1 << 0) 6771#define VLV_GTLC_ALLOWWAKEREQ (1 << 0)
6699 6772
6700#define VLV_GTLC_PW_STATUS 0x130094 6773#define VLV_GTLC_PW_STATUS _MMIO(0x130094)
6701#define VLV_GTLC_ALLOWWAKEACK (1 << 0) 6774#define VLV_GTLC_ALLOWWAKEACK (1 << 0)
6702#define VLV_GTLC_ALLOWWAKEERR (1 << 1) 6775#define VLV_GTLC_ALLOWWAKEERR (1 << 1)
6703#define VLV_GTLC_PW_MEDIA_STATUS_MASK (1 << 5) 6776#define VLV_GTLC_PW_MEDIA_STATUS_MASK (1 << 5)
6704#define VLV_GTLC_PW_RENDER_STATUS_MASK (1 << 7) 6777#define VLV_GTLC_PW_RENDER_STATUS_MASK (1 << 7)
6705#define FORCEWAKE_MT 0xa188 /* multi-threaded */ 6778#define FORCEWAKE_MT _MMIO(0xa188) /* multi-threaded */
6706#define FORCEWAKE_MEDIA_GEN9 0xa270 6779#define FORCEWAKE_MEDIA_GEN9 _MMIO(0xa270)
6707#define FORCEWAKE_RENDER_GEN9 0xa278 6780#define FORCEWAKE_RENDER_GEN9 _MMIO(0xa278)
6708#define FORCEWAKE_BLITTER_GEN9 0xa188 6781#define FORCEWAKE_BLITTER_GEN9 _MMIO(0xa188)
6709#define FORCEWAKE_ACK_MEDIA_GEN9 0x0D88 6782#define FORCEWAKE_ACK_MEDIA_GEN9 _MMIO(0x0D88)
6710#define FORCEWAKE_ACK_RENDER_GEN9 0x0D84 6783#define FORCEWAKE_ACK_RENDER_GEN9 _MMIO(0x0D84)
6711#define FORCEWAKE_ACK_BLITTER_GEN9 0x130044 6784#define FORCEWAKE_ACK_BLITTER_GEN9 _MMIO(0x130044)
6712#define FORCEWAKE_KERNEL 0x1 6785#define FORCEWAKE_KERNEL 0x1
6713#define FORCEWAKE_USER 0x2 6786#define FORCEWAKE_USER 0x2
6714#define FORCEWAKE_MT_ACK 0x130040 6787#define FORCEWAKE_MT_ACK _MMIO(0x130040)
6715#define ECOBUS 0xa180 6788#define ECOBUS _MMIO(0xa180)
6716#define FORCEWAKE_MT_ENABLE (1<<5) 6789#define FORCEWAKE_MT_ENABLE (1<<5)
6717#define VLV_SPAREG2H 0xA194 6790#define VLV_SPAREG2H _MMIO(0xA194)
6718 6791
6719#define GTFIFODBG 0x120000 6792#define GTFIFODBG _MMIO(0x120000)
6720#define GT_FIFO_SBDROPERR (1<<6) 6793#define GT_FIFO_SBDROPERR (1<<6)
6721#define GT_FIFO_BLOBDROPERR (1<<5) 6794#define GT_FIFO_BLOBDROPERR (1<<5)
6722#define GT_FIFO_SB_READ_ABORTERR (1<<4) 6795#define GT_FIFO_SB_READ_ABORTERR (1<<4)
@@ -6725,23 +6798,23 @@ enum skl_disp_power_wells {
6725#define GT_FIFO_IAWRERR (1<<1) 6798#define GT_FIFO_IAWRERR (1<<1)
6726#define GT_FIFO_IARDERR (1<<0) 6799#define GT_FIFO_IARDERR (1<<0)
6727 6800
6728#define GTFIFOCTL 0x120008 6801#define GTFIFOCTL _MMIO(0x120008)
6729#define GT_FIFO_FREE_ENTRIES_MASK 0x7f 6802#define GT_FIFO_FREE_ENTRIES_MASK 0x7f
6730#define GT_FIFO_NUM_RESERVED_ENTRIES 20 6803#define GT_FIFO_NUM_RESERVED_ENTRIES 20
6731#define GT_FIFO_CTL_BLOCK_ALL_POLICY_STALL (1 << 12) 6804#define GT_FIFO_CTL_BLOCK_ALL_POLICY_STALL (1 << 12)
6732#define GT_FIFO_CTL_RC6_POLICY_STALL (1 << 11) 6805#define GT_FIFO_CTL_RC6_POLICY_STALL (1 << 11)
6733 6806
6734#define HSW_IDICR 0x9008 6807#define HSW_IDICR _MMIO(0x9008)
6735#define IDIHASHMSK(x) (((x) & 0x3f) << 16) 6808#define IDIHASHMSK(x) (((x) & 0x3f) << 16)
6736#define HSW_EDRAM_PRESENT 0x120010 6809#define HSW_EDRAM_PRESENT _MMIO(0x120010)
6737#define EDRAM_ENABLED 0x1 6810#define EDRAM_ENABLED 0x1
6738 6811
6739#define GEN6_UCGCTL1 0x9400 6812#define GEN6_UCGCTL1 _MMIO(0x9400)
6740# define GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE (1 << 16) 6813# define GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE (1 << 16)
6741# define GEN6_BLBUNIT_CLOCK_GATE_DISABLE (1 << 5) 6814# define GEN6_BLBUNIT_CLOCK_GATE_DISABLE (1 << 5)
6742# define GEN6_CSUNIT_CLOCK_GATE_DISABLE (1 << 7) 6815# define GEN6_CSUNIT_CLOCK_GATE_DISABLE (1 << 7)
6743 6816
6744#define GEN6_UCGCTL2 0x9404 6817#define GEN6_UCGCTL2 _MMIO(0x9404)
6745# define GEN6_VFUNIT_CLOCK_GATE_DISABLE (1 << 31) 6818# define GEN6_VFUNIT_CLOCK_GATE_DISABLE (1 << 31)
6746# define GEN7_VDSUNIT_CLOCK_GATE_DISABLE (1 << 30) 6819# define GEN7_VDSUNIT_CLOCK_GATE_DISABLE (1 << 30)
6747# define GEN7_TDLUNIT_CLOCK_GATE_DISABLE (1 << 22) 6820# define GEN7_TDLUNIT_CLOCK_GATE_DISABLE (1 << 22)
@@ -6749,30 +6822,30 @@ enum skl_disp_power_wells {
6749# define GEN6_RCPBUNIT_CLOCK_GATE_DISABLE (1 << 12) 6822# define GEN6_RCPBUNIT_CLOCK_GATE_DISABLE (1 << 12)
6750# define GEN6_RCCUNIT_CLOCK_GATE_DISABLE (1 << 11) 6823# define GEN6_RCCUNIT_CLOCK_GATE_DISABLE (1 << 11)
6751 6824
6752#define GEN6_UCGCTL3 0x9408 6825#define GEN6_UCGCTL3 _MMIO(0x9408)
6753 6826
6754#define GEN7_UCGCTL4 0x940c 6827#define GEN7_UCGCTL4 _MMIO(0x940c)
6755#define GEN7_L3BANK2X_CLOCK_GATE_DISABLE (1<<25) 6828#define GEN7_L3BANK2X_CLOCK_GATE_DISABLE (1<<25)
6756 6829
6757#define GEN6_RCGCTL1 0x9410 6830#define GEN6_RCGCTL1 _MMIO(0x9410)
6758#define GEN6_RCGCTL2 0x9414 6831#define GEN6_RCGCTL2 _MMIO(0x9414)
6759#define GEN6_RSTCTL 0x9420 6832#define GEN6_RSTCTL _MMIO(0x9420)
6760 6833
6761#define GEN8_UCGCTL6 0x9430 6834#define GEN8_UCGCTL6 _MMIO(0x9430)
6762#define GEN8_GAPSUNIT_CLOCK_GATE_DISABLE (1<<24) 6835#define GEN8_GAPSUNIT_CLOCK_GATE_DISABLE (1<<24)
6763#define GEN8_SDEUNIT_CLOCK_GATE_DISABLE (1<<14) 6836#define GEN8_SDEUNIT_CLOCK_GATE_DISABLE (1<<14)
6764#define GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ (1<<28) 6837#define GEN8_HDCUNIT_CLOCK_GATE_DISABLE_HDCREQ (1<<28)
6765 6838
6766#define GEN6_GFXPAUSE 0xA000 6839#define GEN6_GFXPAUSE _MMIO(0xA000)
6767#define GEN6_RPNSWREQ 0xA008 6840#define GEN6_RPNSWREQ _MMIO(0xA008)
6768#define GEN6_TURBO_DISABLE (1<<31) 6841#define GEN6_TURBO_DISABLE (1<<31)
6769#define GEN6_FREQUENCY(x) ((x)<<25) 6842#define GEN6_FREQUENCY(x) ((x)<<25)
6770#define HSW_FREQUENCY(x) ((x)<<24) 6843#define HSW_FREQUENCY(x) ((x)<<24)
6771#define GEN9_FREQUENCY(x) ((x)<<23) 6844#define GEN9_FREQUENCY(x) ((x)<<23)
6772#define GEN6_OFFSET(x) ((x)<<19) 6845#define GEN6_OFFSET(x) ((x)<<19)
6773#define GEN6_AGGRESSIVE_TURBO (0<<15) 6846#define GEN6_AGGRESSIVE_TURBO (0<<15)
6774#define GEN6_RC_VIDEO_FREQ 0xA00C 6847#define GEN6_RC_VIDEO_FREQ _MMIO(0xA00C)
6775#define GEN6_RC_CONTROL 0xA090 6848#define GEN6_RC_CONTROL _MMIO(0xA090)
6776#define GEN6_RC_CTL_RC6pp_ENABLE (1<<16) 6849#define GEN6_RC_CTL_RC6pp_ENABLE (1<<16)
6777#define GEN6_RC_CTL_RC6p_ENABLE (1<<17) 6850#define GEN6_RC_CTL_RC6p_ENABLE (1<<17)
6778#define GEN6_RC_CTL_RC6_ENABLE (1<<18) 6851#define GEN6_RC_CTL_RC6_ENABLE (1<<18)
@@ -6782,16 +6855,16 @@ enum skl_disp_power_wells {
6782#define GEN7_RC_CTL_TO_MODE (1<<28) 6855#define GEN7_RC_CTL_TO_MODE (1<<28)
6783#define GEN6_RC_CTL_EI_MODE(x) ((x)<<27) 6856#define GEN6_RC_CTL_EI_MODE(x) ((x)<<27)
6784#define GEN6_RC_CTL_HW_ENABLE (1<<31) 6857#define GEN6_RC_CTL_HW_ENABLE (1<<31)
6785#define GEN6_RP_DOWN_TIMEOUT 0xA010 6858#define GEN6_RP_DOWN_TIMEOUT _MMIO(0xA010)
6786#define GEN6_RP_INTERRUPT_LIMITS 0xA014 6859#define GEN6_RP_INTERRUPT_LIMITS _MMIO(0xA014)
6787#define GEN6_RPSTAT1 0xA01C 6860#define GEN6_RPSTAT1 _MMIO(0xA01C)
6788#define GEN6_CAGF_SHIFT 8 6861#define GEN6_CAGF_SHIFT 8
6789#define HSW_CAGF_SHIFT 7 6862#define HSW_CAGF_SHIFT 7
6790#define GEN9_CAGF_SHIFT 23 6863#define GEN9_CAGF_SHIFT 23
6791#define GEN6_CAGF_MASK (0x7f << GEN6_CAGF_SHIFT) 6864#define GEN6_CAGF_MASK (0x7f << GEN6_CAGF_SHIFT)
6792#define HSW_CAGF_MASK (0x7f << HSW_CAGF_SHIFT) 6865#define HSW_CAGF_MASK (0x7f << HSW_CAGF_SHIFT)
6793#define GEN9_CAGF_MASK (0x1ff << GEN9_CAGF_SHIFT) 6866#define GEN9_CAGF_MASK (0x1ff << GEN9_CAGF_SHIFT)
6794#define GEN6_RP_CONTROL 0xA024 6867#define GEN6_RP_CONTROL _MMIO(0xA024)
6795#define GEN6_RP_MEDIA_TURBO (1<<11) 6868#define GEN6_RP_MEDIA_TURBO (1<<11)
6796#define GEN6_RP_MEDIA_MODE_MASK (3<<9) 6869#define GEN6_RP_MEDIA_MODE_MASK (3<<9)
6797#define GEN6_RP_MEDIA_HW_TURBO_MODE (3<<9) 6870#define GEN6_RP_MEDIA_HW_TURBO_MODE (3<<9)
@@ -6805,53 +6878,53 @@ enum skl_disp_power_wells {
6805#define GEN6_RP_UP_BUSY_CONT (0x4<<3) 6878#define GEN6_RP_UP_BUSY_CONT (0x4<<3)
6806#define GEN6_RP_DOWN_IDLE_AVG (0x2<<0) 6879#define GEN6_RP_DOWN_IDLE_AVG (0x2<<0)
6807#define GEN6_RP_DOWN_IDLE_CONT (0x1<<0) 6880#define GEN6_RP_DOWN_IDLE_CONT (0x1<<0)
6808#define GEN6_RP_UP_THRESHOLD 0xA02C 6881#define GEN6_RP_UP_THRESHOLD _MMIO(0xA02C)
6809#define GEN6_RP_DOWN_THRESHOLD 0xA030 6882#define GEN6_RP_DOWN_THRESHOLD _MMIO(0xA030)
6810#define GEN6_RP_CUR_UP_EI 0xA050 6883#define GEN6_RP_CUR_UP_EI _MMIO(0xA050)
6811#define GEN6_CURICONT_MASK 0xffffff 6884#define GEN6_CURICONT_MASK 0xffffff
6812#define GEN6_RP_CUR_UP 0xA054 6885#define GEN6_RP_CUR_UP _MMIO(0xA054)
6813#define GEN6_CURBSYTAVG_MASK 0xffffff 6886#define GEN6_CURBSYTAVG_MASK 0xffffff
6814#define GEN6_RP_PREV_UP 0xA058 6887#define GEN6_RP_PREV_UP _MMIO(0xA058)
6815#define GEN6_RP_CUR_DOWN_EI 0xA05C 6888#define GEN6_RP_CUR_DOWN_EI _MMIO(0xA05C)
6816#define GEN6_CURIAVG_MASK 0xffffff 6889#define GEN6_CURIAVG_MASK 0xffffff
6817#define GEN6_RP_CUR_DOWN 0xA060 6890#define GEN6_RP_CUR_DOWN _MMIO(0xA060)
6818#define GEN6_RP_PREV_DOWN 0xA064 6891#define GEN6_RP_PREV_DOWN _MMIO(0xA064)
6819#define GEN6_RP_UP_EI 0xA068 6892#define GEN6_RP_UP_EI _MMIO(0xA068)
6820#define GEN6_RP_DOWN_EI 0xA06C 6893#define GEN6_RP_DOWN_EI _MMIO(0xA06C)
6821#define GEN6_RP_IDLE_HYSTERSIS 0xA070 6894#define GEN6_RP_IDLE_HYSTERSIS _MMIO(0xA070)
6822#define GEN6_RPDEUHWTC 0xA080 6895#define GEN6_RPDEUHWTC _MMIO(0xA080)
6823#define GEN6_RPDEUC 0xA084 6896#define GEN6_RPDEUC _MMIO(0xA084)
6824#define GEN6_RPDEUCSW 0xA088 6897#define GEN6_RPDEUCSW _MMIO(0xA088)
6825#define GEN6_RC_STATE 0xA094 6898#define GEN6_RC_STATE _MMIO(0xA094)
6826#define GEN6_RC1_WAKE_RATE_LIMIT 0xA098 6899#define GEN6_RC1_WAKE_RATE_LIMIT _MMIO(0xA098)
6827#define GEN6_RC6_WAKE_RATE_LIMIT 0xA09C 6900#define GEN6_RC6_WAKE_RATE_LIMIT _MMIO(0xA09C)
6828#define GEN6_RC6pp_WAKE_RATE_LIMIT 0xA0A0 6901#define GEN6_RC6pp_WAKE_RATE_LIMIT _MMIO(0xA0A0)
6829#define GEN6_RC_EVALUATION_INTERVAL 0xA0A8 6902#define GEN6_RC_EVALUATION_INTERVAL _MMIO(0xA0A8)
6830#define GEN6_RC_IDLE_HYSTERSIS 0xA0AC 6903#define GEN6_RC_IDLE_HYSTERSIS _MMIO(0xA0AC)
6831#define GEN6_RC_SLEEP 0xA0B0 6904#define GEN6_RC_SLEEP _MMIO(0xA0B0)
6832#define GEN6_RCUBMABDTMR 0xA0B0 6905#define GEN6_RCUBMABDTMR _MMIO(0xA0B0)
6833#define GEN6_RC1e_THRESHOLD 0xA0B4 6906#define GEN6_RC1e_THRESHOLD _MMIO(0xA0B4)
6834#define GEN6_RC6_THRESHOLD 0xA0B8 6907#define GEN6_RC6_THRESHOLD _MMIO(0xA0B8)
6835#define GEN6_RC6p_THRESHOLD 0xA0BC 6908#define GEN6_RC6p_THRESHOLD _MMIO(0xA0BC)
6836#define VLV_RCEDATA 0xA0BC 6909#define VLV_RCEDATA _MMIO(0xA0BC)
6837#define GEN6_RC6pp_THRESHOLD 0xA0C0 6910#define GEN6_RC6pp_THRESHOLD _MMIO(0xA0C0)
6838#define GEN6_PMINTRMSK 0xA168 6911#define GEN6_PMINTRMSK _MMIO(0xA168)
6839#define GEN8_PMINTR_REDIRECT_TO_NON_DISP (1<<31) 6912#define GEN8_PMINTR_REDIRECT_TO_NON_DISP (1<<31)
6840#define VLV_PWRDWNUPCTL 0xA294 6913#define VLV_PWRDWNUPCTL _MMIO(0xA294)
6841#define GEN9_MEDIA_PG_IDLE_HYSTERESIS 0xA0C4 6914#define GEN9_MEDIA_PG_IDLE_HYSTERESIS _MMIO(0xA0C4)
6842#define GEN9_RENDER_PG_IDLE_HYSTERESIS 0xA0C8 6915#define GEN9_RENDER_PG_IDLE_HYSTERESIS _MMIO(0xA0C8)
6843#define GEN9_PG_ENABLE 0xA210 6916#define GEN9_PG_ENABLE _MMIO(0xA210)
6844#define GEN9_RENDER_PG_ENABLE (1<<0) 6917#define GEN9_RENDER_PG_ENABLE (1<<0)
6845#define GEN9_MEDIA_PG_ENABLE (1<<1) 6918#define GEN9_MEDIA_PG_ENABLE (1<<1)
6846 6919
6847#define VLV_CHICKEN_3 (VLV_DISPLAY_BASE + 0x7040C) 6920#define VLV_CHICKEN_3 _MMIO(VLV_DISPLAY_BASE + 0x7040C)
6848#define PIXEL_OVERLAP_CNT_MASK (3 << 30) 6921#define PIXEL_OVERLAP_CNT_MASK (3 << 30)
6849#define PIXEL_OVERLAP_CNT_SHIFT 30 6922#define PIXEL_OVERLAP_CNT_SHIFT 30
6850 6923
6851#define GEN6_PMISR 0x44020 6924#define GEN6_PMISR _MMIO(0x44020)
6852#define GEN6_PMIMR 0x44024 /* rps_lock */ 6925#define GEN6_PMIMR _MMIO(0x44024) /* rps_lock */
6853#define GEN6_PMIIR 0x44028 6926#define GEN6_PMIIR _MMIO(0x44028)
6854#define GEN6_PMIER 0x4402C 6927#define GEN6_PMIER _MMIO(0x4402C)
6855#define GEN6_PM_MBOX_EVENT (1<<25) 6928#define GEN6_PM_MBOX_EVENT (1<<25)
6856#define GEN6_PM_THERMAL_EVENT (1<<24) 6929#define GEN6_PM_THERMAL_EVENT (1<<24)
6857#define GEN6_PM_RP_DOWN_TIMEOUT (1<<6) 6930#define GEN6_PM_RP_DOWN_TIMEOUT (1<<6)
@@ -6863,30 +6936,30 @@ enum skl_disp_power_wells {
6863 GEN6_PM_RP_DOWN_THRESHOLD | \ 6936 GEN6_PM_RP_DOWN_THRESHOLD | \
6864 GEN6_PM_RP_DOWN_TIMEOUT) 6937 GEN6_PM_RP_DOWN_TIMEOUT)
6865 6938
6866#define GEN7_GT_SCRATCH(i) (0x4F100 + (i) * 4) 6939#define GEN7_GT_SCRATCH(i) _MMIO(0x4F100 + (i) * 4)
6867#define GEN7_GT_SCRATCH_REG_NUM 8 6940#define GEN7_GT_SCRATCH_REG_NUM 8
6868 6941
6869#define VLV_GTLC_SURVIVABILITY_REG 0x130098 6942#define VLV_GTLC_SURVIVABILITY_REG _MMIO(0x130098)
6870#define VLV_GFX_CLK_STATUS_BIT (1<<3) 6943#define VLV_GFX_CLK_STATUS_BIT (1<<3)
6871#define VLV_GFX_CLK_FORCE_ON_BIT (1<<2) 6944#define VLV_GFX_CLK_FORCE_ON_BIT (1<<2)
6872 6945
6873#define GEN6_GT_GFX_RC6_LOCKED 0x138104 6946#define GEN6_GT_GFX_RC6_LOCKED _MMIO(0x138104)
6874#define VLV_COUNTER_CONTROL 0x138104 6947#define VLV_COUNTER_CONTROL _MMIO(0x138104)
6875#define VLV_COUNT_RANGE_HIGH (1<<15) 6948#define VLV_COUNT_RANGE_HIGH (1<<15)
6876#define VLV_MEDIA_RC0_COUNT_EN (1<<5) 6949#define VLV_MEDIA_RC0_COUNT_EN (1<<5)
6877#define VLV_RENDER_RC0_COUNT_EN (1<<4) 6950#define VLV_RENDER_RC0_COUNT_EN (1<<4)
6878#define VLV_MEDIA_RC6_COUNT_EN (1<<1) 6951#define VLV_MEDIA_RC6_COUNT_EN (1<<1)
6879#define VLV_RENDER_RC6_COUNT_EN (1<<0) 6952#define VLV_RENDER_RC6_COUNT_EN (1<<0)
6880#define GEN6_GT_GFX_RC6 0x138108 6953#define GEN6_GT_GFX_RC6 _MMIO(0x138108)
6881#define VLV_GT_RENDER_RC6 0x138108 6954#define VLV_GT_RENDER_RC6 _MMIO(0x138108)
6882#define VLV_GT_MEDIA_RC6 0x13810C 6955#define VLV_GT_MEDIA_RC6 _MMIO(0x13810C)
6883 6956
6884#define GEN6_GT_GFX_RC6p 0x13810C 6957#define GEN6_GT_GFX_RC6p _MMIO(0x13810C)
6885#define GEN6_GT_GFX_RC6pp 0x138110 6958#define GEN6_GT_GFX_RC6pp _MMIO(0x138110)
6886#define VLV_RENDER_C0_COUNT 0x138118 6959#define VLV_RENDER_C0_COUNT _MMIO(0x138118)
6887#define VLV_MEDIA_C0_COUNT 0x13811C 6960#define VLV_MEDIA_C0_COUNT _MMIO(0x13811C)
6888 6961
6889#define GEN6_PCODE_MAILBOX 0x138124 6962#define GEN6_PCODE_MAILBOX _MMIO(0x138124)
6890#define GEN6_PCODE_READY (1<<31) 6963#define GEN6_PCODE_READY (1<<31)
6891#define GEN6_PCODE_WRITE_RC6VIDS 0x4 6964#define GEN6_PCODE_WRITE_RC6VIDS 0x4
6892#define GEN6_PCODE_READ_RC6VIDS 0x5 6965#define GEN6_PCODE_READ_RC6VIDS 0x5
@@ -6909,12 +6982,12 @@ enum skl_disp_power_wells {
6909#define HSW_PCODE_DE_WRITE_FREQ_REQ 0x17 6982#define HSW_PCODE_DE_WRITE_FREQ_REQ 0x17
6910#define DISPLAY_IPS_CONTROL 0x19 6983#define DISPLAY_IPS_CONTROL 0x19
6911#define HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL 0x1A 6984#define HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL 0x1A
6912#define GEN6_PCODE_DATA 0x138128 6985#define GEN6_PCODE_DATA _MMIO(0x138128)
6913#define GEN6_PCODE_FREQ_IA_RATIO_SHIFT 8 6986#define GEN6_PCODE_FREQ_IA_RATIO_SHIFT 8
6914#define GEN6_PCODE_FREQ_RING_RATIO_SHIFT 16 6987#define GEN6_PCODE_FREQ_RING_RATIO_SHIFT 16
6915#define GEN6_PCODE_DATA1 0x13812C 6988#define GEN6_PCODE_DATA1 _MMIO(0x13812C)
6916 6989
6917#define GEN6_GT_CORE_STATUS 0x138060 6990#define GEN6_GT_CORE_STATUS _MMIO(0x138060)
6918#define GEN6_CORE_CPD_STATE_MASK (7<<4) 6991#define GEN6_CORE_CPD_STATE_MASK (7<<4)
6919#define GEN6_RCn_MASK 7 6992#define GEN6_RCn_MASK 7
6920#define GEN6_RC0 0 6993#define GEN6_RC0 0
@@ -6922,26 +6995,26 @@ enum skl_disp_power_wells {
6922#define GEN6_RC6 3 6995#define GEN6_RC6 3
6923#define GEN6_RC7 4 6996#define GEN6_RC7 4
6924 6997
6925#define GEN8_GT_SLICE_INFO 0x138064 6998#define GEN8_GT_SLICE_INFO _MMIO(0x138064)
6926#define GEN8_LSLICESTAT_MASK 0x7 6999#define GEN8_LSLICESTAT_MASK 0x7
6927 7000
6928#define CHV_POWER_SS0_SIG1 0xa720 7001#define CHV_POWER_SS0_SIG1 _MMIO(0xa720)
6929#define CHV_POWER_SS1_SIG1 0xa728 7002#define CHV_POWER_SS1_SIG1 _MMIO(0xa728)
6930#define CHV_SS_PG_ENABLE (1<<1) 7003#define CHV_SS_PG_ENABLE (1<<1)
6931#define CHV_EU08_PG_ENABLE (1<<9) 7004#define CHV_EU08_PG_ENABLE (1<<9)
6932#define CHV_EU19_PG_ENABLE (1<<17) 7005#define CHV_EU19_PG_ENABLE (1<<17)
6933#define CHV_EU210_PG_ENABLE (1<<25) 7006#define CHV_EU210_PG_ENABLE (1<<25)
6934 7007
6935#define CHV_POWER_SS0_SIG2 0xa724 7008#define CHV_POWER_SS0_SIG2 _MMIO(0xa724)
6936#define CHV_POWER_SS1_SIG2 0xa72c 7009#define CHV_POWER_SS1_SIG2 _MMIO(0xa72c)
6937#define CHV_EU311_PG_ENABLE (1<<1) 7010#define CHV_EU311_PG_ENABLE (1<<1)
6938 7011
6939#define GEN9_SLICE_PGCTL_ACK(slice) (0x804c + (slice)*0x4) 7012#define GEN9_SLICE_PGCTL_ACK(slice) _MMIO(0x804c + (slice)*0x4)
6940#define GEN9_PGCTL_SLICE_ACK (1 << 0) 7013#define GEN9_PGCTL_SLICE_ACK (1 << 0)
6941#define GEN9_PGCTL_SS_ACK(subslice) (1 << (2 + (subslice)*2)) 7014#define GEN9_PGCTL_SS_ACK(subslice) (1 << (2 + (subslice)*2))
6942 7015
6943#define GEN9_SS01_EU_PGCTL_ACK(slice) (0x805c + (slice)*0x8) 7016#define GEN9_SS01_EU_PGCTL_ACK(slice) _MMIO(0x805c + (slice)*0x8)
6944#define GEN9_SS23_EU_PGCTL_ACK(slice) (0x8060 + (slice)*0x8) 7017#define GEN9_SS23_EU_PGCTL_ACK(slice) _MMIO(0x8060 + (slice)*0x8)
6945#define GEN9_PGCTL_SSA_EU08_ACK (1 << 0) 7018#define GEN9_PGCTL_SSA_EU08_ACK (1 << 0)
6946#define GEN9_PGCTL_SSA_EU19_ACK (1 << 2) 7019#define GEN9_PGCTL_SSA_EU19_ACK (1 << 2)
6947#define GEN9_PGCTL_SSA_EU210_ACK (1 << 4) 7020#define GEN9_PGCTL_SSA_EU210_ACK (1 << 4)
@@ -6951,18 +7024,17 @@ enum skl_disp_power_wells {
6951#define GEN9_PGCTL_SSB_EU210_ACK (1 << 12) 7024#define GEN9_PGCTL_SSB_EU210_ACK (1 << 12)
6952#define GEN9_PGCTL_SSB_EU311_ACK (1 << 14) 7025#define GEN9_PGCTL_SSB_EU311_ACK (1 << 14)
6953 7026
6954#define GEN7_MISCCPCTL (0x9424) 7027#define GEN7_MISCCPCTL _MMIO(0x9424)
6955#define GEN7_DOP_CLOCK_GATE_ENABLE (1<<0) 7028#define GEN7_DOP_CLOCK_GATE_ENABLE (1<<0)
6956#define GEN8_DOP_CLOCK_GATE_CFCLK_ENABLE (1<<2) 7029#define GEN8_DOP_CLOCK_GATE_CFCLK_ENABLE (1<<2)
6957#define GEN8_DOP_CLOCK_GATE_GUC_ENABLE (1<<4) 7030#define GEN8_DOP_CLOCK_GATE_GUC_ENABLE (1<<4)
6958#define GEN8_DOP_CLOCK_GATE_MEDIA_ENABLE (1<<6) 7031#define GEN8_DOP_CLOCK_GATE_MEDIA_ENABLE (1<<6)
6959 7032
6960#define GEN8_GARBCNTL 0xB004 7033#define GEN8_GARBCNTL _MMIO(0xB004)
6961#define GEN9_GAPS_TSV_CREDIT_DISABLE (1<<7) 7034#define GEN9_GAPS_TSV_CREDIT_DISABLE (1<<7)
6962 7035
6963/* IVYBRIDGE DPF */ 7036/* IVYBRIDGE DPF */
6964#define GEN7_L3CDERRST1 0xB008 /* L3CD Error Status 1 */ 7037#define GEN7_L3CDERRST1(slice) _MMIO(0xB008 + (slice) * 0x200) /* L3CD Error Status 1 */
6965#define HSW_L3CDERRST11 0xB208 /* L3CD Error Status register 1 slice 1 */
6966#define GEN7_L3CDERRST1_ROW_MASK (0x7ff<<14) 7038#define GEN7_L3CDERRST1_ROW_MASK (0x7ff<<14)
6967#define GEN7_PARITY_ERROR_VALID (1<<13) 7039#define GEN7_PARITY_ERROR_VALID (1<<13)
6968#define GEN7_L3CDERRST1_BANK_MASK (3<<11) 7040#define GEN7_L3CDERRST1_BANK_MASK (3<<11)
@@ -6975,119 +7047,102 @@ enum skl_disp_power_wells {
6975 ((reg & GEN7_L3CDERRST1_SUBBANK_MASK) >> 8) 7047 ((reg & GEN7_L3CDERRST1_SUBBANK_MASK) >> 8)
6976#define GEN7_L3CDERRST1_ENABLE (1<<7) 7048#define GEN7_L3CDERRST1_ENABLE (1<<7)
6977 7049
6978#define GEN7_L3LOG_BASE 0xB070 7050#define GEN7_L3LOG(slice, i) _MMIO(0xB070 + (slice) * 0x200 + (i) * 4)
6979#define HSW_L3LOG_BASE_SLICE1 0xB270
6980#define GEN7_L3LOG_SIZE 0x80 7051#define GEN7_L3LOG_SIZE 0x80
6981 7052
6982#define GEN7_HALF_SLICE_CHICKEN1 0xe100 /* IVB GT1 + VLV */ 7053#define GEN7_HALF_SLICE_CHICKEN1 _MMIO(0xe100) /* IVB GT1 + VLV */
6983#define GEN7_HALF_SLICE_CHICKEN1_GT2 0xf100 7054#define GEN7_HALF_SLICE_CHICKEN1_GT2 _MMIO(0xf100)
6984#define GEN7_MAX_PS_THREAD_DEP (8<<12) 7055#define GEN7_MAX_PS_THREAD_DEP (8<<12)
6985#define GEN7_SINGLE_SUBSCAN_DISPATCH_ENABLE (1<<10) 7056#define GEN7_SINGLE_SUBSCAN_DISPATCH_ENABLE (1<<10)
6986#define GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE (1<<4) 7057#define GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE (1<<4)
6987#define GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE (1<<3) 7058#define GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE (1<<3)
6988 7059
6989#define GEN9_HALF_SLICE_CHICKEN5 0xe188 7060#define GEN9_HALF_SLICE_CHICKEN5 _MMIO(0xe188)
6990#define GEN9_DG_MIRROR_FIX_ENABLE (1<<5) 7061#define GEN9_DG_MIRROR_FIX_ENABLE (1<<5)
6991#define GEN9_CCS_TLB_PREFETCH_ENABLE (1<<3) 7062#define GEN9_CCS_TLB_PREFETCH_ENABLE (1<<3)
6992 7063
6993#define GEN8_ROW_CHICKEN 0xe4f0 7064#define GEN8_ROW_CHICKEN _MMIO(0xe4f0)
6994#define PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE (1<<8) 7065#define PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE (1<<8)
6995#define STALL_DOP_GATING_DISABLE (1<<5) 7066#define STALL_DOP_GATING_DISABLE (1<<5)
6996 7067
6997#define GEN7_ROW_CHICKEN2 0xe4f4 7068#define GEN7_ROW_CHICKEN2 _MMIO(0xe4f4)
6998#define GEN7_ROW_CHICKEN2_GT2 0xf4f4 7069#define GEN7_ROW_CHICKEN2_GT2 _MMIO(0xf4f4)
6999#define DOP_CLOCK_GATING_DISABLE (1<<0) 7070#define DOP_CLOCK_GATING_DISABLE (1<<0)
7000 7071
7001#define HSW_ROW_CHICKEN3 0xe49c 7072#define HSW_ROW_CHICKEN3 _MMIO(0xe49c)
7002#define HSW_ROW_CHICKEN3_L3_GLOBAL_ATOMICS_DISABLE (1 << 6) 7073#define HSW_ROW_CHICKEN3_L3_GLOBAL_ATOMICS_DISABLE (1 << 6)
7003 7074
7004#define HALF_SLICE_CHICKEN2 0xe180 7075#define HALF_SLICE_CHICKEN2 _MMIO(0xe180)
7005#define GEN8_ST_PO_DISABLE (1<<13) 7076#define GEN8_ST_PO_DISABLE (1<<13)
7006 7077
7007#define HALF_SLICE_CHICKEN3 0xe184 7078#define HALF_SLICE_CHICKEN3 _MMIO(0xe184)
7008#define HSW_SAMPLE_C_PERFORMANCE (1<<9) 7079#define HSW_SAMPLE_C_PERFORMANCE (1<<9)
7009#define GEN8_CENTROID_PIXEL_OPT_DIS (1<<8) 7080#define GEN8_CENTROID_PIXEL_OPT_DIS (1<<8)
7010#define GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC (1<<5) 7081#define GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC (1<<5)
7011#define GEN8_SAMPLER_POWER_BYPASS_DIS (1<<1) 7082#define GEN8_SAMPLER_POWER_BYPASS_DIS (1<<1)
7012 7083
7013#define GEN9_HALF_SLICE_CHICKEN7 0xe194 7084#define GEN9_HALF_SLICE_CHICKEN7 _MMIO(0xe194)
7014#define GEN9_ENABLE_YV12_BUGFIX (1<<4) 7085#define GEN9_ENABLE_YV12_BUGFIX (1<<4)
7015 7086
7016/* Audio */ 7087/* Audio */
7017#define G4X_AUD_VID_DID (dev_priv->info.display_mmio_offset + 0x62020) 7088#define G4X_AUD_VID_DID _MMIO(dev_priv->info.display_mmio_offset + 0x62020)
7018#define INTEL_AUDIO_DEVCL 0x808629FB 7089#define INTEL_AUDIO_DEVCL 0x808629FB
7019#define INTEL_AUDIO_DEVBLC 0x80862801 7090#define INTEL_AUDIO_DEVBLC 0x80862801
7020#define INTEL_AUDIO_DEVCTG 0x80862802 7091#define INTEL_AUDIO_DEVCTG 0x80862802
7021 7092
7022#define G4X_AUD_CNTL_ST 0x620B4 7093#define G4X_AUD_CNTL_ST _MMIO(0x620B4)
7023#define G4X_ELDV_DEVCL_DEVBLC (1 << 13) 7094#define G4X_ELDV_DEVCL_DEVBLC (1 << 13)
7024#define G4X_ELDV_DEVCTG (1 << 14) 7095#define G4X_ELDV_DEVCTG (1 << 14)
7025#define G4X_ELD_ADDR_MASK (0xf << 5) 7096#define G4X_ELD_ADDR_MASK (0xf << 5)
7026#define G4X_ELD_ACK (1 << 4) 7097#define G4X_ELD_ACK (1 << 4)
7027#define G4X_HDMIW_HDMIEDID 0x6210C 7098#define G4X_HDMIW_HDMIEDID _MMIO(0x6210C)
7028 7099
7029#define _IBX_HDMIW_HDMIEDID_A 0xE2050 7100#define _IBX_HDMIW_HDMIEDID_A 0xE2050
7030#define _IBX_HDMIW_HDMIEDID_B 0xE2150 7101#define _IBX_HDMIW_HDMIEDID_B 0xE2150
7031#define IBX_HDMIW_HDMIEDID(pipe) _PIPE(pipe, \ 7102#define IBX_HDMIW_HDMIEDID(pipe) _MMIO_PIPE(pipe, _IBX_HDMIW_HDMIEDID_A, \
7032 _IBX_HDMIW_HDMIEDID_A, \ 7103 _IBX_HDMIW_HDMIEDID_B)
7033 _IBX_HDMIW_HDMIEDID_B)
7034#define _IBX_AUD_CNTL_ST_A 0xE20B4 7104#define _IBX_AUD_CNTL_ST_A 0xE20B4
7035#define _IBX_AUD_CNTL_ST_B 0xE21B4 7105#define _IBX_AUD_CNTL_ST_B 0xE21B4
7036#define IBX_AUD_CNTL_ST(pipe) _PIPE(pipe, \ 7106#define IBX_AUD_CNTL_ST(pipe) _MMIO_PIPE(pipe, _IBX_AUD_CNTL_ST_A, \
7037 _IBX_AUD_CNTL_ST_A, \ 7107 _IBX_AUD_CNTL_ST_B)
7038 _IBX_AUD_CNTL_ST_B)
7039#define IBX_ELD_BUFFER_SIZE_MASK (0x1f << 10) 7108#define IBX_ELD_BUFFER_SIZE_MASK (0x1f << 10)
7040#define IBX_ELD_ADDRESS_MASK (0x1f << 5) 7109#define IBX_ELD_ADDRESS_MASK (0x1f << 5)
7041#define IBX_ELD_ACK (1 << 4) 7110#define IBX_ELD_ACK (1 << 4)
7042#define IBX_AUD_CNTL_ST2 0xE20C0 7111#define IBX_AUD_CNTL_ST2 _MMIO(0xE20C0)
7043#define IBX_CP_READY(port) ((1 << 1) << (((port) - 1) * 4)) 7112#define IBX_CP_READY(port) ((1 << 1) << (((port) - 1) * 4))
7044#define IBX_ELD_VALID(port) ((1 << 0) << (((port) - 1) * 4)) 7113#define IBX_ELD_VALID(port) ((1 << 0) << (((port) - 1) * 4))
7045 7114
7046#define _CPT_HDMIW_HDMIEDID_A 0xE5050 7115#define _CPT_HDMIW_HDMIEDID_A 0xE5050
7047#define _CPT_HDMIW_HDMIEDID_B 0xE5150 7116#define _CPT_HDMIW_HDMIEDID_B 0xE5150
7048#define CPT_HDMIW_HDMIEDID(pipe) _PIPE(pipe, \ 7117#define CPT_HDMIW_HDMIEDID(pipe) _MMIO_PIPE(pipe, _CPT_HDMIW_HDMIEDID_A, _CPT_HDMIW_HDMIEDID_B)
7049 _CPT_HDMIW_HDMIEDID_A, \
7050 _CPT_HDMIW_HDMIEDID_B)
7051#define _CPT_AUD_CNTL_ST_A 0xE50B4 7118#define _CPT_AUD_CNTL_ST_A 0xE50B4
7052#define _CPT_AUD_CNTL_ST_B 0xE51B4 7119#define _CPT_AUD_CNTL_ST_B 0xE51B4
7053#define CPT_AUD_CNTL_ST(pipe) _PIPE(pipe, \ 7120#define CPT_AUD_CNTL_ST(pipe) _MMIO_PIPE(pipe, _CPT_AUD_CNTL_ST_A, _CPT_AUD_CNTL_ST_B)
7054 _CPT_AUD_CNTL_ST_A, \ 7121#define CPT_AUD_CNTRL_ST2 _MMIO(0xE50C0)
7055 _CPT_AUD_CNTL_ST_B)
7056#define CPT_AUD_CNTRL_ST2 0xE50C0
7057 7122
7058#define _VLV_HDMIW_HDMIEDID_A (VLV_DISPLAY_BASE + 0x62050) 7123#define _VLV_HDMIW_HDMIEDID_A (VLV_DISPLAY_BASE + 0x62050)
7059#define _VLV_HDMIW_HDMIEDID_B (VLV_DISPLAY_BASE + 0x62150) 7124#define _VLV_HDMIW_HDMIEDID_B (VLV_DISPLAY_BASE + 0x62150)
7060#define VLV_HDMIW_HDMIEDID(pipe) _PIPE(pipe, \ 7125#define VLV_HDMIW_HDMIEDID(pipe) _MMIO_PIPE(pipe, _VLV_HDMIW_HDMIEDID_A, _VLV_HDMIW_HDMIEDID_B)
7061 _VLV_HDMIW_HDMIEDID_A, \
7062 _VLV_HDMIW_HDMIEDID_B)
7063#define _VLV_AUD_CNTL_ST_A (VLV_DISPLAY_BASE + 0x620B4) 7126#define _VLV_AUD_CNTL_ST_A (VLV_DISPLAY_BASE + 0x620B4)
7064#define _VLV_AUD_CNTL_ST_B (VLV_DISPLAY_BASE + 0x621B4) 7127#define _VLV_AUD_CNTL_ST_B (VLV_DISPLAY_BASE + 0x621B4)
7065#define VLV_AUD_CNTL_ST(pipe) _PIPE(pipe, \ 7128#define VLV_AUD_CNTL_ST(pipe) _MMIO_PIPE(pipe, _VLV_AUD_CNTL_ST_A, _VLV_AUD_CNTL_ST_B)
7066 _VLV_AUD_CNTL_ST_A, \ 7129#define VLV_AUD_CNTL_ST2 _MMIO(VLV_DISPLAY_BASE + 0x620C0)
7067 _VLV_AUD_CNTL_ST_B)
7068#define VLV_AUD_CNTL_ST2 (VLV_DISPLAY_BASE + 0x620C0)
7069 7130
7070/* These are the 4 32-bit write offset registers for each stream 7131/* These are the 4 32-bit write offset registers for each stream
7071 * output buffer. It determines the offset from the 7132 * output buffer. It determines the offset from the
7072 * 3DSTATE_SO_BUFFERs that the next streamed vertex output goes to. 7133 * 3DSTATE_SO_BUFFERs that the next streamed vertex output goes to.
7073 */ 7134 */
7074#define GEN7_SO_WRITE_OFFSET(n) (0x5280 + (n) * 4) 7135#define GEN7_SO_WRITE_OFFSET(n) _MMIO(0x5280 + (n) * 4)
7075 7136
7076#define _IBX_AUD_CONFIG_A 0xe2000 7137#define _IBX_AUD_CONFIG_A 0xe2000
7077#define _IBX_AUD_CONFIG_B 0xe2100 7138#define _IBX_AUD_CONFIG_B 0xe2100
7078#define IBX_AUD_CFG(pipe) _PIPE(pipe, \ 7139#define IBX_AUD_CFG(pipe) _MMIO_PIPE(pipe, _IBX_AUD_CONFIG_A, _IBX_AUD_CONFIG_B)
7079 _IBX_AUD_CONFIG_A, \
7080 _IBX_AUD_CONFIG_B)
7081#define _CPT_AUD_CONFIG_A 0xe5000 7140#define _CPT_AUD_CONFIG_A 0xe5000
7082#define _CPT_AUD_CONFIG_B 0xe5100 7141#define _CPT_AUD_CONFIG_B 0xe5100
7083#define CPT_AUD_CFG(pipe) _PIPE(pipe, \ 7142#define CPT_AUD_CFG(pipe) _MMIO_PIPE(pipe, _CPT_AUD_CONFIG_A, _CPT_AUD_CONFIG_B)
7084 _CPT_AUD_CONFIG_A, \
7085 _CPT_AUD_CONFIG_B)
7086#define _VLV_AUD_CONFIG_A (VLV_DISPLAY_BASE + 0x62000) 7143#define _VLV_AUD_CONFIG_A (VLV_DISPLAY_BASE + 0x62000)
7087#define _VLV_AUD_CONFIG_B (VLV_DISPLAY_BASE + 0x62100) 7144#define _VLV_AUD_CONFIG_B (VLV_DISPLAY_BASE + 0x62100)
7088#define VLV_AUD_CFG(pipe) _PIPE(pipe, \ 7145#define VLV_AUD_CFG(pipe) _MMIO_PIPE(pipe, _VLV_AUD_CONFIG_A, _VLV_AUD_CONFIG_B)
7089 _VLV_AUD_CONFIG_A, \
7090 _VLV_AUD_CONFIG_B)
7091 7146
7092#define AUD_CONFIG_N_VALUE_INDEX (1 << 29) 7147#define AUD_CONFIG_N_VALUE_INDEX (1 << 29)
7093#define AUD_CONFIG_N_PROG_ENABLE (1 << 28) 7148#define AUD_CONFIG_N_PROG_ENABLE (1 << 28)
@@ -7112,72 +7167,62 @@ enum skl_disp_power_wells {
7112/* HSW Audio */ 7167/* HSW Audio */
7113#define _HSW_AUD_CONFIG_A 0x65000 7168#define _HSW_AUD_CONFIG_A 0x65000
7114#define _HSW_AUD_CONFIG_B 0x65100 7169#define _HSW_AUD_CONFIG_B 0x65100
7115#define HSW_AUD_CFG(pipe) _PIPE(pipe, \ 7170#define HSW_AUD_CFG(pipe) _MMIO_PIPE(pipe, _HSW_AUD_CONFIG_A, _HSW_AUD_CONFIG_B)
7116 _HSW_AUD_CONFIG_A, \
7117 _HSW_AUD_CONFIG_B)
7118 7171
7119#define _HSW_AUD_MISC_CTRL_A 0x65010 7172#define _HSW_AUD_MISC_CTRL_A 0x65010
7120#define _HSW_AUD_MISC_CTRL_B 0x65110 7173#define _HSW_AUD_MISC_CTRL_B 0x65110
7121#define HSW_AUD_MISC_CTRL(pipe) _PIPE(pipe, \ 7174#define HSW_AUD_MISC_CTRL(pipe) _MMIO_PIPE(pipe, _HSW_AUD_MISC_CTRL_A, _HSW_AUD_MISC_CTRL_B)
7122 _HSW_AUD_MISC_CTRL_A, \
7123 _HSW_AUD_MISC_CTRL_B)
7124 7175
7125#define _HSW_AUD_DIP_ELD_CTRL_ST_A 0x650b4 7176#define _HSW_AUD_DIP_ELD_CTRL_ST_A 0x650b4
7126#define _HSW_AUD_DIP_ELD_CTRL_ST_B 0x651b4 7177#define _HSW_AUD_DIP_ELD_CTRL_ST_B 0x651b4
7127#define HSW_AUD_DIP_ELD_CTRL(pipe) _PIPE(pipe, \ 7178#define HSW_AUD_DIP_ELD_CTRL(pipe) _MMIO_PIPE(pipe, _HSW_AUD_DIP_ELD_CTRL_ST_A, _HSW_AUD_DIP_ELD_CTRL_ST_B)
7128 _HSW_AUD_DIP_ELD_CTRL_ST_A, \
7129 _HSW_AUD_DIP_ELD_CTRL_ST_B)
7130 7179
7131/* Audio Digital Converter */ 7180/* Audio Digital Converter */
7132#define _HSW_AUD_DIG_CNVT_1 0x65080 7181#define _HSW_AUD_DIG_CNVT_1 0x65080
7133#define _HSW_AUD_DIG_CNVT_2 0x65180 7182#define _HSW_AUD_DIG_CNVT_2 0x65180
7134#define AUD_DIG_CNVT(pipe) _PIPE(pipe, \ 7183#define AUD_DIG_CNVT(pipe) _MMIO_PIPE(pipe, _HSW_AUD_DIG_CNVT_1, _HSW_AUD_DIG_CNVT_2)
7135 _HSW_AUD_DIG_CNVT_1, \
7136 _HSW_AUD_DIG_CNVT_2)
7137#define DIP_PORT_SEL_MASK 0x3 7184#define DIP_PORT_SEL_MASK 0x3
7138 7185
7139#define _HSW_AUD_EDID_DATA_A 0x65050 7186#define _HSW_AUD_EDID_DATA_A 0x65050
7140#define _HSW_AUD_EDID_DATA_B 0x65150 7187#define _HSW_AUD_EDID_DATA_B 0x65150
7141#define HSW_AUD_EDID_DATA(pipe) _PIPE(pipe, \ 7188#define HSW_AUD_EDID_DATA(pipe) _MMIO_PIPE(pipe, _HSW_AUD_EDID_DATA_A, _HSW_AUD_EDID_DATA_B)
7142 _HSW_AUD_EDID_DATA_A, \
7143 _HSW_AUD_EDID_DATA_B)
7144 7189
7145#define HSW_AUD_PIPE_CONV_CFG 0x6507c 7190#define HSW_AUD_PIPE_CONV_CFG _MMIO(0x6507c)
7146#define HSW_AUD_PIN_ELD_CP_VLD 0x650c0 7191#define HSW_AUD_PIN_ELD_CP_VLD _MMIO(0x650c0)
7147#define AUDIO_INACTIVE(trans) ((1 << 3) << ((trans) * 4)) 7192#define AUDIO_INACTIVE(trans) ((1 << 3) << ((trans) * 4))
7148#define AUDIO_OUTPUT_ENABLE(trans) ((1 << 2) << ((trans) * 4)) 7193#define AUDIO_OUTPUT_ENABLE(trans) ((1 << 2) << ((trans) * 4))
7149#define AUDIO_CP_READY(trans) ((1 << 1) << ((trans) * 4)) 7194#define AUDIO_CP_READY(trans) ((1 << 1) << ((trans) * 4))
7150#define AUDIO_ELD_VALID(trans) ((1 << 0) << ((trans) * 4)) 7195#define AUDIO_ELD_VALID(trans) ((1 << 0) << ((trans) * 4))
7151 7196
7152#define HSW_AUD_CHICKENBIT 0x65f10 7197#define HSW_AUD_CHICKENBIT _MMIO(0x65f10)
7153#define SKL_AUD_CODEC_WAKE_SIGNAL (1 << 15) 7198#define SKL_AUD_CODEC_WAKE_SIGNAL (1 << 15)
7154 7199
7155/* HSW Power Wells */ 7200/* HSW Power Wells */
7156#define HSW_PWR_WELL_BIOS 0x45400 /* CTL1 */ 7201#define HSW_PWR_WELL_BIOS _MMIO(0x45400) /* CTL1 */
7157#define HSW_PWR_WELL_DRIVER 0x45404 /* CTL2 */ 7202#define HSW_PWR_WELL_DRIVER _MMIO(0x45404) /* CTL2 */
7158#define HSW_PWR_WELL_KVMR 0x45408 /* CTL3 */ 7203#define HSW_PWR_WELL_KVMR _MMIO(0x45408) /* CTL3 */
7159#define HSW_PWR_WELL_DEBUG 0x4540C /* CTL4 */ 7204#define HSW_PWR_WELL_DEBUG _MMIO(0x4540C) /* CTL4 */
7160#define HSW_PWR_WELL_ENABLE_REQUEST (1<<31) 7205#define HSW_PWR_WELL_ENABLE_REQUEST (1<<31)
7161#define HSW_PWR_WELL_STATE_ENABLED (1<<30) 7206#define HSW_PWR_WELL_STATE_ENABLED (1<<30)
7162#define HSW_PWR_WELL_CTL5 0x45410 7207#define HSW_PWR_WELL_CTL5 _MMIO(0x45410)
7163#define HSW_PWR_WELL_ENABLE_SINGLE_STEP (1<<31) 7208#define HSW_PWR_WELL_ENABLE_SINGLE_STEP (1<<31)
7164#define HSW_PWR_WELL_PWR_GATE_OVERRIDE (1<<20) 7209#define HSW_PWR_WELL_PWR_GATE_OVERRIDE (1<<20)
7165#define HSW_PWR_WELL_FORCE_ON (1<<19) 7210#define HSW_PWR_WELL_FORCE_ON (1<<19)
7166#define HSW_PWR_WELL_CTL6 0x45414 7211#define HSW_PWR_WELL_CTL6 _MMIO(0x45414)
7167 7212
7168/* SKL Fuse Status */ 7213/* SKL Fuse Status */
7169#define SKL_FUSE_STATUS 0x42000 7214#define SKL_FUSE_STATUS _MMIO(0x42000)
7170#define SKL_FUSE_DOWNLOAD_STATUS (1<<31) 7215#define SKL_FUSE_DOWNLOAD_STATUS (1<<31)
7171#define SKL_FUSE_PG0_DIST_STATUS (1<<27) 7216#define SKL_FUSE_PG0_DIST_STATUS (1<<27)
7172#define SKL_FUSE_PG1_DIST_STATUS (1<<26) 7217#define SKL_FUSE_PG1_DIST_STATUS (1<<26)
7173#define SKL_FUSE_PG2_DIST_STATUS (1<<25) 7218#define SKL_FUSE_PG2_DIST_STATUS (1<<25)
7174 7219
7175/* Per-pipe DDI Function Control */ 7220/* Per-pipe DDI Function Control */
7176#define TRANS_DDI_FUNC_CTL_A 0x60400 7221#define _TRANS_DDI_FUNC_CTL_A 0x60400
7177#define TRANS_DDI_FUNC_CTL_B 0x61400 7222#define _TRANS_DDI_FUNC_CTL_B 0x61400
7178#define TRANS_DDI_FUNC_CTL_C 0x62400 7223#define _TRANS_DDI_FUNC_CTL_C 0x62400
7179#define TRANS_DDI_FUNC_CTL_EDP 0x6F400 7224#define _TRANS_DDI_FUNC_CTL_EDP 0x6F400
7180#define TRANS_DDI_FUNC_CTL(tran) _TRANSCODER2(tran, TRANS_DDI_FUNC_CTL_A) 7225#define TRANS_DDI_FUNC_CTL(tran) _MMIO_TRANS2(tran, _TRANS_DDI_FUNC_CTL_A)
7181 7226
7182#define TRANS_DDI_FUNC_ENABLE (1<<31) 7227#define TRANS_DDI_FUNC_ENABLE (1<<31)
7183/* Those bits are ignored by pipe EDP since it can only connect to DDI A */ 7228/* Those bits are ignored by pipe EDP since it can only connect to DDI A */
@@ -7207,9 +7252,9 @@ enum skl_disp_power_wells {
7207#define TRANS_DDI_BFI_ENABLE (1<<4) 7252#define TRANS_DDI_BFI_ENABLE (1<<4)
7208 7253
7209/* DisplayPort Transport Control */ 7254/* DisplayPort Transport Control */
7210#define DP_TP_CTL_A 0x64040 7255#define _DP_TP_CTL_A 0x64040
7211#define DP_TP_CTL_B 0x64140 7256#define _DP_TP_CTL_B 0x64140
7212#define DP_TP_CTL(port) _PORT(port, DP_TP_CTL_A, DP_TP_CTL_B) 7257#define DP_TP_CTL(port) _MMIO_PORT(port, _DP_TP_CTL_A, _DP_TP_CTL_B)
7213#define DP_TP_CTL_ENABLE (1<<31) 7258#define DP_TP_CTL_ENABLE (1<<31)
7214#define DP_TP_CTL_MODE_SST (0<<27) 7259#define DP_TP_CTL_MODE_SST (0<<27)
7215#define DP_TP_CTL_MODE_MST (1<<27) 7260#define DP_TP_CTL_MODE_MST (1<<27)
@@ -7225,9 +7270,9 @@ enum skl_disp_power_wells {
7225#define DP_TP_CTL_SCRAMBLE_DISABLE (1<<7) 7270#define DP_TP_CTL_SCRAMBLE_DISABLE (1<<7)
7226 7271
7227/* DisplayPort Transport Status */ 7272/* DisplayPort Transport Status */
7228#define DP_TP_STATUS_A 0x64044 7273#define _DP_TP_STATUS_A 0x64044
7229#define DP_TP_STATUS_B 0x64144 7274#define _DP_TP_STATUS_B 0x64144
7230#define DP_TP_STATUS(port) _PORT(port, DP_TP_STATUS_A, DP_TP_STATUS_B) 7275#define DP_TP_STATUS(port) _MMIO_PORT(port, _DP_TP_STATUS_A, _DP_TP_STATUS_B)
7231#define DP_TP_STATUS_IDLE_DONE (1<<25) 7276#define DP_TP_STATUS_IDLE_DONE (1<<25)
7232#define DP_TP_STATUS_ACT_SENT (1<<24) 7277#define DP_TP_STATUS_ACT_SENT (1<<24)
7233#define DP_TP_STATUS_MODE_STATUS_MST (1<<23) 7278#define DP_TP_STATUS_MODE_STATUS_MST (1<<23)
@@ -7237,9 +7282,9 @@ enum skl_disp_power_wells {
7237#define DP_TP_STATUS_PAYLOAD_MAPPING_VC0 (3 << 0) 7282#define DP_TP_STATUS_PAYLOAD_MAPPING_VC0 (3 << 0)
7238 7283
7239/* DDI Buffer Control */ 7284/* DDI Buffer Control */
7240#define DDI_BUF_CTL_A 0x64000 7285#define _DDI_BUF_CTL_A 0x64000
7241#define DDI_BUF_CTL_B 0x64100 7286#define _DDI_BUF_CTL_B 0x64100
7242#define DDI_BUF_CTL(port) _PORT(port, DDI_BUF_CTL_A, DDI_BUF_CTL_B) 7287#define DDI_BUF_CTL(port) _MMIO_PORT(port, _DDI_BUF_CTL_A, _DDI_BUF_CTL_B)
7243#define DDI_BUF_CTL_ENABLE (1<<31) 7288#define DDI_BUF_CTL_ENABLE (1<<31)
7244#define DDI_BUF_TRANS_SELECT(n) ((n) << 24) 7289#define DDI_BUF_TRANS_SELECT(n) ((n) << 24)
7245#define DDI_BUF_EMP_MASK (0xf<<24) 7290#define DDI_BUF_EMP_MASK (0xf<<24)
@@ -7252,17 +7297,17 @@ enum skl_disp_power_wells {
7252#define DDI_INIT_DISPLAY_DETECTED (1<<0) 7297#define DDI_INIT_DISPLAY_DETECTED (1<<0)
7253 7298
7254/* DDI Buffer Translations */ 7299/* DDI Buffer Translations */
7255#define DDI_BUF_TRANS_A 0x64E00 7300#define _DDI_BUF_TRANS_A 0x64E00
7256#define DDI_BUF_TRANS_B 0x64E60 7301#define _DDI_BUF_TRANS_B 0x64E60
7257#define DDI_BUF_TRANS_LO(port, i) (_PORT(port, DDI_BUF_TRANS_A, DDI_BUF_TRANS_B) + (i) * 8) 7302#define DDI_BUF_TRANS_LO(port, i) _MMIO(_PORT(port, _DDI_BUF_TRANS_A, _DDI_BUF_TRANS_B) + (i) * 8)
7258#define DDI_BUF_TRANS_HI(port, i) (_PORT(port, DDI_BUF_TRANS_A, DDI_BUF_TRANS_B) + (i) * 8 + 4) 7303#define DDI_BUF_TRANS_HI(port, i) _MMIO(_PORT(port, _DDI_BUF_TRANS_A, _DDI_BUF_TRANS_B) + (i) * 8 + 4)
7259 7304
7260/* Sideband Interface (SBI) is programmed indirectly, via 7305/* Sideband Interface (SBI) is programmed indirectly, via
7261 * SBI_ADDR, which contains the register offset; and SBI_DATA, 7306 * SBI_ADDR, which contains the register offset; and SBI_DATA,
7262 * which contains the payload */ 7307 * which contains the payload */
7263#define SBI_ADDR 0xC6000 7308#define SBI_ADDR _MMIO(0xC6000)
7264#define SBI_DATA 0xC6004 7309#define SBI_DATA _MMIO(0xC6004)
7265#define SBI_CTL_STAT 0xC6008 7310#define SBI_CTL_STAT _MMIO(0xC6008)
7266#define SBI_CTL_DEST_ICLK (0x0<<16) 7311#define SBI_CTL_DEST_ICLK (0x0<<16)
7267#define SBI_CTL_DEST_MPHY (0x1<<16) 7312#define SBI_CTL_DEST_MPHY (0x1<<16)
7268#define SBI_CTL_OP_IORD (0x2<<8) 7313#define SBI_CTL_OP_IORD (0x2<<8)
@@ -7293,12 +7338,12 @@ enum skl_disp_power_wells {
7293#define SBI_GEN0_CFG_BUFFENABLE_DISABLE (1<<0) 7338#define SBI_GEN0_CFG_BUFFENABLE_DISABLE (1<<0)
7294 7339
7295/* LPT PIXCLK_GATE */ 7340/* LPT PIXCLK_GATE */
7296#define PIXCLK_GATE 0xC6020 7341#define PIXCLK_GATE _MMIO(0xC6020)
7297#define PIXCLK_GATE_UNGATE (1<<0) 7342#define PIXCLK_GATE_UNGATE (1<<0)
7298#define PIXCLK_GATE_GATE (0<<0) 7343#define PIXCLK_GATE_GATE (0<<0)
7299 7344
7300/* SPLL */ 7345/* SPLL */
7301#define SPLL_CTL 0x46020 7346#define SPLL_CTL _MMIO(0x46020)
7302#define SPLL_PLL_ENABLE (1<<31) 7347#define SPLL_PLL_ENABLE (1<<31)
7303#define SPLL_PLL_SSC (1<<28) 7348#define SPLL_PLL_SSC (1<<28)
7304#define SPLL_PLL_NON_SSC (2<<28) 7349#define SPLL_PLL_NON_SSC (2<<28)
@@ -7310,9 +7355,9 @@ enum skl_disp_power_wells {
7310#define SPLL_PLL_FREQ_MASK (3<<26) 7355#define SPLL_PLL_FREQ_MASK (3<<26)
7311 7356
7312/* WRPLL */ 7357/* WRPLL */
7313#define WRPLL_CTL1 0x46040 7358#define _WRPLL_CTL1 0x46040
7314#define WRPLL_CTL2 0x46060 7359#define _WRPLL_CTL2 0x46060
7315#define WRPLL_CTL(pll) (pll == 0 ? WRPLL_CTL1 : WRPLL_CTL2) 7360#define WRPLL_CTL(pll) _MMIO_PIPE(pll, _WRPLL_CTL1, _WRPLL_CTL2)
7316#define WRPLL_PLL_ENABLE (1<<31) 7361#define WRPLL_PLL_ENABLE (1<<31)
7317#define WRPLL_PLL_SSC (1<<28) 7362#define WRPLL_PLL_SSC (1<<28)
7318#define WRPLL_PLL_NON_SSC (2<<28) 7363#define WRPLL_PLL_NON_SSC (2<<28)
@@ -7329,9 +7374,9 @@ enum skl_disp_power_wells {
7329#define WRPLL_DIVIDER_FB_MASK (0xff<<16) 7374#define WRPLL_DIVIDER_FB_MASK (0xff<<16)
7330 7375
7331/* Port clock selection */ 7376/* Port clock selection */
7332#define PORT_CLK_SEL_A 0x46100 7377#define _PORT_CLK_SEL_A 0x46100
7333#define PORT_CLK_SEL_B 0x46104 7378#define _PORT_CLK_SEL_B 0x46104
7334#define PORT_CLK_SEL(port) _PORT(port, PORT_CLK_SEL_A, PORT_CLK_SEL_B) 7379#define PORT_CLK_SEL(port) _MMIO_PORT(port, _PORT_CLK_SEL_A, _PORT_CLK_SEL_B)
7335#define PORT_CLK_SEL_LCPLL_2700 (0<<29) 7380#define PORT_CLK_SEL_LCPLL_2700 (0<<29)
7336#define PORT_CLK_SEL_LCPLL_1350 (1<<29) 7381#define PORT_CLK_SEL_LCPLL_1350 (1<<29)
7337#define PORT_CLK_SEL_LCPLL_810 (2<<29) 7382#define PORT_CLK_SEL_LCPLL_810 (2<<29)
@@ -7343,18 +7388,18 @@ enum skl_disp_power_wells {
7343#define PORT_CLK_SEL_MASK (7<<29) 7388#define PORT_CLK_SEL_MASK (7<<29)
7344 7389
7345/* Transcoder clock selection */ 7390/* Transcoder clock selection */
7346#define TRANS_CLK_SEL_A 0x46140 7391#define _TRANS_CLK_SEL_A 0x46140
7347#define TRANS_CLK_SEL_B 0x46144 7392#define _TRANS_CLK_SEL_B 0x46144
7348#define TRANS_CLK_SEL(tran) _TRANSCODER(tran, TRANS_CLK_SEL_A, TRANS_CLK_SEL_B) 7393#define TRANS_CLK_SEL(tran) _MMIO_TRANS(tran, _TRANS_CLK_SEL_A, _TRANS_CLK_SEL_B)
7349/* For each transcoder, we need to select the corresponding port clock */ 7394/* For each transcoder, we need to select the corresponding port clock */
7350#define TRANS_CLK_SEL_DISABLED (0x0<<29) 7395#define TRANS_CLK_SEL_DISABLED (0x0<<29)
7351#define TRANS_CLK_SEL_PORT(x) (((x)+1)<<29) 7396#define TRANS_CLK_SEL_PORT(x) (((x)+1)<<29)
7352 7397
7353#define TRANSA_MSA_MISC 0x60410 7398#define _TRANSA_MSA_MISC 0x60410
7354#define TRANSB_MSA_MISC 0x61410 7399#define _TRANSB_MSA_MISC 0x61410
7355#define TRANSC_MSA_MISC 0x62410 7400#define _TRANSC_MSA_MISC 0x62410
7356#define TRANS_EDP_MSA_MISC 0x6f410 7401#define _TRANS_EDP_MSA_MISC 0x6f410
7357#define TRANS_MSA_MISC(tran) _TRANSCODER2(tran, TRANSA_MSA_MISC) 7402#define TRANS_MSA_MISC(tran) _MMIO_TRANS2(tran, _TRANSA_MSA_MISC)
7358 7403
7359#define TRANS_MSA_SYNC_CLK (1<<0) 7404#define TRANS_MSA_SYNC_CLK (1<<0)
7360#define TRANS_MSA_6_BPC (0<<5) 7405#define TRANS_MSA_6_BPC (0<<5)
@@ -7364,7 +7409,7 @@ enum skl_disp_power_wells {
7364#define TRANS_MSA_16_BPC (4<<5) 7409#define TRANS_MSA_16_BPC (4<<5)
7365 7410
7366/* LCPLL Control */ 7411/* LCPLL Control */
7367#define LCPLL_CTL 0x130040 7412#define LCPLL_CTL _MMIO(0x130040)
7368#define LCPLL_PLL_DISABLE (1<<31) 7413#define LCPLL_PLL_DISABLE (1<<31)
7369#define LCPLL_PLL_LOCK (1<<30) 7414#define LCPLL_PLL_LOCK (1<<30)
7370#define LCPLL_CLK_FREQ_MASK (3<<26) 7415#define LCPLL_CLK_FREQ_MASK (3<<26)
@@ -7384,7 +7429,7 @@ enum skl_disp_power_wells {
7384 */ 7429 */
7385 7430
7386/* CDCLK_CTL */ 7431/* CDCLK_CTL */
7387#define CDCLK_CTL 0x46000 7432#define CDCLK_CTL _MMIO(0x46000)
7388#define CDCLK_FREQ_SEL_MASK (3<<26) 7433#define CDCLK_FREQ_SEL_MASK (3<<26)
7389#define CDCLK_FREQ_450_432 (0<<26) 7434#define CDCLK_FREQ_450_432 (0<<26)
7390#define CDCLK_FREQ_540 (1<<26) 7435#define CDCLK_FREQ_540 (1<<26)
@@ -7400,12 +7445,12 @@ enum skl_disp_power_wells {
7400#define BXT_CDCLK_SSA_PRECHARGE_ENABLE (1<<16) 7445#define BXT_CDCLK_SSA_PRECHARGE_ENABLE (1<<16)
7401 7446
7402/* LCPLL_CTL */ 7447/* LCPLL_CTL */
7403#define LCPLL1_CTL 0x46010 7448#define LCPLL1_CTL _MMIO(0x46010)
7404#define LCPLL2_CTL 0x46014 7449#define LCPLL2_CTL _MMIO(0x46014)
7405#define LCPLL_PLL_ENABLE (1<<31) 7450#define LCPLL_PLL_ENABLE (1<<31)
7406 7451
7407/* DPLL control1 */ 7452/* DPLL control1 */
7408#define DPLL_CTRL1 0x6C058 7453#define DPLL_CTRL1 _MMIO(0x6C058)
7409#define DPLL_CTRL1_HDMI_MODE(id) (1<<((id)*6+5)) 7454#define DPLL_CTRL1_HDMI_MODE(id) (1<<((id)*6+5))
7410#define DPLL_CTRL1_SSC(id) (1<<((id)*6+4)) 7455#define DPLL_CTRL1_SSC(id) (1<<((id)*6+4))
7411#define DPLL_CTRL1_LINK_RATE_MASK(id) (7<<((id)*6+1)) 7456#define DPLL_CTRL1_LINK_RATE_MASK(id) (7<<((id)*6+1))
@@ -7420,7 +7465,7 @@ enum skl_disp_power_wells {
7420#define DPLL_CTRL1_LINK_RATE_2160 5 7465#define DPLL_CTRL1_LINK_RATE_2160 5
7421 7466
7422/* DPLL control2 */ 7467/* DPLL control2 */
7423#define DPLL_CTRL2 0x6C05C 7468#define DPLL_CTRL2 _MMIO(0x6C05C)
7424#define DPLL_CTRL2_DDI_CLK_OFF(port) (1<<((port)+15)) 7469#define DPLL_CTRL2_DDI_CLK_OFF(port) (1<<((port)+15))
7425#define DPLL_CTRL2_DDI_CLK_SEL_MASK(port) (3<<((port)*3+1)) 7470#define DPLL_CTRL2_DDI_CLK_SEL_MASK(port) (3<<((port)*3+1))
7426#define DPLL_CTRL2_DDI_CLK_SEL_SHIFT(port) ((port)*3+1) 7471#define DPLL_CTRL2_DDI_CLK_SEL_SHIFT(port) ((port)*3+1)
@@ -7428,21 +7473,21 @@ enum skl_disp_power_wells {
7428#define DPLL_CTRL2_DDI_SEL_OVERRIDE(port) (1<<((port)*3)) 7473#define DPLL_CTRL2_DDI_SEL_OVERRIDE(port) (1<<((port)*3))
7429 7474
7430/* DPLL Status */ 7475/* DPLL Status */
7431#define DPLL_STATUS 0x6C060 7476#define DPLL_STATUS _MMIO(0x6C060)
7432#define DPLL_LOCK(id) (1<<((id)*8)) 7477#define DPLL_LOCK(id) (1<<((id)*8))
7433 7478
7434/* DPLL cfg */ 7479/* DPLL cfg */
7435#define DPLL1_CFGCR1 0x6C040 7480#define _DPLL1_CFGCR1 0x6C040
7436#define DPLL2_CFGCR1 0x6C048 7481#define _DPLL2_CFGCR1 0x6C048
7437#define DPLL3_CFGCR1 0x6C050 7482#define _DPLL3_CFGCR1 0x6C050
7438#define DPLL_CFGCR1_FREQ_ENABLE (1<<31) 7483#define DPLL_CFGCR1_FREQ_ENABLE (1<<31)
7439#define DPLL_CFGCR1_DCO_FRACTION_MASK (0x7fff<<9) 7484#define DPLL_CFGCR1_DCO_FRACTION_MASK (0x7fff<<9)
7440#define DPLL_CFGCR1_DCO_FRACTION(x) ((x)<<9) 7485#define DPLL_CFGCR1_DCO_FRACTION(x) ((x)<<9)
7441#define DPLL_CFGCR1_DCO_INTEGER_MASK (0x1ff) 7486#define DPLL_CFGCR1_DCO_INTEGER_MASK (0x1ff)
7442 7487
7443#define DPLL1_CFGCR2 0x6C044 7488#define _DPLL1_CFGCR2 0x6C044
7444#define DPLL2_CFGCR2 0x6C04C 7489#define _DPLL2_CFGCR2 0x6C04C
7445#define DPLL3_CFGCR2 0x6C054 7490#define _DPLL3_CFGCR2 0x6C054
7446#define DPLL_CFGCR2_QDIV_RATIO_MASK (0xff<<8) 7491#define DPLL_CFGCR2_QDIV_RATIO_MASK (0xff<<8)
7447#define DPLL_CFGCR2_QDIV_RATIO(x) ((x)<<8) 7492#define DPLL_CFGCR2_QDIV_RATIO(x) ((x)<<8)
7448#define DPLL_CFGCR2_QDIV_MODE(x) ((x)<<7) 7493#define DPLL_CFGCR2_QDIV_MODE(x) ((x)<<7)
@@ -7460,58 +7505,58 @@ enum skl_disp_power_wells {
7460#define DPLL_CFGCR2_PDIV_7 (4<<2) 7505#define DPLL_CFGCR2_PDIV_7 (4<<2)
7461#define DPLL_CFGCR2_CENTRAL_FREQ_MASK (3) 7506#define DPLL_CFGCR2_CENTRAL_FREQ_MASK (3)
7462 7507
7463#define DPLL_CFGCR1(id) (DPLL1_CFGCR1 + ((id) - SKL_DPLL1) * 8) 7508#define DPLL_CFGCR1(id) _MMIO_PIPE((id) - SKL_DPLL1, _DPLL1_CFGCR1, _DPLL2_CFGCR2)
7464#define DPLL_CFGCR2(id) (DPLL1_CFGCR2 + ((id) - SKL_DPLL1) * 8) 7509#define DPLL_CFGCR2(id) _MMIO_PIPE((id) - SKL_DPLL1, _DPLL1_CFGCR2, _DPLL2_CFGCR2)
7465 7510
7466/* BXT display engine PLL */ 7511/* BXT display engine PLL */
7467#define BXT_DE_PLL_CTL 0x6d000 7512#define BXT_DE_PLL_CTL _MMIO(0x6d000)
7468#define BXT_DE_PLL_RATIO(x) (x) /* {60,65,100} * 19.2MHz */ 7513#define BXT_DE_PLL_RATIO(x) (x) /* {60,65,100} * 19.2MHz */
7469#define BXT_DE_PLL_RATIO_MASK 0xff 7514#define BXT_DE_PLL_RATIO_MASK 0xff
7470 7515
7471#define BXT_DE_PLL_ENABLE 0x46070 7516#define BXT_DE_PLL_ENABLE _MMIO(0x46070)
7472#define BXT_DE_PLL_PLL_ENABLE (1 << 31) 7517#define BXT_DE_PLL_PLL_ENABLE (1 << 31)
7473#define BXT_DE_PLL_LOCK (1 << 30) 7518#define BXT_DE_PLL_LOCK (1 << 30)
7474 7519
7475/* GEN9 DC */ 7520/* GEN9 DC */
7476#define DC_STATE_EN 0x45504 7521#define DC_STATE_EN _MMIO(0x45504)
7522#define DC_STATE_DISABLE 0
7477#define DC_STATE_EN_UPTO_DC5 (1<<0) 7523#define DC_STATE_EN_UPTO_DC5 (1<<0)
7478#define DC_STATE_EN_DC9 (1<<3) 7524#define DC_STATE_EN_DC9 (1<<3)
7479#define DC_STATE_EN_UPTO_DC6 (2<<0) 7525#define DC_STATE_EN_UPTO_DC6 (2<<0)
7480#define DC_STATE_EN_UPTO_DC5_DC6_MASK 0x3 7526#define DC_STATE_EN_UPTO_DC5_DC6_MASK 0x3
7481 7527
7482#define DC_STATE_DEBUG 0x45520 7528#define DC_STATE_DEBUG _MMIO(0x45520)
7483#define DC_STATE_DEBUG_MASK_MEMORY_UP (1<<1) 7529#define DC_STATE_DEBUG_MASK_MEMORY_UP (1<<1)
7484 7530
7485/* Please see hsw_read_dcomp() and hsw_write_dcomp() before using this register, 7531/* Please see hsw_read_dcomp() and hsw_write_dcomp() before using this register,
7486 * since on HSW we can't write to it using I915_WRITE. */ 7532 * since on HSW we can't write to it using I915_WRITE. */
7487#define D_COMP_HSW (MCHBAR_MIRROR_BASE_SNB + 0x5F0C) 7533#define D_COMP_HSW _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5F0C)
7488#define D_COMP_BDW 0x138144 7534#define D_COMP_BDW _MMIO(0x138144)
7489#define D_COMP_RCOMP_IN_PROGRESS (1<<9) 7535#define D_COMP_RCOMP_IN_PROGRESS (1<<9)
7490#define D_COMP_COMP_FORCE (1<<8) 7536#define D_COMP_COMP_FORCE (1<<8)
7491#define D_COMP_COMP_DISABLE (1<<0) 7537#define D_COMP_COMP_DISABLE (1<<0)
7492 7538
7493/* Pipe WM_LINETIME - watermark line time */ 7539/* Pipe WM_LINETIME - watermark line time */
7494#define PIPE_WM_LINETIME_A 0x45270 7540#define _PIPE_WM_LINETIME_A 0x45270
7495#define PIPE_WM_LINETIME_B 0x45274 7541#define _PIPE_WM_LINETIME_B 0x45274
7496#define PIPE_WM_LINETIME(pipe) _PIPE(pipe, PIPE_WM_LINETIME_A, \ 7542#define PIPE_WM_LINETIME(pipe) _MMIO_PIPE(pipe, _PIPE_WM_LINETIME_A, _PIPE_WM_LINETIME_B)
7497 PIPE_WM_LINETIME_B)
7498#define PIPE_WM_LINETIME_MASK (0x1ff) 7543#define PIPE_WM_LINETIME_MASK (0x1ff)
7499#define PIPE_WM_LINETIME_TIME(x) ((x)) 7544#define PIPE_WM_LINETIME_TIME(x) ((x))
7500#define PIPE_WM_LINETIME_IPS_LINETIME_MASK (0x1ff<<16) 7545#define PIPE_WM_LINETIME_IPS_LINETIME_MASK (0x1ff<<16)
7501#define PIPE_WM_LINETIME_IPS_LINETIME(x) ((x)<<16) 7546#define PIPE_WM_LINETIME_IPS_LINETIME(x) ((x)<<16)
7502 7547
7503/* SFUSE_STRAP */ 7548/* SFUSE_STRAP */
7504#define SFUSE_STRAP 0xc2014 7549#define SFUSE_STRAP _MMIO(0xc2014)
7505#define SFUSE_STRAP_FUSE_LOCK (1<<13) 7550#define SFUSE_STRAP_FUSE_LOCK (1<<13)
7506#define SFUSE_STRAP_DISPLAY_DISABLED (1<<7) 7551#define SFUSE_STRAP_DISPLAY_DISABLED (1<<7)
7507#define SFUSE_STRAP_DDIB_DETECTED (1<<2) 7552#define SFUSE_STRAP_DDIB_DETECTED (1<<2)
7508#define SFUSE_STRAP_DDIC_DETECTED (1<<1) 7553#define SFUSE_STRAP_DDIC_DETECTED (1<<1)
7509#define SFUSE_STRAP_DDID_DETECTED (1<<0) 7554#define SFUSE_STRAP_DDID_DETECTED (1<<0)
7510 7555
7511#define WM_MISC 0x45260 7556#define WM_MISC _MMIO(0x45260)
7512#define WM_MISC_DATA_PARTITION_5_6 (1 << 0) 7557#define WM_MISC_DATA_PARTITION_5_6 (1 << 0)
7513 7558
7514#define WM_DBG 0x45280 7559#define WM_DBG _MMIO(0x45280)
7515#define WM_DBG_DISALLOW_MULTIPLE_LP (1<<0) 7560#define WM_DBG_DISALLOW_MULTIPLE_LP (1<<0)
7516#define WM_DBG_DISALLOW_MAXFIFO (1<<1) 7561#define WM_DBG_DISALLOW_MAXFIFO (1<<1)
7517#define WM_DBG_DISALLOW_SPRITE (1<<2) 7562#define WM_DBG_DISALLOW_SPRITE (1<<2)
@@ -7548,28 +7593,29 @@ enum skl_disp_power_wells {
7548#define _PIPE_B_CSC_POSTOFF_ME 0x49144 7593#define _PIPE_B_CSC_POSTOFF_ME 0x49144
7549#define _PIPE_B_CSC_POSTOFF_LO 0x49148 7594#define _PIPE_B_CSC_POSTOFF_LO 0x49148
7550 7595
7551#define PIPE_CSC_COEFF_RY_GY(pipe) _PIPE(pipe, _PIPE_A_CSC_COEFF_RY_GY, _PIPE_B_CSC_COEFF_RY_GY) 7596#define PIPE_CSC_COEFF_RY_GY(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_COEFF_RY_GY, _PIPE_B_CSC_COEFF_RY_GY)
7552#define PIPE_CSC_COEFF_BY(pipe) _PIPE(pipe, _PIPE_A_CSC_COEFF_BY, _PIPE_B_CSC_COEFF_BY) 7597#define PIPE_CSC_COEFF_BY(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_COEFF_BY, _PIPE_B_CSC_COEFF_BY)
7553#define PIPE_CSC_COEFF_RU_GU(pipe) _PIPE(pipe, _PIPE_A_CSC_COEFF_RU_GU, _PIPE_B_CSC_COEFF_RU_GU) 7598#define PIPE_CSC_COEFF_RU_GU(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_COEFF_RU_GU, _PIPE_B_CSC_COEFF_RU_GU)
7554#define PIPE_CSC_COEFF_BU(pipe) _PIPE(pipe, _PIPE_A_CSC_COEFF_BU, _PIPE_B_CSC_COEFF_BU) 7599#define PIPE_CSC_COEFF_BU(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_COEFF_BU, _PIPE_B_CSC_COEFF_BU)
7555#define PIPE_CSC_COEFF_RV_GV(pipe) _PIPE(pipe, _PIPE_A_CSC_COEFF_RV_GV, _PIPE_B_CSC_COEFF_RV_GV) 7600#define PIPE_CSC_COEFF_RV_GV(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_COEFF_RV_GV, _PIPE_B_CSC_COEFF_RV_GV)
7556#define PIPE_CSC_COEFF_BV(pipe) _PIPE(pipe, _PIPE_A_CSC_COEFF_BV, _PIPE_B_CSC_COEFF_BV) 7601#define PIPE_CSC_COEFF_BV(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_COEFF_BV, _PIPE_B_CSC_COEFF_BV)
7557#define PIPE_CSC_MODE(pipe) _PIPE(pipe, _PIPE_A_CSC_MODE, _PIPE_B_CSC_MODE) 7602#define PIPE_CSC_MODE(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_MODE, _PIPE_B_CSC_MODE)
7558#define PIPE_CSC_PREOFF_HI(pipe) _PIPE(pipe, _PIPE_A_CSC_PREOFF_HI, _PIPE_B_CSC_PREOFF_HI) 7603#define PIPE_CSC_PREOFF_HI(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_PREOFF_HI, _PIPE_B_CSC_PREOFF_HI)
7559#define PIPE_CSC_PREOFF_ME(pipe) _PIPE(pipe, _PIPE_A_CSC_PREOFF_ME, _PIPE_B_CSC_PREOFF_ME) 7604#define PIPE_CSC_PREOFF_ME(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_PREOFF_ME, _PIPE_B_CSC_PREOFF_ME)
7560#define PIPE_CSC_PREOFF_LO(pipe) _PIPE(pipe, _PIPE_A_CSC_PREOFF_LO, _PIPE_B_CSC_PREOFF_LO) 7605#define PIPE_CSC_PREOFF_LO(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_PREOFF_LO, _PIPE_B_CSC_PREOFF_LO)
7561#define PIPE_CSC_POSTOFF_HI(pipe) _PIPE(pipe, _PIPE_A_CSC_POSTOFF_HI, _PIPE_B_CSC_POSTOFF_HI) 7606#define PIPE_CSC_POSTOFF_HI(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_POSTOFF_HI, _PIPE_B_CSC_POSTOFF_HI)
7562#define PIPE_CSC_POSTOFF_ME(pipe) _PIPE(pipe, _PIPE_A_CSC_POSTOFF_ME, _PIPE_B_CSC_POSTOFF_ME) 7607#define PIPE_CSC_POSTOFF_ME(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_POSTOFF_ME, _PIPE_B_CSC_POSTOFF_ME)
7563#define PIPE_CSC_POSTOFF_LO(pipe) _PIPE(pipe, _PIPE_A_CSC_POSTOFF_LO, _PIPE_B_CSC_POSTOFF_LO) 7608#define PIPE_CSC_POSTOFF_LO(pipe) _MMIO_PIPE(pipe, _PIPE_A_CSC_POSTOFF_LO, _PIPE_B_CSC_POSTOFF_LO)
7564 7609
7565/* MIPI DSI registers */ 7610/* MIPI DSI registers */
7566 7611
7567#define _MIPI_PORT(port, a, c) _PORT3(port, a, 0, c) /* ports A and C only */ 7612#define _MIPI_PORT(port, a, c) _PORT3(port, a, 0, c) /* ports A and C only */
7613#define _MMIO_MIPI(port, a, c) _MMIO(_MIPI_PORT(port, a, c))
7568 7614
7569/* BXT MIPI clock controls */ 7615/* BXT MIPI clock controls */
7570#define BXT_MAX_VAR_OUTPUT_KHZ 39500 7616#define BXT_MAX_VAR_OUTPUT_KHZ 39500
7571 7617
7572#define BXT_MIPI_CLOCK_CTL 0x46090 7618#define BXT_MIPI_CLOCK_CTL _MMIO(0x46090)
7573#define BXT_MIPI1_DIV_SHIFT 26 7619#define BXT_MIPI1_DIV_SHIFT 26
7574#define BXT_MIPI2_DIV_SHIFT 10 7620#define BXT_MIPI2_DIV_SHIFT 10
7575#define BXT_MIPI_DIV_SHIFT(port) \ 7621#define BXT_MIPI_DIV_SHIFT(port) \
@@ -7631,20 +7677,20 @@ enum skl_disp_power_wells {
7631/* BXT MIPI mode configure */ 7677/* BXT MIPI mode configure */
7632#define _BXT_MIPIA_TRANS_HACTIVE 0x6B0F8 7678#define _BXT_MIPIA_TRANS_HACTIVE 0x6B0F8
7633#define _BXT_MIPIC_TRANS_HACTIVE 0x6B8F8 7679#define _BXT_MIPIC_TRANS_HACTIVE 0x6B8F8
7634#define BXT_MIPI_TRANS_HACTIVE(tc) _MIPI_PORT(tc, \ 7680#define BXT_MIPI_TRANS_HACTIVE(tc) _MMIO_MIPI(tc, \
7635 _BXT_MIPIA_TRANS_HACTIVE, _BXT_MIPIC_TRANS_HACTIVE) 7681 _BXT_MIPIA_TRANS_HACTIVE, _BXT_MIPIC_TRANS_HACTIVE)
7636 7682
7637#define _BXT_MIPIA_TRANS_VACTIVE 0x6B0FC 7683#define _BXT_MIPIA_TRANS_VACTIVE 0x6B0FC
7638#define _BXT_MIPIC_TRANS_VACTIVE 0x6B8FC 7684#define _BXT_MIPIC_TRANS_VACTIVE 0x6B8FC
7639#define BXT_MIPI_TRANS_VACTIVE(tc) _MIPI_PORT(tc, \ 7685#define BXT_MIPI_TRANS_VACTIVE(tc) _MMIO_MIPI(tc, \
7640 _BXT_MIPIA_TRANS_VACTIVE, _BXT_MIPIC_TRANS_VACTIVE) 7686 _BXT_MIPIA_TRANS_VACTIVE, _BXT_MIPIC_TRANS_VACTIVE)
7641 7687
7642#define _BXT_MIPIA_TRANS_VTOTAL 0x6B100 7688#define _BXT_MIPIA_TRANS_VTOTAL 0x6B100
7643#define _BXT_MIPIC_TRANS_VTOTAL 0x6B900 7689#define _BXT_MIPIC_TRANS_VTOTAL 0x6B900
7644#define BXT_MIPI_TRANS_VTOTAL(tc) _MIPI_PORT(tc, \ 7690#define BXT_MIPI_TRANS_VTOTAL(tc) _MMIO_MIPI(tc, \
7645 _BXT_MIPIA_TRANS_VTOTAL, _BXT_MIPIC_TRANS_VTOTAL) 7691 _BXT_MIPIA_TRANS_VTOTAL, _BXT_MIPIC_TRANS_VTOTAL)
7646 7692
7647#define BXT_DSI_PLL_CTL 0x161000 7693#define BXT_DSI_PLL_CTL _MMIO(0x161000)
7648#define BXT_DSI_PLL_PVD_RATIO_SHIFT 16 7694#define BXT_DSI_PLL_PVD_RATIO_SHIFT 16
7649#define BXT_DSI_PLL_PVD_RATIO_MASK (3 << BXT_DSI_PLL_PVD_RATIO_SHIFT) 7695#define BXT_DSI_PLL_PVD_RATIO_MASK (3 << BXT_DSI_PLL_PVD_RATIO_SHIFT)
7650#define BXT_DSI_PLL_PVD_RATIO_1 (1 << BXT_DSI_PLL_PVD_RATIO_SHIFT) 7696#define BXT_DSI_PLL_PVD_RATIO_1 (1 << BXT_DSI_PLL_PVD_RATIO_SHIFT)
@@ -7662,19 +7708,18 @@ enum skl_disp_power_wells {
7662#define BXT_DSI_PLL_RATIO_MASK 0xFF 7708#define BXT_DSI_PLL_RATIO_MASK 0xFF
7663#define BXT_REF_CLOCK_KHZ 19500 7709#define BXT_REF_CLOCK_KHZ 19500
7664 7710
7665#define BXT_DSI_PLL_ENABLE 0x46080 7711#define BXT_DSI_PLL_ENABLE _MMIO(0x46080)
7666#define BXT_DSI_PLL_DO_ENABLE (1 << 31) 7712#define BXT_DSI_PLL_DO_ENABLE (1 << 31)
7667#define BXT_DSI_PLL_LOCKED (1 << 30) 7713#define BXT_DSI_PLL_LOCKED (1 << 30)
7668 7714
7669#define _MIPIA_PORT_CTRL (VLV_DISPLAY_BASE + 0x61190) 7715#define _MIPIA_PORT_CTRL (VLV_DISPLAY_BASE + 0x61190)
7670#define _MIPIC_PORT_CTRL (VLV_DISPLAY_BASE + 0x61700) 7716#define _MIPIC_PORT_CTRL (VLV_DISPLAY_BASE + 0x61700)
7671#define MIPI_PORT_CTRL(port) _MIPI_PORT(port, _MIPIA_PORT_CTRL, _MIPIC_PORT_CTRL) 7717#define MIPI_PORT_CTRL(port) _MMIO_MIPI(port, _MIPIA_PORT_CTRL, _MIPIC_PORT_CTRL)
7672 7718
7673 /* BXT port control */ 7719 /* BXT port control */
7674#define _BXT_MIPIA_PORT_CTRL 0x6B0C0 7720#define _BXT_MIPIA_PORT_CTRL 0x6B0C0
7675#define _BXT_MIPIC_PORT_CTRL 0x6B8C0 7721#define _BXT_MIPIC_PORT_CTRL 0x6B8C0
7676#define BXT_MIPI_PORT_CTRL(tc) _MIPI_PORT(tc, _BXT_MIPIA_PORT_CTRL, \ 7722#define BXT_MIPI_PORT_CTRL(tc) _MMIO_MIPI(tc, _BXT_MIPIA_PORT_CTRL, _BXT_MIPIC_PORT_CTRL)
7677 _BXT_MIPIC_PORT_CTRL)
7678 7723
7679#define DPI_ENABLE (1 << 31) /* A + C */ 7724#define DPI_ENABLE (1 << 31) /* A + C */
7680#define MIPIA_MIPI4DPHY_DELAY_COUNT_SHIFT 27 7725#define MIPIA_MIPI4DPHY_DELAY_COUNT_SHIFT 27
@@ -7718,8 +7763,7 @@ enum skl_disp_power_wells {
7718 7763
7719#define _MIPIA_TEARING_CTRL (VLV_DISPLAY_BASE + 0x61194) 7764#define _MIPIA_TEARING_CTRL (VLV_DISPLAY_BASE + 0x61194)
7720#define _MIPIC_TEARING_CTRL (VLV_DISPLAY_BASE + 0x61704) 7765#define _MIPIC_TEARING_CTRL (VLV_DISPLAY_BASE + 0x61704)
7721#define MIPI_TEARING_CTRL(port) _MIPI_PORT(port, \ 7766#define MIPI_TEARING_CTRL(port) _MMIO_MIPI(port, _MIPIA_TEARING_CTRL, _MIPIC_TEARING_CTRL)
7722 _MIPIA_TEARING_CTRL, _MIPIC_TEARING_CTRL)
7723#define TEARING_EFFECT_DELAY_SHIFT 0 7767#define TEARING_EFFECT_DELAY_SHIFT 0
7724#define TEARING_EFFECT_DELAY_MASK (0xffff << 0) 7768#define TEARING_EFFECT_DELAY_MASK (0xffff << 0)
7725 7769
@@ -7730,8 +7774,7 @@ enum skl_disp_power_wells {
7730 7774
7731#define _MIPIA_DEVICE_READY (dev_priv->mipi_mmio_base + 0xb000) 7775#define _MIPIA_DEVICE_READY (dev_priv->mipi_mmio_base + 0xb000)
7732#define _MIPIC_DEVICE_READY (dev_priv->mipi_mmio_base + 0xb800) 7776#define _MIPIC_DEVICE_READY (dev_priv->mipi_mmio_base + 0xb800)
7733#define MIPI_DEVICE_READY(port) _MIPI_PORT(port, _MIPIA_DEVICE_READY, \ 7777#define MIPI_DEVICE_READY(port) _MMIO_MIPI(port, _MIPIA_DEVICE_READY, _MIPIC_DEVICE_READY)
7734 _MIPIC_DEVICE_READY)
7735#define BUS_POSSESSION (1 << 3) /* set to give bus to receiver */ 7778#define BUS_POSSESSION (1 << 3) /* set to give bus to receiver */
7736#define ULPS_STATE_MASK (3 << 1) 7779#define ULPS_STATE_MASK (3 << 1)
7737#define ULPS_STATE_ENTER (2 << 1) 7780#define ULPS_STATE_ENTER (2 << 1)
@@ -7741,12 +7784,10 @@ enum skl_disp_power_wells {
7741 7784
7742#define _MIPIA_INTR_STAT (dev_priv->mipi_mmio_base + 0xb004) 7785#define _MIPIA_INTR_STAT (dev_priv->mipi_mmio_base + 0xb004)
7743#define _MIPIC_INTR_STAT (dev_priv->mipi_mmio_base + 0xb804) 7786#define _MIPIC_INTR_STAT (dev_priv->mipi_mmio_base + 0xb804)
7744#define MIPI_INTR_STAT(port) _MIPI_PORT(port, _MIPIA_INTR_STAT, \ 7787#define MIPI_INTR_STAT(port) _MMIO_MIPI(port, _MIPIA_INTR_STAT, _MIPIC_INTR_STAT)
7745 _MIPIC_INTR_STAT)
7746#define _MIPIA_INTR_EN (dev_priv->mipi_mmio_base + 0xb008) 7788#define _MIPIA_INTR_EN (dev_priv->mipi_mmio_base + 0xb008)
7747#define _MIPIC_INTR_EN (dev_priv->mipi_mmio_base + 0xb808) 7789#define _MIPIC_INTR_EN (dev_priv->mipi_mmio_base + 0xb808)
7748#define MIPI_INTR_EN(port) _MIPI_PORT(port, _MIPIA_INTR_EN, \ 7790#define MIPI_INTR_EN(port) _MMIO_MIPI(port, _MIPIA_INTR_EN, _MIPIC_INTR_EN)
7749 _MIPIC_INTR_EN)
7750#define TEARING_EFFECT (1 << 31) 7791#define TEARING_EFFECT (1 << 31)
7751#define SPL_PKT_SENT_INTERRUPT (1 << 30) 7792#define SPL_PKT_SENT_INTERRUPT (1 << 30)
7752#define GEN_READ_DATA_AVAIL (1 << 29) 7793#define GEN_READ_DATA_AVAIL (1 << 29)
@@ -7782,8 +7823,7 @@ enum skl_disp_power_wells {
7782 7823
7783#define _MIPIA_DSI_FUNC_PRG (dev_priv->mipi_mmio_base + 0xb00c) 7824#define _MIPIA_DSI_FUNC_PRG (dev_priv->mipi_mmio_base + 0xb00c)
7784#define _MIPIC_DSI_FUNC_PRG (dev_priv->mipi_mmio_base + 0xb80c) 7825#define _MIPIC_DSI_FUNC_PRG (dev_priv->mipi_mmio_base + 0xb80c)
7785#define MIPI_DSI_FUNC_PRG(port) _MIPI_PORT(port, _MIPIA_DSI_FUNC_PRG, \ 7826#define MIPI_DSI_FUNC_PRG(port) _MMIO_MIPI(port, _MIPIA_DSI_FUNC_PRG, _MIPIC_DSI_FUNC_PRG)
7786 _MIPIC_DSI_FUNC_PRG)
7787#define CMD_MODE_DATA_WIDTH_MASK (7 << 13) 7827#define CMD_MODE_DATA_WIDTH_MASK (7 << 13)
7788#define CMD_MODE_NOT_SUPPORTED (0 << 13) 7828#define CMD_MODE_NOT_SUPPORTED (0 << 13)
7789#define CMD_MODE_DATA_WIDTH_16_BIT (1 << 13) 7829#define CMD_MODE_DATA_WIDTH_16_BIT (1 << 13)
@@ -7806,32 +7846,27 @@ enum skl_disp_power_wells {
7806 7846
7807#define _MIPIA_HS_TX_TIMEOUT (dev_priv->mipi_mmio_base + 0xb010) 7847#define _MIPIA_HS_TX_TIMEOUT (dev_priv->mipi_mmio_base + 0xb010)
7808#define _MIPIC_HS_TX_TIMEOUT (dev_priv->mipi_mmio_base + 0xb810) 7848#define _MIPIC_HS_TX_TIMEOUT (dev_priv->mipi_mmio_base + 0xb810)
7809#define MIPI_HS_TX_TIMEOUT(port) _MIPI_PORT(port, _MIPIA_HS_TX_TIMEOUT, \ 7849#define MIPI_HS_TX_TIMEOUT(port) _MMIO_MIPI(port, _MIPIA_HS_TX_TIMEOUT, _MIPIC_HS_TX_TIMEOUT)
7810 _MIPIC_HS_TX_TIMEOUT)
7811#define HIGH_SPEED_TX_TIMEOUT_COUNTER_MASK 0xffffff 7850#define HIGH_SPEED_TX_TIMEOUT_COUNTER_MASK 0xffffff
7812 7851
7813#define _MIPIA_LP_RX_TIMEOUT (dev_priv->mipi_mmio_base + 0xb014) 7852#define _MIPIA_LP_RX_TIMEOUT (dev_priv->mipi_mmio_base + 0xb014)
7814#define _MIPIC_LP_RX_TIMEOUT (dev_priv->mipi_mmio_base + 0xb814) 7853#define _MIPIC_LP_RX_TIMEOUT (dev_priv->mipi_mmio_base + 0xb814)
7815#define MIPI_LP_RX_TIMEOUT(port) _MIPI_PORT(port, _MIPIA_LP_RX_TIMEOUT, \ 7854#define MIPI_LP_RX_TIMEOUT(port) _MMIO_MIPI(port, _MIPIA_LP_RX_TIMEOUT, _MIPIC_LP_RX_TIMEOUT)
7816 _MIPIC_LP_RX_TIMEOUT)
7817#define LOW_POWER_RX_TIMEOUT_COUNTER_MASK 0xffffff 7855#define LOW_POWER_RX_TIMEOUT_COUNTER_MASK 0xffffff
7818 7856
7819#define _MIPIA_TURN_AROUND_TIMEOUT (dev_priv->mipi_mmio_base + 0xb018) 7857#define _MIPIA_TURN_AROUND_TIMEOUT (dev_priv->mipi_mmio_base + 0xb018)
7820#define _MIPIC_TURN_AROUND_TIMEOUT (dev_priv->mipi_mmio_base + 0xb818) 7858#define _MIPIC_TURN_AROUND_TIMEOUT (dev_priv->mipi_mmio_base + 0xb818)
7821#define MIPI_TURN_AROUND_TIMEOUT(port) _MIPI_PORT(port, \ 7859#define MIPI_TURN_AROUND_TIMEOUT(port) _MMIO_MIPI(port, _MIPIA_TURN_AROUND_TIMEOUT, _MIPIC_TURN_AROUND_TIMEOUT)
7822 _MIPIA_TURN_AROUND_TIMEOUT, _MIPIC_TURN_AROUND_TIMEOUT)
7823#define TURN_AROUND_TIMEOUT_MASK 0x3f 7860#define TURN_AROUND_TIMEOUT_MASK 0x3f
7824 7861
7825#define _MIPIA_DEVICE_RESET_TIMER (dev_priv->mipi_mmio_base + 0xb01c) 7862#define _MIPIA_DEVICE_RESET_TIMER (dev_priv->mipi_mmio_base + 0xb01c)
7826#define _MIPIC_DEVICE_RESET_TIMER (dev_priv->mipi_mmio_base + 0xb81c) 7863#define _MIPIC_DEVICE_RESET_TIMER (dev_priv->mipi_mmio_base + 0xb81c)
7827#define MIPI_DEVICE_RESET_TIMER(port) _MIPI_PORT(port, \ 7864#define MIPI_DEVICE_RESET_TIMER(port) _MMIO_MIPI(port, _MIPIA_DEVICE_RESET_TIMER, _MIPIC_DEVICE_RESET_TIMER)
7828 _MIPIA_DEVICE_RESET_TIMER, _MIPIC_DEVICE_RESET_TIMER)
7829#define DEVICE_RESET_TIMER_MASK 0xffff 7865#define DEVICE_RESET_TIMER_MASK 0xffff
7830 7866
7831#define _MIPIA_DPI_RESOLUTION (dev_priv->mipi_mmio_base + 0xb020) 7867#define _MIPIA_DPI_RESOLUTION (dev_priv->mipi_mmio_base + 0xb020)
7832#define _MIPIC_DPI_RESOLUTION (dev_priv->mipi_mmio_base + 0xb820) 7868#define _MIPIC_DPI_RESOLUTION (dev_priv->mipi_mmio_base + 0xb820)
7833#define MIPI_DPI_RESOLUTION(port) _MIPI_PORT(port, _MIPIA_DPI_RESOLUTION, \ 7869#define MIPI_DPI_RESOLUTION(port) _MMIO_MIPI(port, _MIPIA_DPI_RESOLUTION, _MIPIC_DPI_RESOLUTION)
7834 _MIPIC_DPI_RESOLUTION)
7835#define VERTICAL_ADDRESS_SHIFT 16 7870#define VERTICAL_ADDRESS_SHIFT 16
7836#define VERTICAL_ADDRESS_MASK (0xffff << 16) 7871#define VERTICAL_ADDRESS_MASK (0xffff << 16)
7837#define HORIZONTAL_ADDRESS_SHIFT 0 7872#define HORIZONTAL_ADDRESS_SHIFT 0
@@ -7839,8 +7874,7 @@ enum skl_disp_power_wells {
7839 7874
7840#define _MIPIA_DBI_FIFO_THROTTLE (dev_priv->mipi_mmio_base + 0xb024) 7875#define _MIPIA_DBI_FIFO_THROTTLE (dev_priv->mipi_mmio_base + 0xb024)
7841#define _MIPIC_DBI_FIFO_THROTTLE (dev_priv->mipi_mmio_base + 0xb824) 7876#define _MIPIC_DBI_FIFO_THROTTLE (dev_priv->mipi_mmio_base + 0xb824)
7842#define MIPI_DBI_FIFO_THROTTLE(port) _MIPI_PORT(port, \ 7877#define MIPI_DBI_FIFO_THROTTLE(port) _MMIO_MIPI(port, _MIPIA_DBI_FIFO_THROTTLE, _MIPIC_DBI_FIFO_THROTTLE)
7843 _MIPIA_DBI_FIFO_THROTTLE, _MIPIC_DBI_FIFO_THROTTLE)
7844#define DBI_FIFO_EMPTY_HALF (0 << 0) 7878#define DBI_FIFO_EMPTY_HALF (0 << 0)
7845#define DBI_FIFO_EMPTY_QUARTER (1 << 0) 7879#define DBI_FIFO_EMPTY_QUARTER (1 << 0)
7846#define DBI_FIFO_EMPTY_7_LOCATIONS (2 << 0) 7880#define DBI_FIFO_EMPTY_7_LOCATIONS (2 << 0)
@@ -7848,50 +7882,41 @@ enum skl_disp_power_wells {
7848/* regs below are bits 15:0 */ 7882/* regs below are bits 15:0 */
7849#define _MIPIA_HSYNC_PADDING_COUNT (dev_priv->mipi_mmio_base + 0xb028) 7883#define _MIPIA_HSYNC_PADDING_COUNT (dev_priv->mipi_mmio_base + 0xb028)
7850#define _MIPIC_HSYNC_PADDING_COUNT (dev_priv->mipi_mmio_base + 0xb828) 7884#define _MIPIC_HSYNC_PADDING_COUNT (dev_priv->mipi_mmio_base + 0xb828)
7851#define MIPI_HSYNC_PADDING_COUNT(port) _MIPI_PORT(port, \ 7885#define MIPI_HSYNC_PADDING_COUNT(port) _MMIO_MIPI(port, _MIPIA_HSYNC_PADDING_COUNT, _MIPIC_HSYNC_PADDING_COUNT)
7852 _MIPIA_HSYNC_PADDING_COUNT, _MIPIC_HSYNC_PADDING_COUNT)
7853 7886
7854#define _MIPIA_HBP_COUNT (dev_priv->mipi_mmio_base + 0xb02c) 7887#define _MIPIA_HBP_COUNT (dev_priv->mipi_mmio_base + 0xb02c)
7855#define _MIPIC_HBP_COUNT (dev_priv->mipi_mmio_base + 0xb82c) 7888#define _MIPIC_HBP_COUNT (dev_priv->mipi_mmio_base + 0xb82c)
7856#define MIPI_HBP_COUNT(port) _MIPI_PORT(port, _MIPIA_HBP_COUNT, \ 7889#define MIPI_HBP_COUNT(port) _MMIO_MIPI(port, _MIPIA_HBP_COUNT, _MIPIC_HBP_COUNT)
7857 _MIPIC_HBP_COUNT)
7858 7890
7859#define _MIPIA_HFP_COUNT (dev_priv->mipi_mmio_base + 0xb030) 7891#define _MIPIA_HFP_COUNT (dev_priv->mipi_mmio_base + 0xb030)
7860#define _MIPIC_HFP_COUNT (dev_priv->mipi_mmio_base + 0xb830) 7892#define _MIPIC_HFP_COUNT (dev_priv->mipi_mmio_base + 0xb830)
7861#define MIPI_HFP_COUNT(port) _MIPI_PORT(port, _MIPIA_HFP_COUNT, \ 7893#define MIPI_HFP_COUNT(port) _MMIO_MIPI(port, _MIPIA_HFP_COUNT, _MIPIC_HFP_COUNT)
7862 _MIPIC_HFP_COUNT)
7863 7894
7864#define _MIPIA_HACTIVE_AREA_COUNT (dev_priv->mipi_mmio_base + 0xb034) 7895#define _MIPIA_HACTIVE_AREA_COUNT (dev_priv->mipi_mmio_base + 0xb034)
7865#define _MIPIC_HACTIVE_AREA_COUNT (dev_priv->mipi_mmio_base + 0xb834) 7896#define _MIPIC_HACTIVE_AREA_COUNT (dev_priv->mipi_mmio_base + 0xb834)
7866#define MIPI_HACTIVE_AREA_COUNT(port) _MIPI_PORT(port, \ 7897#define MIPI_HACTIVE_AREA_COUNT(port) _MMIO_MIPI(port, _MIPIA_HACTIVE_AREA_COUNT, _MIPIC_HACTIVE_AREA_COUNT)
7867 _MIPIA_HACTIVE_AREA_COUNT, _MIPIC_HACTIVE_AREA_COUNT)
7868 7898
7869#define _MIPIA_VSYNC_PADDING_COUNT (dev_priv->mipi_mmio_base + 0xb038) 7899#define _MIPIA_VSYNC_PADDING_COUNT (dev_priv->mipi_mmio_base + 0xb038)
7870#define _MIPIC_VSYNC_PADDING_COUNT (dev_priv->mipi_mmio_base + 0xb838) 7900#define _MIPIC_VSYNC_PADDING_COUNT (dev_priv->mipi_mmio_base + 0xb838)
7871#define MIPI_VSYNC_PADDING_COUNT(port) _MIPI_PORT(port, \ 7901#define MIPI_VSYNC_PADDING_COUNT(port) _MMIO_MIPI(port, _MIPIA_VSYNC_PADDING_COUNT, _MIPIC_VSYNC_PADDING_COUNT)
7872 _MIPIA_VSYNC_PADDING_COUNT, _MIPIC_VSYNC_PADDING_COUNT)
7873 7902
7874#define _MIPIA_VBP_COUNT (dev_priv->mipi_mmio_base + 0xb03c) 7903#define _MIPIA_VBP_COUNT (dev_priv->mipi_mmio_base + 0xb03c)
7875#define _MIPIC_VBP_COUNT (dev_priv->mipi_mmio_base + 0xb83c) 7904#define _MIPIC_VBP_COUNT (dev_priv->mipi_mmio_base + 0xb83c)
7876#define MIPI_VBP_COUNT(port) _MIPI_PORT(port, _MIPIA_VBP_COUNT, \ 7905#define MIPI_VBP_COUNT(port) _MMIO_MIPI(port, _MIPIA_VBP_COUNT, _MIPIC_VBP_COUNT)
7877 _MIPIC_VBP_COUNT)
7878 7906
7879#define _MIPIA_VFP_COUNT (dev_priv->mipi_mmio_base + 0xb040) 7907#define _MIPIA_VFP_COUNT (dev_priv->mipi_mmio_base + 0xb040)
7880#define _MIPIC_VFP_COUNT (dev_priv->mipi_mmio_base + 0xb840) 7908#define _MIPIC_VFP_COUNT (dev_priv->mipi_mmio_base + 0xb840)
7881#define MIPI_VFP_COUNT(port) _MIPI_PORT(port, _MIPIA_VFP_COUNT, \ 7909#define MIPI_VFP_COUNT(port) _MMIO_MIPI(port, _MIPIA_VFP_COUNT, _MIPIC_VFP_COUNT)
7882 _MIPIC_VFP_COUNT)
7883 7910
7884#define _MIPIA_HIGH_LOW_SWITCH_COUNT (dev_priv->mipi_mmio_base + 0xb044) 7911#define _MIPIA_HIGH_LOW_SWITCH_COUNT (dev_priv->mipi_mmio_base + 0xb044)
7885#define _MIPIC_HIGH_LOW_SWITCH_COUNT (dev_priv->mipi_mmio_base + 0xb844) 7912#define _MIPIC_HIGH_LOW_SWITCH_COUNT (dev_priv->mipi_mmio_base + 0xb844)
7886#define MIPI_HIGH_LOW_SWITCH_COUNT(port) _MIPI_PORT(port, \ 7913#define MIPI_HIGH_LOW_SWITCH_COUNT(port) _MMIO_MIPI(port, _MIPIA_HIGH_LOW_SWITCH_COUNT, _MIPIC_HIGH_LOW_SWITCH_COUNT)
7887 _MIPIA_HIGH_LOW_SWITCH_COUNT, _MIPIC_HIGH_LOW_SWITCH_COUNT)
7888 7914
7889/* regs above are bits 15:0 */ 7915/* regs above are bits 15:0 */
7890 7916
7891#define _MIPIA_DPI_CONTROL (dev_priv->mipi_mmio_base + 0xb048) 7917#define _MIPIA_DPI_CONTROL (dev_priv->mipi_mmio_base + 0xb048)
7892#define _MIPIC_DPI_CONTROL (dev_priv->mipi_mmio_base + 0xb848) 7918#define _MIPIC_DPI_CONTROL (dev_priv->mipi_mmio_base + 0xb848)
7893#define MIPI_DPI_CONTROL(port) _MIPI_PORT(port, _MIPIA_DPI_CONTROL, \ 7919#define MIPI_DPI_CONTROL(port) _MMIO_MIPI(port, _MIPIA_DPI_CONTROL, _MIPIC_DPI_CONTROL)
7894 _MIPIC_DPI_CONTROL)
7895#define DPI_LP_MODE (1 << 6) 7920#define DPI_LP_MODE (1 << 6)
7896#define BACKLIGHT_OFF (1 << 5) 7921#define BACKLIGHT_OFF (1 << 5)
7897#define BACKLIGHT_ON (1 << 4) 7922#define BACKLIGHT_ON (1 << 4)
@@ -7902,29 +7927,26 @@ enum skl_disp_power_wells {
7902 7927
7903#define _MIPIA_DPI_DATA (dev_priv->mipi_mmio_base + 0xb04c) 7928#define _MIPIA_DPI_DATA (dev_priv->mipi_mmio_base + 0xb04c)
7904#define _MIPIC_DPI_DATA (dev_priv->mipi_mmio_base + 0xb84c) 7929#define _MIPIC_DPI_DATA (dev_priv->mipi_mmio_base + 0xb84c)
7905#define MIPI_DPI_DATA(port) _MIPI_PORT(port, _MIPIA_DPI_DATA, \ 7930#define MIPI_DPI_DATA(port) _MMIO_MIPI(port, _MIPIA_DPI_DATA, _MIPIC_DPI_DATA)
7906 _MIPIC_DPI_DATA)
7907#define COMMAND_BYTE_SHIFT 0 7931#define COMMAND_BYTE_SHIFT 0
7908#define COMMAND_BYTE_MASK (0x3f << 0) 7932#define COMMAND_BYTE_MASK (0x3f << 0)
7909 7933
7910#define _MIPIA_INIT_COUNT (dev_priv->mipi_mmio_base + 0xb050) 7934#define _MIPIA_INIT_COUNT (dev_priv->mipi_mmio_base + 0xb050)
7911#define _MIPIC_INIT_COUNT (dev_priv->mipi_mmio_base + 0xb850) 7935#define _MIPIC_INIT_COUNT (dev_priv->mipi_mmio_base + 0xb850)
7912#define MIPI_INIT_COUNT(port) _MIPI_PORT(port, _MIPIA_INIT_COUNT, \ 7936#define MIPI_INIT_COUNT(port) _MMIO_MIPI(port, _MIPIA_INIT_COUNT, _MIPIC_INIT_COUNT)
7913 _MIPIC_INIT_COUNT)
7914#define MASTER_INIT_TIMER_SHIFT 0 7937#define MASTER_INIT_TIMER_SHIFT 0
7915#define MASTER_INIT_TIMER_MASK (0xffff << 0) 7938#define MASTER_INIT_TIMER_MASK (0xffff << 0)
7916 7939
7917#define _MIPIA_MAX_RETURN_PKT_SIZE (dev_priv->mipi_mmio_base + 0xb054) 7940#define _MIPIA_MAX_RETURN_PKT_SIZE (dev_priv->mipi_mmio_base + 0xb054)
7918#define _MIPIC_MAX_RETURN_PKT_SIZE (dev_priv->mipi_mmio_base + 0xb854) 7941#define _MIPIC_MAX_RETURN_PKT_SIZE (dev_priv->mipi_mmio_base + 0xb854)
7919#define MIPI_MAX_RETURN_PKT_SIZE(port) _MIPI_PORT(port, \ 7942#define MIPI_MAX_RETURN_PKT_SIZE(port) _MMIO_MIPI(port, \
7920 _MIPIA_MAX_RETURN_PKT_SIZE, _MIPIC_MAX_RETURN_PKT_SIZE) 7943 _MIPIA_MAX_RETURN_PKT_SIZE, _MIPIC_MAX_RETURN_PKT_SIZE)
7921#define MAX_RETURN_PKT_SIZE_SHIFT 0 7944#define MAX_RETURN_PKT_SIZE_SHIFT 0
7922#define MAX_RETURN_PKT_SIZE_MASK (0x3ff << 0) 7945#define MAX_RETURN_PKT_SIZE_MASK (0x3ff << 0)
7923 7946
7924#define _MIPIA_VIDEO_MODE_FORMAT (dev_priv->mipi_mmio_base + 0xb058) 7947#define _MIPIA_VIDEO_MODE_FORMAT (dev_priv->mipi_mmio_base + 0xb058)
7925#define _MIPIC_VIDEO_MODE_FORMAT (dev_priv->mipi_mmio_base + 0xb858) 7948#define _MIPIC_VIDEO_MODE_FORMAT (dev_priv->mipi_mmio_base + 0xb858)
7926#define MIPI_VIDEO_MODE_FORMAT(port) _MIPI_PORT(port, \ 7949#define MIPI_VIDEO_MODE_FORMAT(port) _MMIO_MIPI(port, _MIPIA_VIDEO_MODE_FORMAT, _MIPIC_VIDEO_MODE_FORMAT)
7927 _MIPIA_VIDEO_MODE_FORMAT, _MIPIC_VIDEO_MODE_FORMAT)
7928#define RANDOM_DPI_DISPLAY_RESOLUTION (1 << 4) 7950#define RANDOM_DPI_DISPLAY_RESOLUTION (1 << 4)
7929#define DISABLE_VIDEO_BTA (1 << 3) 7951#define DISABLE_VIDEO_BTA (1 << 3)
7930#define IP_TG_CONFIG (1 << 2) 7952#define IP_TG_CONFIG (1 << 2)
@@ -7934,8 +7956,7 @@ enum skl_disp_power_wells {
7934 7956
7935#define _MIPIA_EOT_DISABLE (dev_priv->mipi_mmio_base + 0xb05c) 7957#define _MIPIA_EOT_DISABLE (dev_priv->mipi_mmio_base + 0xb05c)
7936#define _MIPIC_EOT_DISABLE (dev_priv->mipi_mmio_base + 0xb85c) 7958#define _MIPIC_EOT_DISABLE (dev_priv->mipi_mmio_base + 0xb85c)
7937#define MIPI_EOT_DISABLE(port) _MIPI_PORT(port, _MIPIA_EOT_DISABLE, \ 7959#define MIPI_EOT_DISABLE(port) _MMIO_MIPI(port, _MIPIA_EOT_DISABLE, _MIPIC_EOT_DISABLE)
7938 _MIPIC_EOT_DISABLE)
7939#define LP_RX_TIMEOUT_ERROR_RECOVERY_DISABLE (1 << 7) 7960#define LP_RX_TIMEOUT_ERROR_RECOVERY_DISABLE (1 << 7)
7940#define HS_RX_TIMEOUT_ERROR_RECOVERY_DISABLE (1 << 6) 7961#define HS_RX_TIMEOUT_ERROR_RECOVERY_DISABLE (1 << 6)
7941#define LOW_CONTENTION_RECOVERY_DISABLE (1 << 5) 7962#define LOW_CONTENTION_RECOVERY_DISABLE (1 << 5)
@@ -7947,31 +7968,26 @@ enum skl_disp_power_wells {
7947 7968
7948#define _MIPIA_LP_BYTECLK (dev_priv->mipi_mmio_base + 0xb060) 7969#define _MIPIA_LP_BYTECLK (dev_priv->mipi_mmio_base + 0xb060)
7949#define _MIPIC_LP_BYTECLK (dev_priv->mipi_mmio_base + 0xb860) 7970#define _MIPIC_LP_BYTECLK (dev_priv->mipi_mmio_base + 0xb860)
7950#define MIPI_LP_BYTECLK(port) _MIPI_PORT(port, _MIPIA_LP_BYTECLK, \ 7971#define MIPI_LP_BYTECLK(port) _MMIO_MIPI(port, _MIPIA_LP_BYTECLK, _MIPIC_LP_BYTECLK)
7951 _MIPIC_LP_BYTECLK)
7952#define LP_BYTECLK_SHIFT 0 7972#define LP_BYTECLK_SHIFT 0
7953#define LP_BYTECLK_MASK (0xffff << 0) 7973#define LP_BYTECLK_MASK (0xffff << 0)
7954 7974
7955/* bits 31:0 */ 7975/* bits 31:0 */
7956#define _MIPIA_LP_GEN_DATA (dev_priv->mipi_mmio_base + 0xb064) 7976#define _MIPIA_LP_GEN_DATA (dev_priv->mipi_mmio_base + 0xb064)
7957#define _MIPIC_LP_GEN_DATA (dev_priv->mipi_mmio_base + 0xb864) 7977#define _MIPIC_LP_GEN_DATA (dev_priv->mipi_mmio_base + 0xb864)
7958#define MIPI_LP_GEN_DATA(port) _MIPI_PORT(port, _MIPIA_LP_GEN_DATA, \ 7978#define MIPI_LP_GEN_DATA(port) _MMIO_MIPI(port, _MIPIA_LP_GEN_DATA, _MIPIC_LP_GEN_DATA)
7959 _MIPIC_LP_GEN_DATA)
7960 7979
7961/* bits 31:0 */ 7980/* bits 31:0 */
7962#define _MIPIA_HS_GEN_DATA (dev_priv->mipi_mmio_base + 0xb068) 7981#define _MIPIA_HS_GEN_DATA (dev_priv->mipi_mmio_base + 0xb068)
7963#define _MIPIC_HS_GEN_DATA (dev_priv->mipi_mmio_base + 0xb868) 7982#define _MIPIC_HS_GEN_DATA (dev_priv->mipi_mmio_base + 0xb868)
7964#define MIPI_HS_GEN_DATA(port) _MIPI_PORT(port, _MIPIA_HS_GEN_DATA, \ 7983#define MIPI_HS_GEN_DATA(port) _MMIO_MIPI(port, _MIPIA_HS_GEN_DATA, _MIPIC_HS_GEN_DATA)
7965 _MIPIC_HS_GEN_DATA)
7966 7984
7967#define _MIPIA_LP_GEN_CTRL (dev_priv->mipi_mmio_base + 0xb06c) 7985#define _MIPIA_LP_GEN_CTRL (dev_priv->mipi_mmio_base + 0xb06c)
7968#define _MIPIC_LP_GEN_CTRL (dev_priv->mipi_mmio_base + 0xb86c) 7986#define _MIPIC_LP_GEN_CTRL (dev_priv->mipi_mmio_base + 0xb86c)
7969#define MIPI_LP_GEN_CTRL(port) _MIPI_PORT(port, _MIPIA_LP_GEN_CTRL, \ 7987#define MIPI_LP_GEN_CTRL(port) _MMIO_MIPI(port, _MIPIA_LP_GEN_CTRL, _MIPIC_LP_GEN_CTRL)
7970 _MIPIC_LP_GEN_CTRL)
7971#define _MIPIA_HS_GEN_CTRL (dev_priv->mipi_mmio_base + 0xb070) 7988#define _MIPIA_HS_GEN_CTRL (dev_priv->mipi_mmio_base + 0xb070)
7972#define _MIPIC_HS_GEN_CTRL (dev_priv->mipi_mmio_base + 0xb870) 7989#define _MIPIC_HS_GEN_CTRL (dev_priv->mipi_mmio_base + 0xb870)
7973#define MIPI_HS_GEN_CTRL(port) _MIPI_PORT(port, _MIPIA_HS_GEN_CTRL, \ 7990#define MIPI_HS_GEN_CTRL(port) _MMIO_MIPI(port, _MIPIA_HS_GEN_CTRL, _MIPIC_HS_GEN_CTRL)
7974 _MIPIC_HS_GEN_CTRL)
7975#define LONG_PACKET_WORD_COUNT_SHIFT 8 7991#define LONG_PACKET_WORD_COUNT_SHIFT 8
7976#define LONG_PACKET_WORD_COUNT_MASK (0xffff << 8) 7992#define LONG_PACKET_WORD_COUNT_MASK (0xffff << 8)
7977#define SHORT_PACKET_PARAM_SHIFT 8 7993#define SHORT_PACKET_PARAM_SHIFT 8
@@ -7984,8 +8000,7 @@ enum skl_disp_power_wells {
7984 8000
7985#define _MIPIA_GEN_FIFO_STAT (dev_priv->mipi_mmio_base + 0xb074) 8001#define _MIPIA_GEN_FIFO_STAT (dev_priv->mipi_mmio_base + 0xb074)
7986#define _MIPIC_GEN_FIFO_STAT (dev_priv->mipi_mmio_base + 0xb874) 8002#define _MIPIC_GEN_FIFO_STAT (dev_priv->mipi_mmio_base + 0xb874)
7987#define MIPI_GEN_FIFO_STAT(port) _MIPI_PORT(port, _MIPIA_GEN_FIFO_STAT, \ 8003#define MIPI_GEN_FIFO_STAT(port) _MMIO_MIPI(port, _MIPIA_GEN_FIFO_STAT, _MIPIC_GEN_FIFO_STAT)
7988 _MIPIC_GEN_FIFO_STAT)
7989#define DPI_FIFO_EMPTY (1 << 28) 8004#define DPI_FIFO_EMPTY (1 << 28)
7990#define DBI_FIFO_EMPTY (1 << 27) 8005#define DBI_FIFO_EMPTY (1 << 27)
7991#define LP_CTRL_FIFO_EMPTY (1 << 26) 8006#define LP_CTRL_FIFO_EMPTY (1 << 26)
@@ -8003,16 +8018,14 @@ enum skl_disp_power_wells {
8003 8018
8004#define _MIPIA_HS_LS_DBI_ENABLE (dev_priv->mipi_mmio_base + 0xb078) 8019#define _MIPIA_HS_LS_DBI_ENABLE (dev_priv->mipi_mmio_base + 0xb078)
8005#define _MIPIC_HS_LS_DBI_ENABLE (dev_priv->mipi_mmio_base + 0xb878) 8020#define _MIPIC_HS_LS_DBI_ENABLE (dev_priv->mipi_mmio_base + 0xb878)
8006#define MIPI_HS_LP_DBI_ENABLE(port) _MIPI_PORT(port, \ 8021#define MIPI_HS_LP_DBI_ENABLE(port) _MMIO_MIPI(port, _MIPIA_HS_LS_DBI_ENABLE, _MIPIC_HS_LS_DBI_ENABLE)
8007 _MIPIA_HS_LS_DBI_ENABLE, _MIPIC_HS_LS_DBI_ENABLE)
8008#define DBI_HS_LP_MODE_MASK (1 << 0) 8022#define DBI_HS_LP_MODE_MASK (1 << 0)
8009#define DBI_LP_MODE (1 << 0) 8023#define DBI_LP_MODE (1 << 0)
8010#define DBI_HS_MODE (0 << 0) 8024#define DBI_HS_MODE (0 << 0)
8011 8025
8012#define _MIPIA_DPHY_PARAM (dev_priv->mipi_mmio_base + 0xb080) 8026#define _MIPIA_DPHY_PARAM (dev_priv->mipi_mmio_base + 0xb080)
8013#define _MIPIC_DPHY_PARAM (dev_priv->mipi_mmio_base + 0xb880) 8027#define _MIPIC_DPHY_PARAM (dev_priv->mipi_mmio_base + 0xb880)
8014#define MIPI_DPHY_PARAM(port) _MIPI_PORT(port, _MIPIA_DPHY_PARAM, \ 8028#define MIPI_DPHY_PARAM(port) _MMIO_MIPI(port, _MIPIA_DPHY_PARAM, _MIPIC_DPHY_PARAM)
8015 _MIPIC_DPHY_PARAM)
8016#define EXIT_ZERO_COUNT_SHIFT 24 8029#define EXIT_ZERO_COUNT_SHIFT 24
8017#define EXIT_ZERO_COUNT_MASK (0x3f << 24) 8030#define EXIT_ZERO_COUNT_MASK (0x3f << 24)
8018#define TRAIL_COUNT_SHIFT 16 8031#define TRAIL_COUNT_SHIFT 16
@@ -8025,15 +8038,11 @@ enum skl_disp_power_wells {
8025/* bits 31:0 */ 8038/* bits 31:0 */
8026#define _MIPIA_DBI_BW_CTRL (dev_priv->mipi_mmio_base + 0xb084) 8039#define _MIPIA_DBI_BW_CTRL (dev_priv->mipi_mmio_base + 0xb084)
8027#define _MIPIC_DBI_BW_CTRL (dev_priv->mipi_mmio_base + 0xb884) 8040#define _MIPIC_DBI_BW_CTRL (dev_priv->mipi_mmio_base + 0xb884)
8028#define MIPI_DBI_BW_CTRL(port) _MIPI_PORT(port, _MIPIA_DBI_BW_CTRL, \ 8041#define MIPI_DBI_BW_CTRL(port) _MMIO_MIPI(port, _MIPIA_DBI_BW_CTRL, _MIPIC_DBI_BW_CTRL)
8029 _MIPIC_DBI_BW_CTRL) 8042
8030 8043#define _MIPIA_CLK_LANE_SWITCH_TIME_CNT (dev_priv->mipi_mmio_base + 0xb088)
8031#define _MIPIA_CLK_LANE_SWITCH_TIME_CNT (dev_priv->mipi_mmio_base \ 8044#define _MIPIC_CLK_LANE_SWITCH_TIME_CNT (dev_priv->mipi_mmio_base + 0xb888)
8032 + 0xb088) 8045#define MIPI_CLK_LANE_SWITCH_TIME_CNT(port) _MMIO_MIPI(port, _MIPIA_CLK_LANE_SWITCH_TIME_CNT, _MIPIC_CLK_LANE_SWITCH_TIME_CNT)
8033#define _MIPIC_CLK_LANE_SWITCH_TIME_CNT (dev_priv->mipi_mmio_base \
8034 + 0xb888)
8035#define MIPI_CLK_LANE_SWITCH_TIME_CNT(port) _MIPI_PORT(port, \
8036 _MIPIA_CLK_LANE_SWITCH_TIME_CNT, _MIPIC_CLK_LANE_SWITCH_TIME_CNT)
8037#define LP_HS_SSW_CNT_SHIFT 16 8046#define LP_HS_SSW_CNT_SHIFT 16
8038#define LP_HS_SSW_CNT_MASK (0xffff << 16) 8047#define LP_HS_SSW_CNT_MASK (0xffff << 16)
8039#define HS_LP_PWR_SW_CNT_SHIFT 0 8048#define HS_LP_PWR_SW_CNT_SHIFT 0
@@ -8041,19 +8050,16 @@ enum skl_disp_power_wells {
8041 8050
8042#define _MIPIA_STOP_STATE_STALL (dev_priv->mipi_mmio_base + 0xb08c) 8051#define _MIPIA_STOP_STATE_STALL (dev_priv->mipi_mmio_base + 0xb08c)
8043#define _MIPIC_STOP_STATE_STALL (dev_priv->mipi_mmio_base + 0xb88c) 8052#define _MIPIC_STOP_STATE_STALL (dev_priv->mipi_mmio_base + 0xb88c)
8044#define MIPI_STOP_STATE_STALL(port) _MIPI_PORT(port, \ 8053#define MIPI_STOP_STATE_STALL(port) _MMIO_MIPI(port, _MIPIA_STOP_STATE_STALL, _MIPIC_STOP_STATE_STALL)
8045 _MIPIA_STOP_STATE_STALL, _MIPIC_STOP_STATE_STALL)
8046#define STOP_STATE_STALL_COUNTER_SHIFT 0 8054#define STOP_STATE_STALL_COUNTER_SHIFT 0
8047#define STOP_STATE_STALL_COUNTER_MASK (0xff << 0) 8055#define STOP_STATE_STALL_COUNTER_MASK (0xff << 0)
8048 8056
8049#define _MIPIA_INTR_STAT_REG_1 (dev_priv->mipi_mmio_base + 0xb090) 8057#define _MIPIA_INTR_STAT_REG_1 (dev_priv->mipi_mmio_base + 0xb090)
8050#define _MIPIC_INTR_STAT_REG_1 (dev_priv->mipi_mmio_base + 0xb890) 8058#define _MIPIC_INTR_STAT_REG_1 (dev_priv->mipi_mmio_base + 0xb890)
8051#define MIPI_INTR_STAT_REG_1(port) _MIPI_PORT(port, \ 8059#define MIPI_INTR_STAT_REG_1(port) _MMIO_MIPI(port, _MIPIA_INTR_STAT_REG_1, _MIPIC_INTR_STAT_REG_1)
8052 _MIPIA_INTR_STAT_REG_1, _MIPIC_INTR_STAT_REG_1)
8053#define _MIPIA_INTR_EN_REG_1 (dev_priv->mipi_mmio_base + 0xb094) 8060#define _MIPIA_INTR_EN_REG_1 (dev_priv->mipi_mmio_base + 0xb094)
8054#define _MIPIC_INTR_EN_REG_1 (dev_priv->mipi_mmio_base + 0xb894) 8061#define _MIPIC_INTR_EN_REG_1 (dev_priv->mipi_mmio_base + 0xb894)
8055#define MIPI_INTR_EN_REG_1(port) _MIPI_PORT(port, _MIPIA_INTR_EN_REG_1, \ 8062#define MIPI_INTR_EN_REG_1(port) _MMIO_MIPI(port, _MIPIA_INTR_EN_REG_1, _MIPIC_INTR_EN_REG_1)
8056 _MIPIC_INTR_EN_REG_1)
8057#define RX_CONTENTION_DETECTED (1 << 0) 8063#define RX_CONTENTION_DETECTED (1 << 0)
8058 8064
8059/* XXX: only pipe A ?!? */ 8065/* XXX: only pipe A ?!? */
@@ -8073,8 +8079,7 @@ enum skl_disp_power_wells {
8073 8079
8074#define _MIPIA_CTRL (dev_priv->mipi_mmio_base + 0xb104) 8080#define _MIPIA_CTRL (dev_priv->mipi_mmio_base + 0xb104)
8075#define _MIPIC_CTRL (dev_priv->mipi_mmio_base + 0xb904) 8081#define _MIPIC_CTRL (dev_priv->mipi_mmio_base + 0xb904)
8076#define MIPI_CTRL(port) _MIPI_PORT(port, _MIPIA_CTRL, \ 8082#define MIPI_CTRL(port) _MMIO_MIPI(port, _MIPIA_CTRL, _MIPIC_CTRL)
8077 _MIPIC_CTRL)
8078#define ESCAPE_CLOCK_DIVIDER_SHIFT 5 /* A only */ 8083#define ESCAPE_CLOCK_DIVIDER_SHIFT 5 /* A only */
8079#define ESCAPE_CLOCK_DIVIDER_MASK (3 << 5) 8084#define ESCAPE_CLOCK_DIVIDER_MASK (3 << 5)
8080#define ESCAPE_CLOCK_DIVIDER_1 (0 << 5) 8085#define ESCAPE_CLOCK_DIVIDER_1 (0 << 5)
@@ -8093,23 +8098,20 @@ enum skl_disp_power_wells {
8093 8098
8094#define _MIPIA_DATA_ADDRESS (dev_priv->mipi_mmio_base + 0xb108) 8099#define _MIPIA_DATA_ADDRESS (dev_priv->mipi_mmio_base + 0xb108)
8095#define _MIPIC_DATA_ADDRESS (dev_priv->mipi_mmio_base + 0xb908) 8100#define _MIPIC_DATA_ADDRESS (dev_priv->mipi_mmio_base + 0xb908)
8096#define MIPI_DATA_ADDRESS(port) _MIPI_PORT(port, _MIPIA_DATA_ADDRESS, \ 8101#define MIPI_DATA_ADDRESS(port) _MMIO_MIPI(port, _MIPIA_DATA_ADDRESS, _MIPIC_DATA_ADDRESS)
8097 _MIPIC_DATA_ADDRESS)
8098#define DATA_MEM_ADDRESS_SHIFT 5 8102#define DATA_MEM_ADDRESS_SHIFT 5
8099#define DATA_MEM_ADDRESS_MASK (0x7ffffff << 5) 8103#define DATA_MEM_ADDRESS_MASK (0x7ffffff << 5)
8100#define DATA_VALID (1 << 0) 8104#define DATA_VALID (1 << 0)
8101 8105
8102#define _MIPIA_DATA_LENGTH (dev_priv->mipi_mmio_base + 0xb10c) 8106#define _MIPIA_DATA_LENGTH (dev_priv->mipi_mmio_base + 0xb10c)
8103#define _MIPIC_DATA_LENGTH (dev_priv->mipi_mmio_base + 0xb90c) 8107#define _MIPIC_DATA_LENGTH (dev_priv->mipi_mmio_base + 0xb90c)
8104#define MIPI_DATA_LENGTH(port) _MIPI_PORT(port, _MIPIA_DATA_LENGTH, \ 8108#define MIPI_DATA_LENGTH(port) _MMIO_MIPI(port, _MIPIA_DATA_LENGTH, _MIPIC_DATA_LENGTH)
8105 _MIPIC_DATA_LENGTH)
8106#define DATA_LENGTH_SHIFT 0 8109#define DATA_LENGTH_SHIFT 0
8107#define DATA_LENGTH_MASK (0xfffff << 0) 8110#define DATA_LENGTH_MASK (0xfffff << 0)
8108 8111
8109#define _MIPIA_COMMAND_ADDRESS (dev_priv->mipi_mmio_base + 0xb110) 8112#define _MIPIA_COMMAND_ADDRESS (dev_priv->mipi_mmio_base + 0xb110)
8110#define _MIPIC_COMMAND_ADDRESS (dev_priv->mipi_mmio_base + 0xb910) 8113#define _MIPIC_COMMAND_ADDRESS (dev_priv->mipi_mmio_base + 0xb910)
8111#define MIPI_COMMAND_ADDRESS(port) _MIPI_PORT(port, \ 8114#define MIPI_COMMAND_ADDRESS(port) _MMIO_MIPI(port, _MIPIA_COMMAND_ADDRESS, _MIPIC_COMMAND_ADDRESS)
8112 _MIPIA_COMMAND_ADDRESS, _MIPIC_COMMAND_ADDRESS)
8113#define COMMAND_MEM_ADDRESS_SHIFT 5 8115#define COMMAND_MEM_ADDRESS_SHIFT 5
8114#define COMMAND_MEM_ADDRESS_MASK (0x7ffffff << 5) 8116#define COMMAND_MEM_ADDRESS_MASK (0x7ffffff << 5)
8115#define AUTO_PWG_ENABLE (1 << 2) 8117#define AUTO_PWG_ENABLE (1 << 2)
@@ -8118,21 +8120,17 @@ enum skl_disp_power_wells {
8118 8120
8119#define _MIPIA_COMMAND_LENGTH (dev_priv->mipi_mmio_base + 0xb114) 8121#define _MIPIA_COMMAND_LENGTH (dev_priv->mipi_mmio_base + 0xb114)
8120#define _MIPIC_COMMAND_LENGTH (dev_priv->mipi_mmio_base + 0xb914) 8122#define _MIPIC_COMMAND_LENGTH (dev_priv->mipi_mmio_base + 0xb914)
8121#define MIPI_COMMAND_LENGTH(port) _MIPI_PORT(port, _MIPIA_COMMAND_LENGTH, \ 8123#define MIPI_COMMAND_LENGTH(port) _MMIO_MIPI(port, _MIPIA_COMMAND_LENGTH, _MIPIC_COMMAND_LENGTH)
8122 _MIPIC_COMMAND_LENGTH)
8123#define COMMAND_LENGTH_SHIFT(n) (8 * (n)) /* n: 0...3 */ 8124#define COMMAND_LENGTH_SHIFT(n) (8 * (n)) /* n: 0...3 */
8124#define COMMAND_LENGTH_MASK(n) (0xff << (8 * (n))) 8125#define COMMAND_LENGTH_MASK(n) (0xff << (8 * (n)))
8125 8126
8126#define _MIPIA_READ_DATA_RETURN0 (dev_priv->mipi_mmio_base + 0xb118) 8127#define _MIPIA_READ_DATA_RETURN0 (dev_priv->mipi_mmio_base + 0xb118)
8127#define _MIPIC_READ_DATA_RETURN0 (dev_priv->mipi_mmio_base + 0xb918) 8128#define _MIPIC_READ_DATA_RETURN0 (dev_priv->mipi_mmio_base + 0xb918)
8128#define MIPI_READ_DATA_RETURN(port, n) \ 8129#define MIPI_READ_DATA_RETURN(port, n) _MMIO(_MIPI(port, _MIPIA_READ_DATA_RETURN0, _MIPIC_READ_DATA_RETURN0) + 4 * (n)) /* n: 0...7 */
8129 (_MIPI_PORT(port, _MIPIA_READ_DATA_RETURN0, _MIPIC_READ_DATA_RETURN0) \
8130 + 4 * (n)) /* n: 0...7 */
8131 8130
8132#define _MIPIA_READ_DATA_VALID (dev_priv->mipi_mmio_base + 0xb138) 8131#define _MIPIA_READ_DATA_VALID (dev_priv->mipi_mmio_base + 0xb138)
8133#define _MIPIC_READ_DATA_VALID (dev_priv->mipi_mmio_base + 0xb938) 8132#define _MIPIC_READ_DATA_VALID (dev_priv->mipi_mmio_base + 0xb938)
8134#define MIPI_READ_DATA_VALID(port) _MIPI_PORT(port, \ 8133#define MIPI_READ_DATA_VALID(port) _MMIO_MIPI(port, _MIPIA_READ_DATA_VALID, _MIPIC_READ_DATA_VALID)
8135 _MIPIA_READ_DATA_VALID, _MIPIC_READ_DATA_VALID)
8136#define READ_DATA_VALID(n) (1 << (n)) 8134#define READ_DATA_VALID(n) (1 << (n))
8137 8135
8138/* For UMS only (deprecated): */ 8136/* For UMS only (deprecated): */
@@ -8140,12 +8138,12 @@ enum skl_disp_power_wells {
8140#define _PALETTE_B (dev_priv->info.display_mmio_offset + 0xa800) 8138#define _PALETTE_B (dev_priv->info.display_mmio_offset + 0xa800)
8141 8139
8142/* MOCS (Memory Object Control State) registers */ 8140/* MOCS (Memory Object Control State) registers */
8143#define GEN9_LNCFCMOCS0 0xb020 /* L3 Cache Control base */ 8141#define GEN9_LNCFCMOCS(i) _MMIO(0xb020 + (i) * 4) /* L3 Cache Control */
8144 8142
8145#define GEN9_GFX_MOCS_0 0xc800 /* Graphics MOCS base register*/ 8143#define GEN9_GFX_MOCS(i) _MMIO(0xc800 + (i) * 4) /* Graphics MOCS registers */
8146#define GEN9_MFX0_MOCS_0 0xc900 /* Media 0 MOCS base register*/ 8144#define GEN9_MFX0_MOCS(i) _MMIO(0xc900 + (i) * 4) /* Media 0 MOCS registers */
8147#define GEN9_MFX1_MOCS_0 0xca00 /* Media 1 MOCS base register*/ 8145#define GEN9_MFX1_MOCS(i) _MMIO(0xca00 + (i) * 4) /* Media 1 MOCS registers */
8148#define GEN9_VEBOX_MOCS_0 0xcb00 /* Video MOCS base register*/ 8146#define GEN9_VEBOX_MOCS(i) _MMIO(0xcb00 + (i) * 4) /* Video MOCS registers */
8149#define GEN9_BLT_MOCS_0 0xcc00 /* Blitter MOCS base register*/ 8147#define GEN9_BLT_MOCS(i) _MMIO(0xcc00 + (i) * 4) /* Blitter MOCS registers */
8150 8148
8151#endif /* _I915_REG_H_ */ 8149#endif /* _I915_REG_H_ */
diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
index 50ce9ce2b269..f929c61f0fa2 100644
--- a/drivers/gpu/drm/i915/i915_sysfs.c
+++ b/drivers/gpu/drm/i915/i915_sysfs.c
@@ -35,7 +35,8 @@
35#define dev_to_drm_minor(d) dev_get_drvdata((d)) 35#define dev_to_drm_minor(d) dev_get_drvdata((d))
36 36
37#ifdef CONFIG_PM 37#ifdef CONFIG_PM
38static u32 calc_residency(struct drm_device *dev, const u32 reg) 38static u32 calc_residency(struct drm_device *dev,
39 i915_reg_t reg)
39{ 40{
40 struct drm_i915_private *dev_priv = dev->dev_private; 41 struct drm_i915_private *dev_priv = dev->dev_private;
41 u64 raw_time; /* 32b value may overflow during fixed point math */ 42 u64 raw_time; /* 32b value may overflow during fixed point math */
diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h
index 04fe8491c8b6..52b2d409945d 100644
--- a/drivers/gpu/drm/i915/i915_trace.h
+++ b/drivers/gpu/drm/i915/i915_trace.h
@@ -664,7 +664,7 @@ TRACE_EVENT(i915_flip_complete,
664); 664);
665 665
666TRACE_EVENT_CONDITION(i915_reg_rw, 666TRACE_EVENT_CONDITION(i915_reg_rw,
667 TP_PROTO(bool write, u32 reg, u64 val, int len, bool trace), 667 TP_PROTO(bool write, i915_reg_t reg, u64 val, int len, bool trace),
668 668
669 TP_ARGS(write, reg, val, len, trace), 669 TP_ARGS(write, reg, val, len, trace),
670 670
@@ -679,7 +679,7 @@ TRACE_EVENT_CONDITION(i915_reg_rw,
679 679
680 TP_fast_assign( 680 TP_fast_assign(
681 __entry->val = (u64)val; 681 __entry->val = (u64)val;
682 __entry->reg = reg; 682 __entry->reg = i915_mmio_reg_offset(reg);
683 __entry->write = write; 683 __entry->write = write;
684 __entry->len = len; 684 __entry->len = len;
685 ), 685 ),
diff --git a/drivers/gpu/drm/i915/i915_vgpu.c b/drivers/gpu/drm/i915/i915_vgpu.c
index 5eee75bff170..dea7429be4d0 100644
--- a/drivers/gpu/drm/i915/i915_vgpu.c
+++ b/drivers/gpu/drm/i915/i915_vgpu.c
@@ -69,13 +69,13 @@ void i915_check_vgpu(struct drm_device *dev)
69 if (!IS_HASWELL(dev)) 69 if (!IS_HASWELL(dev))
70 return; 70 return;
71 71
72 magic = readq(dev_priv->regs + vgtif_reg(magic)); 72 magic = __raw_i915_read64(dev_priv, vgtif_reg(magic));
73 if (magic != VGT_MAGIC) 73 if (magic != VGT_MAGIC)
74 return; 74 return;
75 75
76 version = INTEL_VGT_IF_VERSION_ENCODE( 76 version = INTEL_VGT_IF_VERSION_ENCODE(
77 readw(dev_priv->regs + vgtif_reg(version_major)), 77 __raw_i915_read16(dev_priv, vgtif_reg(version_major)),
78 readw(dev_priv->regs + vgtif_reg(version_minor))); 78 __raw_i915_read16(dev_priv, vgtif_reg(version_minor)));
79 if (version != INTEL_VGT_IF_VERSION) { 79 if (version != INTEL_VGT_IF_VERSION) {
80 DRM_INFO("VGT interface version mismatch!\n"); 80 DRM_INFO("VGT interface version mismatch!\n");
81 return; 81 return;
diff --git a/drivers/gpu/drm/i915/i915_vgpu.h b/drivers/gpu/drm/i915/i915_vgpu.h
index 21c97f44d637..3c83b47b5f69 100644
--- a/drivers/gpu/drm/i915/i915_vgpu.h
+++ b/drivers/gpu/drm/i915/i915_vgpu.h
@@ -92,14 +92,10 @@ struct vgt_if {
92 uint32_t g2v_notify; 92 uint32_t g2v_notify;
93 uint32_t rsv6[7]; 93 uint32_t rsv6[7];
94 94
95 uint32_t pdp0_lo; 95 struct {
96 uint32_t pdp0_hi; 96 uint32_t lo;
97 uint32_t pdp1_lo; 97 uint32_t hi;
98 uint32_t pdp1_hi; 98 } pdp[4];
99 uint32_t pdp2_lo;
100 uint32_t pdp2_hi;
101 uint32_t pdp3_lo;
102 uint32_t pdp3_hi;
103 99
104 uint32_t execlist_context_descriptor_lo; 100 uint32_t execlist_context_descriptor_lo;
105 uint32_t execlist_context_descriptor_hi; 101 uint32_t execlist_context_descriptor_hi;
@@ -108,7 +104,7 @@ struct vgt_if {
108} __packed; 104} __packed;
109 105
110#define vgtif_reg(x) \ 106#define vgtif_reg(x) \
111 (VGT_PVINFO_PAGE + (long)&((struct vgt_if *)NULL)->x) 107 _MMIO((VGT_PVINFO_PAGE + (long)&((struct vgt_if *)NULL)->x))
112 108
113/* vGPU display status to be used by the host side */ 109/* vGPU display status to be used by the host side */
114#define VGT_DRV_DISPLAY_NOT_READY 0 110#define VGT_DRV_DISPLAY_NOT_READY 0
diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c
index f1975f267710..643f342de33b 100644
--- a/drivers/gpu/drm/i915/intel_atomic.c
+++ b/drivers/gpu/drm/i915/intel_atomic.c
@@ -94,6 +94,7 @@ intel_crtc_duplicate_state(struct drm_crtc *crtc)
94 __drm_atomic_helper_crtc_duplicate_state(crtc, &crtc_state->base); 94 __drm_atomic_helper_crtc_duplicate_state(crtc, &crtc_state->base);
95 95
96 crtc_state->update_pipe = false; 96 crtc_state->update_pipe = false;
97 crtc_state->disable_lp_wm = false;
97 98
98 return &crtc_state->base; 99 return &crtc_state->base;
99} 100}
@@ -205,8 +206,6 @@ int intel_atomic_setup_scalers(struct drm_device *dev,
205 * but since this plane is unchanged just do the 206 * but since this plane is unchanged just do the
206 * minimum required validation. 207 * minimum required validation.
207 */ 208 */
208 if (plane->type == DRM_PLANE_TYPE_PRIMARY)
209 intel_crtc->atomic.wait_for_flips = true;
210 crtc_state->base.planes_changed = true; 209 crtc_state->base.planes_changed = true;
211 } 210 }
212 211
diff --git a/drivers/gpu/drm/i915/intel_atomic_plane.c b/drivers/gpu/drm/i915/intel_atomic_plane.c
index a11980696595..c6bb0fc1edfb 100644
--- a/drivers/gpu/drm/i915/intel_atomic_plane.c
+++ b/drivers/gpu/drm/i915/intel_atomic_plane.c
@@ -84,6 +84,7 @@ intel_plane_duplicate_state(struct drm_plane *plane)
84 state = &intel_state->base; 84 state = &intel_state->base;
85 85
86 __drm_atomic_helper_plane_duplicate_state(plane, state); 86 __drm_atomic_helper_plane_duplicate_state(plane, state);
87 intel_state->wait_req = NULL;
87 88
88 return state; 89 return state;
89} 90}
@@ -100,6 +101,7 @@ void
100intel_plane_destroy_state(struct drm_plane *plane, 101intel_plane_destroy_state(struct drm_plane *plane,
101 struct drm_plane_state *state) 102 struct drm_plane_state *state)
102{ 103{
104 WARN_ON(state && to_intel_plane_state(state)->wait_req);
103 drm_atomic_helper_plane_destroy_state(plane, state); 105 drm_atomic_helper_plane_destroy_state(plane, state);
104} 106}
105 107
diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c
index 4dccd9b003a1..de465f2876d1 100644
--- a/drivers/gpu/drm/i915/intel_audio.c
+++ b/drivers/gpu/drm/i915/intel_audio.c
@@ -161,9 +161,9 @@ static bool audio_rate_need_prog(struct intel_crtc *crtc,
161} 161}
162 162
163static bool intel_eld_uptodate(struct drm_connector *connector, 163static bool intel_eld_uptodate(struct drm_connector *connector,
164 int reg_eldv, uint32_t bits_eldv, 164 i915_reg_t reg_eldv, uint32_t bits_eldv,
165 int reg_elda, uint32_t bits_elda, 165 i915_reg_t reg_elda, uint32_t bits_elda,
166 int reg_edid) 166 i915_reg_t reg_edid)
167{ 167{
168 struct drm_i915_private *dev_priv = connector->dev->dev_private; 168 struct drm_i915_private *dev_priv = connector->dev->dev_private;
169 uint8_t *eld = connector->eld; 169 uint8_t *eld = connector->eld;
@@ -364,8 +364,7 @@ static void ilk_audio_codec_disable(struct intel_encoder *encoder)
364 enum port port = intel_dig_port->port; 364 enum port port = intel_dig_port->port;
365 enum pipe pipe = intel_crtc->pipe; 365 enum pipe pipe = intel_crtc->pipe;
366 uint32_t tmp, eldv; 366 uint32_t tmp, eldv;
367 int aud_config; 367 i915_reg_t aud_config, aud_cntrl_st2;
368 int aud_cntrl_st2;
369 368
370 DRM_DEBUG_KMS("Disable audio codec on port %c, pipe %c\n", 369 DRM_DEBUG_KMS("Disable audio codec on port %c, pipe %c\n",
371 port_name(port), pipe_name(pipe)); 370 port_name(port), pipe_name(pipe));
@@ -416,10 +415,7 @@ static void ilk_audio_codec_enable(struct drm_connector *connector,
416 uint32_t eldv; 415 uint32_t eldv;
417 uint32_t tmp; 416 uint32_t tmp;
418 int len, i; 417 int len, i;
419 int hdmiw_hdmiedid; 418 i915_reg_t hdmiw_hdmiedid, aud_config, aud_cntl_st, aud_cntrl_st2;
420 int aud_config;
421 int aud_cntl_st;
422 int aud_cntrl_st2;
423 419
424 DRM_DEBUG_KMS("Enable audio codec on port %c, pipe %c, %u bytes ELD\n", 420 DRM_DEBUG_KMS("Enable audio codec on port %c, pipe %c, %u bytes ELD\n",
425 port_name(port), pipe_name(pipe), drm_eld_size(eld)); 421 port_name(port), pipe_name(pipe), drm_eld_size(eld));
@@ -525,6 +521,10 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)
525 dev_priv->display.audio_codec_enable(connector, intel_encoder, 521 dev_priv->display.audio_codec_enable(connector, intel_encoder,
526 adjusted_mode); 522 adjusted_mode);
527 523
524 mutex_lock(&dev_priv->av_mutex);
525 intel_dig_port->audio_connector = connector;
526 mutex_unlock(&dev_priv->av_mutex);
527
528 if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify) 528 if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
529 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port); 529 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port);
530} 530}
@@ -548,6 +548,10 @@ void intel_audio_codec_disable(struct intel_encoder *intel_encoder)
548 if (dev_priv->display.audio_codec_disable) 548 if (dev_priv->display.audio_codec_disable)
549 dev_priv->display.audio_codec_disable(intel_encoder); 549 dev_priv->display.audio_codec_disable(intel_encoder);
550 550
551 mutex_lock(&dev_priv->av_mutex);
552 intel_dig_port->audio_connector = NULL;
553 mutex_unlock(&dev_priv->av_mutex);
554
551 if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify) 555 if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
552 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port); 556 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port);
553} 557}
@@ -591,7 +595,7 @@ static void i915_audio_component_codec_wake_override(struct device *dev,
591 struct drm_i915_private *dev_priv = dev_to_i915(dev); 595 struct drm_i915_private *dev_priv = dev_to_i915(dev);
592 u32 tmp; 596 u32 tmp;
593 597
594 if (!IS_SKYLAKE(dev_priv)) 598 if (!IS_SKYLAKE(dev_priv) && !IS_KABYLAKE(dev_priv))
595 return; 599 return;
596 600
597 /* 601 /*
@@ -632,44 +636,40 @@ static int i915_audio_component_sync_audio_rate(struct device *dev,
632 int port, int rate) 636 int port, int rate)
633{ 637{
634 struct drm_i915_private *dev_priv = dev_to_i915(dev); 638 struct drm_i915_private *dev_priv = dev_to_i915(dev);
635 struct drm_device *drm_dev = dev_priv->dev;
636 struct intel_encoder *intel_encoder; 639 struct intel_encoder *intel_encoder;
637 struct intel_digital_port *intel_dig_port;
638 struct intel_crtc *crtc; 640 struct intel_crtc *crtc;
639 struct drm_display_mode *mode; 641 struct drm_display_mode *mode;
640 struct i915_audio_component *acomp = dev_priv->audio_component; 642 struct i915_audio_component *acomp = dev_priv->audio_component;
641 enum pipe pipe = -1; 643 enum pipe pipe = INVALID_PIPE;
642 u32 tmp; 644 u32 tmp;
643 int n; 645 int n;
646 int err = 0;
644 647
645 /* HSW, BDW SKL need this fix */ 648 /* HSW, BDW, SKL, KBL need this fix */
646 if (!IS_SKYLAKE(dev_priv) && 649 if (!IS_SKYLAKE(dev_priv) &&
647 !IS_BROADWELL(dev_priv) && 650 !IS_KABYLAKE(dev_priv) &&
648 !IS_HASWELL(dev_priv)) 651 !IS_BROADWELL(dev_priv) &&
652 !IS_HASWELL(dev_priv))
649 return 0; 653 return 0;
650 654
651 mutex_lock(&dev_priv->av_mutex); 655 mutex_lock(&dev_priv->av_mutex);
652 /* 1. get the pipe */ 656 /* 1. get the pipe */
653 for_each_intel_encoder(drm_dev, intel_encoder) { 657 intel_encoder = dev_priv->dig_port_map[port];
654 if (intel_encoder->type != INTEL_OUTPUT_HDMI) 658 /* intel_encoder might be NULL for DP MST */
655 continue; 659 if (!intel_encoder || !intel_encoder->base.crtc ||
656 intel_dig_port = enc_to_dig_port(&intel_encoder->base); 660 intel_encoder->type != INTEL_OUTPUT_HDMI) {
657 if (port == intel_dig_port->port) { 661 DRM_DEBUG_KMS("no valid port %c\n", port_name(port));
658 crtc = to_intel_crtc(intel_encoder->base.crtc); 662 err = -ENODEV;
659 if (!crtc) { 663 goto unlock;
660 DRM_DEBUG_KMS("%s: crtc is NULL\n", __func__);
661 continue;
662 }
663 pipe = crtc->pipe;
664 break;
665 }
666 } 664 }
667 665 crtc = to_intel_crtc(intel_encoder->base.crtc);
666 pipe = crtc->pipe;
668 if (pipe == INVALID_PIPE) { 667 if (pipe == INVALID_PIPE) {
669 DRM_DEBUG_KMS("no pipe for the port %c\n", port_name(port)); 668 DRM_DEBUG_KMS("no pipe for the port %c\n", port_name(port));
670 mutex_unlock(&dev_priv->av_mutex); 669 err = -ENODEV;
671 return -ENODEV; 670 goto unlock;
672 } 671 }
672
673 DRM_DEBUG_KMS("pipe %c connects port %c\n", 673 DRM_DEBUG_KMS("pipe %c connects port %c\n",
674 pipe_name(pipe), port_name(port)); 674 pipe_name(pipe), port_name(port));
675 mode = &crtc->config->base.adjusted_mode; 675 mode = &crtc->config->base.adjusted_mode;
@@ -682,8 +682,7 @@ static int i915_audio_component_sync_audio_rate(struct device *dev,
682 tmp = I915_READ(HSW_AUD_CFG(pipe)); 682 tmp = I915_READ(HSW_AUD_CFG(pipe));
683 tmp &= ~AUD_CONFIG_N_PROG_ENABLE; 683 tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
684 I915_WRITE(HSW_AUD_CFG(pipe), tmp); 684 I915_WRITE(HSW_AUD_CFG(pipe), tmp);
685 mutex_unlock(&dev_priv->av_mutex); 685 goto unlock;
686 return 0;
687 } 686 }
688 687
689 n = audio_config_get_n(mode, rate); 688 n = audio_config_get_n(mode, rate);
@@ -693,8 +692,7 @@ static int i915_audio_component_sync_audio_rate(struct device *dev,
693 tmp = I915_READ(HSW_AUD_CFG(pipe)); 692 tmp = I915_READ(HSW_AUD_CFG(pipe));
694 tmp &= ~AUD_CONFIG_N_PROG_ENABLE; 693 tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
695 I915_WRITE(HSW_AUD_CFG(pipe), tmp); 694 I915_WRITE(HSW_AUD_CFG(pipe), tmp);
696 mutex_unlock(&dev_priv->av_mutex); 695 goto unlock;
697 return 0;
698 } 696 }
699 697
700 /* 3. set the N/CTS/M */ 698 /* 3. set the N/CTS/M */
@@ -702,8 +700,37 @@ static int i915_audio_component_sync_audio_rate(struct device *dev,
702 tmp = audio_config_setup_n_reg(n, tmp); 700 tmp = audio_config_setup_n_reg(n, tmp);
703 I915_WRITE(HSW_AUD_CFG(pipe), tmp); 701 I915_WRITE(HSW_AUD_CFG(pipe), tmp);
704 702
703 unlock:
705 mutex_unlock(&dev_priv->av_mutex); 704 mutex_unlock(&dev_priv->av_mutex);
706 return 0; 705 return err;
706}
707
708static int i915_audio_component_get_eld(struct device *dev, int port,
709 bool *enabled,
710 unsigned char *buf, int max_bytes)
711{
712 struct drm_i915_private *dev_priv = dev_to_i915(dev);
713 struct intel_encoder *intel_encoder;
714 struct intel_digital_port *intel_dig_port;
715 const u8 *eld;
716 int ret = -EINVAL;
717
718 mutex_lock(&dev_priv->av_mutex);
719 intel_encoder = dev_priv->dig_port_map[port];
720 /* intel_encoder might be NULL for DP MST */
721 if (intel_encoder) {
722 ret = 0;
723 intel_dig_port = enc_to_dig_port(&intel_encoder->base);
724 *enabled = intel_dig_port->audio_connector != NULL;
725 if (*enabled) {
726 eld = intel_dig_port->audio_connector->eld;
727 ret = drm_eld_size(eld);
728 memcpy(buf, eld, min(max_bytes, ret));
729 }
730 }
731
732 mutex_unlock(&dev_priv->av_mutex);
733 return ret;
707} 734}
708 735
709static const struct i915_audio_component_ops i915_audio_component_ops = { 736static const struct i915_audio_component_ops i915_audio_component_ops = {
@@ -713,6 +740,7 @@ static const struct i915_audio_component_ops i915_audio_component_ops = {
713 .codec_wake_override = i915_audio_component_codec_wake_override, 740 .codec_wake_override = i915_audio_component_codec_wake_override,
714 .get_cdclk_freq = i915_audio_component_get_cdclk_freq, 741 .get_cdclk_freq = i915_audio_component_get_cdclk_freq,
715 .sync_audio_rate = i915_audio_component_sync_audio_rate, 742 .sync_audio_rate = i915_audio_component_sync_audio_rate,
743 .get_eld = i915_audio_component_get_eld,
716}; 744};
717 745
718static int i915_audio_component_bind(struct device *i915_dev, 746static int i915_audio_component_bind(struct device *i915_dev,
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index 6a2c76e367a5..27b3e610e8f0 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -50,7 +50,7 @@ struct intel_crt {
50 * encoder's enable/disable callbacks */ 50 * encoder's enable/disable callbacks */
51 struct intel_connector *connector; 51 struct intel_connector *connector;
52 bool force_hotplug_required; 52 bool force_hotplug_required;
53 u32 adpa_reg; 53 i915_reg_t adpa_reg;
54}; 54};
55 55
56static struct intel_crt *intel_encoder_to_crt(struct intel_encoder *encoder) 56static struct intel_crt *intel_encoder_to_crt(struct intel_encoder *encoder)
@@ -480,12 +480,8 @@ intel_crt_load_detect(struct intel_crt *crt)
480 uint32_t vsample; 480 uint32_t vsample;
481 uint32_t vblank, vblank_start, vblank_end; 481 uint32_t vblank, vblank_start, vblank_end;
482 uint32_t dsl; 482 uint32_t dsl;
483 uint32_t bclrpat_reg; 483 i915_reg_t bclrpat_reg, vtotal_reg,
484 uint32_t vtotal_reg; 484 vblank_reg, vsync_reg, pipeconf_reg, pipe_dsl_reg;
485 uint32_t vblank_reg;
486 uint32_t vsync_reg;
487 uint32_t pipeconf_reg;
488 uint32_t pipe_dsl_reg;
489 uint8_t st00; 485 uint8_t st00;
490 enum drm_connector_status status; 486 enum drm_connector_status status;
491 487
@@ -518,7 +514,7 @@ intel_crt_load_detect(struct intel_crt *crt)
518 /* Wait for next Vblank to substitue 514 /* Wait for next Vblank to substitue
519 * border color for Color info */ 515 * border color for Color info */
520 intel_wait_for_vblank(dev, pipe); 516 intel_wait_for_vblank(dev, pipe);
521 st00 = I915_READ8(VGA_MSR_WRITE); 517 st00 = I915_READ8(_VGA_MSR_WRITE);
522 status = ((st00 & (1 << 4)) != 0) ? 518 status = ((st00 & (1 << 4)) != 0) ?
523 connector_status_connected : 519 connector_status_connected :
524 connector_status_disconnected; 520 connector_status_disconnected;
@@ -563,7 +559,7 @@ intel_crt_load_detect(struct intel_crt *crt)
563 do { 559 do {
564 count++; 560 count++;
565 /* Read the ST00 VGA status register */ 561 /* Read the ST00 VGA status register */
566 st00 = I915_READ8(VGA_MSR_WRITE); 562 st00 = I915_READ8(_VGA_MSR_WRITE);
567 if (st00 & (1 << 4)) 563 if (st00 & (1 << 4))
568 detect++; 564 detect++;
569 } while ((I915_READ(pipe_dsl_reg) == dsl)); 565 } while ((I915_READ(pipe_dsl_reg) == dsl));
diff --git a/drivers/gpu/drm/i915/intel_csr.c b/drivers/gpu/drm/i915/intel_csr.c
index 9e530a739354..6c6a6695e99c 100644
--- a/drivers/gpu/drm/i915/intel_csr.c
+++ b/drivers/gpu/drm/i915/intel_csr.c
@@ -47,21 +47,10 @@
47MODULE_FIRMWARE(I915_CSR_SKL); 47MODULE_FIRMWARE(I915_CSR_SKL);
48MODULE_FIRMWARE(I915_CSR_BXT); 48MODULE_FIRMWARE(I915_CSR_BXT);
49 49
50/* 50#define SKL_CSR_VERSION_REQUIRED CSR_VERSION(1, 23)
51* SKL CSR registers for DC5 and DC6 51
52*/
53#define CSR_PROGRAM(i) (0x80000 + (i) * 4)
54#define CSR_SSP_BASE_ADDR_GEN9 0x00002FC0
55#define CSR_HTP_ADDR_SKL 0x00500034
56#define CSR_SSP_BASE 0x8F074
57#define CSR_HTP_SKL 0x8F004
58#define CSR_LAST_WRITE 0x8F034
59#define CSR_LAST_WRITE_VALUE 0xc003b400
60/* MMIO address range for CSR program (0x80000 - 0x82FFF) */
61#define CSR_MAX_FW_SIZE 0x2FFF 52#define CSR_MAX_FW_SIZE 0x2FFF
62#define CSR_DEFAULT_FW_OFFSET 0xFFFFFFFF 53#define CSR_DEFAULT_FW_OFFSET 0xFFFFFFFF
63#define CSR_MMIO_START_RANGE 0x80000
64#define CSR_MMIO_END_RANGE 0x8FFFF
65 54
66struct intel_css_header { 55struct intel_css_header {
67 /* 0x09 for DMC */ 56 /* 0x09 for DMC */
@@ -178,166 +167,134 @@ struct stepping_info {
178}; 167};
179 168
180static const struct stepping_info skl_stepping_info[] = { 169static const struct stepping_info skl_stepping_info[] = {
181 {'A', '0'}, {'B', '0'}, {'C', '0'}, 170 {'A', '0'}, {'B', '0'}, {'C', '0'},
182 {'D', '0'}, {'E', '0'}, {'F', '0'}, 171 {'D', '0'}, {'E', '0'}, {'F', '0'},
183 {'G', '0'}, {'H', '0'}, {'I', '0'} 172 {'G', '0'}, {'H', '0'}, {'I', '0'}
184}; 173};
185 174
186static struct stepping_info bxt_stepping_info[] = { 175static const struct stepping_info bxt_stepping_info[] = {
187 {'A', '0'}, {'A', '1'}, {'A', '2'}, 176 {'A', '0'}, {'A', '1'}, {'A', '2'},
188 {'B', '0'}, {'B', '1'}, {'B', '2'} 177 {'B', '0'}, {'B', '1'}, {'B', '2'}
189}; 178};
190 179
191static char intel_get_stepping(struct drm_device *dev) 180static const struct stepping_info *intel_get_stepping_info(struct drm_device *dev)
192{
193 if (IS_SKYLAKE(dev) && (dev->pdev->revision <
194 ARRAY_SIZE(skl_stepping_info)))
195 return skl_stepping_info[dev->pdev->revision].stepping;
196 else if (IS_BROXTON(dev) && (dev->pdev->revision <
197 ARRAY_SIZE(bxt_stepping_info)))
198 return bxt_stepping_info[dev->pdev->revision].stepping;
199 else
200 return -ENODATA;
201}
202
203static char intel_get_substepping(struct drm_device *dev)
204{ 181{
205 if (IS_SKYLAKE(dev) && (dev->pdev->revision < 182 const struct stepping_info *si;
206 ARRAY_SIZE(skl_stepping_info))) 183 unsigned int size;
207 return skl_stepping_info[dev->pdev->revision].substepping; 184
208 else if (IS_BROXTON(dev) && (dev->pdev->revision < 185 if (IS_SKYLAKE(dev)) {
209 ARRAY_SIZE(bxt_stepping_info))) 186 size = ARRAY_SIZE(skl_stepping_info);
210 return bxt_stepping_info[dev->pdev->revision].substepping; 187 si = skl_stepping_info;
211 else 188 } else if (IS_BROXTON(dev)) {
212 return -ENODATA; 189 size = ARRAY_SIZE(bxt_stepping_info);
213} 190 si = bxt_stepping_info;
214 191 } else {
215/** 192 return NULL;
216 * intel_csr_load_status_get() - to get firmware loading status. 193 }
217 * @dev_priv: i915 device.
218 *
219 * This function helps to get the firmware loading status.
220 *
221 * Return: Firmware loading status.
222 */
223enum csr_state intel_csr_load_status_get(struct drm_i915_private *dev_priv)
224{
225 enum csr_state state;
226 194
227 mutex_lock(&dev_priv->csr_lock); 195 if (INTEL_REVID(dev) < size)
228 state = dev_priv->csr.state; 196 return si + INTEL_REVID(dev);
229 mutex_unlock(&dev_priv->csr_lock);
230 197
231 return state; 198 return NULL;
232}
233
234/**
235 * intel_csr_load_status_set() - help to set firmware loading status.
236 * @dev_priv: i915 device.
237 * @state: enumeration of firmware loading status.
238 *
239 * Set the firmware loading status.
240 */
241void intel_csr_load_status_set(struct drm_i915_private *dev_priv,
242 enum csr_state state)
243{
244 mutex_lock(&dev_priv->csr_lock);
245 dev_priv->csr.state = state;
246 mutex_unlock(&dev_priv->csr_lock);
247} 199}
248 200
249/** 201/**
250 * intel_csr_load_program() - write the firmware from memory to register. 202 * intel_csr_load_program() - write the firmware from memory to register.
251 * @dev: drm device. 203 * @dev_priv: i915 drm device.
252 * 204 *
253 * CSR firmware is read from a .bin file and kept in internal memory one time. 205 * CSR firmware is read from a .bin file and kept in internal memory one time.
254 * Everytime display comes back from low power state this function is called to 206 * Everytime display comes back from low power state this function is called to
255 * copy the firmware from internal memory to registers. 207 * copy the firmware from internal memory to registers.
256 */ 208 */
257void intel_csr_load_program(struct drm_device *dev) 209void intel_csr_load_program(struct drm_i915_private *dev_priv)
258{ 210{
259 struct drm_i915_private *dev_priv = dev->dev_private;
260 u32 *payload = dev_priv->csr.dmc_payload; 211 u32 *payload = dev_priv->csr.dmc_payload;
261 uint32_t i, fw_size; 212 uint32_t i, fw_size;
262 213
263 if (!IS_GEN9(dev)) { 214 if (!IS_GEN9(dev_priv)) {
264 DRM_ERROR("No CSR support available for this platform\n"); 215 DRM_ERROR("No CSR support available for this platform\n");
265 return; 216 return;
266 } 217 }
267 218
268 /* 219 if (!dev_priv->csr.dmc_payload) {
269 * FIXME: Firmware gets lost on S3/S4, but not when entering system 220 DRM_ERROR("Tried to program CSR with empty payload\n");
270 * standby or suspend-to-idle (which is just like forced runtime pm).
271 * Unfortunately the ACPI subsystem doesn't yet give us a way to
272 * differentiate this, hence figure it out with this hack.
273 */
274 if (I915_READ(CSR_PROGRAM(0)))
275 return; 221 return;
222 }
276 223
277 mutex_lock(&dev_priv->csr_lock);
278 fw_size = dev_priv->csr.dmc_fw_size; 224 fw_size = dev_priv->csr.dmc_fw_size;
279 for (i = 0; i < fw_size; i++) 225 for (i = 0; i < fw_size; i++)
280 I915_WRITE(CSR_PROGRAM(i), payload[i]); 226 I915_WRITE(CSR_PROGRAM(i), payload[i]);
281 227
282 for (i = 0; i < dev_priv->csr.mmio_count; i++) { 228 for (i = 0; i < dev_priv->csr.mmio_count; i++) {
283 I915_WRITE(dev_priv->csr.mmioaddr[i], 229 I915_WRITE(dev_priv->csr.mmioaddr[i],
284 dev_priv->csr.mmiodata[i]); 230 dev_priv->csr.mmiodata[i]);
285 } 231 }
286
287 dev_priv->csr.state = FW_LOADED;
288 mutex_unlock(&dev_priv->csr_lock);
289} 232}
290 233
291static void finish_csr_load(const struct firmware *fw, void *context) 234static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
235 const struct firmware *fw)
292{ 236{
293 struct drm_i915_private *dev_priv = context;
294 struct drm_device *dev = dev_priv->dev; 237 struct drm_device *dev = dev_priv->dev;
295 struct intel_css_header *css_header; 238 struct intel_css_header *css_header;
296 struct intel_package_header *package_header; 239 struct intel_package_header *package_header;
297 struct intel_dmc_header *dmc_header; 240 struct intel_dmc_header *dmc_header;
298 struct intel_csr *csr = &dev_priv->csr; 241 struct intel_csr *csr = &dev_priv->csr;
299 char stepping = intel_get_stepping(dev); 242 const struct stepping_info *stepping_info = intel_get_stepping_info(dev);
300 char substepping = intel_get_substepping(dev); 243 char stepping, substepping;
301 uint32_t dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes; 244 uint32_t dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes;
302 uint32_t i; 245 uint32_t i;
303 uint32_t *dmc_payload; 246 uint32_t *dmc_payload;
304 bool fw_loaded = false;
305 247
306 if (!fw) { 248 if (!fw)
307 i915_firmware_load_error_print(csr->fw_path, 0); 249 return NULL;
308 goto out;
309 }
310 250
311 if ((stepping == -ENODATA) || (substepping == -ENODATA)) { 251 if (!stepping_info) {
312 DRM_ERROR("Unknown stepping info, firmware loading failed\n"); 252 DRM_ERROR("Unknown stepping info, firmware loading failed\n");
313 goto out; 253 return NULL;
314 } 254 }
315 255
256 stepping = stepping_info->stepping;
257 substepping = stepping_info->substepping;
258
316 /* Extract CSS Header information*/ 259 /* Extract CSS Header information*/
317 css_header = (struct intel_css_header *)fw->data; 260 css_header = (struct intel_css_header *)fw->data;
318 if (sizeof(struct intel_css_header) != 261 if (sizeof(struct intel_css_header) !=
319 (css_header->header_len * 4)) { 262 (css_header->header_len * 4)) {
320 DRM_ERROR("Firmware has wrong CSS header length %u bytes\n", 263 DRM_ERROR("Firmware has wrong CSS header length %u bytes\n",
321 (css_header->header_len * 4)); 264 (css_header->header_len * 4));
322 goto out; 265 return NULL;
323 } 266 }
267
268 csr->version = css_header->version;
269
270 if (IS_SKYLAKE(dev) && csr->version < SKL_CSR_VERSION_REQUIRED) {
271 DRM_INFO("Refusing to load old Skylake DMC firmware v%u.%u,"
272 " please upgrade to v%u.%u or later"
273 " [https://01.org/linuxgraphics/intel-linux-graphics-firmwares].\n",
274 CSR_VERSION_MAJOR(csr->version),
275 CSR_VERSION_MINOR(csr->version),
276 CSR_VERSION_MAJOR(SKL_CSR_VERSION_REQUIRED),
277 CSR_VERSION_MINOR(SKL_CSR_VERSION_REQUIRED));
278 return NULL;
279 }
280
324 readcount += sizeof(struct intel_css_header); 281 readcount += sizeof(struct intel_css_header);
325 282
326 /* Extract Package Header information*/ 283 /* Extract Package Header information*/
327 package_header = (struct intel_package_header *) 284 package_header = (struct intel_package_header *)
328 &fw->data[readcount]; 285 &fw->data[readcount];
329 if (sizeof(struct intel_package_header) != 286 if (sizeof(struct intel_package_header) !=
330 (package_header->header_len * 4)) { 287 (package_header->header_len * 4)) {
331 DRM_ERROR("Firmware has wrong package header length %u bytes\n", 288 DRM_ERROR("Firmware has wrong package header length %u bytes\n",
332 (package_header->header_len * 4)); 289 (package_header->header_len * 4));
333 goto out; 290 return NULL;
334 } 291 }
335 readcount += sizeof(struct intel_package_header); 292 readcount += sizeof(struct intel_package_header);
336 293
337 /* Search for dmc_offset to find firware binary. */ 294 /* Search for dmc_offset to find firware binary. */
338 for (i = 0; i < package_header->num_entries; i++) { 295 for (i = 0; i < package_header->num_entries; i++) {
339 if (package_header->fw_info[i].substepping == '*' && 296 if (package_header->fw_info[i].substepping == '*' &&
340 stepping == package_header->fw_info[i].stepping) { 297 stepping == package_header->fw_info[i].stepping) {
341 dmc_offset = package_header->fw_info[i].offset; 298 dmc_offset = package_header->fw_info[i].offset;
342 break; 299 break;
343 } else if (stepping == package_header->fw_info[i].stepping && 300 } else if (stepping == package_header->fw_info[i].stepping &&
@@ -345,12 +302,12 @@ static void finish_csr_load(const struct firmware *fw, void *context)
345 dmc_offset = package_header->fw_info[i].offset; 302 dmc_offset = package_header->fw_info[i].offset;
346 break; 303 break;
347 } else if (package_header->fw_info[i].stepping == '*' && 304 } else if (package_header->fw_info[i].stepping == '*' &&
348 package_header->fw_info[i].substepping == '*') 305 package_header->fw_info[i].substepping == '*')
349 dmc_offset = package_header->fw_info[i].offset; 306 dmc_offset = package_header->fw_info[i].offset;
350 } 307 }
351 if (dmc_offset == CSR_DEFAULT_FW_OFFSET) { 308 if (dmc_offset == CSR_DEFAULT_FW_OFFSET) {
352 DRM_ERROR("Firmware not supported for %c stepping\n", stepping); 309 DRM_ERROR("Firmware not supported for %c stepping\n", stepping);
353 goto out; 310 return NULL;
354 } 311 }
355 readcount += dmc_offset; 312 readcount += dmc_offset;
356 313
@@ -358,26 +315,26 @@ static void finish_csr_load(const struct firmware *fw, void *context)
358 dmc_header = (struct intel_dmc_header *)&fw->data[readcount]; 315 dmc_header = (struct intel_dmc_header *)&fw->data[readcount];
359 if (sizeof(struct intel_dmc_header) != (dmc_header->header_len)) { 316 if (sizeof(struct intel_dmc_header) != (dmc_header->header_len)) {
360 DRM_ERROR("Firmware has wrong dmc header length %u bytes\n", 317 DRM_ERROR("Firmware has wrong dmc header length %u bytes\n",
361 (dmc_header->header_len)); 318 (dmc_header->header_len));
362 goto out; 319 return NULL;
363 } 320 }
364 readcount += sizeof(struct intel_dmc_header); 321 readcount += sizeof(struct intel_dmc_header);
365 322
366 /* Cache the dmc header info. */ 323 /* Cache the dmc header info. */
367 if (dmc_header->mmio_count > ARRAY_SIZE(csr->mmioaddr)) { 324 if (dmc_header->mmio_count > ARRAY_SIZE(csr->mmioaddr)) {
368 DRM_ERROR("Firmware has wrong mmio count %u\n", 325 DRM_ERROR("Firmware has wrong mmio count %u\n",
369 dmc_header->mmio_count); 326 dmc_header->mmio_count);
370 goto out; 327 return NULL;
371 } 328 }
372 csr->mmio_count = dmc_header->mmio_count; 329 csr->mmio_count = dmc_header->mmio_count;
373 for (i = 0; i < dmc_header->mmio_count; i++) { 330 for (i = 0; i < dmc_header->mmio_count; i++) {
374 if (dmc_header->mmioaddr[i] < CSR_MMIO_START_RANGE || 331 if (dmc_header->mmioaddr[i] < CSR_MMIO_START_RANGE ||
375 dmc_header->mmioaddr[i] > CSR_MMIO_END_RANGE) { 332 dmc_header->mmioaddr[i] > CSR_MMIO_END_RANGE) {
376 DRM_ERROR(" Firmware has wrong mmio address 0x%x\n", 333 DRM_ERROR(" Firmware has wrong mmio address 0x%x\n",
377 dmc_header->mmioaddr[i]); 334 dmc_header->mmioaddr[i]);
378 goto out; 335 return NULL;
379 } 336 }
380 csr->mmioaddr[i] = dmc_header->mmioaddr[i]; 337 csr->mmioaddr[i] = _MMIO(dmc_header->mmioaddr[i]);
381 csr->mmiodata[i] = dmc_header->mmiodata[i]; 338 csr->mmiodata[i] = dmc_header->mmiodata[i];
382 } 339 }
383 340
@@ -385,56 +342,80 @@ static void finish_csr_load(const struct firmware *fw, void *context)
385 nbytes = dmc_header->fw_size * 4; 342 nbytes = dmc_header->fw_size * 4;
386 if (nbytes > CSR_MAX_FW_SIZE) { 343 if (nbytes > CSR_MAX_FW_SIZE) {
387 DRM_ERROR("CSR firmware too big (%u) bytes\n", nbytes); 344 DRM_ERROR("CSR firmware too big (%u) bytes\n", nbytes);
388 goto out; 345 return NULL;
389 } 346 }
390 csr->dmc_fw_size = dmc_header->fw_size; 347 csr->dmc_fw_size = dmc_header->fw_size;
391 348
392 csr->dmc_payload = kmalloc(nbytes, GFP_KERNEL); 349 dmc_payload = kmalloc(nbytes, GFP_KERNEL);
393 if (!csr->dmc_payload) { 350 if (!dmc_payload) {
394 DRM_ERROR("Memory allocation failed for dmc payload\n"); 351 DRM_ERROR("Memory allocation failed for dmc payload\n");
395 goto out; 352 return NULL;
396 } 353 }
397 354
398 dmc_payload = csr->dmc_payload;
399 memcpy(dmc_payload, &fw->data[readcount], nbytes); 355 memcpy(dmc_payload, &fw->data[readcount], nbytes);
400 356
357 return dmc_payload;
358}
359
360static void csr_load_work_fn(struct work_struct *work)
361{
362 struct drm_i915_private *dev_priv;
363 struct intel_csr *csr;
364 const struct firmware *fw;
365 int ret;
366
367 dev_priv = container_of(work, typeof(*dev_priv), csr.work);
368 csr = &dev_priv->csr;
369
370 ret = request_firmware(&fw, dev_priv->csr.fw_path,
371 &dev_priv->dev->pdev->dev);
372 if (!fw)
373 goto out;
374
375 dev_priv->csr.dmc_payload = parse_csr_fw(dev_priv, fw);
376 if (!dev_priv->csr.dmc_payload)
377 goto out;
378
401 /* load csr program during system boot, as needed for DC states */ 379 /* load csr program during system boot, as needed for DC states */
402 intel_csr_load_program(dev); 380 intel_csr_load_program(dev_priv);
403 fw_loaded = true;
404 381
405 DRM_DEBUG_KMS("Finished loading %s\n", dev_priv->csr.fw_path);
406out: 382out:
407 if (fw_loaded) 383 if (dev_priv->csr.dmc_payload) {
408 intel_runtime_pm_put(dev_priv); 384 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
409 else 385
410 intel_csr_load_status_set(dev_priv, FW_FAILED); 386 DRM_INFO("Finished loading %s (v%u.%u)\n",
387 dev_priv->csr.fw_path,
388 CSR_VERSION_MAJOR(csr->version),
389 CSR_VERSION_MINOR(csr->version));
390 } else {
391 DRM_ERROR("Failed to load DMC firmware, disabling rpm\n");
392 }
411 393
412 release_firmware(fw); 394 release_firmware(fw);
413} 395}
414 396
415/** 397/**
416 * intel_csr_ucode_init() - initialize the firmware loading. 398 * intel_csr_ucode_init() - initialize the firmware loading.
417 * @dev: drm device. 399 * @dev_priv: i915 drm device.
418 * 400 *
419 * This function is called at the time of loading the display driver to read 401 * This function is called at the time of loading the display driver to read
420 * firmware from a .bin file and copied into a internal memory. 402 * firmware from a .bin file and copied into a internal memory.
421 */ 403 */
422void intel_csr_ucode_init(struct drm_device *dev) 404void intel_csr_ucode_init(struct drm_i915_private *dev_priv)
423{ 405{
424 struct drm_i915_private *dev_priv = dev->dev_private;
425 struct intel_csr *csr = &dev_priv->csr; 406 struct intel_csr *csr = &dev_priv->csr;
426 int ret;
427 407
428 if (!HAS_CSR(dev)) 408 INIT_WORK(&dev_priv->csr.work, csr_load_work_fn);
409
410 if (!HAS_CSR(dev_priv))
429 return; 411 return;
430 412
431 if (IS_SKYLAKE(dev)) 413 if (IS_SKYLAKE(dev_priv))
432 csr->fw_path = I915_CSR_SKL; 414 csr->fw_path = I915_CSR_SKL;
433 else if (IS_BROXTON(dev_priv)) 415 else if (IS_BROXTON(dev_priv))
434 csr->fw_path = I915_CSR_BXT; 416 csr->fw_path = I915_CSR_BXT;
435 else { 417 else {
436 DRM_ERROR("Unexpected: no known CSR firmware for platform\n"); 418 DRM_ERROR("Unexpected: no known CSR firmware for platform\n");
437 intel_csr_load_status_set(dev_priv, FW_FAILED);
438 return; 419 return;
439 } 420 }
440 421
@@ -444,43 +425,24 @@ void intel_csr_ucode_init(struct drm_device *dev)
444 * Obtain a runtime pm reference, until CSR is loaded, 425 * Obtain a runtime pm reference, until CSR is loaded,
445 * to avoid entering runtime-suspend. 426 * to avoid entering runtime-suspend.
446 */ 427 */
447 intel_runtime_pm_get(dev_priv); 428 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
448 429
449 /* CSR supported for platform, load firmware */ 430 schedule_work(&dev_priv->csr.work);
450 ret = request_firmware_nowait(THIS_MODULE, true, csr->fw_path,
451 &dev_priv->dev->pdev->dev,
452 GFP_KERNEL, dev_priv,
453 finish_csr_load);
454 if (ret) {
455 i915_firmware_load_error_print(csr->fw_path, ret);
456 intel_csr_load_status_set(dev_priv, FW_FAILED);
457 }
458} 431}
459 432
460/** 433/**
461 * intel_csr_ucode_fini() - unload the CSR firmware. 434 * intel_csr_ucode_fini() - unload the CSR firmware.
462 * @dev: drm device. 435 * @dev_priv: i915 drm device.
463 * 436 *
464 * Firmmware unloading includes freeing the internal momory and reset the 437 * Firmmware unloading includes freeing the internal momory and reset the
465 * firmware loading status. 438 * firmware loading status.
466 */ 439 */
467void intel_csr_ucode_fini(struct drm_device *dev) 440void intel_csr_ucode_fini(struct drm_i915_private *dev_priv)
468{ 441{
469 struct drm_i915_private *dev_priv = dev->dev_private; 442 if (!HAS_CSR(dev_priv))
470
471 if (!HAS_CSR(dev))
472 return; 443 return;
473 444
474 intel_csr_load_status_set(dev_priv, FW_FAILED); 445 flush_work(&dev_priv->csr.work);
475 kfree(dev_priv->csr.dmc_payload);
476}
477 446
478void assert_csr_loaded(struct drm_i915_private *dev_priv) 447 kfree(dev_priv->csr.dmc_payload);
479{
480 WARN_ONCE(intel_csr_load_status_get(dev_priv) != FW_LOADED,
481 "CSR is not loaded.\n");
482 WARN_ONCE(!I915_READ(CSR_PROGRAM(0)),
483 "CSR program storage start is NULL\n");
484 WARN_ONCE(!I915_READ(CSR_SSP_BASE), "CSR SSP Base Not fine\n");
485 WARN_ONCE(!I915_READ(CSR_HTP_SKL), "CSR HTP Not fine\n");
486} 448}
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index a6752a61d99f..59deb0d85533 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -133,12 +133,12 @@ static const struct ddi_buf_trans skl_ddi_translations_dp[] = {
133 { 0x00002016, 0x000000A0, 0x0 }, 133 { 0x00002016, 0x000000A0, 0x0 },
134 { 0x00005012, 0x0000009B, 0x0 }, 134 { 0x00005012, 0x0000009B, 0x0 },
135 { 0x00007011, 0x00000088, 0x0 }, 135 { 0x00007011, 0x00000088, 0x0 },
136 { 0x00009010, 0x000000C7, 0x0 }, 136 { 0x80009010, 0x000000C0, 0x1 }, /* Uses I_boost level 0x1 */
137 { 0x00002016, 0x0000009B, 0x0 }, 137 { 0x00002016, 0x0000009B, 0x0 },
138 { 0x00005012, 0x00000088, 0x0 }, 138 { 0x00005012, 0x00000088, 0x0 },
139 { 0x00007011, 0x000000C7, 0x0 }, 139 { 0x80007011, 0x000000C0, 0x1 }, /* Uses I_boost level 0x1 */
140 { 0x00002016, 0x000000DF, 0x0 }, 140 { 0x00002016, 0x000000DF, 0x0 },
141 { 0x00005012, 0x000000C7, 0x0 }, 141 { 0x80005012, 0x000000C0, 0x1 }, /* Uses I_boost level 0x1 */
142}; 142};
143 143
144/* Skylake U */ 144/* Skylake U */
@@ -146,12 +146,12 @@ static const struct ddi_buf_trans skl_u_ddi_translations_dp[] = {
146 { 0x0000201B, 0x000000A2, 0x0 }, 146 { 0x0000201B, 0x000000A2, 0x0 },
147 { 0x00005012, 0x00000088, 0x0 }, 147 { 0x00005012, 0x00000088, 0x0 },
148 { 0x00007011, 0x00000087, 0x0 }, 148 { 0x00007011, 0x00000087, 0x0 },
149 { 0x80009010, 0x000000C7, 0x1 }, /* Uses I_boost level 0x1 */ 149 { 0x80009010, 0x000000C0, 0x1 }, /* Uses I_boost level 0x1 */
150 { 0x0000201B, 0x0000009D, 0x0 }, 150 { 0x0000201B, 0x0000009D, 0x0 },
151 { 0x00005012, 0x000000C7, 0x0 }, 151 { 0x80005012, 0x000000C0, 0x1 }, /* Uses I_boost level 0x1 */
152 { 0x00007011, 0x000000C7, 0x0 }, 152 { 0x80007011, 0x000000C0, 0x1 }, /* Uses I_boost level 0x1 */
153 { 0x00002016, 0x00000088, 0x0 }, 153 { 0x00002016, 0x00000088, 0x0 },
154 { 0x00005012, 0x000000C7, 0x0 }, 154 { 0x80005012, 0x000000C0, 0x1 }, /* Uses I_boost level 0x1 */
155}; 155};
156 156
157/* Skylake Y */ 157/* Skylake Y */
@@ -159,12 +159,12 @@ static const struct ddi_buf_trans skl_y_ddi_translations_dp[] = {
159 { 0x00000018, 0x000000A2, 0x0 }, 159 { 0x00000018, 0x000000A2, 0x0 },
160 { 0x00005012, 0x00000088, 0x0 }, 160 { 0x00005012, 0x00000088, 0x0 },
161 { 0x00007011, 0x00000087, 0x0 }, 161 { 0x00007011, 0x00000087, 0x0 },
162 { 0x80009010, 0x000000C7, 0x3 }, /* Uses I_boost level 0x3 */ 162 { 0x80009010, 0x000000C0, 0x3 }, /* Uses I_boost level 0x3 */
163 { 0x00000018, 0x0000009D, 0x0 }, 163 { 0x00000018, 0x0000009D, 0x0 },
164 { 0x00005012, 0x000000C7, 0x0 }, 164 { 0x80005012, 0x000000C0, 0x3 }, /* Uses I_boost level 0x3 */
165 { 0x00007011, 0x000000C7, 0x0 }, 165 { 0x80007011, 0x000000C0, 0x3 }, /* Uses I_boost level 0x3 */
166 { 0x00000018, 0x00000088, 0x0 }, 166 { 0x00000018, 0x00000088, 0x0 },
167 { 0x00005012, 0x000000C7, 0x0 }, 167 { 0x80005012, 0x000000C0, 0x3 }, /* Uses I_boost level 0x3 */
168}; 168};
169 169
170/* 170/*
@@ -345,7 +345,7 @@ enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
345static bool 345static bool
346intel_dig_port_supports_hdmi(const struct intel_digital_port *intel_dig_port) 346intel_dig_port_supports_hdmi(const struct intel_digital_port *intel_dig_port)
347{ 347{
348 return intel_dig_port->hdmi.hdmi_reg; 348 return i915_mmio_reg_valid(intel_dig_port->hdmi.hdmi_reg);
349} 349}
350 350
351static const struct ddi_buf_trans *skl_get_buf_trans_dp(struct drm_device *dev, 351static const struct ddi_buf_trans *skl_get_buf_trans_dp(struct drm_device *dev,
@@ -448,7 +448,7 @@ static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port,
448 bxt_ddi_vswing_sequence(dev, hdmi_level, port, 448 bxt_ddi_vswing_sequence(dev, hdmi_level, port,
449 INTEL_OUTPUT_HDMI); 449 INTEL_OUTPUT_HDMI);
450 return; 450 return;
451 } else if (IS_SKYLAKE(dev)) { 451 } else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
452 ddi_translations_fdi = NULL; 452 ddi_translations_fdi = NULL;
453 ddi_translations_dp = 453 ddi_translations_dp =
454 skl_get_buf_trans_dp(dev, &n_dp_entries); 454 skl_get_buf_trans_dp(dev, &n_dp_entries);
@@ -576,7 +576,7 @@ void intel_prepare_ddi(struct drm_device *dev)
576static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv, 576static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
577 enum port port) 577 enum port port)
578{ 578{
579 uint32_t reg = DDI_BUF_CTL(port); 579 i915_reg_t reg = DDI_BUF_CTL(port);
580 int i; 580 int i;
581 581
582 for (i = 0; i < 16; i++) { 582 for (i = 0; i < 16; i++) {
@@ -931,7 +931,8 @@ static void hsw_wrpll_update_rnp(uint64_t freq2k, unsigned budget,
931 /* Otherwise a < c && b >= d, do nothing */ 931 /* Otherwise a < c && b >= d, do nothing */
932} 932}
933 933
934static int hsw_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv, int reg) 934static int hsw_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv,
935 i915_reg_t reg)
935{ 936{
936 int refclk = LC_FREQ; 937 int refclk = LC_FREQ;
937 int n, p, r; 938 int n, p, r;
@@ -967,7 +968,7 @@ static int hsw_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv, int reg)
967static int skl_calc_wrpll_link(struct drm_i915_private *dev_priv, 968static int skl_calc_wrpll_link(struct drm_i915_private *dev_priv,
968 uint32_t dpll) 969 uint32_t dpll)
969{ 970{
970 uint32_t cfgcr1_reg, cfgcr2_reg; 971 i915_reg_t cfgcr1_reg, cfgcr2_reg;
971 uint32_t cfgcr1_val, cfgcr2_val; 972 uint32_t cfgcr1_val, cfgcr2_val;
972 uint32_t p0, p1, p2, dco_freq; 973 uint32_t p0, p1, p2, dco_freq;
973 974
@@ -1112,10 +1113,10 @@ static void hsw_ddi_clock_get(struct intel_encoder *encoder,
1112 link_clock = 270000; 1113 link_clock = 270000;
1113 break; 1114 break;
1114 case PORT_CLK_SEL_WRPLL1: 1115 case PORT_CLK_SEL_WRPLL1:
1115 link_clock = hsw_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL1); 1116 link_clock = hsw_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL(0));
1116 break; 1117 break;
1117 case PORT_CLK_SEL_WRPLL2: 1118 case PORT_CLK_SEL_WRPLL2:
1118 link_clock = hsw_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL2); 1119 link_clock = hsw_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL(1));
1119 break; 1120 break;
1120 case PORT_CLK_SEL_SPLL: 1121 case PORT_CLK_SEL_SPLL:
1121 pll = I915_READ(SPLL_CTL) & SPLL_PLL_FREQ_MASK; 1122 pll = I915_READ(SPLL_CTL) & SPLL_PLL_FREQ_MASK;
@@ -1184,7 +1185,7 @@ void intel_ddi_clock_get(struct intel_encoder *encoder,
1184 1185
1185 if (INTEL_INFO(dev)->gen <= 8) 1186 if (INTEL_INFO(dev)->gen <= 8)
1186 hsw_ddi_clock_get(encoder, pipe_config); 1187 hsw_ddi_clock_get(encoder, pipe_config);
1187 else if (IS_SKYLAKE(dev)) 1188 else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
1188 skl_ddi_clock_get(encoder, pipe_config); 1189 skl_ddi_clock_get(encoder, pipe_config);
1189 else if (IS_BROXTON(dev)) 1190 else if (IS_BROXTON(dev))
1190 bxt_ddi_clock_get(encoder, pipe_config); 1191 bxt_ddi_clock_get(encoder, pipe_config);
@@ -1780,7 +1781,7 @@ bool intel_ddi_pll_select(struct intel_crtc *intel_crtc,
1780 struct intel_encoder *intel_encoder = 1781 struct intel_encoder *intel_encoder =
1781 intel_ddi_get_crtc_new_encoder(crtc_state); 1782 intel_ddi_get_crtc_new_encoder(crtc_state);
1782 1783
1783 if (IS_SKYLAKE(dev)) 1784 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
1784 return skl_ddi_pll_select(intel_crtc, crtc_state, 1785 return skl_ddi_pll_select(intel_crtc, crtc_state,
1785 intel_encoder); 1786 intel_encoder);
1786 else if (IS_BROXTON(dev)) 1787 else if (IS_BROXTON(dev))
@@ -1942,7 +1943,7 @@ void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
1942void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv, 1943void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
1943 enum transcoder cpu_transcoder) 1944 enum transcoder cpu_transcoder)
1944{ 1945{
1945 uint32_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder); 1946 i915_reg_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
1946 uint32_t val = I915_READ(reg); 1947 uint32_t val = I915_READ(reg);
1947 1948
1948 val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK | TRANS_DDI_DP_VC_PAYLOAD_ALLOC); 1949 val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK | TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
@@ -2097,21 +2098,21 @@ static void skl_ddi_set_iboost(struct drm_device *dev, u32 level,
2097 iboost = dp_iboost; 2098 iboost = dp_iboost;
2098 } else { 2099 } else {
2099 ddi_translations = skl_get_buf_trans_dp(dev, &n_entries); 2100 ddi_translations = skl_get_buf_trans_dp(dev, &n_entries);
2100 iboost = ddi_translations[port].i_boost; 2101 iboost = ddi_translations[level].i_boost;
2101 } 2102 }
2102 } else if (type == INTEL_OUTPUT_EDP) { 2103 } else if (type == INTEL_OUTPUT_EDP) {
2103 if (dp_iboost) { 2104 if (dp_iboost) {
2104 iboost = dp_iboost; 2105 iboost = dp_iboost;
2105 } else { 2106 } else {
2106 ddi_translations = skl_get_buf_trans_edp(dev, &n_entries); 2107 ddi_translations = skl_get_buf_trans_edp(dev, &n_entries);
2107 iboost = ddi_translations[port].i_boost; 2108 iboost = ddi_translations[level].i_boost;
2108 } 2109 }
2109 } else if (type == INTEL_OUTPUT_HDMI) { 2110 } else if (type == INTEL_OUTPUT_HDMI) {
2110 if (hdmi_iboost) { 2111 if (hdmi_iboost) {
2111 iboost = hdmi_iboost; 2112 iboost = hdmi_iboost;
2112 } else { 2113 } else {
2113 ddi_translations = skl_get_buf_trans_hdmi(dev, &n_entries); 2114 ddi_translations = skl_get_buf_trans_hdmi(dev, &n_entries);
2114 iboost = ddi_translations[port].i_boost; 2115 iboost = ddi_translations[level].i_boost;
2115 } 2116 }
2116 } else { 2117 } else {
2117 return; 2118 return;
@@ -2263,7 +2264,7 @@ uint32_t ddi_signal_levels(struct intel_dp *intel_dp)
2263 2264
2264 level = translate_signal_level(signal_levels); 2265 level = translate_signal_level(signal_levels);
2265 2266
2266 if (IS_SKYLAKE(dev)) 2267 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
2267 skl_ddi_set_iboost(dev, level, port, encoder->type); 2268 skl_ddi_set_iboost(dev, level, port, encoder->type);
2268 else if (IS_BROXTON(dev)) 2269 else if (IS_BROXTON(dev))
2269 bxt_ddi_vswing_sequence(dev, level, port, encoder->type); 2270 bxt_ddi_vswing_sequence(dev, level, port, encoder->type);
@@ -2271,30 +2272,21 @@ uint32_t ddi_signal_levels(struct intel_dp *intel_dp)
2271 return DDI_BUF_TRANS_SELECT(level); 2272 return DDI_BUF_TRANS_SELECT(level);
2272} 2273}
2273 2274
2274static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder) 2275void intel_ddi_clk_select(struct intel_encoder *encoder,
2276 const struct intel_crtc_state *pipe_config)
2275{ 2277{
2276 struct drm_encoder *encoder = &intel_encoder->base; 2278 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2277 struct drm_device *dev = encoder->dev; 2279 enum port port = intel_ddi_get_encoder_port(encoder);
2278 struct drm_i915_private *dev_priv = dev->dev_private;
2279 struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
2280 enum port port = intel_ddi_get_encoder_port(intel_encoder);
2281 int type = intel_encoder->type;
2282 int hdmi_level;
2283
2284 if (type == INTEL_OUTPUT_EDP) {
2285 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2286 intel_edp_panel_on(intel_dp);
2287 }
2288 2280
2289 if (IS_SKYLAKE(dev)) { 2281 if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
2290 uint32_t dpll = crtc->config->ddi_pll_sel; 2282 uint32_t dpll = pipe_config->ddi_pll_sel;
2291 uint32_t val; 2283 uint32_t val;
2292 2284
2293 /* 2285 /*
2294 * DPLL0 is used for eDP and is the only "private" DPLL (as 2286 * DPLL0 is used for eDP and is the only "private" DPLL (as
2295 * opposed to shared) on SKL 2287 * opposed to shared) on SKL
2296 */ 2288 */
2297 if (type == INTEL_OUTPUT_EDP) { 2289 if (encoder->type == INTEL_OUTPUT_EDP) {
2298 WARN_ON(dpll != SKL_DPLL0); 2290 WARN_ON(dpll != SKL_DPLL0);
2299 2291
2300 val = I915_READ(DPLL_CTRL1); 2292 val = I915_READ(DPLL_CTRL1);
@@ -2302,7 +2294,7 @@ static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
2302 val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) | 2294 val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) |
2303 DPLL_CTRL1_SSC(dpll) | 2295 DPLL_CTRL1_SSC(dpll) |
2304 DPLL_CTRL1_LINK_RATE_MASK(dpll)); 2296 DPLL_CTRL1_LINK_RATE_MASK(dpll));
2305 val |= crtc->config->dpll_hw_state.ctrl1 << (dpll * 6); 2297 val |= pipe_config->dpll_hw_state.ctrl1 << (dpll * 6);
2306 2298
2307 I915_WRITE(DPLL_CTRL1, val); 2299 I915_WRITE(DPLL_CTRL1, val);
2308 POSTING_READ(DPLL_CTRL1); 2300 POSTING_READ(DPLL_CTRL1);
@@ -2318,10 +2310,28 @@ static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
2318 2310
2319 I915_WRITE(DPLL_CTRL2, val); 2311 I915_WRITE(DPLL_CTRL2, val);
2320 2312
2321 } else if (INTEL_INFO(dev)->gen < 9) { 2313 } else if (INTEL_INFO(dev_priv)->gen < 9) {
2322 WARN_ON(crtc->config->ddi_pll_sel == PORT_CLK_SEL_NONE); 2314 WARN_ON(pipe_config->ddi_pll_sel == PORT_CLK_SEL_NONE);
2323 I915_WRITE(PORT_CLK_SEL(port), crtc->config->ddi_pll_sel); 2315 I915_WRITE(PORT_CLK_SEL(port), pipe_config->ddi_pll_sel);
2324 } 2316 }
2317}
2318
2319static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
2320{
2321 struct drm_encoder *encoder = &intel_encoder->base;
2322 struct drm_device *dev = encoder->dev;
2323 struct drm_i915_private *dev_priv = dev->dev_private;
2324 struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
2325 enum port port = intel_ddi_get_encoder_port(intel_encoder);
2326 int type = intel_encoder->type;
2327 int hdmi_level;
2328
2329 if (type == INTEL_OUTPUT_EDP) {
2330 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2331 intel_edp_panel_on(intel_dp);
2332 }
2333
2334 intel_ddi_clk_select(intel_encoder, crtc->config);
2325 2335
2326 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) { 2336 if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
2327 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 2337 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
@@ -2381,7 +2391,7 @@ static void intel_ddi_post_disable(struct intel_encoder *intel_encoder)
2381 intel_edp_panel_off(intel_dp); 2391 intel_edp_panel_off(intel_dp);
2382 } 2392 }
2383 2393
2384 if (IS_SKYLAKE(dev)) 2394 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
2385 I915_WRITE(DPLL_CTRL2, (I915_READ(DPLL_CTRL2) | 2395 I915_WRITE(DPLL_CTRL2, (I915_READ(DPLL_CTRL2) |
2386 DPLL_CTRL2_DDI_CLK_OFF(port))); 2396 DPLL_CTRL2_DDI_CLK_OFF(port)));
2387 else if (INTEL_INFO(dev)->gen < 9) 2397 else if (INTEL_INFO(dev)->gen < 9)
@@ -2553,7 +2563,7 @@ static const char * const skl_ddi_pll_names[] = {
2553}; 2563};
2554 2564
2555struct skl_dpll_regs { 2565struct skl_dpll_regs {
2556 u32 ctl, cfgcr1, cfgcr2; 2566 i915_reg_t ctl, cfgcr1, cfgcr2;
2557}; 2567};
2558 2568
2559/* this array is indexed by the *shared* pll id */ 2569/* this array is indexed by the *shared* pll id */
@@ -2566,13 +2576,13 @@ static const struct skl_dpll_regs skl_dpll_regs[3] = {
2566 }, 2576 },
2567 { 2577 {
2568 /* DPLL 2 */ 2578 /* DPLL 2 */
2569 .ctl = WRPLL_CTL1, 2579 .ctl = WRPLL_CTL(0),
2570 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2), 2580 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
2571 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2), 2581 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
2572 }, 2582 },
2573 { 2583 {
2574 /* DPLL 3 */ 2584 /* DPLL 3 */
2575 .ctl = WRPLL_CTL2, 2585 .ctl = WRPLL_CTL(1),
2576 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3), 2586 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
2577 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3), 2587 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
2578 }, 2588 },
@@ -2992,22 +3002,22 @@ void intel_ddi_pll_init(struct drm_device *dev)
2992 struct drm_i915_private *dev_priv = dev->dev_private; 3002 struct drm_i915_private *dev_priv = dev->dev_private;
2993 uint32_t val = I915_READ(LCPLL_CTL); 3003 uint32_t val = I915_READ(LCPLL_CTL);
2994 3004
2995 if (IS_SKYLAKE(dev)) 3005 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
2996 skl_shared_dplls_init(dev_priv); 3006 skl_shared_dplls_init(dev_priv);
2997 else if (IS_BROXTON(dev)) 3007 else if (IS_BROXTON(dev))
2998 bxt_shared_dplls_init(dev_priv); 3008 bxt_shared_dplls_init(dev_priv);
2999 else 3009 else
3000 hsw_shared_dplls_init(dev_priv); 3010 hsw_shared_dplls_init(dev_priv);
3001 3011
3002 if (IS_SKYLAKE(dev)) { 3012 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
3003 int cdclk_freq; 3013 int cdclk_freq;
3004 3014
3005 cdclk_freq = dev_priv->display.get_display_clock_speed(dev); 3015 cdclk_freq = dev_priv->display.get_display_clock_speed(dev);
3006 dev_priv->skl_boot_cdclk = cdclk_freq; 3016 dev_priv->skl_boot_cdclk = cdclk_freq;
3017 if (skl_sanitize_cdclk(dev_priv))
3018 DRM_DEBUG_KMS("Sanitized cdclk programmed by pre-os\n");
3007 if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE)) 3019 if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE))
3008 DRM_ERROR("LCPLL1 is disabled\n"); 3020 DRM_ERROR("LCPLL1 is disabled\n");
3009 else
3010 intel_display_power_get(dev_priv, POWER_DOMAIN_PLLS);
3011 } else if (IS_BROXTON(dev)) { 3021 } else if (IS_BROXTON(dev)) {
3012 broxton_init_cdclk(dev); 3022 broxton_init_cdclk(dev);
3013 broxton_ddi_phy_init(dev); 3023 broxton_ddi_phy_init(dev);
@@ -3026,11 +3036,11 @@ void intel_ddi_pll_init(struct drm_device *dev)
3026 } 3036 }
3027} 3037}
3028 3038
3029void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder) 3039void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
3030{ 3040{
3031 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); 3041 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3032 struct intel_dp *intel_dp = &intel_dig_port->dp; 3042 struct drm_i915_private *dev_priv =
3033 struct drm_i915_private *dev_priv = encoder->dev->dev_private; 3043 to_i915(intel_dig_port->base.base.dev);
3034 enum port port = intel_dig_port->port; 3044 enum port port = intel_dig_port->port;
3035 uint32_t val; 3045 uint32_t val;
3036 bool wait = false; 3046 bool wait = false;
@@ -3285,10 +3295,25 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
3285 intel_encoder->get_config = intel_ddi_get_config; 3295 intel_encoder->get_config = intel_ddi_get_config;
3286 3296
3287 intel_dig_port->port = port; 3297 intel_dig_port->port = port;
3298 dev_priv->dig_port_map[port] = intel_encoder;
3288 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) & 3299 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
3289 (DDI_BUF_PORT_REVERSAL | 3300 (DDI_BUF_PORT_REVERSAL |
3290 DDI_A_4_LANES); 3301 DDI_A_4_LANES);
3291 3302
3303 /*
3304 * Bspec says that DDI_A_4_LANES is the only supported configuration
3305 * for Broxton. Yet some BIOS fail to set this bit on port A if eDP
3306 * wasn't lit up at boot. Force this bit on in our internal
3307 * configuration so that we use the proper lane count for our
3308 * calculations.
3309 */
3310 if (IS_BROXTON(dev) && port == PORT_A) {
3311 if (!(intel_dig_port->saved_port_bits & DDI_A_4_LANES)) {
3312 DRM_DEBUG_KMS("BXT BIOS forgot to set DDI_A_4_LANES for port A; fixing\n");
3313 intel_dig_port->saved_port_bits |= DDI_A_4_LANES;
3314 }
3315 }
3316
3292 intel_encoder->type = INTEL_OUTPUT_UNKNOWN; 3317 intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
3293 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2); 3318 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
3294 intel_encoder->cloneable = 0; 3319 intel_encoder->cloneable = 0;
@@ -3302,8 +3327,7 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
3302 * On BXT A0/A1, sw needs to activate DDIA HPD logic and 3327 * On BXT A0/A1, sw needs to activate DDIA HPD logic and
3303 * interrupts to check the external panel connection. 3328 * interrupts to check the external panel connection.
3304 */ 3329 */
3305 if (IS_BROXTON(dev_priv) && (INTEL_REVID(dev) < BXT_REVID_B0) 3330 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1) && port == PORT_B)
3306 && port == PORT_B)
3307 dev_priv->hotplug.irq_port[PORT_A] = intel_dig_port; 3331 dev_priv->hotplug.irq_port[PORT_A] = intel_dig_port;
3308 else 3332 else
3309 dev_priv->hotplug.irq_port[port] = intel_dig_port; 3333 dev_priv->hotplug.irq_port[port] = intel_dig_port;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 32cf97346978..622d30c6c37f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1096,7 +1096,7 @@ enum transcoder intel_pipe_to_cpu_transcoder(struct drm_i915_private *dev_priv,
1096static bool pipe_dsl_stopped(struct drm_device *dev, enum pipe pipe) 1096static bool pipe_dsl_stopped(struct drm_device *dev, enum pipe pipe)
1097{ 1097{
1098 struct drm_i915_private *dev_priv = dev->dev_private; 1098 struct drm_i915_private *dev_priv = dev->dev_private;
1099 u32 reg = PIPEDSL(pipe); 1099 i915_reg_t reg = PIPEDSL(pipe);
1100 u32 line1, line2; 1100 u32 line1, line2;
1101 u32 line_mask; 1101 u32 line_mask;
1102 1102
@@ -1136,7 +1136,7 @@ static void intel_wait_for_pipe_off(struct intel_crtc *crtc)
1136 enum pipe pipe = crtc->pipe; 1136 enum pipe pipe = crtc->pipe;
1137 1137
1138 if (INTEL_INFO(dev)->gen >= 4) { 1138 if (INTEL_INFO(dev)->gen >= 4) {
1139 int reg = PIPECONF(cpu_transcoder); 1139 i915_reg_t reg = PIPECONF(cpu_transcoder);
1140 1140
1141 /* Wait for the Pipe State to go off */ 1141 /* Wait for the Pipe State to go off */
1142 if (wait_for((I915_READ(reg) & I965_PIPECONF_ACTIVE) == 0, 1142 if (wait_for((I915_READ(reg) & I965_PIPECONF_ACTIVE) == 0,
@@ -1286,7 +1286,7 @@ void assert_panel_unlocked(struct drm_i915_private *dev_priv,
1286 enum pipe pipe) 1286 enum pipe pipe)
1287{ 1287{
1288 struct drm_device *dev = dev_priv->dev; 1288 struct drm_device *dev = dev_priv->dev;
1289 int pp_reg; 1289 i915_reg_t pp_reg;
1290 u32 val; 1290 u32 val;
1291 enum pipe panel_pipe = PIPE_A; 1291 enum pipe panel_pipe = PIPE_A;
1292 bool locked = true; 1292 bool locked = true;
@@ -1481,8 +1481,7 @@ static bool dp_pipe_enabled(struct drm_i915_private *dev_priv,
1481 return false; 1481 return false;
1482 1482
1483 if (HAS_PCH_CPT(dev_priv->dev)) { 1483 if (HAS_PCH_CPT(dev_priv->dev)) {
1484 u32 trans_dp_ctl_reg = TRANS_DP_CTL(pipe); 1484 u32 trans_dp_ctl = I915_READ(TRANS_DP_CTL(pipe));
1485 u32 trans_dp_ctl = I915_READ(trans_dp_ctl_reg);
1486 if ((trans_dp_ctl & TRANS_DP_PORT_SEL_MASK) != port_sel) 1485 if ((trans_dp_ctl & TRANS_DP_PORT_SEL_MASK) != port_sel)
1487 return false; 1486 return false;
1488 } else if (IS_CHERRYVIEW(dev_priv->dev)) { 1487 } else if (IS_CHERRYVIEW(dev_priv->dev)) {
@@ -1546,12 +1545,13 @@ static bool adpa_pipe_enabled(struct drm_i915_private *dev_priv,
1546} 1545}
1547 1546
1548static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv, 1547static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
1549 enum pipe pipe, int reg, u32 port_sel) 1548 enum pipe pipe, i915_reg_t reg,
1549 u32 port_sel)
1550{ 1550{
1551 u32 val = I915_READ(reg); 1551 u32 val = I915_READ(reg);
1552 I915_STATE_WARN(dp_pipe_enabled(dev_priv, pipe, port_sel, val), 1552 I915_STATE_WARN(dp_pipe_enabled(dev_priv, pipe, port_sel, val),
1553 "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", 1553 "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
1554 reg, pipe_name(pipe)); 1554 i915_mmio_reg_offset(reg), pipe_name(pipe));
1555 1555
1556 I915_STATE_WARN(HAS_PCH_IBX(dev_priv->dev) && (val & DP_PORT_EN) == 0 1556 I915_STATE_WARN(HAS_PCH_IBX(dev_priv->dev) && (val & DP_PORT_EN) == 0
1557 && (val & DP_PIPEB_SELECT), 1557 && (val & DP_PIPEB_SELECT),
@@ -1559,12 +1559,12 @@ static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
1559} 1559}
1560 1560
1561static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv, 1561static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
1562 enum pipe pipe, int reg) 1562 enum pipe pipe, i915_reg_t reg)
1563{ 1563{
1564 u32 val = I915_READ(reg); 1564 u32 val = I915_READ(reg);
1565 I915_STATE_WARN(hdmi_pipe_enabled(dev_priv, pipe, val), 1565 I915_STATE_WARN(hdmi_pipe_enabled(dev_priv, pipe, val),
1566 "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n", 1566 "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n",
1567 reg, pipe_name(pipe)); 1567 i915_mmio_reg_offset(reg), pipe_name(pipe));
1568 1568
1569 I915_STATE_WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_ENABLE) == 0 1569 I915_STATE_WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_ENABLE) == 0
1570 && (val & SDVO_PIPE_B_SELECT), 1570 && (val & SDVO_PIPE_B_SELECT),
@@ -1600,7 +1600,7 @@ static void vlv_enable_pll(struct intel_crtc *crtc,
1600{ 1600{
1601 struct drm_device *dev = crtc->base.dev; 1601 struct drm_device *dev = crtc->base.dev;
1602 struct drm_i915_private *dev_priv = dev->dev_private; 1602 struct drm_i915_private *dev_priv = dev->dev_private;
1603 int reg = DPLL(crtc->pipe); 1603 i915_reg_t reg = DPLL(crtc->pipe);
1604 u32 dpll = pipe_config->dpll_hw_state.dpll; 1604 u32 dpll = pipe_config->dpll_hw_state.dpll;
1605 1605
1606 assert_pipe_disabled(dev_priv, crtc->pipe); 1606 assert_pipe_disabled(dev_priv, crtc->pipe);
@@ -1689,7 +1689,7 @@ static void i9xx_enable_pll(struct intel_crtc *crtc)
1689{ 1689{
1690 struct drm_device *dev = crtc->base.dev; 1690 struct drm_device *dev = crtc->base.dev;
1691 struct drm_i915_private *dev_priv = dev->dev_private; 1691 struct drm_i915_private *dev_priv = dev->dev_private;
1692 int reg = DPLL(crtc->pipe); 1692 i915_reg_t reg = DPLL(crtc->pipe);
1693 u32 dpll = crtc->config->dpll_hw_state.dpll; 1693 u32 dpll = crtc->config->dpll_hw_state.dpll;
1694 1694
1695 assert_pipe_disabled(dev_priv, crtc->pipe); 1695 assert_pipe_disabled(dev_priv, crtc->pipe);
@@ -1838,7 +1838,7 @@ void vlv_wait_port_ready(struct drm_i915_private *dev_priv,
1838 unsigned int expected_mask) 1838 unsigned int expected_mask)
1839{ 1839{
1840 u32 port_mask; 1840 u32 port_mask;
1841 int dpll_reg; 1841 i915_reg_t dpll_reg;
1842 1842
1843 switch (dport->port) { 1843 switch (dport->port) {
1844 case PORT_B: 1844 case PORT_B:
@@ -1963,7 +1963,8 @@ static void ironlake_enable_pch_transcoder(struct drm_i915_private *dev_priv,
1963 struct drm_device *dev = dev_priv->dev; 1963 struct drm_device *dev = dev_priv->dev;
1964 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; 1964 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
1965 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1965 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1966 uint32_t reg, val, pipeconf_val; 1966 i915_reg_t reg;
1967 uint32_t val, pipeconf_val;
1967 1968
1968 /* PCH only available on ILK+ */ 1969 /* PCH only available on ILK+ */
1969 BUG_ON(!HAS_PCH_SPLIT(dev)); 1970 BUG_ON(!HAS_PCH_SPLIT(dev));
@@ -2052,7 +2053,8 @@ static void ironlake_disable_pch_transcoder(struct drm_i915_private *dev_priv,
2052 enum pipe pipe) 2053 enum pipe pipe)
2053{ 2054{
2054 struct drm_device *dev = dev_priv->dev; 2055 struct drm_device *dev = dev_priv->dev;
2055 uint32_t reg, val; 2056 i915_reg_t reg;
2057 uint32_t val;
2056 2058
2057 /* FDI relies on the transcoder */ 2059 /* FDI relies on the transcoder */
2058 assert_fdi_tx_disabled(dev_priv, pipe); 2060 assert_fdi_tx_disabled(dev_priv, pipe);
@@ -2069,7 +2071,7 @@ static void ironlake_disable_pch_transcoder(struct drm_i915_private *dev_priv,
2069 if (wait_for((I915_READ(reg) & TRANS_STATE_ENABLE) == 0, 50)) 2071 if (wait_for((I915_READ(reg) & TRANS_STATE_ENABLE) == 0, 50))
2070 DRM_ERROR("failed to disable transcoder %c\n", pipe_name(pipe)); 2072 DRM_ERROR("failed to disable transcoder %c\n", pipe_name(pipe));
2071 2073
2072 if (!HAS_PCH_IBX(dev)) { 2074 if (HAS_PCH_CPT(dev)) {
2073 /* Workaround: Clear the timing override chicken bit again. */ 2075 /* Workaround: Clear the timing override chicken bit again. */
2074 reg = TRANS_CHICKEN2(pipe); 2076 reg = TRANS_CHICKEN2(pipe);
2075 val = I915_READ(reg); 2077 val = I915_READ(reg);
@@ -2107,10 +2109,9 @@ static void intel_enable_pipe(struct intel_crtc *crtc)
2107 struct drm_device *dev = crtc->base.dev; 2109 struct drm_device *dev = crtc->base.dev;
2108 struct drm_i915_private *dev_priv = dev->dev_private; 2110 struct drm_i915_private *dev_priv = dev->dev_private;
2109 enum pipe pipe = crtc->pipe; 2111 enum pipe pipe = crtc->pipe;
2110 enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv, 2112 enum transcoder cpu_transcoder = crtc->config->cpu_transcoder;
2111 pipe);
2112 enum pipe pch_transcoder; 2113 enum pipe pch_transcoder;
2113 int reg; 2114 i915_reg_t reg;
2114 u32 val; 2115 u32 val;
2115 2116
2116 DRM_DEBUG_KMS("enabling pipe %c\n", pipe_name(pipe)); 2117 DRM_DEBUG_KMS("enabling pipe %c\n", pipe_name(pipe));
@@ -2171,7 +2172,7 @@ static void intel_disable_pipe(struct intel_crtc *crtc)
2171 struct drm_i915_private *dev_priv = crtc->base.dev->dev_private; 2172 struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
2172 enum transcoder cpu_transcoder = crtc->config->cpu_transcoder; 2173 enum transcoder cpu_transcoder = crtc->config->cpu_transcoder;
2173 enum pipe pipe = crtc->pipe; 2174 enum pipe pipe = crtc->pipe;
2174 int reg; 2175 i915_reg_t reg;
2175 u32 val; 2176 u32 val;
2176 2177
2177 DRM_DEBUG_KMS("disabling pipe %c\n", pipe_name(pipe)); 2178 DRM_DEBUG_KMS("disabling pipe %c\n", pipe_name(pipe));
@@ -2270,20 +2271,20 @@ intel_fb_align_height(struct drm_device *dev, unsigned int height,
2270 fb_format_modifier, 0)); 2271 fb_format_modifier, 0));
2271} 2272}
2272 2273
2273static int 2274static void
2274intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb, 2275intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb,
2275 const struct drm_plane_state *plane_state) 2276 const struct drm_plane_state *plane_state)
2276{ 2277{
2277 struct intel_rotation_info *info = &view->rotation_info; 2278 struct intel_rotation_info *info = &view->params.rotation_info;
2278 unsigned int tile_height, tile_pitch; 2279 unsigned int tile_height, tile_pitch;
2279 2280
2280 *view = i915_ggtt_view_normal; 2281 *view = i915_ggtt_view_normal;
2281 2282
2282 if (!plane_state) 2283 if (!plane_state)
2283 return 0; 2284 return;
2284 2285
2285 if (!intel_rotation_90_or_270(plane_state->rotation)) 2286 if (!intel_rotation_90_or_270(plane_state->rotation))
2286 return 0; 2287 return;
2287 2288
2288 *view = i915_ggtt_view_rotated; 2289 *view = i915_ggtt_view_rotated;
2289 2290
@@ -2310,8 +2311,6 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb,
2310 info->size_uv = info->width_pages_uv * info->height_pages_uv * 2311 info->size_uv = info->width_pages_uv * info->height_pages_uv *
2311 PAGE_SIZE; 2312 PAGE_SIZE;
2312 } 2313 }
2313
2314 return 0;
2315} 2314}
2316 2315
2317static unsigned int intel_linear_alignment(struct drm_i915_private *dev_priv) 2316static unsigned int intel_linear_alignment(struct drm_i915_private *dev_priv)
@@ -2330,9 +2329,7 @@ static unsigned int intel_linear_alignment(struct drm_i915_private *dev_priv)
2330int 2329int
2331intel_pin_and_fence_fb_obj(struct drm_plane *plane, 2330intel_pin_and_fence_fb_obj(struct drm_plane *plane,
2332 struct drm_framebuffer *fb, 2331 struct drm_framebuffer *fb,
2333 const struct drm_plane_state *plane_state, 2332 const struct drm_plane_state *plane_state)
2334 struct intel_engine_cs *pipelined,
2335 struct drm_i915_gem_request **pipelined_request)
2336{ 2333{
2337 struct drm_device *dev = fb->dev; 2334 struct drm_device *dev = fb->dev;
2338 struct drm_i915_private *dev_priv = dev->dev_private; 2335 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -2367,9 +2364,7 @@ intel_pin_and_fence_fb_obj(struct drm_plane *plane,
2367 return -EINVAL; 2364 return -EINVAL;
2368 } 2365 }
2369 2366
2370 ret = intel_fill_fb_ggtt_view(&view, fb, plane_state); 2367 intel_fill_fb_ggtt_view(&view, fb, plane_state);
2371 if (ret)
2372 return ret;
2373 2368
2374 /* Note that the w/a also requires 64 PTE of padding following the 2369 /* Note that the w/a also requires 64 PTE of padding following the
2375 * bo. We currently fill all unused PTE with the shadow page and so 2370 * bo. We currently fill all unused PTE with the shadow page and so
@@ -2388,11 +2383,10 @@ intel_pin_and_fence_fb_obj(struct drm_plane *plane,
2388 */ 2383 */
2389 intel_runtime_pm_get(dev_priv); 2384 intel_runtime_pm_get(dev_priv);
2390 2385
2391 dev_priv->mm.interruptible = false; 2386 ret = i915_gem_object_pin_to_display_plane(obj, alignment,
2392 ret = i915_gem_object_pin_to_display_plane(obj, alignment, pipelined, 2387 &view);
2393 pipelined_request, &view);
2394 if (ret) 2388 if (ret)
2395 goto err_interruptible; 2389 goto err_pm;
2396 2390
2397 /* Install a fence for tiled scan-out. Pre-i965 always needs a 2391 /* Install a fence for tiled scan-out. Pre-i965 always needs a
2398 * fence, whereas 965+ only requires a fence if using 2392 * fence, whereas 965+ only requires a fence if using
@@ -2418,14 +2412,12 @@ intel_pin_and_fence_fb_obj(struct drm_plane *plane,
2418 i915_gem_object_pin_fence(obj); 2412 i915_gem_object_pin_fence(obj);
2419 } 2413 }
2420 2414
2421 dev_priv->mm.interruptible = true;
2422 intel_runtime_pm_put(dev_priv); 2415 intel_runtime_pm_put(dev_priv);
2423 return 0; 2416 return 0;
2424 2417
2425err_unpin: 2418err_unpin:
2426 i915_gem_object_unpin_from_display_plane(obj, &view); 2419 i915_gem_object_unpin_from_display_plane(obj, &view);
2427err_interruptible: 2420err_pm:
2428 dev_priv->mm.interruptible = true;
2429 intel_runtime_pm_put(dev_priv); 2421 intel_runtime_pm_put(dev_priv);
2430 return ret; 2422 return ret;
2431} 2423}
@@ -2435,12 +2427,10 @@ static void intel_unpin_fb_obj(struct drm_framebuffer *fb,
2435{ 2427{
2436 struct drm_i915_gem_object *obj = intel_fb_obj(fb); 2428 struct drm_i915_gem_object *obj = intel_fb_obj(fb);
2437 struct i915_ggtt_view view; 2429 struct i915_ggtt_view view;
2438 int ret;
2439 2430
2440 WARN_ON(!mutex_is_locked(&obj->base.dev->struct_mutex)); 2431 WARN_ON(!mutex_is_locked(&obj->base.dev->struct_mutex));
2441 2432
2442 ret = intel_fill_fb_ggtt_view(&view, fb, plane_state); 2433 intel_fill_fb_ggtt_view(&view, fb, plane_state);
2443 WARN_ONCE(ret, "Couldn't get view from plane state!");
2444 2434
2445 if (view.type == I915_GGTT_VIEW_NORMAL) 2435 if (view.type == I915_GGTT_VIEW_NORMAL)
2446 i915_gem_object_unpin_fence(obj); 2436 i915_gem_object_unpin_fence(obj);
@@ -2695,7 +2685,7 @@ static void i9xx_update_primary_plane(struct drm_crtc *crtc,
2695 int plane = intel_crtc->plane; 2685 int plane = intel_crtc->plane;
2696 unsigned long linear_offset; 2686 unsigned long linear_offset;
2697 u32 dspcntr; 2687 u32 dspcntr;
2698 u32 reg = DSPCNTR(plane); 2688 i915_reg_t reg = DSPCNTR(plane);
2699 int pixel_size; 2689 int pixel_size;
2700 2690
2701 if (!visible || !fb) { 2691 if (!visible || !fb) {
@@ -2825,7 +2815,7 @@ static void ironlake_update_primary_plane(struct drm_crtc *crtc,
2825 int plane = intel_crtc->plane; 2815 int plane = intel_crtc->plane;
2826 unsigned long linear_offset; 2816 unsigned long linear_offset;
2827 u32 dspcntr; 2817 u32 dspcntr;
2828 u32 reg = DSPCNTR(plane); 2818 i915_reg_t reg = DSPCNTR(plane);
2829 int pixel_size; 2819 int pixel_size;
2830 2820
2831 if (!visible || !fb) { 2821 if (!visible || !fb) {
@@ -2950,30 +2940,32 @@ u32 intel_fb_stride_alignment(struct drm_device *dev, uint64_t fb_modifier,
2950 } 2940 }
2951} 2941}
2952 2942
2953unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane, 2943u32 intel_plane_obj_offset(struct intel_plane *intel_plane,
2954 struct drm_i915_gem_object *obj, 2944 struct drm_i915_gem_object *obj,
2955 unsigned int plane) 2945 unsigned int plane)
2956{ 2946{
2957 const struct i915_ggtt_view *view = &i915_ggtt_view_normal; 2947 struct i915_ggtt_view view;
2958 struct i915_vma *vma; 2948 struct i915_vma *vma;
2959 unsigned char *offset; 2949 u64 offset;
2960 2950
2961 if (intel_rotation_90_or_270(intel_plane->base.state->rotation)) 2951 intel_fill_fb_ggtt_view(&view, intel_plane->base.fb,
2962 view = &i915_ggtt_view_rotated; 2952 intel_plane->base.state);
2963 2953
2964 vma = i915_gem_obj_to_ggtt_view(obj, view); 2954 vma = i915_gem_obj_to_ggtt_view(obj, &view);
2965 if (WARN(!vma, "ggtt vma for display object not found! (view=%u)\n", 2955 if (WARN(!vma, "ggtt vma for display object not found! (view=%u)\n",
2966 view->type)) 2956 view.type))
2967 return -1; 2957 return -1;
2968 2958
2969 offset = (unsigned char *)vma->node.start; 2959 offset = vma->node.start;
2970 2960
2971 if (plane == 1) { 2961 if (plane == 1) {
2972 offset += vma->ggtt_view.rotation_info.uv_start_page * 2962 offset += vma->ggtt_view.params.rotation_info.uv_start_page *
2973 PAGE_SIZE; 2963 PAGE_SIZE;
2974 } 2964 }
2975 2965
2976 return (unsigned long)offset; 2966 WARN_ON(upper_32_bits(offset));
2967
2968 return lower_32_bits(offset);
2977} 2969}
2978 2970
2979static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id) 2971static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id)
@@ -3099,7 +3091,7 @@ static void skylake_update_primary_plane(struct drm_crtc *crtc,
3099 u32 tile_height, plane_offset, plane_size; 3091 u32 tile_height, plane_offset, plane_size;
3100 unsigned int rotation; 3092 unsigned int rotation;
3101 int x_offset, y_offset; 3093 int x_offset, y_offset;
3102 unsigned long surf_addr; 3094 u32 surf_addr;
3103 struct intel_crtc_state *crtc_state = intel_crtc->config; 3095 struct intel_crtc_state *crtc_state = intel_crtc->config;
3104 struct intel_plane_state *plane_state; 3096 struct intel_plane_state *plane_state;
3105 int src_x = 0, src_y = 0, src_w = 0, src_h = 0; 3097 int src_x = 0, src_y = 0, src_w = 0, src_h = 0;
@@ -3227,10 +3219,9 @@ static void intel_update_primary_planes(struct drm_device *dev)
3227 struct intel_plane_state *plane_state; 3219 struct intel_plane_state *plane_state;
3228 3220
3229 drm_modeset_lock_crtc(crtc, &plane->base); 3221 drm_modeset_lock_crtc(crtc, &plane->base);
3230
3231 plane_state = to_intel_plane_state(plane->base.state); 3222 plane_state = to_intel_plane_state(plane->base.state);
3232 3223
3233 if (plane_state->base.fb) 3224 if (crtc->state->active && plane_state->base.fb)
3234 plane->commit_plane(&plane->base, plane_state); 3225 plane->commit_plane(&plane->base, plane_state);
3235 3226
3236 drm_modeset_unlock_crtc(crtc); 3227 drm_modeset_unlock_crtc(crtc);
@@ -3306,32 +3297,6 @@ void intel_finish_reset(struct drm_device *dev)
3306 drm_modeset_unlock_all(dev); 3297 drm_modeset_unlock_all(dev);
3307} 3298}
3308 3299
3309static void
3310intel_finish_fb(struct drm_framebuffer *old_fb)
3311{
3312 struct drm_i915_gem_object *obj = intel_fb_obj(old_fb);
3313 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
3314 bool was_interruptible = dev_priv->mm.interruptible;
3315 int ret;
3316
3317 /* Big Hammer, we also need to ensure that any pending
3318 * MI_WAIT_FOR_EVENT inside a user batch buffer on the
3319 * current scanout is retired before unpinning the old
3320 * framebuffer. Note that we rely on userspace rendering
3321 * into the buffer attached to the pipe they are waiting
3322 * on. If not, userspace generates a GPU hang with IPEHR
3323 * point to the MI_WAIT_FOR_EVENT.
3324 *
3325 * This should only fail upon a hung GPU, in which case we
3326 * can safely continue.
3327 */
3328 dev_priv->mm.interruptible = false;
3329 ret = i915_gem_object_wait_rendering(obj, true);
3330 dev_priv->mm.interruptible = was_interruptible;
3331
3332 WARN_ON(ret);
3333}
3334
3335static bool intel_crtc_has_pending_flip(struct drm_crtc *crtc) 3300static bool intel_crtc_has_pending_flip(struct drm_crtc *crtc)
3336{ 3301{
3337 struct drm_device *dev = crtc->dev; 3302 struct drm_device *dev = crtc->dev;
@@ -3401,7 +3366,8 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc)
3401 struct drm_i915_private *dev_priv = dev->dev_private; 3366 struct drm_i915_private *dev_priv = dev->dev_private;
3402 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3367 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3403 int pipe = intel_crtc->pipe; 3368 int pipe = intel_crtc->pipe;
3404 u32 reg, temp; 3369 i915_reg_t reg;
3370 u32 temp;
3405 3371
3406 /* enable normal train */ 3372 /* enable normal train */
3407 reg = FDI_TX_CTL(pipe); 3373 reg = FDI_TX_CTL(pipe);
@@ -3443,7 +3409,8 @@ static void ironlake_fdi_link_train(struct drm_crtc *crtc)
3443 struct drm_i915_private *dev_priv = dev->dev_private; 3409 struct drm_i915_private *dev_priv = dev->dev_private;
3444 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3410 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3445 int pipe = intel_crtc->pipe; 3411 int pipe = intel_crtc->pipe;
3446 u32 reg, temp, tries; 3412 i915_reg_t reg;
3413 u32 temp, tries;
3447 3414
3448 /* FDI needs bits from pipe first */ 3415 /* FDI needs bits from pipe first */
3449 assert_pipe_enabled(dev_priv, pipe); 3416 assert_pipe_enabled(dev_priv, pipe);
@@ -3543,7 +3510,8 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
3543 struct drm_i915_private *dev_priv = dev->dev_private; 3510 struct drm_i915_private *dev_priv = dev->dev_private;
3544 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3511 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3545 int pipe = intel_crtc->pipe; 3512 int pipe = intel_crtc->pipe;
3546 u32 reg, temp, i, retry; 3513 i915_reg_t reg;
3514 u32 temp, i, retry;
3547 3515
3548 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit 3516 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
3549 for train result */ 3517 for train result */
@@ -3675,7 +3643,8 @@ static void ivb_manual_fdi_link_train(struct drm_crtc *crtc)
3675 struct drm_i915_private *dev_priv = dev->dev_private; 3643 struct drm_i915_private *dev_priv = dev->dev_private;
3676 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3644 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3677 int pipe = intel_crtc->pipe; 3645 int pipe = intel_crtc->pipe;
3678 u32 reg, temp, i, j; 3646 i915_reg_t reg;
3647 u32 temp, i, j;
3679 3648
3680 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit 3649 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
3681 for train result */ 3650 for train result */
@@ -3792,8 +3761,8 @@ static void ironlake_fdi_pll_enable(struct intel_crtc *intel_crtc)
3792 struct drm_device *dev = intel_crtc->base.dev; 3761 struct drm_device *dev = intel_crtc->base.dev;
3793 struct drm_i915_private *dev_priv = dev->dev_private; 3762 struct drm_i915_private *dev_priv = dev->dev_private;
3794 int pipe = intel_crtc->pipe; 3763 int pipe = intel_crtc->pipe;
3795 u32 reg, temp; 3764 i915_reg_t reg;
3796 3765 u32 temp;
3797 3766
3798 /* enable PCH FDI RX PLL, wait warmup plus DMI latency */ 3767 /* enable PCH FDI RX PLL, wait warmup plus DMI latency */
3799 reg = FDI_RX_CTL(pipe); 3768 reg = FDI_RX_CTL(pipe);
@@ -3829,7 +3798,8 @@ static void ironlake_fdi_pll_disable(struct intel_crtc *intel_crtc)
3829 struct drm_device *dev = intel_crtc->base.dev; 3798 struct drm_device *dev = intel_crtc->base.dev;
3830 struct drm_i915_private *dev_priv = dev->dev_private; 3799 struct drm_i915_private *dev_priv = dev->dev_private;
3831 int pipe = intel_crtc->pipe; 3800 int pipe = intel_crtc->pipe;
3832 u32 reg, temp; 3801 i915_reg_t reg;
3802 u32 temp;
3833 3803
3834 /* Switch from PCDclk to Rawclk */ 3804 /* Switch from PCDclk to Rawclk */
3835 reg = FDI_RX_CTL(pipe); 3805 reg = FDI_RX_CTL(pipe);
@@ -3859,7 +3829,8 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc)
3859 struct drm_i915_private *dev_priv = dev->dev_private; 3829 struct drm_i915_private *dev_priv = dev->dev_private;
3860 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3830 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3861 int pipe = intel_crtc->pipe; 3831 int pipe = intel_crtc->pipe;
3862 u32 reg, temp; 3832 i915_reg_t reg;
3833 u32 temp;
3863 3834
3864 /* disable CPU FDI tx and PCH FDI rx */ 3835 /* disable CPU FDI tx and PCH FDI rx */
3865 reg = FDI_TX_CTL(pipe); 3836 reg = FDI_TX_CTL(pipe);
@@ -3952,15 +3923,23 @@ static void page_flip_completed(struct intel_crtc *intel_crtc)
3952 work->pending_flip_obj); 3923 work->pending_flip_obj);
3953} 3924}
3954 3925
3955void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc) 3926static int intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc)
3956{ 3927{
3957 struct drm_device *dev = crtc->dev; 3928 struct drm_device *dev = crtc->dev;
3958 struct drm_i915_private *dev_priv = dev->dev_private; 3929 struct drm_i915_private *dev_priv = dev->dev_private;
3930 long ret;
3959 3931
3960 WARN_ON(waitqueue_active(&dev_priv->pending_flip_queue)); 3932 WARN_ON(waitqueue_active(&dev_priv->pending_flip_queue));
3961 if (WARN_ON(wait_event_timeout(dev_priv->pending_flip_queue, 3933
3962 !intel_crtc_has_pending_flip(crtc), 3934 ret = wait_event_interruptible_timeout(
3963 60*HZ) == 0)) { 3935 dev_priv->pending_flip_queue,
3936 !intel_crtc_has_pending_flip(crtc),
3937 60*HZ);
3938
3939 if (ret < 0)
3940 return ret;
3941
3942 if (ret == 0) {
3964 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3943 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3965 3944
3966 spin_lock_irq(&dev->event_lock); 3945 spin_lock_irq(&dev->event_lock);
@@ -3971,11 +3950,7 @@ void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc)
3971 spin_unlock_irq(&dev->event_lock); 3950 spin_unlock_irq(&dev->event_lock);
3972 } 3951 }
3973 3952
3974 if (crtc->primary->fb) { 3953 return 0;
3975 mutex_lock(&dev->struct_mutex);
3976 intel_finish_fb(crtc->primary->fb);
3977 mutex_unlock(&dev->struct_mutex);
3978 }
3979} 3954}
3980 3955
3981/* Program iCLKIP clock to the desired frequency */ 3956/* Program iCLKIP clock to the desired frequency */
@@ -4135,6 +4110,22 @@ static void ivybridge_update_fdi_bc_bifurcation(struct intel_crtc *intel_crtc)
4135 } 4110 }
4136} 4111}
4137 4112
4113/* Return which DP Port should be selected for Transcoder DP control */
4114static enum port
4115intel_trans_dp_port_sel(struct drm_crtc *crtc)
4116{
4117 struct drm_device *dev = crtc->dev;
4118 struct intel_encoder *encoder;
4119
4120 for_each_encoder_on_crtc(dev, crtc, encoder) {
4121 if (encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
4122 encoder->type == INTEL_OUTPUT_EDP)
4123 return enc_to_dig_port(&encoder->base)->port;
4124 }
4125
4126 return -1;
4127}
4128
4138/* 4129/*
4139 * Enable PCH resources required for PCH ports: 4130 * Enable PCH resources required for PCH ports:
4140 * - PCH PLLs 4131 * - PCH PLLs
@@ -4149,7 +4140,7 @@ static void ironlake_pch_enable(struct drm_crtc *crtc)
4149 struct drm_i915_private *dev_priv = dev->dev_private; 4140 struct drm_i915_private *dev_priv = dev->dev_private;
4150 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 4141 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4151 int pipe = intel_crtc->pipe; 4142 int pipe = intel_crtc->pipe;
4152 u32 reg, temp; 4143 u32 temp;
4153 4144
4154 assert_pch_transcoder_disabled(dev_priv, pipe); 4145 assert_pch_transcoder_disabled(dev_priv, pipe);
4155 4146
@@ -4196,8 +4187,10 @@ static void ironlake_pch_enable(struct drm_crtc *crtc)
4196 4187
4197 /* For PCH DP, enable TRANS_DP_CTL */ 4188 /* For PCH DP, enable TRANS_DP_CTL */
4198 if (HAS_PCH_CPT(dev) && intel_crtc->config->has_dp_encoder) { 4189 if (HAS_PCH_CPT(dev) && intel_crtc->config->has_dp_encoder) {
4190 const struct drm_display_mode *adjusted_mode =
4191 &intel_crtc->config->base.adjusted_mode;
4199 u32 bpc = (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) >> 5; 4192 u32 bpc = (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) >> 5;
4200 reg = TRANS_DP_CTL(pipe); 4193 i915_reg_t reg = TRANS_DP_CTL(pipe);
4201 temp = I915_READ(reg); 4194 temp = I915_READ(reg);
4202 temp &= ~(TRANS_DP_PORT_SEL_MASK | 4195 temp &= ~(TRANS_DP_PORT_SEL_MASK |
4203 TRANS_DP_SYNC_MASK | 4196 TRANS_DP_SYNC_MASK |
@@ -4205,19 +4198,19 @@ static void ironlake_pch_enable(struct drm_crtc *crtc)
4205 temp |= TRANS_DP_OUTPUT_ENABLE; 4198 temp |= TRANS_DP_OUTPUT_ENABLE;
4206 temp |= bpc << 9; /* same format but at 11:9 */ 4199 temp |= bpc << 9; /* same format but at 11:9 */
4207 4200
4208 if (crtc->mode.flags & DRM_MODE_FLAG_PHSYNC) 4201 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
4209 temp |= TRANS_DP_HSYNC_ACTIVE_HIGH; 4202 temp |= TRANS_DP_HSYNC_ACTIVE_HIGH;
4210 if (crtc->mode.flags & DRM_MODE_FLAG_PVSYNC) 4203 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
4211 temp |= TRANS_DP_VSYNC_ACTIVE_HIGH; 4204 temp |= TRANS_DP_VSYNC_ACTIVE_HIGH;
4212 4205
4213 switch (intel_trans_dp_port_sel(crtc)) { 4206 switch (intel_trans_dp_port_sel(crtc)) {
4214 case PCH_DP_B: 4207 case PORT_B:
4215 temp |= TRANS_DP_PORT_SEL_B; 4208 temp |= TRANS_DP_PORT_SEL_B;
4216 break; 4209 break;
4217 case PCH_DP_C: 4210 case PORT_C:
4218 temp |= TRANS_DP_PORT_SEL_C; 4211 temp |= TRANS_DP_PORT_SEL_C;
4219 break; 4212 break;
4220 case PCH_DP_D: 4213 case PORT_D:
4221 temp |= TRANS_DP_PORT_SEL_D; 4214 temp |= TRANS_DP_PORT_SEL_D;
4222 break; 4215 break;
4223 default: 4216 default:
@@ -4357,7 +4350,7 @@ static void intel_shared_dpll_commit(struct drm_atomic_state *state)
4357static void cpt_verify_modeset(struct drm_device *dev, int pipe) 4350static void cpt_verify_modeset(struct drm_device *dev, int pipe)
4358{ 4351{
4359 struct drm_i915_private *dev_priv = dev->dev_private; 4352 struct drm_i915_private *dev_priv = dev->dev_private;
4360 int dslreg = PIPEDSL(pipe); 4353 i915_reg_t dslreg = PIPEDSL(pipe);
4361 u32 temp; 4354 u32 temp;
4362 4355
4363 temp = I915_READ(dslreg); 4356 temp = I915_READ(dslreg);
@@ -4667,7 +4660,7 @@ static void intel_crtc_load_lut(struct drm_crtc *crtc)
4667 } 4660 }
4668 4661
4669 for (i = 0; i < 256; i++) { 4662 for (i = 0; i < 256; i++) {
4670 u32 palreg; 4663 i915_reg_t palreg;
4671 4664
4672 if (HAS_GMCH_DISPLAY(dev)) 4665 if (HAS_GMCH_DISPLAY(dev))
4673 palreg = PALETTE(pipe, i); 4666 palreg = PALETTE(pipe, i);
@@ -4746,9 +4739,9 @@ intel_post_enable_primary(struct drm_crtc *crtc)
4746 if (IS_GEN2(dev)) 4739 if (IS_GEN2(dev))
4747 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true); 4740 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
4748 4741
4749 /* Underruns don't raise interrupts, so check manually. */ 4742 /* Underruns don't always raise interrupts, so check manually. */
4750 if (HAS_GMCH_DISPLAY(dev)) 4743 intel_check_cpu_fifo_underruns(dev_priv);
4751 i9xx_check_fifo_underruns(dev_priv); 4744 intel_check_pch_fifo_underruns(dev_priv);
4752} 4745}
4753 4746
4754/** 4747/**
@@ -4807,7 +4800,6 @@ static void intel_post_plane_update(struct intel_crtc *crtc)
4807 struct intel_crtc_atomic_commit *atomic = &crtc->atomic; 4800 struct intel_crtc_atomic_commit *atomic = &crtc->atomic;
4808 struct drm_device *dev = crtc->base.dev; 4801 struct drm_device *dev = crtc->base.dev;
4809 struct drm_i915_private *dev_priv = dev->dev_private; 4802 struct drm_i915_private *dev_priv = dev->dev_private;
4810 struct drm_plane *plane;
4811 4803
4812 if (atomic->wait_vblank) 4804 if (atomic->wait_vblank)
4813 intel_wait_for_vblank(dev, crtc->pipe); 4805 intel_wait_for_vblank(dev, crtc->pipe);
@@ -4826,10 +4818,6 @@ static void intel_post_plane_update(struct intel_crtc *crtc)
4826 if (atomic->post_enable_primary) 4818 if (atomic->post_enable_primary)
4827 intel_post_enable_primary(&crtc->base); 4819 intel_post_enable_primary(&crtc->base);
4828 4820
4829 drm_for_each_plane_mask(plane, dev, atomic->update_sprite_watermarks)
4830 intel_update_sprite_watermarks(plane, &crtc->base,
4831 0, 0, 0, false, false);
4832
4833 memset(atomic, 0, sizeof(*atomic)); 4821 memset(atomic, 0, sizeof(*atomic));
4834} 4822}
4835 4823
@@ -4838,20 +4826,6 @@ static void intel_pre_plane_update(struct intel_crtc *crtc)
4838 struct drm_device *dev = crtc->base.dev; 4826 struct drm_device *dev = crtc->base.dev;
4839 struct drm_i915_private *dev_priv = dev->dev_private; 4827 struct drm_i915_private *dev_priv = dev->dev_private;
4840 struct intel_crtc_atomic_commit *atomic = &crtc->atomic; 4828 struct intel_crtc_atomic_commit *atomic = &crtc->atomic;
4841 struct drm_plane *p;
4842
4843 /* Track fb's for any planes being disabled */
4844 drm_for_each_plane_mask(p, dev, atomic->disabled_planes) {
4845 struct intel_plane *plane = to_intel_plane(p);
4846
4847 mutex_lock(&dev->struct_mutex);
4848 i915_gem_track_fb(intel_fb_obj(plane->base.fb), NULL,
4849 plane->frontbuffer_bit);
4850 mutex_unlock(&dev->struct_mutex);
4851 }
4852
4853 if (atomic->wait_for_flips)
4854 intel_crtc_wait_for_pending_flips(&crtc->base);
4855 4829
4856 if (atomic->disable_fbc) 4830 if (atomic->disable_fbc)
4857 intel_fbc_disable_crtc(crtc); 4831 intel_fbc_disable_crtc(crtc);
@@ -4900,6 +4874,9 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
4900 return; 4874 return;
4901 4875
4902 if (intel_crtc->config->has_pch_encoder) 4876 if (intel_crtc->config->has_pch_encoder)
4877 intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
4878
4879 if (intel_crtc->config->has_pch_encoder)
4903 intel_prepare_shared_dpll(intel_crtc); 4880 intel_prepare_shared_dpll(intel_crtc);
4904 4881
4905 if (intel_crtc->config->has_dp_encoder) 4882 if (intel_crtc->config->has_dp_encoder)
@@ -4917,7 +4894,6 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
4917 intel_crtc->active = true; 4894 intel_crtc->active = true;
4918 4895
4919 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true); 4896 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
4920 intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
4921 4897
4922 for_each_encoder_on_crtc(dev, crtc, encoder) 4898 for_each_encoder_on_crtc(dev, crtc, encoder)
4923 if (encoder->pre_enable) 4899 if (encoder->pre_enable)
@@ -4955,6 +4931,11 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
4955 4931
4956 if (HAS_PCH_CPT(dev)) 4932 if (HAS_PCH_CPT(dev))
4957 cpt_verify_modeset(dev, intel_crtc->pipe); 4933 cpt_verify_modeset(dev, intel_crtc->pipe);
4934
4935 /* Must wait for vblank to avoid spurious PCH FIFO underruns */
4936 if (intel_crtc->config->has_pch_encoder)
4937 intel_wait_for_vblank(dev, pipe);
4938 intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
4958} 4939}
4959 4940
4960/* IPS only exists on ULT machines and is tied to pipe A. */ 4941/* IPS only exists on ULT machines and is tied to pipe A. */
@@ -4977,6 +4958,10 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
4977 if (WARN_ON(intel_crtc->active)) 4958 if (WARN_ON(intel_crtc->active))
4978 return; 4959 return;
4979 4960
4961 if (intel_crtc->config->has_pch_encoder)
4962 intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
4963 false);
4964
4980 if (intel_crtc_to_shared_dpll(intel_crtc)) 4965 if (intel_crtc_to_shared_dpll(intel_crtc))
4981 intel_enable_shared_dpll(intel_crtc); 4966 intel_enable_shared_dpll(intel_crtc);
4982 4967
@@ -5009,11 +4994,8 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
5009 encoder->pre_enable(encoder); 4994 encoder->pre_enable(encoder);
5010 } 4995 }
5011 4996
5012 if (intel_crtc->config->has_pch_encoder) { 4997 if (intel_crtc->config->has_pch_encoder)
5013 intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
5014 true);
5015 dev_priv->display.fdi_link_train(crtc); 4998 dev_priv->display.fdi_link_train(crtc);
5016 }
5017 4999
5018 if (!is_dsi) 5000 if (!is_dsi)
5019 intel_ddi_enable_pipe_clock(intel_crtc); 5001 intel_ddi_enable_pipe_clock(intel_crtc);
@@ -5050,6 +5032,10 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
5050 intel_opregion_notify_encoder(encoder, true); 5032 intel_opregion_notify_encoder(encoder, true);
5051 } 5033 }
5052 5034
5035 if (intel_crtc->config->has_pch_encoder)
5036 intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
5037 true);
5038
5053 /* If we change the relative order between pipe/planes enabling, we need 5039 /* If we change the relative order between pipe/planes enabling, we need
5054 * to change the workaround. */ 5040 * to change the workaround. */
5055 hsw_workaround_pipe = pipe_config->hsw_workaround_pipe; 5041 hsw_workaround_pipe = pipe_config->hsw_workaround_pipe;
@@ -5081,7 +5067,9 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
5081 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 5067 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
5082 struct intel_encoder *encoder; 5068 struct intel_encoder *encoder;
5083 int pipe = intel_crtc->pipe; 5069 int pipe = intel_crtc->pipe;
5084 u32 reg, temp; 5070
5071 if (intel_crtc->config->has_pch_encoder)
5072 intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
5085 5073
5086 for_each_encoder_on_crtc(dev, crtc, encoder) 5074 for_each_encoder_on_crtc(dev, crtc, encoder)
5087 encoder->disable(encoder); 5075 encoder->disable(encoder);
@@ -5089,9 +5077,6 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
5089 drm_crtc_vblank_off(crtc); 5077 drm_crtc_vblank_off(crtc);
5090 assert_vblank_disabled(crtc); 5078 assert_vblank_disabled(crtc);
5091 5079
5092 if (intel_crtc->config->has_pch_encoder)
5093 intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
5094
5095 intel_disable_pipe(intel_crtc); 5080 intel_disable_pipe(intel_crtc);
5096 5081
5097 ironlake_pfit_disable(intel_crtc, false); 5082 ironlake_pfit_disable(intel_crtc, false);
@@ -5107,6 +5092,9 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
5107 ironlake_disable_pch_transcoder(dev_priv, pipe); 5092 ironlake_disable_pch_transcoder(dev_priv, pipe);
5108 5093
5109 if (HAS_PCH_CPT(dev)) { 5094 if (HAS_PCH_CPT(dev)) {
5095 i915_reg_t reg;
5096 u32 temp;
5097
5110 /* disable TRANS_DP_CTL */ 5098 /* disable TRANS_DP_CTL */
5111 reg = TRANS_DP_CTL(pipe); 5099 reg = TRANS_DP_CTL(pipe);
5112 temp = I915_READ(reg); 5100 temp = I915_READ(reg);
@@ -5123,6 +5111,8 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
5123 5111
5124 ironlake_fdi_pll_disable(intel_crtc); 5112 ironlake_fdi_pll_disable(intel_crtc);
5125 } 5113 }
5114
5115 intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
5126} 5116}
5127 5117
5128static void haswell_crtc_disable(struct drm_crtc *crtc) 5118static void haswell_crtc_disable(struct drm_crtc *crtc)
@@ -5134,6 +5124,10 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
5134 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder; 5124 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
5135 bool is_dsi = intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DSI); 5125 bool is_dsi = intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_DSI);
5136 5126
5127 if (intel_crtc->config->has_pch_encoder)
5128 intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
5129 false);
5130
5137 for_each_encoder_on_crtc(dev, crtc, encoder) { 5131 for_each_encoder_on_crtc(dev, crtc, encoder) {
5138 intel_opregion_notify_encoder(encoder, false); 5132 intel_opregion_notify_encoder(encoder, false);
5139 encoder->disable(encoder); 5133 encoder->disable(encoder);
@@ -5142,9 +5136,6 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
5142 drm_crtc_vblank_off(crtc); 5136 drm_crtc_vblank_off(crtc);
5143 assert_vblank_disabled(crtc); 5137 assert_vblank_disabled(crtc);
5144 5138
5145 if (intel_crtc->config->has_pch_encoder)
5146 intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
5147 false);
5148 intel_disable_pipe(intel_crtc); 5139 intel_disable_pipe(intel_crtc);
5149 5140
5150 if (intel_crtc->config->dp_encoder_is_mst) 5141 if (intel_crtc->config->dp_encoder_is_mst)
@@ -5169,6 +5160,10 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
5169 for_each_encoder_on_crtc(dev, crtc, encoder) 5160 for_each_encoder_on_crtc(dev, crtc, encoder)
5170 if (encoder->post_disable) 5161 if (encoder->post_disable)
5171 encoder->post_disable(encoder); 5162 encoder->post_disable(encoder);
5163
5164 if (intel_crtc->config->has_pch_encoder)
5165 intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
5166 true);
5172} 5167}
5173 5168
5174static void i9xx_pfit_enable(struct intel_crtc *crtc) 5169static void i9xx_pfit_enable(struct intel_crtc *crtc)
@@ -5199,15 +5194,15 @@ static enum intel_display_power_domain port_to_power_domain(enum port port)
5199{ 5194{
5200 switch (port) { 5195 switch (port) {
5201 case PORT_A: 5196 case PORT_A:
5202 return POWER_DOMAIN_PORT_DDI_A_4_LANES; 5197 return POWER_DOMAIN_PORT_DDI_A_LANES;
5203 case PORT_B: 5198 case PORT_B:
5204 return POWER_DOMAIN_PORT_DDI_B_4_LANES; 5199 return POWER_DOMAIN_PORT_DDI_B_LANES;
5205 case PORT_C: 5200 case PORT_C:
5206 return POWER_DOMAIN_PORT_DDI_C_4_LANES; 5201 return POWER_DOMAIN_PORT_DDI_C_LANES;
5207 case PORT_D: 5202 case PORT_D:
5208 return POWER_DOMAIN_PORT_DDI_D_4_LANES; 5203 return POWER_DOMAIN_PORT_DDI_D_LANES;
5209 case PORT_E: 5204 case PORT_E:
5210 return POWER_DOMAIN_PORT_DDI_E_2_LANES; 5205 return POWER_DOMAIN_PORT_DDI_E_LANES;
5211 default: 5206 default:
5212 MISSING_CASE(port); 5207 MISSING_CASE(port);
5213 return POWER_DOMAIN_PORT_OTHER; 5208 return POWER_DOMAIN_PORT_OTHER;
@@ -5302,13 +5297,11 @@ static unsigned long get_crtc_power_domains(struct drm_crtc *crtc)
5302 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 5297 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
5303 enum pipe pipe = intel_crtc->pipe; 5298 enum pipe pipe = intel_crtc->pipe;
5304 unsigned long mask; 5299 unsigned long mask;
5305 enum transcoder transcoder; 5300 enum transcoder transcoder = intel_crtc->config->cpu_transcoder;
5306 5301
5307 if (!crtc->state->active) 5302 if (!crtc->state->active)
5308 return 0; 5303 return 0;
5309 5304
5310 transcoder = intel_pipe_to_cpu_transcoder(dev->dev_private, pipe);
5311
5312 mask = BIT(POWER_DOMAIN_PIPE(pipe)); 5305 mask = BIT(POWER_DOMAIN_PIPE(pipe));
5313 mask |= BIT(POWER_DOMAIN_TRANSCODER(transcoder)); 5306 mask |= BIT(POWER_DOMAIN_TRANSCODER(transcoder));
5314 if (intel_crtc->config->pch_pfit.enabled || 5307 if (intel_crtc->config->pch_pfit.enabled ||
@@ -5395,7 +5388,7 @@ static void intel_update_max_cdclk(struct drm_device *dev)
5395{ 5388{
5396 struct drm_i915_private *dev_priv = dev->dev_private; 5389 struct drm_i915_private *dev_priv = dev->dev_private;
5397 5390
5398 if (IS_SKYLAKE(dev)) { 5391 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
5399 u32 limit = I915_READ(SKL_DFSM) & SKL_DFSM_CDCLK_LIMIT_MASK; 5392 u32 limit = I915_READ(SKL_DFSM) & SKL_DFSM_CDCLK_LIMIT_MASK;
5400 5393
5401 if (limit == SKL_DFSM_CDCLK_LIMIT_675) 5394 if (limit == SKL_DFSM_CDCLK_LIMIT_675)
@@ -5812,32 +5805,16 @@ void skl_uninit_cdclk(struct drm_i915_private *dev_priv)
5812 if (I915_READ(DBUF_CTL) & DBUF_POWER_STATE) 5805 if (I915_READ(DBUF_CTL) & DBUF_POWER_STATE)
5813 DRM_ERROR("DBuf power disable timeout\n"); 5806 DRM_ERROR("DBuf power disable timeout\n");
5814 5807
5815 /* 5808 /* disable DPLL0 */
5816 * DMC assumes ownership of LCPLL and will get confused if we touch it. 5809 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) & ~LCPLL_PLL_ENABLE);
5817 */ 5810 if (wait_for(!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_LOCK), 1))
5818 if (dev_priv->csr.dmc_payload) { 5811 DRM_ERROR("Couldn't disable DPLL0\n");
5819 /* disable DPLL0 */
5820 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) &
5821 ~LCPLL_PLL_ENABLE);
5822 if (wait_for(!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_LOCK), 1))
5823 DRM_ERROR("Couldn't disable DPLL0\n");
5824 }
5825
5826 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
5827} 5812}
5828 5813
5829void skl_init_cdclk(struct drm_i915_private *dev_priv) 5814void skl_init_cdclk(struct drm_i915_private *dev_priv)
5830{ 5815{
5831 u32 val;
5832 unsigned int required_vco; 5816 unsigned int required_vco;
5833 5817
5834 /* enable PCH reset handshake */
5835 val = I915_READ(HSW_NDE_RSTWRN_OPT);
5836 I915_WRITE(HSW_NDE_RSTWRN_OPT, val | RESET_PCH_HANDSHAKE_ENABLE);
5837
5838 /* enable PG1 and Misc I/O */
5839 intel_display_power_get(dev_priv, POWER_DOMAIN_PLLS);
5840
5841 /* DPLL0 not enabled (happens on early BIOS versions) */ 5818 /* DPLL0 not enabled (happens on early BIOS versions) */
5842 if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE)) { 5819 if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE)) {
5843 /* enable DPLL0 */ 5820 /* enable DPLL0 */
@@ -5858,6 +5835,45 @@ void skl_init_cdclk(struct drm_i915_private *dev_priv)
5858 DRM_ERROR("DBuf power enable timeout\n"); 5835 DRM_ERROR("DBuf power enable timeout\n");
5859} 5836}
5860 5837
5838int skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
5839{
5840 uint32_t lcpll1 = I915_READ(LCPLL1_CTL);
5841 uint32_t cdctl = I915_READ(CDCLK_CTL);
5842 int freq = dev_priv->skl_boot_cdclk;
5843
5844 /*
5845 * check if the pre-os intialized the display
5846 * There is SWF18 scratchpad register defined which is set by the
5847 * pre-os which can be used by the OS drivers to check the status
5848 */
5849 if ((I915_READ(SWF_ILK(0x18)) & 0x00FFFFFF) == 0)
5850 goto sanitize;
5851
5852 /* Is PLL enabled and locked ? */
5853 if (!((lcpll1 & LCPLL_PLL_ENABLE) && (lcpll1 & LCPLL_PLL_LOCK)))
5854 goto sanitize;
5855
5856 /* DPLL okay; verify the cdclock
5857 *
5858 * Noticed in some instances that the freq selection is correct but
5859 * decimal part is programmed wrong from BIOS where pre-os does not
5860 * enable display. Verify the same as well.
5861 */
5862 if (cdctl == ((cdctl & CDCLK_FREQ_SEL_MASK) | skl_cdclk_decimal(freq)))
5863 /* All well; nothing to sanitize */
5864 return false;
5865sanitize:
5866 /*
5867 * As of now initialize with max cdclk till
5868 * we get dynamic cdclk support
5869 * */
5870 dev_priv->skl_boot_cdclk = dev_priv->max_cdclk_freq;
5871 skl_init_cdclk(dev_priv);
5872
5873 /* we did have to sanitize */
5874 return true;
5875}
5876
5861/* Adjust CDclk dividers to allow high res or save power if possible */ 5877/* Adjust CDclk dividers to allow high res or save power if possible */
5862static void valleyview_set_cdclk(struct drm_device *dev, int cdclk) 5878static void valleyview_set_cdclk(struct drm_device *dev, int cdclk)
5863{ 5879{
@@ -6322,7 +6338,8 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc)
6322 return; 6338 return;
6323 6339
6324 if (to_intel_plane_state(crtc->primary->state)->visible) { 6340 if (to_intel_plane_state(crtc->primary->state)->visible) {
6325 intel_crtc_wait_for_pending_flips(crtc); 6341 WARN_ON(intel_crtc->unpin_work);
6342
6326 intel_pre_disable_primary(crtc); 6343 intel_pre_disable_primary(crtc);
6327 6344
6328 intel_crtc_disable_planes(crtc, 1 << drm_plane_index(crtc->primary)); 6345 intel_crtc_disable_planes(crtc, 1 << drm_plane_index(crtc->primary));
@@ -6642,6 +6659,15 @@ static void hsw_compute_ips_config(struct intel_crtc *crtc,
6642 pipe_config_supports_ips(dev_priv, pipe_config); 6659 pipe_config_supports_ips(dev_priv, pipe_config);
6643} 6660}
6644 6661
6662static bool intel_crtc_supports_double_wide(const struct intel_crtc *crtc)
6663{
6664 const struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
6665
6666 /* GDG double wide on either pipe, otherwise pipe A only */
6667 return INTEL_INFO(dev_priv)->gen < 4 &&
6668 (crtc->pipe == PIPE_A || IS_I915G(dev_priv));
6669}
6670
6645static int intel_crtc_compute_config(struct intel_crtc *crtc, 6671static int intel_crtc_compute_config(struct intel_crtc *crtc,
6646 struct intel_crtc_state *pipe_config) 6672 struct intel_crtc_state *pipe_config)
6647{ 6673{
@@ -6651,23 +6677,24 @@ static int intel_crtc_compute_config(struct intel_crtc *crtc,
6651 6677
6652 /* FIXME should check pixel clock limits on all platforms */ 6678 /* FIXME should check pixel clock limits on all platforms */
6653 if (INTEL_INFO(dev)->gen < 4) { 6679 if (INTEL_INFO(dev)->gen < 4) {
6654 int clock_limit = dev_priv->max_cdclk_freq; 6680 int clock_limit = dev_priv->max_cdclk_freq * 9 / 10;
6655 6681
6656 /* 6682 /*
6657 * Enable pixel doubling when the dot clock 6683 * Enable double wide mode when the dot clock
6658 * is > 90% of the (display) core speed. 6684 * is > 90% of the (display) core speed.
6659 *
6660 * GDG double wide on either pipe,
6661 * otherwise pipe A only.
6662 */ 6685 */
6663 if ((crtc->pipe == PIPE_A || IS_I915G(dev)) && 6686 if (intel_crtc_supports_double_wide(crtc) &&
6664 adjusted_mode->crtc_clock > clock_limit * 9 / 10) { 6687 adjusted_mode->crtc_clock > clock_limit) {
6665 clock_limit *= 2; 6688 clock_limit *= 2;
6666 pipe_config->double_wide = true; 6689 pipe_config->double_wide = true;
6667 } 6690 }
6668 6691
6669 if (adjusted_mode->crtc_clock > clock_limit * 9 / 10) 6692 if (adjusted_mode->crtc_clock > clock_limit) {
6693 DRM_DEBUG_KMS("requested pixel clock (%d kHz) too high (max: %d kHz, double wide: %s)\n",
6694 adjusted_mode->crtc_clock, clock_limit,
6695 yesno(pipe_config->double_wide));
6670 return -EINVAL; 6696 return -EINVAL;
6697 }
6671 } 6698 }
6672 6699
6673 /* 6700 /*
@@ -7432,7 +7459,7 @@ static void chv_prepare_pll(struct intel_crtc *crtc,
7432 struct drm_device *dev = crtc->base.dev; 7459 struct drm_device *dev = crtc->base.dev;
7433 struct drm_i915_private *dev_priv = dev->dev_private; 7460 struct drm_i915_private *dev_priv = dev->dev_private;
7434 int pipe = crtc->pipe; 7461 int pipe = crtc->pipe;
7435 int dpll_reg = DPLL(crtc->pipe); 7462 i915_reg_t dpll_reg = DPLL(crtc->pipe);
7436 enum dpio_channel port = vlv_pipe_to_channel(pipe); 7463 enum dpio_channel port = vlv_pipe_to_channel(pipe);
7437 u32 loopfilter, tribuf_calcntr; 7464 u32 loopfilter, tribuf_calcntr;
7438 u32 bestn, bestm1, bestm2, bestp1, bestp2, bestm2_frac; 7465 u32 bestn, bestm1, bestm2, bestp1, bestp2, bestm2_frac;
@@ -9350,8 +9377,8 @@ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
9350 9377
9351 I915_STATE_WARN(I915_READ(HSW_PWR_WELL_DRIVER), "Power well on\n"); 9378 I915_STATE_WARN(I915_READ(HSW_PWR_WELL_DRIVER), "Power well on\n");
9352 I915_STATE_WARN(I915_READ(SPLL_CTL) & SPLL_PLL_ENABLE, "SPLL enabled\n"); 9379 I915_STATE_WARN(I915_READ(SPLL_CTL) & SPLL_PLL_ENABLE, "SPLL enabled\n");
9353 I915_STATE_WARN(I915_READ(WRPLL_CTL1) & WRPLL_PLL_ENABLE, "WRPLL1 enabled\n"); 9380 I915_STATE_WARN(I915_READ(WRPLL_CTL(0)) & WRPLL_PLL_ENABLE, "WRPLL1 enabled\n");
9354 I915_STATE_WARN(I915_READ(WRPLL_CTL2) & WRPLL_PLL_ENABLE, "WRPLL2 enabled\n"); 9381 I915_STATE_WARN(I915_READ(WRPLL_CTL(1)) & WRPLL_PLL_ENABLE, "WRPLL2 enabled\n");
9355 I915_STATE_WARN(I915_READ(PCH_PP_STATUS) & PP_ON, "Panel power on\n"); 9382 I915_STATE_WARN(I915_READ(PCH_PP_STATUS) & PP_ON, "Panel power on\n");
9356 I915_STATE_WARN(I915_READ(BLC_PWM_CPU_CTL2) & BLM_PWM_ENABLE, 9383 I915_STATE_WARN(I915_READ(BLC_PWM_CPU_CTL2) & BLM_PWM_ENABLE,
9357 "CPU PWM1 enabled\n"); 9384 "CPU PWM1 enabled\n");
@@ -9813,7 +9840,7 @@ static void haswell_get_ddi_port_state(struct intel_crtc *crtc,
9813 9840
9814 port = (tmp & TRANS_DDI_PORT_MASK) >> TRANS_DDI_PORT_SHIFT; 9841 port = (tmp & TRANS_DDI_PORT_MASK) >> TRANS_DDI_PORT_SHIFT;
9815 9842
9816 if (IS_SKYLAKE(dev)) 9843 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
9817 skylake_get_ddi_pll(dev_priv, port, pipe_config); 9844 skylake_get_ddi_pll(dev_priv, port, pipe_config);
9818 else if (IS_BROXTON(dev)) 9845 else if (IS_BROXTON(dev))
9819 bxt_get_ddi_pll(dev_priv, port, pipe_config); 9846 bxt_get_ddi_pll(dev_priv, port, pipe_config);
@@ -10154,20 +10181,17 @@ __intel_framebuffer_create(struct drm_device *dev,
10154 int ret; 10181 int ret;
10155 10182
10156 intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL); 10183 intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
10157 if (!intel_fb) { 10184 if (!intel_fb)
10158 drm_gem_object_unreference(&obj->base);
10159 return ERR_PTR(-ENOMEM); 10185 return ERR_PTR(-ENOMEM);
10160 }
10161 10186
10162 ret = intel_framebuffer_init(dev, intel_fb, mode_cmd, obj); 10187 ret = intel_framebuffer_init(dev, intel_fb, mode_cmd, obj);
10163 if (ret) 10188 if (ret)
10164 goto err; 10189 goto err;
10165 10190
10166 return &intel_fb->base; 10191 return &intel_fb->base;
10192
10167err: 10193err:
10168 drm_gem_object_unreference(&obj->base);
10169 kfree(intel_fb); 10194 kfree(intel_fb);
10170
10171 return ERR_PTR(ret); 10195 return ERR_PTR(ret);
10172} 10196}
10173 10197
@@ -10207,6 +10231,7 @@ intel_framebuffer_create_for_mode(struct drm_device *dev,
10207 struct drm_display_mode *mode, 10231 struct drm_display_mode *mode,
10208 int depth, int bpp) 10232 int depth, int bpp)
10209{ 10233{
10234 struct drm_framebuffer *fb;
10210 struct drm_i915_gem_object *obj; 10235 struct drm_i915_gem_object *obj;
10211 struct drm_mode_fb_cmd2 mode_cmd = { 0 }; 10236 struct drm_mode_fb_cmd2 mode_cmd = { 0 };
10212 10237
@@ -10221,7 +10246,11 @@ intel_framebuffer_create_for_mode(struct drm_device *dev,
10221 bpp); 10246 bpp);
10222 mode_cmd.pixel_format = drm_mode_legacy_fb_format(bpp, depth); 10247 mode_cmd.pixel_format = drm_mode_legacy_fb_format(bpp, depth);
10223 10248
10224 return intel_framebuffer_create(dev, &mode_cmd, obj); 10249 fb = intel_framebuffer_create(dev, &mode_cmd, obj);
10250 if (IS_ERR(fb))
10251 drm_gem_object_unreference_unlocked(&obj->base);
10252
10253 return fb;
10225} 10254}
10226 10255
10227static struct drm_framebuffer * 10256static struct drm_framebuffer *
@@ -11124,7 +11153,7 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
11124 */ 11153 */
11125 if (ring->id == RCS) { 11154 if (ring->id == RCS) {
11126 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); 11155 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
11127 intel_ring_emit(ring, DERRMR); 11156 intel_ring_emit_reg(ring, DERRMR);
11128 intel_ring_emit(ring, ~(DERRMR_PIPEA_PRI_FLIP_DONE | 11157 intel_ring_emit(ring, ~(DERRMR_PIPEA_PRI_FLIP_DONE |
11129 DERRMR_PIPEB_PRI_FLIP_DONE | 11158 DERRMR_PIPEB_PRI_FLIP_DONE |
11130 DERRMR_PIPEC_PRI_FLIP_DONE)); 11159 DERRMR_PIPEC_PRI_FLIP_DONE));
@@ -11134,7 +11163,7 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
11134 else 11163 else
11135 intel_ring_emit(ring, MI_STORE_REGISTER_MEM | 11164 intel_ring_emit(ring, MI_STORE_REGISTER_MEM |
11136 MI_SRM_LRM_GLOBAL_GTT); 11165 MI_SRM_LRM_GLOBAL_GTT);
11137 intel_ring_emit(ring, DERRMR); 11166 intel_ring_emit_reg(ring, DERRMR);
11138 intel_ring_emit(ring, ring->scratch.gtt_offset + 256); 11167 intel_ring_emit(ring, ring->scratch.gtt_offset + 256);
11139 if (IS_GEN8(dev)) { 11168 if (IS_GEN8(dev)) {
11140 intel_ring_emit(ring, 0); 11169 intel_ring_emit(ring, 0);
@@ -11179,13 +11208,14 @@ static bool use_mmio_flip(struct intel_engine_cs *ring,
11179} 11208}
11180 11209
11181static void skl_do_mmio_flip(struct intel_crtc *intel_crtc, 11210static void skl_do_mmio_flip(struct intel_crtc *intel_crtc,
11211 unsigned int rotation,
11182 struct intel_unpin_work *work) 11212 struct intel_unpin_work *work)
11183{ 11213{
11184 struct drm_device *dev = intel_crtc->base.dev; 11214 struct drm_device *dev = intel_crtc->base.dev;
11185 struct drm_i915_private *dev_priv = dev->dev_private; 11215 struct drm_i915_private *dev_priv = dev->dev_private;
11186 struct drm_framebuffer *fb = intel_crtc->base.primary->fb; 11216 struct drm_framebuffer *fb = intel_crtc->base.primary->fb;
11187 const enum pipe pipe = intel_crtc->pipe; 11217 const enum pipe pipe = intel_crtc->pipe;
11188 u32 ctl, stride; 11218 u32 ctl, stride, tile_height;
11189 11219
11190 ctl = I915_READ(PLANE_CTL(pipe, 0)); 11220 ctl = I915_READ(PLANE_CTL(pipe, 0));
11191 ctl &= ~PLANE_CTL_TILED_MASK; 11221 ctl &= ~PLANE_CTL_TILED_MASK;
@@ -11209,9 +11239,16 @@ static void skl_do_mmio_flip(struct intel_crtc *intel_crtc,
11209 * The stride is either expressed as a multiple of 64 bytes chunks for 11239 * The stride is either expressed as a multiple of 64 bytes chunks for
11210 * linear buffers or in number of tiles for tiled buffers. 11240 * linear buffers or in number of tiles for tiled buffers.
11211 */ 11241 */
11212 stride = fb->pitches[0] / 11242 if (intel_rotation_90_or_270(rotation)) {
11213 intel_fb_stride_alignment(dev, fb->modifier[0], 11243 /* stride = Surface height in tiles */
11214 fb->pixel_format); 11244 tile_height = intel_tile_height(dev, fb->pixel_format,
11245 fb->modifier[0], 0);
11246 stride = DIV_ROUND_UP(fb->height, tile_height);
11247 } else {
11248 stride = fb->pitches[0] /
11249 intel_fb_stride_alignment(dev, fb->modifier[0],
11250 fb->pixel_format);
11251 }
11215 11252
11216 /* 11253 /*
11217 * Both PLANE_CTL and PLANE_STRIDE are not updated on vblank but on 11254 * Both PLANE_CTL and PLANE_STRIDE are not updated on vblank but on
@@ -11232,10 +11269,9 @@ static void ilk_do_mmio_flip(struct intel_crtc *intel_crtc,
11232 struct intel_framebuffer *intel_fb = 11269 struct intel_framebuffer *intel_fb =
11233 to_intel_framebuffer(intel_crtc->base.primary->fb); 11270 to_intel_framebuffer(intel_crtc->base.primary->fb);
11234 struct drm_i915_gem_object *obj = intel_fb->obj; 11271 struct drm_i915_gem_object *obj = intel_fb->obj;
11272 i915_reg_t reg = DSPCNTR(intel_crtc->plane);
11235 u32 dspcntr; 11273 u32 dspcntr;
11236 u32 reg;
11237 11274
11238 reg = DSPCNTR(intel_crtc->plane);
11239 dspcntr = I915_READ(reg); 11275 dspcntr = I915_READ(reg);
11240 11276
11241 if (obj->tiling_mode != I915_TILING_NONE) 11277 if (obj->tiling_mode != I915_TILING_NONE)
@@ -11269,7 +11305,7 @@ static void intel_do_mmio_flip(struct intel_mmio_flip *mmio_flip)
11269 intel_pipe_update_start(crtc); 11305 intel_pipe_update_start(crtc);
11270 11306
11271 if (INTEL_INFO(mmio_flip->i915)->gen >= 9) 11307 if (INTEL_INFO(mmio_flip->i915)->gen >= 9)
11272 skl_do_mmio_flip(crtc, work); 11308 skl_do_mmio_flip(crtc, mmio_flip->rotation, work);
11273 else 11309 else
11274 /* use_mmio_flip() retricts MMIO flips to ilk+ */ 11310 /* use_mmio_flip() retricts MMIO flips to ilk+ */
11275 ilk_do_mmio_flip(crtc, work); 11311 ilk_do_mmio_flip(crtc, work);
@@ -11296,10 +11332,7 @@ static void intel_mmio_flip_work_func(struct work_struct *work)
11296 11332
11297static int intel_queue_mmio_flip(struct drm_device *dev, 11333static int intel_queue_mmio_flip(struct drm_device *dev,
11298 struct drm_crtc *crtc, 11334 struct drm_crtc *crtc,
11299 struct drm_framebuffer *fb, 11335 struct drm_i915_gem_object *obj)
11300 struct drm_i915_gem_object *obj,
11301 struct intel_engine_cs *ring,
11302 uint32_t flags)
11303{ 11336{
11304 struct intel_mmio_flip *mmio_flip; 11337 struct intel_mmio_flip *mmio_flip;
11305 11338
@@ -11310,6 +11343,7 @@ static int intel_queue_mmio_flip(struct drm_device *dev,
11310 mmio_flip->i915 = to_i915(dev); 11343 mmio_flip->i915 = to_i915(dev);
11311 mmio_flip->req = i915_gem_request_reference(obj->last_write_req); 11344 mmio_flip->req = i915_gem_request_reference(obj->last_write_req);
11312 mmio_flip->crtc = to_intel_crtc(crtc); 11345 mmio_flip->crtc = to_intel_crtc(crtc);
11346 mmio_flip->rotation = crtc->primary->state->rotation;
11313 11347
11314 INIT_WORK(&mmio_flip->work, intel_mmio_flip_work_func); 11348 INIT_WORK(&mmio_flip->work, intel_mmio_flip_work_func);
11315 schedule_work(&mmio_flip->work); 11349 schedule_work(&mmio_flip->work);
@@ -11515,9 +11549,14 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
11515 * synchronisation, so all we want here is to pin the framebuffer 11549 * synchronisation, so all we want here is to pin the framebuffer
11516 * into the display plane and skip any waits. 11550 * into the display plane and skip any waits.
11517 */ 11551 */
11552 if (!mmio_flip) {
11553 ret = i915_gem_object_sync(obj, ring, &request);
11554 if (ret)
11555 goto cleanup_pending;
11556 }
11557
11518 ret = intel_pin_and_fence_fb_obj(crtc->primary, fb, 11558 ret = intel_pin_and_fence_fb_obj(crtc->primary, fb,
11519 crtc->primary->state, 11559 crtc->primary->state);
11520 mmio_flip ? i915_gem_request_get_ring(obj->last_write_req) : ring, &request);
11521 if (ret) 11560 if (ret)
11522 goto cleanup_pending; 11561 goto cleanup_pending;
11523 11562
@@ -11526,8 +11565,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
11526 work->gtt_offset += intel_crtc->dspaddr_offset; 11565 work->gtt_offset += intel_crtc->dspaddr_offset;
11527 11566
11528 if (mmio_flip) { 11567 if (mmio_flip) {
11529 ret = intel_queue_mmio_flip(dev, crtc, fb, obj, ring, 11568 ret = intel_queue_mmio_flip(dev, crtc, obj);
11530 page_flip_flags);
11531 if (ret) 11569 if (ret)
11532 goto cleanup_unpin; 11570 goto cleanup_unpin;
11533 11571
@@ -11641,18 +11679,32 @@ retry:
11641static bool intel_wm_need_update(struct drm_plane *plane, 11679static bool intel_wm_need_update(struct drm_plane *plane,
11642 struct drm_plane_state *state) 11680 struct drm_plane_state *state)
11643{ 11681{
11644 /* Update watermarks on tiling changes. */ 11682 struct intel_plane_state *new = to_intel_plane_state(state);
11683 struct intel_plane_state *cur = to_intel_plane_state(plane->state);
11684
11685 /* Update watermarks on tiling or size changes. */
11645 if (!plane->state->fb || !state->fb || 11686 if (!plane->state->fb || !state->fb ||
11646 plane->state->fb->modifier[0] != state->fb->modifier[0] || 11687 plane->state->fb->modifier[0] != state->fb->modifier[0] ||
11647 plane->state->rotation != state->rotation) 11688 plane->state->rotation != state->rotation ||
11648 return true; 11689 drm_rect_width(&new->src) != drm_rect_width(&cur->src) ||
11649 11690 drm_rect_height(&new->src) != drm_rect_height(&cur->src) ||
11650 if (plane->state->crtc_w != state->crtc_w) 11691 drm_rect_width(&new->dst) != drm_rect_width(&cur->dst) ||
11692 drm_rect_height(&new->dst) != drm_rect_height(&cur->dst))
11651 return true; 11693 return true;
11652 11694
11653 return false; 11695 return false;
11654} 11696}
11655 11697
11698static bool needs_scaling(struct intel_plane_state *state)
11699{
11700 int src_w = drm_rect_width(&state->src) >> 16;
11701 int src_h = drm_rect_height(&state->src) >> 16;
11702 int dst_w = drm_rect_width(&state->dst);
11703 int dst_h = drm_rect_height(&state->dst);
11704
11705 return (src_w != dst_w || src_h != dst_h);
11706}
11707
11656int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state, 11708int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state,
11657 struct drm_plane_state *plane_state) 11709 struct drm_plane_state *plane_state)
11658{ 11710{
@@ -11668,7 +11720,6 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state,
11668 bool mode_changed = needs_modeset(crtc_state); 11720 bool mode_changed = needs_modeset(crtc_state);
11669 bool was_crtc_enabled = crtc->state->active; 11721 bool was_crtc_enabled = crtc->state->active;
11670 bool is_crtc_enabled = crtc_state->active; 11722 bool is_crtc_enabled = crtc_state->active;
11671
11672 bool turn_off, turn_on, visible, was_visible; 11723 bool turn_off, turn_on, visible, was_visible;
11673 struct drm_framebuffer *fb = plane_state->fb; 11724 struct drm_framebuffer *fb = plane_state->fb;
11674 11725
@@ -11681,14 +11732,6 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state,
11681 return ret; 11732 return ret;
11682 } 11733 }
11683 11734
11684 /*
11685 * Disabling a plane is always okay; we just need to update
11686 * fb tracking in a special way since cleanup_fb() won't
11687 * get called by the plane helpers.
11688 */
11689 if (old_plane_state->base.fb && !fb)
11690 intel_crtc->atomic.disabled_planes |= 1 << i;
11691
11692 was_visible = old_plane_state->visible; 11735 was_visible = old_plane_state->visible;
11693 visible = to_intel_plane_state(plane_state)->visible; 11736 visible = to_intel_plane_state(plane_state)->visible;
11694 11737
@@ -11738,7 +11781,6 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state,
11738 11781
11739 switch (plane->type) { 11782 switch (plane->type) {
11740 case DRM_PLANE_TYPE_PRIMARY: 11783 case DRM_PLANE_TYPE_PRIMARY:
11741 intel_crtc->atomic.wait_for_flips = true;
11742 intel_crtc->atomic.pre_disable_primary = turn_off; 11784 intel_crtc->atomic.pre_disable_primary = turn_off;
11743 intel_crtc->atomic.post_enable_primary = turn_on; 11785 intel_crtc->atomic.post_enable_primary = turn_on;
11744 11786
@@ -11786,11 +11828,23 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state,
11786 case DRM_PLANE_TYPE_CURSOR: 11828 case DRM_PLANE_TYPE_CURSOR:
11787 break; 11829 break;
11788 case DRM_PLANE_TYPE_OVERLAY: 11830 case DRM_PLANE_TYPE_OVERLAY:
11789 if (turn_off && !mode_changed) { 11831 /*
11832 * WaCxSRDisabledForSpriteScaling:ivb
11833 *
11834 * cstate->update_wm was already set above, so this flag will
11835 * take effect when we commit and program watermarks.
11836 */
11837 if (IS_IVYBRIDGE(dev) &&
11838 needs_scaling(to_intel_plane_state(plane_state)) &&
11839 !needs_scaling(old_plane_state)) {
11840 to_intel_crtc_state(crtc_state)->disable_lp_wm = true;
11841 } else if (turn_off && !mode_changed) {
11790 intel_crtc->atomic.wait_vblank = true; 11842 intel_crtc->atomic.wait_vblank = true;
11791 intel_crtc->atomic.update_sprite_watermarks |= 11843 intel_crtc->atomic.update_sprite_watermarks |=
11792 1 << i; 11844 1 << i;
11793 } 11845 }
11846
11847 break;
11794 } 11848 }
11795 return 0; 11849 return 0;
11796} 11850}
@@ -11875,6 +11929,12 @@ static int intel_crtc_atomic_check(struct drm_crtc *crtc,
11875 } 11929 }
11876 11930
11877 ret = 0; 11931 ret = 0;
11932 if (dev_priv->display.compute_pipe_wm) {
11933 ret = dev_priv->display.compute_pipe_wm(intel_crtc, state);
11934 if (ret)
11935 return ret;
11936 }
11937
11878 if (INTEL_INFO(dev)->gen >= 9) { 11938 if (INTEL_INFO(dev)->gen >= 9) {
11879 if (mode_changed) 11939 if (mode_changed)
11880 ret = skl_update_scaler_crtc(pipe_config); 11940 ret = skl_update_scaler_crtc(pipe_config);
@@ -12064,7 +12124,7 @@ static void intel_dump_pipe_config(struct intel_crtc *crtc,
12064 pipe_config->dpll_hw_state.pll9, 12124 pipe_config->dpll_hw_state.pll9,
12065 pipe_config->dpll_hw_state.pll10, 12125 pipe_config->dpll_hw_state.pll10,
12066 pipe_config->dpll_hw_state.pcsdw12); 12126 pipe_config->dpll_hw_state.pcsdw12);
12067 } else if (IS_SKYLAKE(dev)) { 12127 } else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
12068 DRM_DEBUG_KMS("ddi_pll_sel: %u; dpll_hw_state: " 12128 DRM_DEBUG_KMS("ddi_pll_sel: %u; dpll_hw_state: "
12069 "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n", 12129 "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n",
12070 pipe_config->ddi_pll_sel, 12130 pipe_config->ddi_pll_sel,
@@ -12322,6 +12382,18 @@ intel_modeset_update_crtc_state(struct drm_atomic_state *state)
12322 crtc->hwmode = crtc->state->adjusted_mode; 12382 crtc->hwmode = crtc->state->adjusted_mode;
12323 else 12383 else
12324 crtc->hwmode.crtc_clock = 0; 12384 crtc->hwmode.crtc_clock = 0;
12385
12386 /*
12387 * Update legacy state to satisfy fbc code. This can
12388 * be removed when fbc uses the atomic state.
12389 */
12390 if (drm_atomic_get_existing_plane_state(state, crtc->primary)) {
12391 struct drm_plane_state *plane_state = crtc->primary->state;
12392
12393 crtc->primary->fb = plane_state->fb;
12394 crtc->x = plane_state->src_x >> 16;
12395 crtc->y = plane_state->src_y >> 16;
12396 }
12325 } 12397 }
12326} 12398}
12327 12399
@@ -12347,7 +12419,7 @@ static bool intel_fuzzy_clock_check(int clock1, int clock2)
12347 list_for_each_entry((intel_crtc), \ 12419 list_for_each_entry((intel_crtc), \
12348 &(dev)->mode_config.crtc_list, \ 12420 &(dev)->mode_config.crtc_list, \
12349 base.head) \ 12421 base.head) \
12350 if (mask & (1 <<(intel_crtc)->pipe)) 12422 for_each_if (mask & (1 <<(intel_crtc)->pipe))
12351 12423
12352static bool 12424static bool
12353intel_compare_m_n(unsigned int m, unsigned int n, 12425intel_compare_m_n(unsigned int m, unsigned int n,
@@ -13085,6 +13157,45 @@ static int intel_modeset_checks(struct drm_atomic_state *state)
13085 return 0; 13157 return 0;
13086} 13158}
13087 13159
13160/*
13161 * Handle calculation of various watermark data at the end of the atomic check
13162 * phase. The code here should be run after the per-crtc and per-plane 'check'
13163 * handlers to ensure that all derived state has been updated.
13164 */
13165static void calc_watermark_data(struct drm_atomic_state *state)
13166{
13167 struct drm_device *dev = state->dev;
13168 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
13169 struct drm_crtc *crtc;
13170 struct drm_crtc_state *cstate;
13171 struct drm_plane *plane;
13172 struct drm_plane_state *pstate;
13173
13174 /*
13175 * Calculate watermark configuration details now that derived
13176 * plane/crtc state is all properly updated.
13177 */
13178 drm_for_each_crtc(crtc, dev) {
13179 cstate = drm_atomic_get_existing_crtc_state(state, crtc) ?:
13180 crtc->state;
13181
13182 if (cstate->active)
13183 intel_state->wm_config.num_pipes_active++;
13184 }
13185 drm_for_each_legacy_plane(plane, dev) {
13186 pstate = drm_atomic_get_existing_plane_state(state, plane) ?:
13187 plane->state;
13188
13189 if (!to_intel_plane_state(pstate)->visible)
13190 continue;
13191
13192 intel_state->wm_config.sprites_enabled = true;
13193 if (pstate->crtc_w != pstate->src_w >> 16 ||
13194 pstate->crtc_h != pstate->src_h >> 16)
13195 intel_state->wm_config.sprites_scaled = true;
13196 }
13197}
13198
13088/** 13199/**
13089 * intel_atomic_check - validate state object 13200 * intel_atomic_check - validate state object
13090 * @dev: drm device 13201 * @dev: drm device
@@ -13093,6 +13204,7 @@ static int intel_modeset_checks(struct drm_atomic_state *state)
13093static int intel_atomic_check(struct drm_device *dev, 13204static int intel_atomic_check(struct drm_device *dev,
13094 struct drm_atomic_state *state) 13205 struct drm_atomic_state *state)
13095{ 13206{
13207 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
13096 struct drm_crtc *crtc; 13208 struct drm_crtc *crtc;
13097 struct drm_crtc_state *crtc_state; 13209 struct drm_crtc_state *crtc_state;
13098 int ret, i; 13210 int ret, i;
@@ -13160,10 +13272,81 @@ static int intel_atomic_check(struct drm_device *dev,
13160 if (ret) 13272 if (ret)
13161 return ret; 13273 return ret;
13162 } else 13274 } else
13163 to_intel_atomic_state(state)->cdclk = 13275 intel_state->cdclk = to_i915(state->dev)->cdclk_freq;
13164 to_i915(state->dev)->cdclk_freq;
13165 13276
13166 return drm_atomic_helper_check_planes(state->dev, state); 13277 ret = drm_atomic_helper_check_planes(state->dev, state);
13278 if (ret)
13279 return ret;
13280
13281 calc_watermark_data(state);
13282
13283 return 0;
13284}
13285
13286static int intel_atomic_prepare_commit(struct drm_device *dev,
13287 struct drm_atomic_state *state,
13288 bool async)
13289{
13290 struct drm_i915_private *dev_priv = dev->dev_private;
13291 struct drm_plane_state *plane_state;
13292 struct drm_crtc_state *crtc_state;
13293 struct drm_plane *plane;
13294 struct drm_crtc *crtc;
13295 int i, ret;
13296
13297 if (async) {
13298 DRM_DEBUG_KMS("i915 does not yet support async commit\n");
13299 return -EINVAL;
13300 }
13301
13302 for_each_crtc_in_state(state, crtc, crtc_state, i) {
13303 ret = intel_crtc_wait_for_pending_flips(crtc);
13304 if (ret)
13305 return ret;
13306
13307 if (atomic_read(&to_intel_crtc(crtc)->unpin_work_count) >= 2)
13308 flush_workqueue(dev_priv->wq);
13309 }
13310
13311 ret = mutex_lock_interruptible(&dev->struct_mutex);
13312 if (ret)
13313 return ret;
13314
13315 ret = drm_atomic_helper_prepare_planes(dev, state);
13316 if (!ret && !async && !i915_reset_in_progress(&dev_priv->gpu_error)) {
13317 u32 reset_counter;
13318
13319 reset_counter = atomic_read(&dev_priv->gpu_error.reset_counter);
13320 mutex_unlock(&dev->struct_mutex);
13321
13322 for_each_plane_in_state(state, plane, plane_state, i) {
13323 struct intel_plane_state *intel_plane_state =
13324 to_intel_plane_state(plane_state);
13325
13326 if (!intel_plane_state->wait_req)
13327 continue;
13328
13329 ret = __i915_wait_request(intel_plane_state->wait_req,
13330 reset_counter, true,
13331 NULL, NULL);
13332
13333 /* Swallow -EIO errors to allow updates during hw lockup. */
13334 if (ret == -EIO)
13335 ret = 0;
13336
13337 if (ret)
13338 break;
13339 }
13340
13341 if (!ret)
13342 return 0;
13343
13344 mutex_lock(&dev->struct_mutex);
13345 drm_atomic_helper_cleanup_planes(dev, state);
13346 }
13347
13348 mutex_unlock(&dev->struct_mutex);
13349 return ret;
13167} 13350}
13168 13351
13169/** 13352/**
@@ -13187,22 +13370,20 @@ static int intel_atomic_commit(struct drm_device *dev,
13187 bool async) 13370 bool async)
13188{ 13371{
13189 struct drm_i915_private *dev_priv = dev->dev_private; 13372 struct drm_i915_private *dev_priv = dev->dev_private;
13190 struct drm_crtc *crtc;
13191 struct drm_crtc_state *crtc_state; 13373 struct drm_crtc_state *crtc_state;
13374 struct drm_crtc *crtc;
13192 int ret = 0; 13375 int ret = 0;
13193 int i; 13376 int i;
13194 bool any_ms = false; 13377 bool any_ms = false;
13195 13378
13196 if (async) { 13379 ret = intel_atomic_prepare_commit(dev, state, async);
13197 DRM_DEBUG_KMS("i915 does not yet support async commit\n"); 13380 if (ret) {
13198 return -EINVAL; 13381 DRM_DEBUG_ATOMIC("Preparing state failed with %i\n", ret);
13199 }
13200
13201 ret = drm_atomic_helper_prepare_planes(dev, state);
13202 if (ret)
13203 return ret; 13382 return ret;
13383 }
13204 13384
13205 drm_atomic_helper_swap_state(dev, state); 13385 drm_atomic_helper_swap_state(dev, state);
13386 dev_priv->wm.config = to_intel_atomic_state(state)->wm_config;
13206 13387
13207 for_each_crtc_in_state(state, crtc, crtc_state, i) { 13388 for_each_crtc_in_state(state, crtc, crtc_state, i) {
13208 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 13389 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
@@ -13240,6 +13421,9 @@ static int intel_atomic_commit(struct drm_device *dev,
13240 to_intel_crtc_state(crtc->state)->update_pipe; 13421 to_intel_crtc_state(crtc->state)->update_pipe;
13241 unsigned long put_domains = 0; 13422 unsigned long put_domains = 0;
13242 13423
13424 if (modeset)
13425 intel_display_power_get(dev_priv, POWER_DOMAIN_MODESET);
13426
13243 if (modeset && crtc->state->active) { 13427 if (modeset && crtc->state->active) {
13244 update_scanline_offset(to_intel_crtc(crtc)); 13428 update_scanline_offset(to_intel_crtc(crtc));
13245 dev_priv->display.crtc_enable(crtc); 13429 dev_priv->display.crtc_enable(crtc);
@@ -13255,18 +13439,26 @@ static int intel_atomic_commit(struct drm_device *dev,
13255 if (!modeset) 13439 if (!modeset)
13256 intel_pre_plane_update(intel_crtc); 13440 intel_pre_plane_update(intel_crtc);
13257 13441
13258 drm_atomic_helper_commit_planes_on_crtc(crtc_state); 13442 if (crtc->state->active &&
13443 (crtc->state->planes_changed || update_pipe))
13444 drm_atomic_helper_commit_planes_on_crtc(crtc_state);
13259 13445
13260 if (put_domains) 13446 if (put_domains)
13261 modeset_put_power_domains(dev_priv, put_domains); 13447 modeset_put_power_domains(dev_priv, put_domains);
13262 13448
13263 intel_post_plane_update(intel_crtc); 13449 intel_post_plane_update(intel_crtc);
13450
13451 if (modeset)
13452 intel_display_power_put(dev_priv, POWER_DOMAIN_MODESET);
13264 } 13453 }
13265 13454
13266 /* FIXME: add subpixel order */ 13455 /* FIXME: add subpixel order */
13267 13456
13268 drm_atomic_helper_wait_for_vblanks(dev, state); 13457 drm_atomic_helper_wait_for_vblanks(dev, state);
13458
13459 mutex_lock(&dev->struct_mutex);
13269 drm_atomic_helper_cleanup_planes(dev, state); 13460 drm_atomic_helper_cleanup_planes(dev, state);
13461 mutex_unlock(&dev->struct_mutex);
13270 13462
13271 if (any_ms) 13463 if (any_ms)
13272 intel_modeset_check_state(dev, state); 13464 intel_modeset_check_state(dev, state);
@@ -13435,6 +13627,8 @@ static void intel_shared_dpll_init(struct drm_device *dev)
13435 * bits. Some older platforms need special physical address handling for 13627 * bits. Some older platforms need special physical address handling for
13436 * cursor planes. 13628 * cursor planes.
13437 * 13629 *
13630 * Must be called with struct_mutex held.
13631 *
13438 * Returns 0 on success, negative error code on failure. 13632 * Returns 0 on success, negative error code on failure.
13439 */ 13633 */
13440int 13634int
@@ -13445,28 +13639,58 @@ intel_prepare_plane_fb(struct drm_plane *plane,
13445 struct drm_framebuffer *fb = new_state->fb; 13639 struct drm_framebuffer *fb = new_state->fb;
13446 struct intel_plane *intel_plane = to_intel_plane(plane); 13640 struct intel_plane *intel_plane = to_intel_plane(plane);
13447 struct drm_i915_gem_object *obj = intel_fb_obj(fb); 13641 struct drm_i915_gem_object *obj = intel_fb_obj(fb);
13448 struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->fb); 13642 struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->state->fb);
13449 int ret = 0; 13643 int ret = 0;
13450 13644
13451 if (!obj) 13645 if (!obj && !old_obj)
13452 return 0; 13646 return 0;
13453 13647
13454 mutex_lock(&dev->struct_mutex); 13648 if (old_obj) {
13649 struct drm_crtc_state *crtc_state =
13650 drm_atomic_get_existing_crtc_state(new_state->state, plane->state->crtc);
13651
13652 /* Big Hammer, we also need to ensure that any pending
13653 * MI_WAIT_FOR_EVENT inside a user batch buffer on the
13654 * current scanout is retired before unpinning the old
13655 * framebuffer. Note that we rely on userspace rendering
13656 * into the buffer attached to the pipe they are waiting
13657 * on. If not, userspace generates a GPU hang with IPEHR
13658 * point to the MI_WAIT_FOR_EVENT.
13659 *
13660 * This should only fail upon a hung GPU, in which case we
13661 * can safely continue.
13662 */
13663 if (needs_modeset(crtc_state))
13664 ret = i915_gem_object_wait_rendering(old_obj, true);
13665
13666 /* Swallow -EIO errors to allow updates during hw lockup. */
13667 if (ret && ret != -EIO)
13668 return ret;
13669 }
13455 13670
13456 if (plane->type == DRM_PLANE_TYPE_CURSOR && 13671 if (!obj) {
13672 ret = 0;
13673 } else if (plane->type == DRM_PLANE_TYPE_CURSOR &&
13457 INTEL_INFO(dev)->cursor_needs_physical) { 13674 INTEL_INFO(dev)->cursor_needs_physical) {
13458 int align = IS_I830(dev) ? 16 * 1024 : 256; 13675 int align = IS_I830(dev) ? 16 * 1024 : 256;
13459 ret = i915_gem_object_attach_phys(obj, align); 13676 ret = i915_gem_object_attach_phys(obj, align);
13460 if (ret) 13677 if (ret)
13461 DRM_DEBUG_KMS("failed to attach phys object\n"); 13678 DRM_DEBUG_KMS("failed to attach phys object\n");
13462 } else { 13679 } else {
13463 ret = intel_pin_and_fence_fb_obj(plane, fb, new_state, NULL, NULL); 13680 ret = intel_pin_and_fence_fb_obj(plane, fb, new_state);
13464 } 13681 }
13465 13682
13466 if (ret == 0) 13683 if (ret == 0) {
13467 i915_gem_track_fb(old_obj, obj, intel_plane->frontbuffer_bit); 13684 if (obj) {
13685 struct intel_plane_state *plane_state =
13686 to_intel_plane_state(new_state);
13468 13687
13469 mutex_unlock(&dev->struct_mutex); 13688 i915_gem_request_assign(&plane_state->wait_req,
13689 obj->last_write_req);
13690 }
13691
13692 i915_gem_track_fb(old_obj, obj, intel_plane->frontbuffer_bit);
13693 }
13470 13694
13471 return ret; 13695 return ret;
13472} 13696}
@@ -13477,23 +13701,35 @@ intel_prepare_plane_fb(struct drm_plane *plane,
13477 * @fb: old framebuffer that was on plane 13701 * @fb: old framebuffer that was on plane
13478 * 13702 *
13479 * Cleans up a framebuffer that has just been removed from a plane. 13703 * Cleans up a framebuffer that has just been removed from a plane.
13704 *
13705 * Must be called with struct_mutex held.
13480 */ 13706 */
13481void 13707void
13482intel_cleanup_plane_fb(struct drm_plane *plane, 13708intel_cleanup_plane_fb(struct drm_plane *plane,
13483 const struct drm_plane_state *old_state) 13709 const struct drm_plane_state *old_state)
13484{ 13710{
13485 struct drm_device *dev = plane->dev; 13711 struct drm_device *dev = plane->dev;
13486 struct drm_i915_gem_object *obj = intel_fb_obj(old_state->fb); 13712 struct intel_plane *intel_plane = to_intel_plane(plane);
13713 struct intel_plane_state *old_intel_state;
13714 struct drm_i915_gem_object *old_obj = intel_fb_obj(old_state->fb);
13715 struct drm_i915_gem_object *obj = intel_fb_obj(plane->state->fb);
13487 13716
13488 if (!obj) 13717 old_intel_state = to_intel_plane_state(old_state);
13718
13719 if (!obj && !old_obj)
13489 return; 13720 return;
13490 13721
13491 if (plane->type != DRM_PLANE_TYPE_CURSOR || 13722 if (old_obj && (plane->type != DRM_PLANE_TYPE_CURSOR ||
13492 !INTEL_INFO(dev)->cursor_needs_physical) { 13723 !INTEL_INFO(dev)->cursor_needs_physical))
13493 mutex_lock(&dev->struct_mutex);
13494 intel_unpin_fb_obj(old_state->fb, old_state); 13724 intel_unpin_fb_obj(old_state->fb, old_state);
13495 mutex_unlock(&dev->struct_mutex); 13725
13496 } 13726 /* prepare_fb aborted? */
13727 if ((old_obj && (old_obj->frontbuffer_bits & intel_plane->frontbuffer_bit)) ||
13728 (obj && !(obj->frontbuffer_bits & intel_plane->frontbuffer_bit)))
13729 i915_gem_track_fb(old_obj, obj, intel_plane->frontbuffer_bit);
13730
13731 i915_gem_request_assign(&old_intel_state->wait_req, NULL);
13732
13497} 13733}
13498 13734
13499int 13735int
@@ -13512,7 +13748,7 @@ skl_max_scale(struct intel_crtc *intel_crtc, struct intel_crtc_state *crtc_state
13512 crtc_clock = crtc_state->base.adjusted_mode.crtc_clock; 13748 crtc_clock = crtc_state->base.adjusted_mode.crtc_clock;
13513 cdclk = to_intel_atomic_state(crtc_state->base.state)->cdclk; 13749 cdclk = to_intel_atomic_state(crtc_state->base.state)->cdclk;
13514 13750
13515 if (!crtc_clock || !cdclk) 13751 if (WARN_ON_ONCE(!crtc_clock || cdclk < crtc_clock))
13516 return DRM_PLANE_HELPER_NO_SCALING; 13752 return DRM_PLANE_HELPER_NO_SCALING;
13517 13753
13518 /* 13754 /*
@@ -13560,18 +13796,8 @@ intel_commit_primary_plane(struct drm_plane *plane,
13560 struct drm_framebuffer *fb = state->base.fb; 13796 struct drm_framebuffer *fb = state->base.fb;
13561 struct drm_device *dev = plane->dev; 13797 struct drm_device *dev = plane->dev;
13562 struct drm_i915_private *dev_priv = dev->dev_private; 13798 struct drm_i915_private *dev_priv = dev->dev_private;
13563 struct intel_crtc *intel_crtc;
13564 struct drm_rect *src = &state->src;
13565 13799
13566 crtc = crtc ? crtc : plane->crtc; 13800 crtc = crtc ? crtc : plane->crtc;
13567 intel_crtc = to_intel_crtc(crtc);
13568
13569 plane->fb = fb;
13570 crtc->x = src->x1 >> 16;
13571 crtc->y = src->y1 >> 16;
13572
13573 if (!crtc->state->active)
13574 return;
13575 13801
13576 dev_priv->display.update_primary_plane(crtc, fb, 13802 dev_priv->display.update_primary_plane(crtc, fb,
13577 state->src.x1 >> 16, 13803 state->src.x1 >> 16,
@@ -13601,8 +13827,7 @@ static void intel_begin_crtc_commit(struct drm_crtc *crtc,
13601 intel_update_watermarks(crtc); 13827 intel_update_watermarks(crtc);
13602 13828
13603 /* Perform vblank evasion around commit operation */ 13829 /* Perform vblank evasion around commit operation */
13604 if (crtc->state->active) 13830 intel_pipe_update_start(intel_crtc);
13605 intel_pipe_update_start(intel_crtc);
13606 13831
13607 if (modeset) 13832 if (modeset)
13608 return; 13833 return;
@@ -13618,8 +13843,7 @@ static void intel_finish_crtc_commit(struct drm_crtc *crtc,
13618{ 13843{
13619 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 13844 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
13620 13845
13621 if (crtc->state->active) 13846 intel_pipe_update_end(intel_crtc);
13622 intel_pipe_update_end(intel_crtc);
13623} 13847}
13624 13848
13625/** 13849/**
@@ -14087,7 +14311,7 @@ static void intel_setup_outputs(struct drm_device *dev)
14087 */ 14311 */
14088 found = I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_INIT_DISPLAY_DETECTED; 14312 found = I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_INIT_DISPLAY_DETECTED;
14089 /* WaIgnoreDDIAStrap: skl */ 14313 /* WaIgnoreDDIAStrap: skl */
14090 if (found || IS_SKYLAKE(dev)) 14314 if (found || IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
14091 intel_ddi_init(dev, PORT_A); 14315 intel_ddi_init(dev, PORT_A);
14092 14316
14093 /* DDI B, C and D detection is indicated by the SFUSE_STRAP 14317 /* DDI B, C and D detection is indicated by the SFUSE_STRAP
@@ -14103,7 +14327,7 @@ static void intel_setup_outputs(struct drm_device *dev)
14103 /* 14327 /*
14104 * On SKL we don't have a way to detect DDI-E so we rely on VBT. 14328 * On SKL we don't have a way to detect DDI-E so we rely on VBT.
14105 */ 14329 */
14106 if (IS_SKYLAKE(dev) && 14330 if ((IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) &&
14107 (dev_priv->vbt.ddi_port_info[PORT_E].supports_dp || 14331 (dev_priv->vbt.ddi_port_info[PORT_E].supports_dp ||
14108 dev_priv->vbt.ddi_port_info[PORT_E].supports_dvi || 14332 dev_priv->vbt.ddi_port_info[PORT_E].supports_dvi ||
14109 dev_priv->vbt.ddi_port_info[PORT_E].supports_hdmi)) 14333 dev_priv->vbt.ddi_port_info[PORT_E].supports_hdmi))
@@ -14118,7 +14342,7 @@ static void intel_setup_outputs(struct drm_device *dev)
14118 14342
14119 if (I915_READ(PCH_HDMIB) & SDVO_DETECTED) { 14343 if (I915_READ(PCH_HDMIB) & SDVO_DETECTED) {
14120 /* PCH SDVOB multiplex with HDMIB */ 14344 /* PCH SDVOB multiplex with HDMIB */
14121 found = intel_sdvo_init(dev, PCH_SDVOB, true); 14345 found = intel_sdvo_init(dev, PCH_SDVOB, PORT_B);
14122 if (!found) 14346 if (!found)
14123 intel_hdmi_init(dev, PCH_HDMIB, PORT_B); 14347 intel_hdmi_init(dev, PCH_HDMIB, PORT_B);
14124 if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED)) 14348 if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED))
@@ -14174,7 +14398,7 @@ static void intel_setup_outputs(struct drm_device *dev)
14174 14398
14175 if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) { 14399 if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
14176 DRM_DEBUG_KMS("probing SDVOB\n"); 14400 DRM_DEBUG_KMS("probing SDVOB\n");
14177 found = intel_sdvo_init(dev, GEN3_SDVOB, true); 14401 found = intel_sdvo_init(dev, GEN3_SDVOB, PORT_B);
14178 if (!found && IS_G4X(dev)) { 14402 if (!found && IS_G4X(dev)) {
14179 DRM_DEBUG_KMS("probing HDMI on SDVOB\n"); 14403 DRM_DEBUG_KMS("probing HDMI on SDVOB\n");
14180 intel_hdmi_init(dev, GEN4_HDMIB, PORT_B); 14404 intel_hdmi_init(dev, GEN4_HDMIB, PORT_B);
@@ -14188,7 +14412,7 @@ static void intel_setup_outputs(struct drm_device *dev)
14188 14412
14189 if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) { 14413 if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
14190 DRM_DEBUG_KMS("probing SDVOC\n"); 14414 DRM_DEBUG_KMS("probing SDVOC\n");
14191 found = intel_sdvo_init(dev, GEN3_SDVOC, false); 14415 found = intel_sdvo_init(dev, GEN3_SDVOC, PORT_C);
14192 } 14416 }
14193 14417
14194 if (!found && (I915_READ(GEN3_SDVOC) & SDVO_DETECTED)) { 14418 if (!found && (I915_READ(GEN3_SDVOC) & SDVO_DETECTED)) {
@@ -14454,8 +14678,9 @@ static int intel_framebuffer_init(struct drm_device *dev,
14454static struct drm_framebuffer * 14678static struct drm_framebuffer *
14455intel_user_framebuffer_create(struct drm_device *dev, 14679intel_user_framebuffer_create(struct drm_device *dev,
14456 struct drm_file *filp, 14680 struct drm_file *filp,
14457 struct drm_mode_fb_cmd2 *user_mode_cmd) 14681 const struct drm_mode_fb_cmd2 *user_mode_cmd)
14458{ 14682{
14683 struct drm_framebuffer *fb;
14459 struct drm_i915_gem_object *obj; 14684 struct drm_i915_gem_object *obj;
14460 struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd; 14685 struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
14461 14686
@@ -14464,7 +14689,11 @@ intel_user_framebuffer_create(struct drm_device *dev,
14464 if (&obj->base == NULL) 14689 if (&obj->base == NULL)
14465 return ERR_PTR(-ENOENT); 14690 return ERR_PTR(-ENOENT);
14466 14691
14467 return intel_framebuffer_create(dev, &mode_cmd, obj); 14692 fb = intel_framebuffer_create(dev, &mode_cmd, obj);
14693 if (IS_ERR(fb))
14694 drm_gem_object_unreference_unlocked(&obj->base);
14695
14696 return fb;
14468} 14697}
14469 14698
14470#ifndef CONFIG_DRM_FBDEV_EMULATION 14699#ifndef CONFIG_DRM_FBDEV_EMULATION
@@ -14549,7 +14778,7 @@ static void intel_init_display(struct drm_device *dev)
14549 } 14778 }
14550 14779
14551 /* Returns the core display clock speed */ 14780 /* Returns the core display clock speed */
14552 if (IS_SKYLAKE(dev)) 14781 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
14553 dev_priv->display.get_display_clock_speed = 14782 dev_priv->display.get_display_clock_speed =
14554 skylake_get_display_clock_speed; 14783 skylake_get_display_clock_speed;
14555 else if (IS_BROXTON(dev)) 14784 else if (IS_BROXTON(dev))
@@ -14838,7 +15067,7 @@ static void i915_disable_vga(struct drm_device *dev)
14838{ 15067{
14839 struct drm_i915_private *dev_priv = dev->dev_private; 15068 struct drm_i915_private *dev_priv = dev->dev_private;
14840 u8 sr1; 15069 u8 sr1;
14841 u32 vga_reg = i915_vgacntrl_reg(dev); 15070 i915_reg_t vga_reg = i915_vgacntrl_reg(dev);
14842 15071
14843 /* WaEnableVGAAccessThroughIOPort:ctg,elk,ilk,snb,ivb,vlv,hsw */ 15072 /* WaEnableVGAAccessThroughIOPort:ctg,elk,ilk,snb,ivb,vlv,hsw */
14844 vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO); 15073 vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO);
@@ -14954,9 +15183,6 @@ void intel_modeset_init(struct drm_device *dev)
14954 i915_disable_vga(dev); 15183 i915_disable_vga(dev);
14955 intel_setup_outputs(dev); 15184 intel_setup_outputs(dev);
14956 15185
14957 /* Just in case the BIOS is doing something questionable. */
14958 intel_fbc_disable(dev_priv);
14959
14960 drm_modeset_lock_all(dev); 15186 drm_modeset_lock_all(dev);
14961 intel_modeset_setup_hw_state(dev); 15187 intel_modeset_setup_hw_state(dev);
14962 drm_modeset_unlock_all(dev); 15188 drm_modeset_unlock_all(dev);
@@ -15043,10 +15269,9 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
15043{ 15269{
15044 struct drm_device *dev = crtc->base.dev; 15270 struct drm_device *dev = crtc->base.dev;
15045 struct drm_i915_private *dev_priv = dev->dev_private; 15271 struct drm_i915_private *dev_priv = dev->dev_private;
15046 u32 reg; 15272 i915_reg_t reg = PIPECONF(crtc->config->cpu_transcoder);
15047 15273
15048 /* Clear any frame start delays used for debugging left by the BIOS */ 15274 /* Clear any frame start delays used for debugging left by the BIOS */
15049 reg = PIPECONF(crtc->config->cpu_transcoder);
15050 I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK); 15275 I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
15051 15276
15052 /* restore vblank interrupts to correct state */ 15277 /* restore vblank interrupts to correct state */
@@ -15200,7 +15425,7 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
15200void i915_redisable_vga_power_on(struct drm_device *dev) 15425void i915_redisable_vga_power_on(struct drm_device *dev)
15201{ 15426{
15202 struct drm_i915_private *dev_priv = dev->dev_private; 15427 struct drm_i915_private *dev_priv = dev->dev_private;
15203 u32 vga_reg = i915_vgacntrl_reg(dev); 15428 i915_reg_t vga_reg = i915_vgacntrl_reg(dev);
15204 15429
15205 if (!(I915_READ(vga_reg) & VGA_DISP_DISABLE)) { 15430 if (!(I915_READ(vga_reg) & VGA_DISP_DISABLE)) {
15206 DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n"); 15431 DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n");
@@ -15239,7 +15464,7 @@ static void readout_plane_state(struct intel_crtc *crtc)
15239 struct intel_plane_state *plane_state = 15464 struct intel_plane_state *plane_state =
15240 to_intel_plane_state(primary->state); 15465 to_intel_plane_state(primary->state);
15241 15466
15242 plane_state->visible = 15467 plane_state->visible = crtc->active &&
15243 primary_get_hw_state(to_intel_plane(primary)); 15468 primary_get_hw_state(to_intel_plane(primary));
15244 15469
15245 if (plane_state->visible) 15470 if (plane_state->visible)
@@ -15496,8 +15721,7 @@ void intel_modeset_gem_init(struct drm_device *dev)
15496 mutex_lock(&dev->struct_mutex); 15721 mutex_lock(&dev->struct_mutex);
15497 ret = intel_pin_and_fence_fb_obj(c->primary, 15722 ret = intel_pin_and_fence_fb_obj(c->primary,
15498 c->primary->fb, 15723 c->primary->fb,
15499 c->primary->state, 15724 c->primary->state);
15500 NULL, NULL);
15501 mutex_unlock(&dev->struct_mutex); 15725 mutex_unlock(&dev->struct_mutex);
15502 if (ret) { 15726 if (ret) {
15503 DRM_ERROR("failed to pin boot fb on pipe %d\n", 15727 DRM_ERROR("failed to pin boot fb on pipe %d\n",
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 78b8ec84d576..e1456ead5c53 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -541,7 +541,8 @@ void vlv_power_sequencer_reset(struct drm_i915_private *dev_priv)
541 } 541 }
542} 542}
543 543
544static u32 _pp_ctrl_reg(struct intel_dp *intel_dp) 544static i915_reg_t
545_pp_ctrl_reg(struct intel_dp *intel_dp)
545{ 546{
546 struct drm_device *dev = intel_dp_to_dev(intel_dp); 547 struct drm_device *dev = intel_dp_to_dev(intel_dp);
547 548
@@ -553,7 +554,8 @@ static u32 _pp_ctrl_reg(struct intel_dp *intel_dp)
553 return VLV_PIPE_PP_CONTROL(vlv_power_sequencer_pipe(intel_dp)); 554 return VLV_PIPE_PP_CONTROL(vlv_power_sequencer_pipe(intel_dp));
554} 555}
555 556
556static u32 _pp_stat_reg(struct intel_dp *intel_dp) 557static i915_reg_t
558_pp_stat_reg(struct intel_dp *intel_dp)
557{ 559{
558 struct drm_device *dev = intel_dp_to_dev(intel_dp); 560 struct drm_device *dev = intel_dp_to_dev(intel_dp);
559 561
@@ -582,7 +584,7 @@ static int edp_notify_handler(struct notifier_block *this, unsigned long code,
582 584
583 if (IS_VALLEYVIEW(dev)) { 585 if (IS_VALLEYVIEW(dev)) {
584 enum pipe pipe = vlv_power_sequencer_pipe(intel_dp); 586 enum pipe pipe = vlv_power_sequencer_pipe(intel_dp);
585 u32 pp_ctrl_reg, pp_div_reg; 587 i915_reg_t pp_ctrl_reg, pp_div_reg;
586 u32 pp_div; 588 u32 pp_div;
587 589
588 pp_ctrl_reg = VLV_PIPE_PP_CONTROL(pipe); 590 pp_ctrl_reg = VLV_PIPE_PP_CONTROL(pipe);
@@ -652,7 +654,7 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp, bool has_aux_irq)
652 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 654 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
653 struct drm_device *dev = intel_dig_port->base.base.dev; 655 struct drm_device *dev = intel_dig_port->base.base.dev;
654 struct drm_i915_private *dev_priv = dev->dev_private; 656 struct drm_i915_private *dev_priv = dev->dev_private;
655 uint32_t ch_ctl = intel_dp->aux_ch_ctl_reg; 657 i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg;
656 uint32_t status; 658 uint32_t status;
657 bool done; 659 bool done;
658 660
@@ -750,7 +752,7 @@ static uint32_t i9xx_get_aux_send_ctl(struct intel_dp *intel_dp,
750 else 752 else
751 precharge = 5; 753 precharge = 5;
752 754
753 if (IS_BROADWELL(dev) && intel_dp->aux_ch_ctl_reg == DPA_AUX_CH_CTL) 755 if (IS_BROADWELL(dev) && intel_dig_port->port == PORT_A)
754 timeout = DP_AUX_CH_CTL_TIME_OUT_600us; 756 timeout = DP_AUX_CH_CTL_TIME_OUT_600us;
755 else 757 else
756 timeout = DP_AUX_CH_CTL_TIME_OUT_400us; 758 timeout = DP_AUX_CH_CTL_TIME_OUT_400us;
@@ -789,8 +791,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
789 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 791 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
790 struct drm_device *dev = intel_dig_port->base.base.dev; 792 struct drm_device *dev = intel_dig_port->base.base.dev;
791 struct drm_i915_private *dev_priv = dev->dev_private; 793 struct drm_i915_private *dev_priv = dev->dev_private;
792 uint32_t ch_ctl = intel_dp->aux_ch_ctl_reg; 794 i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg;
793 uint32_t ch_data = ch_ctl + 4;
794 uint32_t aux_clock_divider; 795 uint32_t aux_clock_divider;
795 int i, ret, recv_bytes; 796 int i, ret, recv_bytes;
796 uint32_t status; 797 uint32_t status;
@@ -854,7 +855,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
854 for (try = 0; try < 5; try++) { 855 for (try = 0; try < 5; try++) {
855 /* Load the send data into the aux channel data registers */ 856 /* Load the send data into the aux channel data registers */
856 for (i = 0; i < send_bytes; i += 4) 857 for (i = 0; i < send_bytes; i += 4)
857 I915_WRITE(ch_data + i, 858 I915_WRITE(intel_dp->aux_ch_data_reg[i >> 2],
858 intel_dp_pack_aux(send + i, 859 intel_dp_pack_aux(send + i,
859 send_bytes - i)); 860 send_bytes - i));
860 861
@@ -918,7 +919,7 @@ done:
918 recv_bytes = recv_size; 919 recv_bytes = recv_size;
919 920
920 for (i = 0; i < recv_bytes; i += 4) 921 for (i = 0; i < recv_bytes; i += 4)
921 intel_dp_unpack_aux(I915_READ(ch_data + i), 922 intel_dp_unpack_aux(I915_READ(intel_dp->aux_ch_data_reg[i >> 2]),
922 recv + i, recv_bytes - i); 923 recv + i, recv_bytes - i);
923 924
924 ret = recv_bytes; 925 ret = recv_bytes;
@@ -1005,96 +1006,206 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
1005 return ret; 1006 return ret;
1006} 1007}
1007 1008
1008static void 1009static i915_reg_t g4x_aux_ctl_reg(struct drm_i915_private *dev_priv,
1009intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector) 1010 enum port port)
1010{ 1011{
1011 struct drm_device *dev = intel_dp_to_dev(intel_dp); 1012 switch (port) {
1012 struct drm_i915_private *dev_priv = dev->dev_private; 1013 case PORT_B:
1013 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 1014 case PORT_C:
1014 enum port port = intel_dig_port->port; 1015 case PORT_D:
1015 struct ddi_vbt_port_info *info = &dev_priv->vbt.ddi_port_info[port]; 1016 return DP_AUX_CH_CTL(port);
1016 const char *name = NULL; 1017 default:
1017 uint32_t porte_aux_ctl_reg = DPA_AUX_CH_CTL; 1018 MISSING_CASE(port);
1018 int ret; 1019 return DP_AUX_CH_CTL(PORT_B);
1020 }
1021}
1019 1022
1020 /* On SKL we don't have Aux for port E so we rely on VBT to set 1023static i915_reg_t g4x_aux_data_reg(struct drm_i915_private *dev_priv,
1021 * a proper alternate aux channel. 1024 enum port port, int index)
1022 */ 1025{
1023 if (IS_SKYLAKE(dev) && port == PORT_E) { 1026 switch (port) {
1024 switch (info->alternate_aux_channel) { 1027 case PORT_B:
1025 case DP_AUX_B: 1028 case PORT_C:
1026 porte_aux_ctl_reg = DPB_AUX_CH_CTL; 1029 case PORT_D:
1027 break; 1030 return DP_AUX_CH_DATA(port, index);
1028 case DP_AUX_C: 1031 default:
1029 porte_aux_ctl_reg = DPC_AUX_CH_CTL; 1032 MISSING_CASE(port);
1030 break; 1033 return DP_AUX_CH_DATA(PORT_B, index);
1031 case DP_AUX_D:
1032 porte_aux_ctl_reg = DPD_AUX_CH_CTL;
1033 break;
1034 case DP_AUX_A:
1035 default:
1036 porte_aux_ctl_reg = DPA_AUX_CH_CTL;
1037 }
1038 } 1034 }
1035}
1039 1036
1037static i915_reg_t ilk_aux_ctl_reg(struct drm_i915_private *dev_priv,
1038 enum port port)
1039{
1040 switch (port) { 1040 switch (port) {
1041 case PORT_A: 1041 case PORT_A:
1042 intel_dp->aux_ch_ctl_reg = DPA_AUX_CH_CTL; 1042 return DP_AUX_CH_CTL(port);
1043 name = "DPDDC-A";
1044 break;
1045 case PORT_B: 1043 case PORT_B:
1046 intel_dp->aux_ch_ctl_reg = PCH_DPB_AUX_CH_CTL;
1047 name = "DPDDC-B";
1048 break;
1049 case PORT_C: 1044 case PORT_C:
1050 intel_dp->aux_ch_ctl_reg = PCH_DPC_AUX_CH_CTL;
1051 name = "DPDDC-C";
1052 break;
1053 case PORT_D: 1045 case PORT_D:
1054 intel_dp->aux_ch_ctl_reg = PCH_DPD_AUX_CH_CTL; 1046 return PCH_DP_AUX_CH_CTL(port);
1055 name = "DPDDC-D";
1056 break;
1057 case PORT_E:
1058 intel_dp->aux_ch_ctl_reg = porte_aux_ctl_reg;
1059 name = "DPDDC-E";
1060 break;
1061 default: 1047 default:
1062 BUG(); 1048 MISSING_CASE(port);
1049 return DP_AUX_CH_CTL(PORT_A);
1063 } 1050 }
1051}
1064 1052
1065 /* 1053static i915_reg_t ilk_aux_data_reg(struct drm_i915_private *dev_priv,
1066 * The AUX_CTL register is usually DP_CTL + 0x10. 1054 enum port port, int index)
1067 * 1055{
1068 * On Haswell and Broadwell though: 1056 switch (port) {
1069 * - Both port A DDI_BUF_CTL and DDI_AUX_CTL are on the CPU 1057 case PORT_A:
1070 * - Port B/C/D AUX channels are on the PCH, DDI_BUF_CTL on the CPU 1058 return DP_AUX_CH_DATA(port, index);
1071 * 1059 case PORT_B:
1072 * Skylake moves AUX_CTL back next to DDI_BUF_CTL, on the CPU. 1060 case PORT_C:
1073 */ 1061 case PORT_D:
1074 if (!IS_HASWELL(dev) && !IS_BROADWELL(dev) && port != PORT_E) 1062 return PCH_DP_AUX_CH_DATA(port, index);
1075 intel_dp->aux_ch_ctl_reg = intel_dp->output_reg + 0x10; 1063 default:
1064 MISSING_CASE(port);
1065 return DP_AUX_CH_DATA(PORT_A, index);
1066 }
1067}
1068
1069/*
1070 * On SKL we don't have Aux for port E so we rely
1071 * on VBT to set a proper alternate aux channel.
1072 */
1073static enum port skl_porte_aux_port(struct drm_i915_private *dev_priv)
1074{
1075 const struct ddi_vbt_port_info *info =
1076 &dev_priv->vbt.ddi_port_info[PORT_E];
1077
1078 switch (info->alternate_aux_channel) {
1079 case DP_AUX_A:
1080 return PORT_A;
1081 case DP_AUX_B:
1082 return PORT_B;
1083 case DP_AUX_C:
1084 return PORT_C;
1085 case DP_AUX_D:
1086 return PORT_D;
1087 default:
1088 MISSING_CASE(info->alternate_aux_channel);
1089 return PORT_A;
1090 }
1091}
1092
1093static i915_reg_t skl_aux_ctl_reg(struct drm_i915_private *dev_priv,
1094 enum port port)
1095{
1096 if (port == PORT_E)
1097 port = skl_porte_aux_port(dev_priv);
1098
1099 switch (port) {
1100 case PORT_A:
1101 case PORT_B:
1102 case PORT_C:
1103 case PORT_D:
1104 return DP_AUX_CH_CTL(port);
1105 default:
1106 MISSING_CASE(port);
1107 return DP_AUX_CH_CTL(PORT_A);
1108 }
1109}
1110
1111static i915_reg_t skl_aux_data_reg(struct drm_i915_private *dev_priv,
1112 enum port port, int index)
1113{
1114 if (port == PORT_E)
1115 port = skl_porte_aux_port(dev_priv);
1116
1117 switch (port) {
1118 case PORT_A:
1119 case PORT_B:
1120 case PORT_C:
1121 case PORT_D:
1122 return DP_AUX_CH_DATA(port, index);
1123 default:
1124 MISSING_CASE(port);
1125 return DP_AUX_CH_DATA(PORT_A, index);
1126 }
1127}
1128
1129static i915_reg_t intel_aux_ctl_reg(struct drm_i915_private *dev_priv,
1130 enum port port)
1131{
1132 if (INTEL_INFO(dev_priv)->gen >= 9)
1133 return skl_aux_ctl_reg(dev_priv, port);
1134 else if (HAS_PCH_SPLIT(dev_priv))
1135 return ilk_aux_ctl_reg(dev_priv, port);
1136 else
1137 return g4x_aux_ctl_reg(dev_priv, port);
1138}
1139
1140static i915_reg_t intel_aux_data_reg(struct drm_i915_private *dev_priv,
1141 enum port port, int index)
1142{
1143 if (INTEL_INFO(dev_priv)->gen >= 9)
1144 return skl_aux_data_reg(dev_priv, port, index);
1145 else if (HAS_PCH_SPLIT(dev_priv))
1146 return ilk_aux_data_reg(dev_priv, port, index);
1147 else
1148 return g4x_aux_data_reg(dev_priv, port, index);
1149}
1150
1151static void intel_aux_reg_init(struct intel_dp *intel_dp)
1152{
1153 struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
1154 enum port port = dp_to_dig_port(intel_dp)->port;
1155 int i;
1156
1157 intel_dp->aux_ch_ctl_reg = intel_aux_ctl_reg(dev_priv, port);
1158 for (i = 0; i < ARRAY_SIZE(intel_dp->aux_ch_data_reg); i++)
1159 intel_dp->aux_ch_data_reg[i] = intel_aux_data_reg(dev_priv, port, i);
1160}
1161
1162static void
1163intel_dp_aux_fini(struct intel_dp *intel_dp)
1164{
1165 drm_dp_aux_unregister(&intel_dp->aux);
1166 kfree(intel_dp->aux.name);
1167}
1168
1169static int
1170intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector)
1171{
1172 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1173 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
1174 enum port port = intel_dig_port->port;
1175 int ret;
1176
1177 intel_aux_reg_init(intel_dp);
1178
1179 intel_dp->aux.name = kasprintf(GFP_KERNEL, "DPDDC-%c", port_name(port));
1180 if (!intel_dp->aux.name)
1181 return -ENOMEM;
1076 1182
1077 intel_dp->aux.name = name;
1078 intel_dp->aux.dev = dev->dev; 1183 intel_dp->aux.dev = dev->dev;
1079 intel_dp->aux.transfer = intel_dp_aux_transfer; 1184 intel_dp->aux.transfer = intel_dp_aux_transfer;
1080 1185
1081 DRM_DEBUG_KMS("registering %s bus for %s\n", name, 1186 DRM_DEBUG_KMS("registering %s bus for %s\n",
1187 intel_dp->aux.name,
1082 connector->base.kdev->kobj.name); 1188 connector->base.kdev->kobj.name);
1083 1189
1084 ret = drm_dp_aux_register(&intel_dp->aux); 1190 ret = drm_dp_aux_register(&intel_dp->aux);
1085 if (ret < 0) { 1191 if (ret < 0) {
1086 DRM_ERROR("drm_dp_aux_register() for %s failed (%d)\n", 1192 DRM_ERROR("drm_dp_aux_register() for %s failed (%d)\n",
1087 name, ret); 1193 intel_dp->aux.name, ret);
1088 return; 1194 kfree(intel_dp->aux.name);
1195 return ret;
1089 } 1196 }
1090 1197
1091 ret = sysfs_create_link(&connector->base.kdev->kobj, 1198 ret = sysfs_create_link(&connector->base.kdev->kobj,
1092 &intel_dp->aux.ddc.dev.kobj, 1199 &intel_dp->aux.ddc.dev.kobj,
1093 intel_dp->aux.ddc.dev.kobj.name); 1200 intel_dp->aux.ddc.dev.kobj.name);
1094 if (ret < 0) { 1201 if (ret < 0) {
1095 DRM_ERROR("sysfs_create_link() for %s failed (%d)\n", name, ret); 1202 DRM_ERROR("sysfs_create_link() for %s failed (%d)\n",
1096 drm_dp_aux_unregister(&intel_dp->aux); 1203 intel_dp->aux.name, ret);
1204 intel_dp_aux_fini(intel_dp);
1205 return ret;
1097 } 1206 }
1207
1208 return 0;
1098} 1209}
1099 1210
1100static void 1211static void
@@ -1186,10 +1297,13 @@ intel_dp_sink_rates(struct intel_dp *intel_dp, const int **sink_rates)
1186 return (intel_dp_max_link_bw(intel_dp) >> 3) + 1; 1297 return (intel_dp_max_link_bw(intel_dp) >> 3) + 1;
1187} 1298}
1188 1299
1189static bool intel_dp_source_supports_hbr2(struct drm_device *dev) 1300bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp)
1190{ 1301{
1302 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1303 struct drm_device *dev = dig_port->base.base.dev;
1304
1191 /* WaDisableHBR2:skl */ 1305 /* WaDisableHBR2:skl */
1192 if (IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) 1306 if (IS_SKL_REVID(dev, 0, SKL_REVID_B0))
1193 return false; 1307 return false;
1194 1308
1195 if ((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || IS_BROADWELL(dev) || 1309 if ((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) || IS_BROADWELL(dev) ||
@@ -1200,14 +1314,16 @@ static bool intel_dp_source_supports_hbr2(struct drm_device *dev)
1200} 1314}
1201 1315
1202static int 1316static int
1203intel_dp_source_rates(struct drm_device *dev, const int **source_rates) 1317intel_dp_source_rates(struct intel_dp *intel_dp, const int **source_rates)
1204{ 1318{
1319 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1320 struct drm_device *dev = dig_port->base.base.dev;
1205 int size; 1321 int size;
1206 1322
1207 if (IS_BROXTON(dev)) { 1323 if (IS_BROXTON(dev)) {
1208 *source_rates = bxt_rates; 1324 *source_rates = bxt_rates;
1209 size = ARRAY_SIZE(bxt_rates); 1325 size = ARRAY_SIZE(bxt_rates);
1210 } else if (IS_SKYLAKE(dev)) { 1326 } else if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
1211 *source_rates = skl_rates; 1327 *source_rates = skl_rates;
1212 size = ARRAY_SIZE(skl_rates); 1328 size = ARRAY_SIZE(skl_rates);
1213 } else { 1329 } else {
@@ -1216,7 +1332,7 @@ intel_dp_source_rates(struct drm_device *dev, const int **source_rates)
1216 } 1332 }
1217 1333
1218 /* This depends on the fact that 5.4 is last value in the array */ 1334 /* This depends on the fact that 5.4 is last value in the array */
1219 if (!intel_dp_source_supports_hbr2(dev)) 1335 if (!intel_dp_source_supports_hbr2(intel_dp))
1220 size--; 1336 size--;
1221 1337
1222 return size; 1338 return size;
@@ -1281,12 +1397,11 @@ static int intersect_rates(const int *source_rates, int source_len,
1281static int intel_dp_common_rates(struct intel_dp *intel_dp, 1397static int intel_dp_common_rates(struct intel_dp *intel_dp,
1282 int *common_rates) 1398 int *common_rates)
1283{ 1399{
1284 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1285 const int *source_rates, *sink_rates; 1400 const int *source_rates, *sink_rates;
1286 int source_len, sink_len; 1401 int source_len, sink_len;
1287 1402
1288 sink_len = intel_dp_sink_rates(intel_dp, &sink_rates); 1403 sink_len = intel_dp_sink_rates(intel_dp, &sink_rates);
1289 source_len = intel_dp_source_rates(dev, &source_rates); 1404 source_len = intel_dp_source_rates(intel_dp, &source_rates);
1290 1405
1291 return intersect_rates(source_rates, source_len, 1406 return intersect_rates(source_rates, source_len,
1292 sink_rates, sink_len, 1407 sink_rates, sink_len,
@@ -1311,7 +1426,6 @@ static void snprintf_int_array(char *str, size_t len,
1311 1426
1312static void intel_dp_print_rates(struct intel_dp *intel_dp) 1427static void intel_dp_print_rates(struct intel_dp *intel_dp)
1313{ 1428{
1314 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1315 const int *source_rates, *sink_rates; 1429 const int *source_rates, *sink_rates;
1316 int source_len, sink_len, common_len; 1430 int source_len, sink_len, common_len;
1317 int common_rates[DP_MAX_SUPPORTED_RATES]; 1431 int common_rates[DP_MAX_SUPPORTED_RATES];
@@ -1320,7 +1434,7 @@ static void intel_dp_print_rates(struct intel_dp *intel_dp)
1320 if ((drm_debug & DRM_UT_KMS) == 0) 1434 if ((drm_debug & DRM_UT_KMS) == 0)
1321 return; 1435 return;
1322 1436
1323 source_len = intel_dp_source_rates(dev, &source_rates); 1437 source_len = intel_dp_source_rates(intel_dp, &source_rates);
1324 snprintf_int_array(str, sizeof(str), source_rates, source_len); 1438 snprintf_int_array(str, sizeof(str), source_rates, source_len);
1325 DRM_DEBUG_KMS("source rates: %s\n", str); 1439 DRM_DEBUG_KMS("source rates: %s\n", str);
1326 1440
@@ -1362,8 +1476,8 @@ int intel_dp_rate_select(struct intel_dp *intel_dp, int rate)
1362 return rate_to_index(rate, intel_dp->sink_rates); 1476 return rate_to_index(rate, intel_dp->sink_rates);
1363} 1477}
1364 1478
1365static void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock, 1479void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock,
1366 uint8_t *link_bw, uint8_t *rate_select) 1480 uint8_t *link_bw, uint8_t *rate_select)
1367{ 1481{
1368 if (intel_dp->num_sink_rates) { 1482 if (intel_dp->num_sink_rates) {
1369 *link_bw = 0; 1483 *link_bw = 0;
@@ -1423,7 +1537,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
1423 return ret; 1537 return ret;
1424 } 1538 }
1425 1539
1426 if (!HAS_PCH_SPLIT(dev)) 1540 if (HAS_GMCH_DISPLAY(dev))
1427 intel_gmch_panel_fitting(intel_crtc, pipe_config, 1541 intel_gmch_panel_fitting(intel_crtc, pipe_config,
1428 intel_connector->panel.fitting_mode); 1542 intel_connector->panel.fitting_mode);
1429 else 1543 else
@@ -1527,7 +1641,7 @@ found:
1527 &pipe_config->dp_m2_n2); 1641 &pipe_config->dp_m2_n2);
1528 } 1642 }
1529 1643
1530 if (IS_SKYLAKE(dev) && is_edp(intel_dp)) 1644 if ((IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) && is_edp(intel_dp))
1531 skl_edp_set_pll_config(pipe_config); 1645 skl_edp_set_pll_config(pipe_config);
1532 else if (IS_BROXTON(dev)) 1646 else if (IS_BROXTON(dev))
1533 /* handled in ddi */; 1647 /* handled in ddi */;
@@ -1539,37 +1653,6 @@ found:
1539 return true; 1653 return true;
1540} 1654}
1541 1655
1542static void ironlake_set_pll_cpu_edp(struct intel_dp *intel_dp)
1543{
1544 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1545 struct intel_crtc *crtc = to_intel_crtc(dig_port->base.base.crtc);
1546 struct drm_device *dev = crtc->base.dev;
1547 struct drm_i915_private *dev_priv = dev->dev_private;
1548 u32 dpa_ctl;
1549
1550 DRM_DEBUG_KMS("eDP PLL enable for clock %d\n",
1551 crtc->config->port_clock);
1552 dpa_ctl = I915_READ(DP_A);
1553 dpa_ctl &= ~DP_PLL_FREQ_MASK;
1554
1555 if (crtc->config->port_clock == 162000) {
1556 /* For a long time we've carried around a ILK-DevA w/a for the
1557 * 160MHz clock. If we're really unlucky, it's still required.
1558 */
1559 DRM_DEBUG_KMS("160MHz cpu eDP clock, might need ilk devA w/a\n");
1560 dpa_ctl |= DP_PLL_FREQ_160MHZ;
1561 intel_dp->DP |= DP_PLL_FREQ_160MHZ;
1562 } else {
1563 dpa_ctl |= DP_PLL_FREQ_270MHZ;
1564 intel_dp->DP |= DP_PLL_FREQ_270MHZ;
1565 }
1566
1567 I915_WRITE(DP_A, dpa_ctl);
1568
1569 POSTING_READ(DP_A);
1570 udelay(500);
1571}
1572
1573void intel_dp_set_link_params(struct intel_dp *intel_dp, 1656void intel_dp_set_link_params(struct intel_dp *intel_dp,
1574 const struct intel_crtc_state *pipe_config) 1657 const struct intel_crtc_state *pipe_config)
1575{ 1658{
@@ -1614,9 +1697,6 @@ static void intel_dp_prepare(struct intel_encoder *encoder)
1614 intel_dp->DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0; 1697 intel_dp->DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
1615 intel_dp->DP |= DP_PORT_WIDTH(crtc->config->lane_count); 1698 intel_dp->DP |= DP_PORT_WIDTH(crtc->config->lane_count);
1616 1699
1617 if (crtc->config->has_audio)
1618 intel_dp->DP |= DP_AUDIO_OUTPUT_ENABLE;
1619
1620 /* Split out the IBX/CPU vs CPT settings */ 1700 /* Split out the IBX/CPU vs CPT settings */
1621 1701
1622 if (IS_GEN7(dev) && port == PORT_A) { 1702 if (IS_GEN7(dev) && port == PORT_A) {
@@ -1677,7 +1757,7 @@ static void wait_panel_status(struct intel_dp *intel_dp,
1677{ 1757{
1678 struct drm_device *dev = intel_dp_to_dev(intel_dp); 1758 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1679 struct drm_i915_private *dev_priv = dev->dev_private; 1759 struct drm_i915_private *dev_priv = dev->dev_private;
1680 u32 pp_stat_reg, pp_ctrl_reg; 1760 i915_reg_t pp_stat_reg, pp_ctrl_reg;
1681 1761
1682 lockdep_assert_held(&dev_priv->pps_mutex); 1762 lockdep_assert_held(&dev_priv->pps_mutex);
1683 1763
@@ -1767,7 +1847,7 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
1767 struct drm_i915_private *dev_priv = dev->dev_private; 1847 struct drm_i915_private *dev_priv = dev->dev_private;
1768 enum intel_display_power_domain power_domain; 1848 enum intel_display_power_domain power_domain;
1769 u32 pp; 1849 u32 pp;
1770 u32 pp_stat_reg, pp_ctrl_reg; 1850 i915_reg_t pp_stat_reg, pp_ctrl_reg;
1771 bool need_to_disable = !intel_dp->want_panel_vdd; 1851 bool need_to_disable = !intel_dp->want_panel_vdd;
1772 1852
1773 lockdep_assert_held(&dev_priv->pps_mutex); 1853 lockdep_assert_held(&dev_priv->pps_mutex);
@@ -1843,7 +1923,7 @@ static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)
1843 struct intel_encoder *intel_encoder = &intel_dig_port->base; 1923 struct intel_encoder *intel_encoder = &intel_dig_port->base;
1844 enum intel_display_power_domain power_domain; 1924 enum intel_display_power_domain power_domain;
1845 u32 pp; 1925 u32 pp;
1846 u32 pp_stat_reg, pp_ctrl_reg; 1926 i915_reg_t pp_stat_reg, pp_ctrl_reg;
1847 1927
1848 lockdep_assert_held(&dev_priv->pps_mutex); 1928 lockdep_assert_held(&dev_priv->pps_mutex);
1849 1929
@@ -1930,7 +2010,7 @@ static void edp_panel_on(struct intel_dp *intel_dp)
1930 struct drm_device *dev = intel_dp_to_dev(intel_dp); 2010 struct drm_device *dev = intel_dp_to_dev(intel_dp);
1931 struct drm_i915_private *dev_priv = dev->dev_private; 2011 struct drm_i915_private *dev_priv = dev->dev_private;
1932 u32 pp; 2012 u32 pp;
1933 u32 pp_ctrl_reg; 2013 i915_reg_t pp_ctrl_reg;
1934 2014
1935 lockdep_assert_held(&dev_priv->pps_mutex); 2015 lockdep_assert_held(&dev_priv->pps_mutex);
1936 2016
@@ -1992,7 +2072,7 @@ static void edp_panel_off(struct intel_dp *intel_dp)
1992 struct drm_i915_private *dev_priv = dev->dev_private; 2072 struct drm_i915_private *dev_priv = dev->dev_private;
1993 enum intel_display_power_domain power_domain; 2073 enum intel_display_power_domain power_domain;
1994 u32 pp; 2074 u32 pp;
1995 u32 pp_ctrl_reg; 2075 i915_reg_t pp_ctrl_reg;
1996 2076
1997 lockdep_assert_held(&dev_priv->pps_mutex); 2077 lockdep_assert_held(&dev_priv->pps_mutex);
1998 2078
@@ -2043,7 +2123,7 @@ static void _intel_edp_backlight_on(struct intel_dp *intel_dp)
2043 struct drm_device *dev = intel_dig_port->base.base.dev; 2123 struct drm_device *dev = intel_dig_port->base.base.dev;
2044 struct drm_i915_private *dev_priv = dev->dev_private; 2124 struct drm_i915_private *dev_priv = dev->dev_private;
2045 u32 pp; 2125 u32 pp;
2046 u32 pp_ctrl_reg; 2126 i915_reg_t pp_ctrl_reg;
2047 2127
2048 /* 2128 /*
2049 * If we enable the backlight right away following a panel power 2129 * If we enable the backlight right away following a panel power
@@ -2084,7 +2164,7 @@ static void _intel_edp_backlight_off(struct intel_dp *intel_dp)
2084 struct drm_device *dev = intel_dp_to_dev(intel_dp); 2164 struct drm_device *dev = intel_dp_to_dev(intel_dp);
2085 struct drm_i915_private *dev_priv = dev->dev_private; 2165 struct drm_i915_private *dev_priv = dev->dev_private;
2086 u32 pp; 2166 u32 pp;
2087 u32 pp_ctrl_reg; 2167 i915_reg_t pp_ctrl_reg;
2088 2168
2089 if (!is_edp(intel_dp)) 2169 if (!is_edp(intel_dp))
2090 return; 2170 return;
@@ -2143,27 +2223,61 @@ static void intel_edp_backlight_power(struct intel_connector *connector,
2143 _intel_edp_backlight_off(intel_dp); 2223 _intel_edp_backlight_off(intel_dp);
2144} 2224}
2145 2225
2226static const char *state_string(bool enabled)
2227{
2228 return enabled ? "on" : "off";
2229}
2230
2231static void assert_dp_port(struct intel_dp *intel_dp, bool state)
2232{
2233 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
2234 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
2235 bool cur_state = I915_READ(intel_dp->output_reg) & DP_PORT_EN;
2236
2237 I915_STATE_WARN(cur_state != state,
2238 "DP port %c state assertion failure (expected %s, current %s)\n",
2239 port_name(dig_port->port),
2240 state_string(state), state_string(cur_state));
2241}
2242#define assert_dp_port_disabled(d) assert_dp_port((d), false)
2243
2244static void assert_edp_pll(struct drm_i915_private *dev_priv, bool state)
2245{
2246 bool cur_state = I915_READ(DP_A) & DP_PLL_ENABLE;
2247
2248 I915_STATE_WARN(cur_state != state,
2249 "eDP PLL state assertion failure (expected %s, current %s)\n",
2250 state_string(state), state_string(cur_state));
2251}
2252#define assert_edp_pll_enabled(d) assert_edp_pll((d), true)
2253#define assert_edp_pll_disabled(d) assert_edp_pll((d), false)
2254
2146static void ironlake_edp_pll_on(struct intel_dp *intel_dp) 2255static void ironlake_edp_pll_on(struct intel_dp *intel_dp)
2147{ 2256{
2148 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 2257 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2149 struct drm_crtc *crtc = intel_dig_port->base.base.crtc; 2258 struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc);
2150 struct drm_device *dev = crtc->dev; 2259 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2151 struct drm_i915_private *dev_priv = dev->dev_private;
2152 u32 dpa_ctl;
2153 2260
2154 assert_pipe_disabled(dev_priv, 2261 assert_pipe_disabled(dev_priv, crtc->pipe);
2155 to_intel_crtc(crtc)->pipe); 2262 assert_dp_port_disabled(intel_dp);
2263 assert_edp_pll_disabled(dev_priv);
2264
2265 DRM_DEBUG_KMS("enabling eDP PLL for clock %d\n",
2266 crtc->config->port_clock);
2267
2268 intel_dp->DP &= ~DP_PLL_FREQ_MASK;
2269
2270 if (crtc->config->port_clock == 162000)
2271 intel_dp->DP |= DP_PLL_FREQ_162MHZ;
2272 else
2273 intel_dp->DP |= DP_PLL_FREQ_270MHZ;
2274
2275 I915_WRITE(DP_A, intel_dp->DP);
2276 POSTING_READ(DP_A);
2277 udelay(500);
2156 2278
2157 DRM_DEBUG_KMS("\n");
2158 dpa_ctl = I915_READ(DP_A);
2159 WARN(dpa_ctl & DP_PLL_ENABLE, "dp pll on, should be off\n");
2160 WARN(dpa_ctl & DP_PORT_EN, "dp port still on, should be off\n");
2161
2162 /* We don't adjust intel_dp->DP while tearing down the link, to
2163 * facilitate link retraining (e.g. after hotplug). Hence clear all
2164 * enable bits here to ensure that we don't enable too much. */
2165 intel_dp->DP &= ~(DP_PORT_EN | DP_AUDIO_OUTPUT_ENABLE);
2166 intel_dp->DP |= DP_PLL_ENABLE; 2279 intel_dp->DP |= DP_PLL_ENABLE;
2280
2167 I915_WRITE(DP_A, intel_dp->DP); 2281 I915_WRITE(DP_A, intel_dp->DP);
2168 POSTING_READ(DP_A); 2282 POSTING_READ(DP_A);
2169 udelay(200); 2283 udelay(200);
@@ -2172,24 +2286,18 @@ static void ironlake_edp_pll_on(struct intel_dp *intel_dp)
2172static void ironlake_edp_pll_off(struct intel_dp *intel_dp) 2286static void ironlake_edp_pll_off(struct intel_dp *intel_dp)
2173{ 2287{
2174 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 2288 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2175 struct drm_crtc *crtc = intel_dig_port->base.base.crtc; 2289 struct intel_crtc *crtc = to_intel_crtc(intel_dig_port->base.base.crtc);
2176 struct drm_device *dev = crtc->dev; 2290 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2177 struct drm_i915_private *dev_priv = dev->dev_private; 2291
2178 u32 dpa_ctl; 2292 assert_pipe_disabled(dev_priv, crtc->pipe);
2293 assert_dp_port_disabled(intel_dp);
2294 assert_edp_pll_enabled(dev_priv);
2179 2295
2180 assert_pipe_disabled(dev_priv, 2296 DRM_DEBUG_KMS("disabling eDP PLL\n");
2181 to_intel_crtc(crtc)->pipe);
2182 2297
2183 dpa_ctl = I915_READ(DP_A); 2298 intel_dp->DP &= ~DP_PLL_ENABLE;
2184 WARN((dpa_ctl & DP_PLL_ENABLE) == 0,
2185 "dp pll off, should be on\n");
2186 WARN(dpa_ctl & DP_PORT_EN, "dp port still on, should be off\n");
2187 2299
2188 /* We can't rely on the value tracked for the DP register in 2300 I915_WRITE(DP_A, intel_dp->DP);
2189 * intel_dp->DP because link_down must not change that (otherwise link
2190 * re-training will fail. */
2191 dpa_ctl &= ~DP_PLL_ENABLE;
2192 I915_WRITE(DP_A, dpa_ctl);
2193 POSTING_READ(DP_A); 2301 POSTING_READ(DP_A);
2194 udelay(200); 2302 udelay(200);
2195} 2303}
@@ -2258,7 +2366,7 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
2258 } 2366 }
2259 2367
2260 DRM_DEBUG_KMS("No pipe for dp port 0x%x found\n", 2368 DRM_DEBUG_KMS("No pipe for dp port 0x%x found\n",
2261 intel_dp->output_reg); 2369 i915_mmio_reg_offset(intel_dp->output_reg));
2262 } else if (IS_CHERRYVIEW(dev)) { 2370 } else if (IS_CHERRYVIEW(dev)) {
2263 *pipe = DP_PORT_TO_PIPE_CHV(tmp); 2371 *pipe = DP_PORT_TO_PIPE_CHV(tmp);
2264 } else { 2372 } else {
@@ -2321,7 +2429,7 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
2321 intel_dp_get_m_n(crtc, pipe_config); 2429 intel_dp_get_m_n(crtc, pipe_config);
2322 2430
2323 if (port == PORT_A) { 2431 if (port == PORT_A) {
2324 if ((I915_READ(DP_A) & DP_PLL_FREQ_MASK) == DP_PLL_FREQ_160MHZ) 2432 if ((I915_READ(DP_A) & DP_PLL_FREQ_MASK) == DP_PLL_FREQ_162MHZ)
2325 pipe_config->port_clock = 162000; 2433 pipe_config->port_clock = 162000;
2326 else 2434 else
2327 pipe_config->port_clock = 270000; 2435 pipe_config->port_clock = 270000;
@@ -2386,6 +2494,8 @@ static void ilk_post_disable_dp(struct intel_encoder *encoder)
2386 enum port port = dp_to_dig_port(intel_dp)->port; 2494 enum port port = dp_to_dig_port(intel_dp)->port;
2387 2495
2388 intel_dp_link_down(intel_dp); 2496 intel_dp_link_down(intel_dp);
2497
2498 /* Only ilk+ has port A */
2389 if (port == PORT_A) 2499 if (port == PORT_A)
2390 ironlake_edp_pll_off(intel_dp); 2500 ironlake_edp_pll_off(intel_dp);
2391} 2501}
@@ -2545,6 +2655,8 @@ static void intel_dp_enable_port(struct intel_dp *intel_dp)
2545{ 2655{
2546 struct drm_device *dev = intel_dp_to_dev(intel_dp); 2656 struct drm_device *dev = intel_dp_to_dev(intel_dp);
2547 struct drm_i915_private *dev_priv = dev->dev_private; 2657 struct drm_i915_private *dev_priv = dev->dev_private;
2658 struct intel_crtc *crtc =
2659 to_intel_crtc(dp_to_dig_port(intel_dp)->base.base.crtc);
2548 2660
2549 /* enable with pattern 1 (as per spec) */ 2661 /* enable with pattern 1 (as per spec) */
2550 _intel_dp_set_link_train(intel_dp, &intel_dp->DP, 2662 _intel_dp_set_link_train(intel_dp, &intel_dp->DP,
@@ -2560,6 +2672,8 @@ static void intel_dp_enable_port(struct intel_dp *intel_dp)
2560 * fail when the power sequencer is freshly used for this port. 2672 * fail when the power sequencer is freshly used for this port.
2561 */ 2673 */
2562 intel_dp->DP |= DP_PORT_EN; 2674 intel_dp->DP |= DP_PORT_EN;
2675 if (crtc->config->has_audio)
2676 intel_dp->DP |= DP_AUDIO_OUTPUT_ENABLE;
2563 2677
2564 I915_WRITE(intel_dp->output_reg, intel_dp->DP); 2678 I915_WRITE(intel_dp->output_reg, intel_dp->DP);
2565 POSTING_READ(intel_dp->output_reg); 2679 POSTING_READ(intel_dp->output_reg);
@@ -2572,6 +2686,8 @@ static void intel_enable_dp(struct intel_encoder *encoder)
2572 struct drm_i915_private *dev_priv = dev->dev_private; 2686 struct drm_i915_private *dev_priv = dev->dev_private;
2573 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); 2687 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
2574 uint32_t dp_reg = I915_READ(intel_dp->output_reg); 2688 uint32_t dp_reg = I915_READ(intel_dp->output_reg);
2689 enum port port = dp_to_dig_port(intel_dp)->port;
2690 enum pipe pipe = crtc->pipe;
2575 2691
2576 if (WARN_ON(dp_reg & DP_PORT_EN)) 2692 if (WARN_ON(dp_reg & DP_PORT_EN))
2577 return; 2693 return;
@@ -2583,6 +2699,17 @@ static void intel_enable_dp(struct intel_encoder *encoder)
2583 2699
2584 intel_dp_enable_port(intel_dp); 2700 intel_dp_enable_port(intel_dp);
2585 2701
2702 if (port == PORT_A && IS_GEN5(dev_priv)) {
2703 /*
2704 * Underrun reporting for the other pipe was disabled in
2705 * g4x_pre_enable_dp(). The eDP PLL and port have now been
2706 * enabled, so it's now safe to re-enable underrun reporting.
2707 */
2708 intel_wait_for_vblank_if_active(dev_priv->dev, !pipe);
2709 intel_set_cpu_fifo_underrun_reporting(dev_priv, !pipe, true);
2710 intel_set_pch_fifo_underrun_reporting(dev_priv, !pipe, true);
2711 }
2712
2586 edp_panel_vdd_on(intel_dp); 2713 edp_panel_vdd_on(intel_dp);
2587 edp_panel_on(intel_dp); 2714 edp_panel_on(intel_dp);
2588 edp_panel_vdd_off(intel_dp, true); 2715 edp_panel_vdd_off(intel_dp, true);
@@ -2605,7 +2732,7 @@ static void intel_enable_dp(struct intel_encoder *encoder)
2605 2732
2606 if (crtc->config->has_audio) { 2733 if (crtc->config->has_audio) {
2607 DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n", 2734 DRM_DEBUG_DRIVER("Enabling DP audio on pipe %c\n",
2608 pipe_name(crtc->pipe)); 2735 pipe_name(pipe));
2609 intel_audio_codec_enable(encoder); 2736 intel_audio_codec_enable(encoder);
2610 } 2737 }
2611} 2738}
@@ -2628,16 +2755,29 @@ static void vlv_enable_dp(struct intel_encoder *encoder)
2628 2755
2629static void g4x_pre_enable_dp(struct intel_encoder *encoder) 2756static void g4x_pre_enable_dp(struct intel_encoder *encoder)
2630{ 2757{
2758 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2631 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); 2759 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
2632 struct intel_digital_port *dport = dp_to_dig_port(intel_dp); 2760 enum port port = dp_to_dig_port(intel_dp)->port;
2761 enum pipe pipe = to_intel_crtc(encoder->base.crtc)->pipe;
2633 2762
2634 intel_dp_prepare(encoder); 2763 intel_dp_prepare(encoder);
2635 2764
2765 if (port == PORT_A && IS_GEN5(dev_priv)) {
2766 /*
2767 * We get FIFO underruns on the other pipe when
2768 * enabling the CPU eDP PLL, and when enabling CPU
2769 * eDP port. We could potentially avoid the PLL
2770 * underrun with a vblank wait just prior to enabling
2771 * the PLL, but that doesn't appear to help the port
2772 * enable case. Just sweep it all under the rug.
2773 */
2774 intel_set_cpu_fifo_underrun_reporting(dev_priv, !pipe, false);
2775 intel_set_pch_fifo_underrun_reporting(dev_priv, !pipe, false);
2776 }
2777
2636 /* Only ilk+ has port A */ 2778 /* Only ilk+ has port A */
2637 if (dport->port == PORT_A) { 2779 if (port == PORT_A)
2638 ironlake_set_pll_cpu_edp(intel_dp);
2639 ironlake_edp_pll_on(intel_dp); 2780 ironlake_edp_pll_on(intel_dp);
2640 }
2641} 2781}
2642 2782
2643static void vlv_detach_power_sequencer(struct intel_dp *intel_dp) 2783static void vlv_detach_power_sequencer(struct intel_dp *intel_dp)
@@ -2645,7 +2785,7 @@ static void vlv_detach_power_sequencer(struct intel_dp *intel_dp)
2645 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 2785 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
2646 struct drm_i915_private *dev_priv = intel_dig_port->base.base.dev->dev_private; 2786 struct drm_i915_private *dev_priv = intel_dig_port->base.base.dev->dev_private;
2647 enum pipe pipe = intel_dp->pps_pipe; 2787 enum pipe pipe = intel_dp->pps_pipe;
2648 int pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe); 2788 i915_reg_t pp_on_reg = VLV_PIPE_PP_ON_DELAYS(pipe);
2649 2789
2650 edp_panel_vdd_off_sync(intel_dp); 2790 edp_panel_vdd_off_sync(intel_dp);
2651 2791
@@ -3043,7 +3183,7 @@ intel_dp_dpcd_read_wake(struct drm_dp_aux *aux, unsigned int offset,
3043 * Fetch AUX CH registers 0x202 - 0x207 which contain 3183 * Fetch AUX CH registers 0x202 - 0x207 which contain
3044 * link status information 3184 * link status information
3045 */ 3185 */
3046static bool 3186bool
3047intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE]) 3187intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE])
3048{ 3188{
3049 return intel_dp_dpcd_read_wake(&intel_dp->aux, 3189 return intel_dp_dpcd_read_wake(&intel_dp->aux,
@@ -3053,7 +3193,7 @@ intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_
3053} 3193}
3054 3194
3055/* These are source-specific values. */ 3195/* These are source-specific values. */
3056static uint8_t 3196uint8_t
3057intel_dp_voltage_max(struct intel_dp *intel_dp) 3197intel_dp_voltage_max(struct intel_dp *intel_dp)
3058{ 3198{
3059 struct drm_device *dev = intel_dp_to_dev(intel_dp); 3199 struct drm_device *dev = intel_dp_to_dev(intel_dp);
@@ -3076,7 +3216,7 @@ intel_dp_voltage_max(struct intel_dp *intel_dp)
3076 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2; 3216 return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
3077} 3217}
3078 3218
3079static uint8_t 3219uint8_t
3080intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing) 3220intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)
3081{ 3221{
3082 struct drm_device *dev = intel_dp_to_dev(intel_dp); 3222 struct drm_device *dev = intel_dp_to_dev(intel_dp);
@@ -3418,38 +3558,6 @@ static uint32_t chv_signal_levels(struct intel_dp *intel_dp)
3418 return 0; 3558 return 0;
3419} 3559}
3420 3560
3421static void
3422intel_get_adjust_train(struct intel_dp *intel_dp,
3423 const uint8_t link_status[DP_LINK_STATUS_SIZE])
3424{
3425 uint8_t v = 0;
3426 uint8_t p = 0;
3427 int lane;
3428 uint8_t voltage_max;
3429 uint8_t preemph_max;
3430
3431 for (lane = 0; lane < intel_dp->lane_count; lane++) {
3432 uint8_t this_v = drm_dp_get_adjust_request_voltage(link_status, lane);
3433 uint8_t this_p = drm_dp_get_adjust_request_pre_emphasis(link_status, lane);
3434
3435 if (this_v > v)
3436 v = this_v;
3437 if (this_p > p)
3438 p = this_p;
3439 }
3440
3441 voltage_max = intel_dp_voltage_max(intel_dp);
3442 if (v >= voltage_max)
3443 v = voltage_max | DP_TRAIN_MAX_SWING_REACHED;
3444
3445 preemph_max = intel_dp_pre_emphasis_max(intel_dp, v);
3446 if (p >= preemph_max)
3447 p = preemph_max | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
3448
3449 for (lane = 0; lane < 4; lane++)
3450 intel_dp->train_set[lane] = v | p;
3451}
3452
3453static uint32_t 3561static uint32_t
3454gen4_signal_levels(uint8_t train_set) 3562gen4_signal_levels(uint8_t train_set)
3455{ 3563{
@@ -3547,13 +3655,13 @@ gen7_edp_signal_levels(uint8_t train_set)
3547 } 3655 }
3548} 3656}
3549 3657
3550/* Properly updates "DP" with the correct signal levels. */ 3658void
3551static void 3659intel_dp_set_signal_levels(struct intel_dp *intel_dp)
3552intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP)
3553{ 3660{
3554 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 3661 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3555 enum port port = intel_dig_port->port; 3662 enum port port = intel_dig_port->port;
3556 struct drm_device *dev = intel_dig_port->base.base.dev; 3663 struct drm_device *dev = intel_dig_port->base.base.dev;
3664 struct drm_i915_private *dev_priv = to_i915(dev);
3557 uint32_t signal_levels, mask = 0; 3665 uint32_t signal_levels, mask = 0;
3558 uint8_t train_set = intel_dp->train_set[0]; 3666 uint8_t train_set = intel_dp->train_set[0];
3559 3667
@@ -3588,74 +3696,27 @@ intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP)
3588 (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) >> 3696 (train_set & DP_TRAIN_PRE_EMPHASIS_MASK) >>
3589 DP_TRAIN_PRE_EMPHASIS_SHIFT); 3697 DP_TRAIN_PRE_EMPHASIS_SHIFT);
3590 3698
3591 *DP = (*DP & ~mask) | signal_levels; 3699 intel_dp->DP = (intel_dp->DP & ~mask) | signal_levels;
3592}
3593 3700
3594static bool 3701 I915_WRITE(intel_dp->output_reg, intel_dp->DP);
3595intel_dp_set_link_train(struct intel_dp *intel_dp,
3596 uint32_t *DP,
3597 uint8_t dp_train_pat)
3598{
3599 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3600 struct drm_i915_private *dev_priv =
3601 to_i915(intel_dig_port->base.base.dev);
3602 uint8_t buf[sizeof(intel_dp->train_set) + 1];
3603 int ret, len;
3604
3605 _intel_dp_set_link_train(intel_dp, DP, dp_train_pat);
3606
3607 I915_WRITE(intel_dp->output_reg, *DP);
3608 POSTING_READ(intel_dp->output_reg); 3702 POSTING_READ(intel_dp->output_reg);
3609
3610 buf[0] = dp_train_pat;
3611 if ((dp_train_pat & DP_TRAINING_PATTERN_MASK) ==
3612 DP_TRAINING_PATTERN_DISABLE) {
3613 /* don't write DP_TRAINING_LANEx_SET on disable */
3614 len = 1;
3615 } else {
3616 /* DP_TRAINING_LANEx_SET follow DP_TRAINING_PATTERN_SET */
3617 memcpy(buf + 1, intel_dp->train_set, intel_dp->lane_count);
3618 len = intel_dp->lane_count + 1;
3619 }
3620
3621 ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_PATTERN_SET,
3622 buf, len);
3623
3624 return ret == len;
3625}
3626
3627static bool
3628intel_dp_reset_link_train(struct intel_dp *intel_dp, uint32_t *DP,
3629 uint8_t dp_train_pat)
3630{
3631 if (!intel_dp->train_set_valid)
3632 memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set));
3633 intel_dp_set_signal_levels(intel_dp, DP);
3634 return intel_dp_set_link_train(intel_dp, DP, dp_train_pat);
3635} 3703}
3636 3704
3637static bool 3705void
3638intel_dp_update_link_train(struct intel_dp *intel_dp, uint32_t *DP, 3706intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
3639 const uint8_t link_status[DP_LINK_STATUS_SIZE]) 3707 uint8_t dp_train_pat)
3640{ 3708{
3641 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 3709 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3642 struct drm_i915_private *dev_priv = 3710 struct drm_i915_private *dev_priv =
3643 to_i915(intel_dig_port->base.base.dev); 3711 to_i915(intel_dig_port->base.base.dev);
3644 int ret;
3645 3712
3646 intel_get_adjust_train(intel_dp, link_status); 3713 _intel_dp_set_link_train(intel_dp, &intel_dp->DP, dp_train_pat);
3647 intel_dp_set_signal_levels(intel_dp, DP);
3648 3714
3649 I915_WRITE(intel_dp->output_reg, *DP); 3715 I915_WRITE(intel_dp->output_reg, intel_dp->DP);
3650 POSTING_READ(intel_dp->output_reg); 3716 POSTING_READ(intel_dp->output_reg);
3651
3652 ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_LANE0_SET,
3653 intel_dp->train_set, intel_dp->lane_count);
3654
3655 return ret == intel_dp->lane_count;
3656} 3717}
3657 3718
3658static void intel_dp_set_idle_link_train(struct intel_dp *intel_dp) 3719void intel_dp_set_idle_link_train(struct intel_dp *intel_dp)
3659{ 3720{
3660 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 3721 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
3661 struct drm_device *dev = intel_dig_port->base.base.dev; 3722 struct drm_device *dev = intel_dig_port->base.base.dev;
@@ -3686,232 +3747,6 @@ static void intel_dp_set_idle_link_train(struct intel_dp *intel_dp)
3686 DRM_ERROR("Timed out waiting for DP idle patterns\n"); 3747 DRM_ERROR("Timed out waiting for DP idle patterns\n");
3687} 3748}
3688 3749
3689/* Enable corresponding port and start training pattern 1 */
3690static void
3691intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
3692{
3693 struct drm_encoder *encoder = &dp_to_dig_port(intel_dp)->base.base;
3694 struct drm_device *dev = encoder->dev;
3695 int i;
3696 uint8_t voltage;
3697 int voltage_tries, loop_tries;
3698 uint32_t DP = intel_dp->DP;
3699 uint8_t link_config[2];
3700 uint8_t link_bw, rate_select;
3701
3702 if (HAS_DDI(dev))
3703 intel_ddi_prepare_link_retrain(encoder);
3704
3705 intel_dp_compute_rate(intel_dp, intel_dp->link_rate,
3706 &link_bw, &rate_select);
3707
3708 /* Write the link configuration data */
3709 link_config[0] = link_bw;
3710 link_config[1] = intel_dp->lane_count;
3711 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
3712 link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
3713 drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET, link_config, 2);
3714 if (intel_dp->num_sink_rates)
3715 drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_RATE_SET,
3716 &rate_select, 1);
3717
3718 link_config[0] = 0;
3719 link_config[1] = DP_SET_ANSI_8B10B;
3720 drm_dp_dpcd_write(&intel_dp->aux, DP_DOWNSPREAD_CTRL, link_config, 2);
3721
3722 DP |= DP_PORT_EN;
3723
3724 /* clock recovery */
3725 if (!intel_dp_reset_link_train(intel_dp, &DP,
3726 DP_TRAINING_PATTERN_1 |
3727 DP_LINK_SCRAMBLING_DISABLE)) {
3728 DRM_ERROR("failed to enable link training\n");
3729 return;
3730 }
3731
3732 voltage = 0xff;
3733 voltage_tries = 0;
3734 loop_tries = 0;
3735 for (;;) {
3736 uint8_t link_status[DP_LINK_STATUS_SIZE];
3737
3738 drm_dp_link_train_clock_recovery_delay(intel_dp->dpcd);
3739 if (!intel_dp_get_link_status(intel_dp, link_status)) {
3740 DRM_ERROR("failed to get link status\n");
3741 break;
3742 }
3743
3744 if (drm_dp_clock_recovery_ok(link_status, intel_dp->lane_count)) {
3745 DRM_DEBUG_KMS("clock recovery OK\n");
3746 break;
3747 }
3748
3749 /*
3750 * if we used previously trained voltage and pre-emphasis values
3751 * and we don't get clock recovery, reset link training values
3752 */
3753 if (intel_dp->train_set_valid) {
3754 DRM_DEBUG_KMS("clock recovery not ok, reset");
3755 /* clear the flag as we are not reusing train set */
3756 intel_dp->train_set_valid = false;
3757 if (!intel_dp_reset_link_train(intel_dp, &DP,
3758 DP_TRAINING_PATTERN_1 |
3759 DP_LINK_SCRAMBLING_DISABLE)) {
3760 DRM_ERROR("failed to enable link training\n");
3761 return;
3762 }
3763 continue;
3764 }
3765
3766 /* Check to see if we've tried the max voltage */
3767 for (i = 0; i < intel_dp->lane_count; i++)
3768 if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)
3769 break;
3770 if (i == intel_dp->lane_count) {
3771 ++loop_tries;
3772 if (loop_tries == 5) {
3773 DRM_ERROR("too many full retries, give up\n");
3774 break;
3775 }
3776 intel_dp_reset_link_train(intel_dp, &DP,
3777 DP_TRAINING_PATTERN_1 |
3778 DP_LINK_SCRAMBLING_DISABLE);
3779 voltage_tries = 0;
3780 continue;
3781 }
3782
3783 /* Check to see if we've tried the same voltage 5 times */
3784 if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) {
3785 ++voltage_tries;
3786 if (voltage_tries == 5) {
3787 DRM_ERROR("too many voltage retries, give up\n");
3788 break;
3789 }
3790 } else
3791 voltage_tries = 0;
3792 voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
3793
3794 /* Update training set as requested by target */
3795 if (!intel_dp_update_link_train(intel_dp, &DP, link_status)) {
3796 DRM_ERROR("failed to update link training\n");
3797 break;
3798 }
3799 }
3800
3801 intel_dp->DP = DP;
3802}
3803
3804static void
3805intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
3806{
3807 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
3808 struct drm_device *dev = dig_port->base.base.dev;
3809 bool channel_eq = false;
3810 int tries, cr_tries;
3811 uint32_t DP = intel_dp->DP;
3812 uint32_t training_pattern = DP_TRAINING_PATTERN_2;
3813
3814 /*
3815 * Training Pattern 3 for HBR2 or 1.2 devices that support it.
3816 *
3817 * Intel platforms that support HBR2 also support TPS3. TPS3 support is
3818 * also mandatory for downstream devices that support HBR2.
3819 *
3820 * Due to WaDisableHBR2 SKL < B0 is the only exception where TPS3 is
3821 * supported but still not enabled.
3822 */
3823 if (intel_dp_source_supports_hbr2(dev) &&
3824 drm_dp_tps3_supported(intel_dp->dpcd))
3825 training_pattern = DP_TRAINING_PATTERN_3;
3826 else if (intel_dp->link_rate == 540000)
3827 DRM_ERROR("5.4 Gbps link rate without HBR2/TPS3 support\n");
3828
3829 /* channel equalization */
3830 if (!intel_dp_set_link_train(intel_dp, &DP,
3831 training_pattern |
3832 DP_LINK_SCRAMBLING_DISABLE)) {
3833 DRM_ERROR("failed to start channel equalization\n");
3834 return;
3835 }
3836
3837 tries = 0;
3838 cr_tries = 0;
3839 channel_eq = false;
3840 for (;;) {
3841 uint8_t link_status[DP_LINK_STATUS_SIZE];
3842
3843 if (cr_tries > 5) {
3844 DRM_ERROR("failed to train DP, aborting\n");
3845 break;
3846 }
3847
3848 drm_dp_link_train_channel_eq_delay(intel_dp->dpcd);
3849 if (!intel_dp_get_link_status(intel_dp, link_status)) {
3850 DRM_ERROR("failed to get link status\n");
3851 break;
3852 }
3853
3854 /* Make sure clock is still ok */
3855 if (!drm_dp_clock_recovery_ok(link_status,
3856 intel_dp->lane_count)) {
3857 intel_dp->train_set_valid = false;
3858 intel_dp_link_training_clock_recovery(intel_dp);
3859 intel_dp_set_link_train(intel_dp, &DP,
3860 training_pattern |
3861 DP_LINK_SCRAMBLING_DISABLE);
3862 cr_tries++;
3863 continue;
3864 }
3865
3866 if (drm_dp_channel_eq_ok(link_status,
3867 intel_dp->lane_count)) {
3868 channel_eq = true;
3869 break;
3870 }
3871
3872 /* Try 5 times, then try clock recovery if that fails */
3873 if (tries > 5) {
3874 intel_dp->train_set_valid = false;
3875 intel_dp_link_training_clock_recovery(intel_dp);
3876 intel_dp_set_link_train(intel_dp, &DP,
3877 training_pattern |
3878 DP_LINK_SCRAMBLING_DISABLE);
3879 tries = 0;
3880 cr_tries++;
3881 continue;
3882 }
3883
3884 /* Update training set as requested by target */
3885 if (!intel_dp_update_link_train(intel_dp, &DP, link_status)) {
3886 DRM_ERROR("failed to update link training\n");
3887 break;
3888 }
3889 ++tries;
3890 }
3891
3892 intel_dp_set_idle_link_train(intel_dp);
3893
3894 intel_dp->DP = DP;
3895
3896 if (channel_eq) {
3897 intel_dp->train_set_valid = true;
3898 DRM_DEBUG_KMS("Channel EQ done. DP Training successful\n");
3899 }
3900}
3901
3902void intel_dp_stop_link_train(struct intel_dp *intel_dp)
3903{
3904 intel_dp_set_link_train(intel_dp, &intel_dp->DP,
3905 DP_TRAINING_PATTERN_DISABLE);
3906}
3907
3908void
3909intel_dp_start_link_train(struct intel_dp *intel_dp)
3910{
3911 intel_dp_link_training_clock_recovery(intel_dp);
3912 intel_dp_link_training_channel_equalization(intel_dp);
3913}
3914
3915static void 3750static void
3916intel_dp_link_down(struct intel_dp *intel_dp) 3751intel_dp_link_down(struct intel_dp *intel_dp)
3917{ 3752{
@@ -3954,6 +3789,13 @@ intel_dp_link_down(struct intel_dp *intel_dp)
3954 * matching HDMI port to be enabled on transcoder A. 3789 * matching HDMI port to be enabled on transcoder A.
3955 */ 3790 */
3956 if (HAS_PCH_IBX(dev) && crtc->pipe == PIPE_B && port != PORT_A) { 3791 if (HAS_PCH_IBX(dev) && crtc->pipe == PIPE_B && port != PORT_A) {
3792 /*
3793 * We get CPU/PCH FIFO underruns on the other pipe when
3794 * doing the workaround. Sweep them under the rug.
3795 */
3796 intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, false);
3797 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);
3798
3957 /* always enable with pattern 1 (as per spec) */ 3799 /* always enable with pattern 1 (as per spec) */
3958 DP &= ~(DP_PIPEB_SELECT | DP_LINK_TRAIN_MASK); 3800 DP &= ~(DP_PIPEB_SELECT | DP_LINK_TRAIN_MASK);
3959 DP |= DP_PORT_EN | DP_LINK_TRAIN_PAT_1; 3801 DP |= DP_PORT_EN | DP_LINK_TRAIN_PAT_1;
@@ -3963,9 +3805,15 @@ intel_dp_link_down(struct intel_dp *intel_dp)
3963 DP &= ~DP_PORT_EN; 3805 DP &= ~DP_PORT_EN;
3964 I915_WRITE(intel_dp->output_reg, DP); 3806 I915_WRITE(intel_dp->output_reg, DP);
3965 POSTING_READ(intel_dp->output_reg); 3807 POSTING_READ(intel_dp->output_reg);
3808
3809 intel_wait_for_vblank_if_active(dev_priv->dev, PIPE_A);
3810 intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true);
3811 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true);
3966 } 3812 }
3967 3813
3968 msleep(intel_dp->panel_power_down_delay); 3814 msleep(intel_dp->panel_power_down_delay);
3815
3816 intel_dp->DP = DP;
3969} 3817}
3970 3818
3971static bool 3819static bool
@@ -4013,7 +3861,7 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
4013 } 3861 }
4014 3862
4015 DRM_DEBUG_KMS("Display Port TPS3 support: source %s, sink %s\n", 3863 DRM_DEBUG_KMS("Display Port TPS3 support: source %s, sink %s\n",
4016 yesno(intel_dp_source_supports_hbr2(dev)), 3864 yesno(intel_dp_source_supports_hbr2(intel_dp)),
4017 yesno(drm_dp_tps3_supported(intel_dp->dpcd))); 3865 yesno(drm_dp_tps3_supported(intel_dp->dpcd)));
4018 3866
4019 /* Intermediate frequency support */ 3867 /* Intermediate frequency support */
@@ -4103,9 +3951,12 @@ intel_dp_probe_mst(struct intel_dp *intel_dp)
4103static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp) 3951static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp)
4104{ 3952{
4105 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 3953 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
3954 struct drm_device *dev = dig_port->base.base.dev;
4106 struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc); 3955 struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc);
4107 u8 buf; 3956 u8 buf;
4108 int ret = 0; 3957 int ret = 0;
3958 int count = 0;
3959 int attempts = 10;
4109 3960
4110 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0) { 3961 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0) {
4111 DRM_DEBUG_KMS("Sink CRC couldn't be stopped properly\n"); 3962 DRM_DEBUG_KMS("Sink CRC couldn't be stopped properly\n");
@@ -4120,7 +3971,22 @@ static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp)
4120 goto out; 3971 goto out;
4121 } 3972 }
4122 3973
4123 intel_dp->sink_crc.started = false; 3974 do {
3975 intel_wait_for_vblank(dev, intel_crtc->pipe);
3976
3977 if (drm_dp_dpcd_readb(&intel_dp->aux,
3978 DP_TEST_SINK_MISC, &buf) < 0) {
3979 ret = -EIO;
3980 goto out;
3981 }
3982 count = buf & DP_TEST_COUNT_MASK;
3983 } while (--attempts && count);
3984
3985 if (attempts == 0) {
3986 DRM_ERROR("TIMEOUT: Sink CRC counter is not zeroed\n");
3987 ret = -ETIMEDOUT;
3988 }
3989
4124 out: 3990 out:
4125 hsw_enable_ips(intel_crtc); 3991 hsw_enable_ips(intel_crtc);
4126 return ret; 3992 return ret;
@@ -4129,27 +3995,26 @@ static int intel_dp_sink_crc_stop(struct intel_dp *intel_dp)
4129static int intel_dp_sink_crc_start(struct intel_dp *intel_dp) 3995static int intel_dp_sink_crc_start(struct intel_dp *intel_dp)
4130{ 3996{
4131 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 3997 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
3998 struct drm_device *dev = dig_port->base.base.dev;
4132 struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc); 3999 struct intel_crtc *intel_crtc = to_intel_crtc(dig_port->base.base.crtc);
4133 u8 buf; 4000 u8 buf;
4134 int ret; 4001 int ret;
4135 4002
4136 if (intel_dp->sink_crc.started) {
4137 ret = intel_dp_sink_crc_stop(intel_dp);
4138 if (ret)
4139 return ret;
4140 }
4141
4142 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0) 4003 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0)
4143 return -EIO; 4004 return -EIO;
4144 4005
4145 if (!(buf & DP_TEST_CRC_SUPPORTED)) 4006 if (!(buf & DP_TEST_CRC_SUPPORTED))
4146 return -ENOTTY; 4007 return -ENOTTY;
4147 4008
4148 intel_dp->sink_crc.last_count = buf & DP_TEST_COUNT_MASK;
4149
4150 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0) 4009 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0)
4151 return -EIO; 4010 return -EIO;
4152 4011
4012 if (buf & DP_TEST_SINK_START) {
4013 ret = intel_dp_sink_crc_stop(intel_dp);
4014 if (ret)
4015 return ret;
4016 }
4017
4153 hsw_disable_ips(intel_crtc); 4018 hsw_disable_ips(intel_crtc);
4154 4019
4155 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK, 4020 if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
@@ -4158,7 +4023,7 @@ static int intel_dp_sink_crc_start(struct intel_dp *intel_dp)
4158 return -EIO; 4023 return -EIO;
4159 } 4024 }
4160 4025
4161 intel_dp->sink_crc.started = true; 4026 intel_wait_for_vblank(dev, intel_crtc->pipe);
4162 return 0; 4027 return 0;
4163} 4028}
4164 4029
@@ -4170,7 +4035,6 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
4170 u8 buf; 4035 u8 buf;
4171 int count, ret; 4036 int count, ret;
4172 int attempts = 6; 4037 int attempts = 6;
4173 bool old_equal_new;
4174 4038
4175 ret = intel_dp_sink_crc_start(intel_dp); 4039 ret = intel_dp_sink_crc_start(intel_dp);
4176 if (ret) 4040 if (ret)
@@ -4186,35 +4050,17 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
4186 } 4050 }
4187 count = buf & DP_TEST_COUNT_MASK; 4051 count = buf & DP_TEST_COUNT_MASK;
4188 4052
4189 /* 4053 } while (--attempts && count == 0);
4190 * Count might be reset during the loop. In this case
4191 * last known count needs to be reset as well.
4192 */
4193 if (count == 0)
4194 intel_dp->sink_crc.last_count = 0;
4195
4196 if (drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_CRC_R_CR, crc, 6) < 0) {
4197 ret = -EIO;
4198 goto stop;
4199 }
4200
4201 old_equal_new = (count == intel_dp->sink_crc.last_count &&
4202 !memcmp(intel_dp->sink_crc.last_crc, crc,
4203 6 * sizeof(u8)));
4204
4205 } while (--attempts && (count == 0 || old_equal_new));
4206
4207 intel_dp->sink_crc.last_count = buf & DP_TEST_COUNT_MASK;
4208 memcpy(intel_dp->sink_crc.last_crc, crc, 6 * sizeof(u8));
4209 4054
4210 if (attempts == 0) { 4055 if (attempts == 0) {
4211 if (old_equal_new) { 4056 DRM_ERROR("Panel is unable to calculate any CRC after 6 vblanks\n");
4212 DRM_DEBUG_KMS("Unreliable Sink CRC counter: Current returned CRC is identical to the previous one\n"); 4057 ret = -ETIMEDOUT;
4213 } else { 4058 goto stop;
4214 DRM_ERROR("Panel is unable to calculate any CRC after 6 vblanks\n"); 4059 }
4215 ret = -ETIMEDOUT; 4060
4216 goto stop; 4061 if (drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_CRC_R_CR, crc, 6) < 0) {
4217 } 4062 ret = -EIO;
4063 goto stop;
4218 } 4064 }
4219 4065
4220stop: 4066stop:
@@ -4314,13 +4160,6 @@ static void intel_dp_handle_test_request(struct intel_dp *intel_dp)
4314 uint8_t rxdata = 0; 4160 uint8_t rxdata = 0;
4315 int status = 0; 4161 int status = 0;
4316 4162
4317 intel_dp->compliance_test_active = 0;
4318 intel_dp->compliance_test_type = 0;
4319 intel_dp->compliance_test_data = 0;
4320
4321 intel_dp->aux.i2c_nack_count = 0;
4322 intel_dp->aux.i2c_defer_count = 0;
4323
4324 status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_REQUEST, &rxdata, 1); 4163 status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_REQUEST, &rxdata, 1);
4325 if (status <= 0) { 4164 if (status <= 0) {
4326 DRM_DEBUG_KMS("Could not read test request from sink\n"); 4165 DRM_DEBUG_KMS("Could not read test request from sink\n");
@@ -4436,6 +4275,14 @@ intel_dp_check_link_status(struct intel_dp *intel_dp)
4436 4275
4437 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); 4276 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
4438 4277
4278 /*
4279 * Clearing compliance test variables to allow capturing
4280 * of values for next automated test request.
4281 */
4282 intel_dp->compliance_test_active = 0;
4283 intel_dp->compliance_test_type = 0;
4284 intel_dp->compliance_test_data = 0;
4285
4439 if (!intel_encoder->base.crtc) 4286 if (!intel_encoder->base.crtc)
4440 return; 4287 return;
4441 4288
@@ -4466,7 +4313,9 @@ intel_dp_check_link_status(struct intel_dp *intel_dp)
4466 DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n"); 4313 DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n");
4467 } 4314 }
4468 4315
4469 if (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count)) { 4316 /* if link training is requested we should perform it always */
4317 if ((intel_dp->compliance_test_type == DP_TEST_LINK_TRAINING) ||
4318 (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count))) {
4470 DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n", 4319 DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n",
4471 intel_encoder->base.name); 4320 intel_encoder->base.name);
4472 intel_dp_start_link_train(intel_dp); 4321 intel_dp_start_link_train(intel_dp);
@@ -4684,41 +4533,6 @@ bool intel_digital_port_connected(struct drm_i915_private *dev_priv,
4684 return g4x_digital_port_connected(dev_priv, port); 4533 return g4x_digital_port_connected(dev_priv, port);
4685} 4534}
4686 4535
4687static enum drm_connector_status
4688ironlake_dp_detect(struct intel_dp *intel_dp)
4689{
4690 struct drm_device *dev = intel_dp_to_dev(intel_dp);
4691 struct drm_i915_private *dev_priv = dev->dev_private;
4692 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4693
4694 if (!intel_digital_port_connected(dev_priv, intel_dig_port))
4695 return connector_status_disconnected;
4696
4697 return intel_dp_detect_dpcd(intel_dp);
4698}
4699
4700static enum drm_connector_status
4701g4x_dp_detect(struct intel_dp *intel_dp)
4702{
4703 struct drm_device *dev = intel_dp_to_dev(intel_dp);
4704 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4705
4706 /* Can't disconnect eDP, but you can close the lid... */
4707 if (is_edp(intel_dp)) {
4708 enum drm_connector_status status;
4709
4710 status = intel_panel_detect(dev);
4711 if (status == connector_status_unknown)
4712 status = connector_status_connected;
4713 return status;
4714 }
4715
4716 if (!intel_digital_port_connected(dev->dev_private, intel_dig_port))
4717 return connector_status_disconnected;
4718
4719 return intel_dp_detect_dpcd(intel_dp);
4720}
4721
4722static struct edid * 4536static struct edid *
4723intel_dp_get_edid(struct intel_dp *intel_dp) 4537intel_dp_get_edid(struct intel_dp *intel_dp)
4724{ 4538{
@@ -4791,12 +4605,19 @@ intel_dp_detect(struct drm_connector *connector, bool force)
4791 /* Can't disconnect eDP, but you can close the lid... */ 4605 /* Can't disconnect eDP, but you can close the lid... */
4792 if (is_edp(intel_dp)) 4606 if (is_edp(intel_dp))
4793 status = edp_detect(intel_dp); 4607 status = edp_detect(intel_dp);
4794 else if (HAS_PCH_SPLIT(dev)) 4608 else if (intel_digital_port_connected(to_i915(dev),
4795 status = ironlake_dp_detect(intel_dp); 4609 dp_to_dig_port(intel_dp)))
4610 status = intel_dp_detect_dpcd(intel_dp);
4796 else 4611 else
4797 status = g4x_dp_detect(intel_dp); 4612 status = connector_status_disconnected;
4798 if (status != connector_status_connected) 4613
4614 if (status != connector_status_connected) {
4615 intel_dp->compliance_test_active = 0;
4616 intel_dp->compliance_test_type = 0;
4617 intel_dp->compliance_test_data = 0;
4618
4799 goto out; 4619 goto out;
4620 }
4800 4621
4801 intel_dp_probe_oui(intel_dp); 4622 intel_dp_probe_oui(intel_dp);
4802 4623
@@ -4810,6 +4631,14 @@ intel_dp_detect(struct drm_connector *connector, bool force)
4810 goto out; 4631 goto out;
4811 } 4632 }
4812 4633
4634 /*
4635 * Clearing NACK and defer counts to get their exact values
4636 * while reading EDID which are required by Compliance tests
4637 * 4.2.2.4 and 4.2.2.5
4638 */
4639 intel_dp->aux.i2c_nack_count = 0;
4640 intel_dp->aux.i2c_defer_count = 0;
4641
4813 intel_dp_set_edid(intel_dp); 4642 intel_dp_set_edid(intel_dp);
4814 4643
4815 if (intel_encoder->type != INTEL_OUTPUT_EDP) 4644 if (intel_encoder->type != INTEL_OUTPUT_EDP)
@@ -5014,7 +4843,7 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
5014 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); 4843 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
5015 struct intel_dp *intel_dp = &intel_dig_port->dp; 4844 struct intel_dp *intel_dp = &intel_dig_port->dp;
5016 4845
5017 drm_dp_aux_unregister(&intel_dp->aux); 4846 intel_dp_aux_fini(intel_dp);
5018 intel_dp_mst_encoder_cleanup(intel_dig_port); 4847 intel_dp_mst_encoder_cleanup(intel_dig_port);
5019 if (is_edp(intel_dp)) { 4848 if (is_edp(intel_dp)) {
5020 cancel_delayed_work_sync(&intel_dp->panel_vdd_work); 4849 cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
@@ -5204,25 +5033,6 @@ put_power:
5204 return ret; 5033 return ret;
5205} 5034}
5206 5035
5207/* Return which DP Port should be selected for Transcoder DP control */
5208int
5209intel_trans_dp_port_sel(struct drm_crtc *crtc)
5210{
5211 struct drm_device *dev = crtc->dev;
5212 struct intel_encoder *intel_encoder;
5213 struct intel_dp *intel_dp;
5214
5215 for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
5216 intel_dp = enc_to_intel_dp(&intel_encoder->base);
5217
5218 if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
5219 intel_encoder->type == INTEL_OUTPUT_EDP)
5220 return intel_dp->output_reg;
5221 }
5222
5223 return -1;
5224}
5225
5226/* check the VBT to see whether the eDP is on another port */ 5036/* check the VBT to see whether the eDP is on another port */
5227bool intel_dp_is_edp(struct drm_device *dev, enum port port) 5037bool intel_dp_is_edp(struct drm_device *dev, enum port port)
5228{ 5038{
@@ -5294,7 +5104,7 @@ intel_dp_init_panel_power_sequencer(struct drm_device *dev,
5294 struct edp_power_seq cur, vbt, spec, 5104 struct edp_power_seq cur, vbt, spec,
5295 *final = &intel_dp->pps_delays; 5105 *final = &intel_dp->pps_delays;
5296 u32 pp_on, pp_off, pp_div = 0, pp_ctl = 0; 5106 u32 pp_on, pp_off, pp_div = 0, pp_ctl = 0;
5297 int pp_ctrl_reg, pp_on_reg, pp_off_reg, pp_div_reg = 0; 5107 i915_reg_t pp_ctrl_reg, pp_on_reg, pp_off_reg, pp_div_reg;
5298 5108
5299 lockdep_assert_held(&dev_priv->pps_mutex); 5109 lockdep_assert_held(&dev_priv->pps_mutex);
5300 5110
@@ -5416,7 +5226,7 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev,
5416 struct drm_i915_private *dev_priv = dev->dev_private; 5226 struct drm_i915_private *dev_priv = dev->dev_private;
5417 u32 pp_on, pp_off, pp_div, port_sel = 0; 5227 u32 pp_on, pp_off, pp_div, port_sel = 0;
5418 int div = HAS_PCH_SPLIT(dev) ? intel_pch_rawclk(dev) : intel_hrawclk(dev); 5228 int div = HAS_PCH_SPLIT(dev) ? intel_pch_rawclk(dev) : intel_hrawclk(dev);
5419 int pp_on_reg, pp_off_reg, pp_div_reg = 0, pp_ctrl_reg; 5229 i915_reg_t pp_on_reg, pp_off_reg, pp_div_reg, pp_ctrl_reg;
5420 enum port port = dp_to_dig_port(intel_dp)->port; 5230 enum port port = dp_to_dig_port(intel_dp)->port;
5421 const struct edp_power_seq *seq = &intel_dp->pps_delays; 5231 const struct edp_power_seq *seq = &intel_dp->pps_delays;
5422 5232
@@ -5578,7 +5388,7 @@ static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate)
5578 DRM_ERROR("Unsupported refreshrate type\n"); 5388 DRM_ERROR("Unsupported refreshrate type\n");
5579 } 5389 }
5580 } else if (INTEL_INFO(dev)->gen > 6) { 5390 } else if (INTEL_INFO(dev)->gen > 6) {
5581 u32 reg = PIPECONF(intel_crtc->config->cpu_transcoder); 5391 i915_reg_t reg = PIPECONF(intel_crtc->config->cpu_transcoder);
5582 u32 val; 5392 u32 val;
5583 5393
5584 val = I915_READ(reg); 5394 val = I915_READ(reg);
@@ -5996,7 +5806,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
5996 struct drm_device *dev = intel_encoder->base.dev; 5806 struct drm_device *dev = intel_encoder->base.dev;
5997 struct drm_i915_private *dev_priv = dev->dev_private; 5807 struct drm_i915_private *dev_priv = dev->dev_private;
5998 enum port port = intel_dig_port->port; 5808 enum port port = intel_dig_port->port;
5999 int type; 5809 int type, ret;
6000 5810
6001 intel_dp->pps_pipe = INVALID_PIPE; 5811 intel_dp->pps_pipe = INVALID_PIPE;
6002 5812
@@ -6017,6 +5827,9 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
6017 else 5827 else
6018 intel_dp->get_aux_send_ctl = i9xx_get_aux_send_ctl; 5828 intel_dp->get_aux_send_ctl = i9xx_get_aux_send_ctl;
6019 5829
5830 if (HAS_DDI(dev))
5831 intel_dp->prepare_link_retrain = intel_ddi_prepare_link_retrain;
5832
6020 /* Preserve the current hw state. */ 5833 /* Preserve the current hw state. */
6021 intel_dp->DP = I915_READ(intel_dp->output_reg); 5834 intel_dp->DP = I915_READ(intel_dp->output_reg);
6022 intel_dp->attached_connector = intel_connector; 5835 intel_dp->attached_connector = intel_connector;
@@ -6068,7 +5881,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
6068 break; 5881 break;
6069 case PORT_B: 5882 case PORT_B:
6070 intel_encoder->hpd_pin = HPD_PORT_B; 5883 intel_encoder->hpd_pin = HPD_PORT_B;
6071 if (IS_BROXTON(dev_priv) && (INTEL_REVID(dev) < BXT_REVID_B0)) 5884 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1))
6072 intel_encoder->hpd_pin = HPD_PORT_A; 5885 intel_encoder->hpd_pin = HPD_PORT_A;
6073 break; 5886 break;
6074 case PORT_C: 5887 case PORT_C:
@@ -6094,7 +5907,9 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
6094 pps_unlock(intel_dp); 5907 pps_unlock(intel_dp);
6095 } 5908 }
6096 5909
6097 intel_dp_aux_init(intel_dp, intel_connector); 5910 ret = intel_dp_aux_init(intel_dp, intel_connector);
5911 if (ret)
5912 goto fail;
6098 5913
6099 /* init MST on ports that can support it */ 5914 /* init MST on ports that can support it */
6100 if (HAS_DP_MST(dev) && 5915 if (HAS_DP_MST(dev) &&
@@ -6103,20 +5918,9 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
6103 intel_connector->base.base.id); 5918 intel_connector->base.base.id);
6104 5919
6105 if (!intel_edp_init_connector(intel_dp, intel_connector)) { 5920 if (!intel_edp_init_connector(intel_dp, intel_connector)) {
6106 drm_dp_aux_unregister(&intel_dp->aux); 5921 intel_dp_aux_fini(intel_dp);
6107 if (is_edp(intel_dp)) { 5922 intel_dp_mst_encoder_cleanup(intel_dig_port);
6108 cancel_delayed_work_sync(&intel_dp->panel_vdd_work); 5923 goto fail;
6109 /*
6110 * vdd might still be enabled do to the delayed vdd off.
6111 * Make sure vdd is actually turned off here.
6112 */
6113 pps_lock(intel_dp);
6114 edp_panel_vdd_off_sync(intel_dp);
6115 pps_unlock(intel_dp);
6116 }
6117 drm_connector_unregister(connector);
6118 drm_connector_cleanup(connector);
6119 return false;
6120 } 5924 }
6121 5925
6122 intel_dp_add_properties(intel_dp, connector); 5926 intel_dp_add_properties(intel_dp, connector);
@@ -6133,10 +5937,27 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
6133 i915_debugfs_connector_add(connector); 5937 i915_debugfs_connector_add(connector);
6134 5938
6135 return true; 5939 return true;
5940
5941fail:
5942 if (is_edp(intel_dp)) {
5943 cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
5944 /*
5945 * vdd might still be enabled do to the delayed vdd off.
5946 * Make sure vdd is actually turned off here.
5947 */
5948 pps_lock(intel_dp);
5949 edp_panel_vdd_off_sync(intel_dp);
5950 pps_unlock(intel_dp);
5951 }
5952 drm_connector_unregister(connector);
5953 drm_connector_cleanup(connector);
5954
5955 return false;
6136} 5956}
6137 5957
6138void 5958void
6139intel_dp_init(struct drm_device *dev, int output_reg, enum port port) 5959intel_dp_init(struct drm_device *dev,
5960 i915_reg_t output_reg, enum port port)
6140{ 5961{
6141 struct drm_i915_private *dev_priv = dev->dev_private; 5962 struct drm_i915_private *dev_priv = dev->dev_private;
6142 struct intel_digital_port *intel_dig_port; 5963 struct intel_digital_port *intel_dig_port;
@@ -6182,6 +6003,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
6182 } 6003 }
6183 6004
6184 intel_dig_port->port = port; 6005 intel_dig_port->port = port;
6006 dev_priv->dig_port_map[port] = intel_encoder;
6185 intel_dig_port->dp.output_reg = output_reg; 6007 intel_dig_port->dp.output_reg = output_reg;
6186 6008
6187 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT; 6009 intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
diff --git a/drivers/gpu/drm/i915/intel_dp_link_training.c b/drivers/gpu/drm/i915/intel_dp_link_training.c
new file mode 100644
index 000000000000..88887938e0bf
--- /dev/null
+++ b/drivers/gpu/drm/i915/intel_dp_link_training.c
@@ -0,0 +1,323 @@
1/*
2 * Copyright © 2008-2015 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24#include "intel_drv.h"
25
26static void
27intel_get_adjust_train(struct intel_dp *intel_dp,
28 const uint8_t link_status[DP_LINK_STATUS_SIZE])
29{
30 uint8_t v = 0;
31 uint8_t p = 0;
32 int lane;
33 uint8_t voltage_max;
34 uint8_t preemph_max;
35
36 for (lane = 0; lane < intel_dp->lane_count; lane++) {
37 uint8_t this_v = drm_dp_get_adjust_request_voltage(link_status, lane);
38 uint8_t this_p = drm_dp_get_adjust_request_pre_emphasis(link_status, lane);
39
40 if (this_v > v)
41 v = this_v;
42 if (this_p > p)
43 p = this_p;
44 }
45
46 voltage_max = intel_dp_voltage_max(intel_dp);
47 if (v >= voltage_max)
48 v = voltage_max | DP_TRAIN_MAX_SWING_REACHED;
49
50 preemph_max = intel_dp_pre_emphasis_max(intel_dp, v);
51 if (p >= preemph_max)
52 p = preemph_max | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
53
54 for (lane = 0; lane < 4; lane++)
55 intel_dp->train_set[lane] = v | p;
56}
57
58static bool
59intel_dp_set_link_train(struct intel_dp *intel_dp,
60 uint8_t dp_train_pat)
61{
62 uint8_t buf[sizeof(intel_dp->train_set) + 1];
63 int ret, len;
64
65 intel_dp_program_link_training_pattern(intel_dp, dp_train_pat);
66
67 buf[0] = dp_train_pat;
68 if ((dp_train_pat & DP_TRAINING_PATTERN_MASK) ==
69 DP_TRAINING_PATTERN_DISABLE) {
70 /* don't write DP_TRAINING_LANEx_SET on disable */
71 len = 1;
72 } else {
73 /* DP_TRAINING_LANEx_SET follow DP_TRAINING_PATTERN_SET */
74 memcpy(buf + 1, intel_dp->train_set, intel_dp->lane_count);
75 len = intel_dp->lane_count + 1;
76 }
77
78 ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_PATTERN_SET,
79 buf, len);
80
81 return ret == len;
82}
83
84static bool
85intel_dp_reset_link_train(struct intel_dp *intel_dp,
86 uint8_t dp_train_pat)
87{
88 if (!intel_dp->train_set_valid)
89 memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set));
90 intel_dp_set_signal_levels(intel_dp);
91 return intel_dp_set_link_train(intel_dp, dp_train_pat);
92}
93
94static bool
95intel_dp_update_link_train(struct intel_dp *intel_dp)
96{
97 int ret;
98
99 intel_dp_set_signal_levels(intel_dp);
100
101 ret = drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_LANE0_SET,
102 intel_dp->train_set, intel_dp->lane_count);
103
104 return ret == intel_dp->lane_count;
105}
106
107/* Enable corresponding port and start training pattern 1 */
108static void
109intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp)
110{
111 int i;
112 uint8_t voltage;
113 int voltage_tries, loop_tries;
114 uint8_t link_config[2];
115 uint8_t link_bw, rate_select;
116
117 if (intel_dp->prepare_link_retrain)
118 intel_dp->prepare_link_retrain(intel_dp);
119
120 intel_dp_compute_rate(intel_dp, intel_dp->link_rate,
121 &link_bw, &rate_select);
122
123 /* Write the link configuration data */
124 link_config[0] = link_bw;
125 link_config[1] = intel_dp->lane_count;
126 if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
127 link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
128 drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET, link_config, 2);
129 if (intel_dp->num_sink_rates)
130 drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_RATE_SET,
131 &rate_select, 1);
132
133 link_config[0] = 0;
134 link_config[1] = DP_SET_ANSI_8B10B;
135 drm_dp_dpcd_write(&intel_dp->aux, DP_DOWNSPREAD_CTRL, link_config, 2);
136
137 intel_dp->DP |= DP_PORT_EN;
138
139 /* clock recovery */
140 if (!intel_dp_reset_link_train(intel_dp,
141 DP_TRAINING_PATTERN_1 |
142 DP_LINK_SCRAMBLING_DISABLE)) {
143 DRM_ERROR("failed to enable link training\n");
144 return;
145 }
146
147 voltage = 0xff;
148 voltage_tries = 0;
149 loop_tries = 0;
150 for (;;) {
151 uint8_t link_status[DP_LINK_STATUS_SIZE];
152
153 drm_dp_link_train_clock_recovery_delay(intel_dp->dpcd);
154 if (!intel_dp_get_link_status(intel_dp, link_status)) {
155 DRM_ERROR("failed to get link status\n");
156 break;
157 }
158
159 if (drm_dp_clock_recovery_ok(link_status, intel_dp->lane_count)) {
160 DRM_DEBUG_KMS("clock recovery OK\n");
161 break;
162 }
163
164 /*
165 * if we used previously trained voltage and pre-emphasis values
166 * and we don't get clock recovery, reset link training values
167 */
168 if (intel_dp->train_set_valid) {
169 DRM_DEBUG_KMS("clock recovery not ok, reset");
170 /* clear the flag as we are not reusing train set */
171 intel_dp->train_set_valid = false;
172 if (!intel_dp_reset_link_train(intel_dp,
173 DP_TRAINING_PATTERN_1 |
174 DP_LINK_SCRAMBLING_DISABLE)) {
175 DRM_ERROR("failed to enable link training\n");
176 return;
177 }
178 continue;
179 }
180
181 /* Check to see if we've tried the max voltage */
182 for (i = 0; i < intel_dp->lane_count; i++)
183 if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)
184 break;
185 if (i == intel_dp->lane_count) {
186 ++loop_tries;
187 if (loop_tries == 5) {
188 DRM_ERROR("too many full retries, give up\n");
189 break;
190 }
191 intel_dp_reset_link_train(intel_dp,
192 DP_TRAINING_PATTERN_1 |
193 DP_LINK_SCRAMBLING_DISABLE);
194 voltage_tries = 0;
195 continue;
196 }
197
198 /* Check to see if we've tried the same voltage 5 times */
199 if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) {
200 ++voltage_tries;
201 if (voltage_tries == 5) {
202 DRM_ERROR("too many voltage retries, give up\n");
203 break;
204 }
205 } else
206 voltage_tries = 0;
207 voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
208
209 /* Update training set as requested by target */
210 intel_get_adjust_train(intel_dp, link_status);
211 if (!intel_dp_update_link_train(intel_dp)) {
212 DRM_ERROR("failed to update link training\n");
213 break;
214 }
215 }
216}
217
218static void
219intel_dp_link_training_channel_equalization(struct intel_dp *intel_dp)
220{
221 bool channel_eq = false;
222 int tries, cr_tries;
223 uint32_t training_pattern = DP_TRAINING_PATTERN_2;
224
225 /*
226 * Training Pattern 3 for HBR2 or 1.2 devices that support it.
227 *
228 * Intel platforms that support HBR2 also support TPS3. TPS3 support is
229 * also mandatory for downstream devices that support HBR2.
230 *
231 * Due to WaDisableHBR2 SKL < B0 is the only exception where TPS3 is
232 * supported but still not enabled.
233 */
234 if (intel_dp_source_supports_hbr2(intel_dp) &&
235 drm_dp_tps3_supported(intel_dp->dpcd))
236 training_pattern = DP_TRAINING_PATTERN_3;
237 else if (intel_dp->link_rate == 540000)
238 DRM_ERROR("5.4 Gbps link rate without HBR2/TPS3 support\n");
239
240 /* channel equalization */
241 if (!intel_dp_set_link_train(intel_dp,
242 training_pattern |
243 DP_LINK_SCRAMBLING_DISABLE)) {
244 DRM_ERROR("failed to start channel equalization\n");
245 return;
246 }
247
248 tries = 0;
249 cr_tries = 0;
250 channel_eq = false;
251 for (;;) {
252 uint8_t link_status[DP_LINK_STATUS_SIZE];
253
254 if (cr_tries > 5) {
255 DRM_ERROR("failed to train DP, aborting\n");
256 break;
257 }
258
259 drm_dp_link_train_channel_eq_delay(intel_dp->dpcd);
260 if (!intel_dp_get_link_status(intel_dp, link_status)) {
261 DRM_ERROR("failed to get link status\n");
262 break;
263 }
264
265 /* Make sure clock is still ok */
266 if (!drm_dp_clock_recovery_ok(link_status,
267 intel_dp->lane_count)) {
268 intel_dp->train_set_valid = false;
269 intel_dp_link_training_clock_recovery(intel_dp);
270 intel_dp_set_link_train(intel_dp,
271 training_pattern |
272 DP_LINK_SCRAMBLING_DISABLE);
273 cr_tries++;
274 continue;
275 }
276
277 if (drm_dp_channel_eq_ok(link_status,
278 intel_dp->lane_count)) {
279 channel_eq = true;
280 break;
281 }
282
283 /* Try 5 times, then try clock recovery if that fails */
284 if (tries > 5) {
285 intel_dp->train_set_valid = false;
286 intel_dp_link_training_clock_recovery(intel_dp);
287 intel_dp_set_link_train(intel_dp,
288 training_pattern |
289 DP_LINK_SCRAMBLING_DISABLE);
290 tries = 0;
291 cr_tries++;
292 continue;
293 }
294
295 /* Update training set as requested by target */
296 intel_get_adjust_train(intel_dp, link_status);
297 if (!intel_dp_update_link_train(intel_dp)) {
298 DRM_ERROR("failed to update link training\n");
299 break;
300 }
301 ++tries;
302 }
303
304 intel_dp_set_idle_link_train(intel_dp);
305
306 if (channel_eq) {
307 intel_dp->train_set_valid = true;
308 DRM_DEBUG_KMS("Channel EQ done. DP Training successful\n");
309 }
310}
311
312void intel_dp_stop_link_train(struct intel_dp *intel_dp)
313{
314 intel_dp_set_link_train(intel_dp,
315 DP_TRAINING_PATTERN_DISABLE);
316}
317
318void
319intel_dp_start_link_train(struct intel_dp *intel_dp)
320{
321 intel_dp_link_training_clock_recovery(intel_dp);
322 intel_dp_link_training_channel_equalization(intel_dp);
323}
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
index 0639275fc471..8c4e7dfe304c 100644
--- a/drivers/gpu/drm/i915/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/intel_dp_mst.c
@@ -173,20 +173,14 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder)
173 intel_mst->port = found->port; 173 intel_mst->port = found->port;
174 174
175 if (intel_dp->active_mst_links == 0) { 175 if (intel_dp->active_mst_links == 0) {
176 enum port port = intel_ddi_get_encoder_port(encoder); 176 intel_ddi_clk_select(encoder, intel_crtc->config);
177 177
178 intel_dp_set_link_params(intel_dp, intel_crtc->config); 178 intel_dp_set_link_params(intel_dp, intel_crtc->config);
179 179
180 /* FIXME: add support for SKL */
181 if (INTEL_INFO(dev)->gen < 9)
182 I915_WRITE(PORT_CLK_SEL(port),
183 intel_crtc->config->ddi_pll_sel);
184
185 intel_ddi_init_dp_buf_reg(&intel_dig_port->base); 180 intel_ddi_init_dp_buf_reg(&intel_dig_port->base);
186 181
187 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON); 182 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
188 183
189
190 intel_dp_start_link_train(intel_dp); 184 intel_dp_start_link_train(intel_dp);
191 intel_dp_stop_link_train(intel_dp); 185 intel_dp_stop_link_train(intel_dp);
192 } 186 }
@@ -414,7 +408,10 @@ static void intel_connector_add_to_fbdev(struct intel_connector *connector)
414{ 408{
415#ifdef CONFIG_DRM_FBDEV_EMULATION 409#ifdef CONFIG_DRM_FBDEV_EMULATION
416 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); 410 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
417 drm_fb_helper_add_one_connector(&dev_priv->fbdev->helper, &connector->base); 411
412 if (dev_priv->fbdev)
413 drm_fb_helper_add_one_connector(&dev_priv->fbdev->helper,
414 &connector->base);
418#endif 415#endif
419} 416}
420 417
@@ -422,7 +419,10 @@ static void intel_connector_remove_from_fbdev(struct intel_connector *connector)
422{ 419{
423#ifdef CONFIG_DRM_FBDEV_EMULATION 420#ifdef CONFIG_DRM_FBDEV_EMULATION
424 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); 421 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
425 drm_fb_helper_remove_one_connector(&dev_priv->fbdev->helper, &connector->base); 422
423 if (dev_priv->fbdev)
424 drm_fb_helper_remove_one_connector(&dev_priv->fbdev->helper,
425 &connector->base);
426#endif 426#endif
427} 427}
428 428
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 0d00f07b7163..86ce3c2ed79a 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -123,8 +123,6 @@ struct intel_framebuffer {
123struct intel_fbdev { 123struct intel_fbdev {
124 struct drm_fb_helper helper; 124 struct drm_fb_helper helper;
125 struct intel_framebuffer *fb; 125 struct intel_framebuffer *fb;
126 struct list_head fbdev_list;
127 struct drm_display_mode *our_mode;
128 int preferred_bpp; 126 int preferred_bpp;
129}; 127};
130 128
@@ -250,6 +248,7 @@ struct intel_atomic_state {
250 unsigned int cdclk; 248 unsigned int cdclk;
251 bool dpll_set; 249 bool dpll_set;
252 struct intel_shared_dpll_config shared_dpll[I915_NUM_PLLS]; 250 struct intel_shared_dpll_config shared_dpll[I915_NUM_PLLS];
251 struct intel_wm_config wm_config;
253}; 252};
254 253
255struct intel_plane_state { 254struct intel_plane_state {
@@ -280,6 +279,9 @@ struct intel_plane_state {
280 int scaler_id; 279 int scaler_id;
281 280
282 struct drm_intel_sprite_colorkey ckey; 281 struct drm_intel_sprite_colorkey ckey;
282
283 /* async flip related structures */
284 struct drm_i915_gem_request *wait_req;
283}; 285};
284 286
285struct intel_initial_plane_config { 287struct intel_initial_plane_config {
@@ -334,6 +336,21 @@ struct intel_crtc_scaler_state {
334/* drm_mode->private_flags */ 336/* drm_mode->private_flags */
335#define I915_MODE_FLAG_INHERITED 1 337#define I915_MODE_FLAG_INHERITED 1
336 338
339struct intel_pipe_wm {
340 struct intel_wm_level wm[5];
341 uint32_t linetime;
342 bool fbc_wm_enabled;
343 bool pipe_enabled;
344 bool sprites_enabled;
345 bool sprites_scaled;
346};
347
348struct skl_pipe_wm {
349 struct skl_wm_level wm[8];
350 struct skl_wm_level trans_wm;
351 uint32_t linetime;
352};
353
337struct intel_crtc_state { 354struct intel_crtc_state {
338 struct drm_crtc_state base; 355 struct drm_crtc_state base;
339 356
@@ -468,6 +485,20 @@ struct intel_crtc_state {
468 485
469 /* w/a for waiting 2 vblanks during crtc enable */ 486 /* w/a for waiting 2 vblanks during crtc enable */
470 enum pipe hsw_workaround_pipe; 487 enum pipe hsw_workaround_pipe;
488
489 /* IVB sprite scaling w/a (WaCxSRDisabledForSpriteScaling:ivb) */
490 bool disable_lp_wm;
491
492 struct {
493 /*
494 * optimal watermarks, programmed post-vblank when this state
495 * is committed
496 */
497 union {
498 struct intel_pipe_wm ilk;
499 struct skl_pipe_wm skl;
500 } optimal;
501 } wm;
471}; 502};
472 503
473struct vlv_wm_state { 504struct vlv_wm_state {
@@ -479,26 +510,12 @@ struct vlv_wm_state {
479 bool cxsr; 510 bool cxsr;
480}; 511};
481 512
482struct intel_pipe_wm {
483 struct intel_wm_level wm[5];
484 uint32_t linetime;
485 bool fbc_wm_enabled;
486 bool pipe_enabled;
487 bool sprites_enabled;
488 bool sprites_scaled;
489};
490
491struct intel_mmio_flip { 513struct intel_mmio_flip {
492 struct work_struct work; 514 struct work_struct work;
493 struct drm_i915_private *i915; 515 struct drm_i915_private *i915;
494 struct drm_i915_gem_request *req; 516 struct drm_i915_gem_request *req;
495 struct intel_crtc *crtc; 517 struct intel_crtc *crtc;
496}; 518 unsigned int rotation;
497
498struct skl_pipe_wm {
499 struct skl_wm_level wm[8];
500 struct skl_wm_level trans_wm;
501 uint32_t linetime;
502}; 519};
503 520
504/* 521/*
@@ -509,13 +526,11 @@ struct skl_pipe_wm {
509 */ 526 */
510struct intel_crtc_atomic_commit { 527struct intel_crtc_atomic_commit {
511 /* Sleepable operations to perform before commit */ 528 /* Sleepable operations to perform before commit */
512 bool wait_for_flips;
513 bool disable_fbc; 529 bool disable_fbc;
514 bool disable_ips; 530 bool disable_ips;
515 bool disable_cxsr; 531 bool disable_cxsr;
516 bool pre_disable_primary; 532 bool pre_disable_primary;
517 bool update_wm_pre, update_wm_post; 533 bool update_wm_pre, update_wm_post;
518 unsigned disabled_planes;
519 534
520 /* Sleepable operations to perform after commit */ 535 /* Sleepable operations to perform after commit */
521 unsigned fb_bits; 536 unsigned fb_bits;
@@ -567,9 +582,10 @@ struct intel_crtc {
567 /* per-pipe watermark state */ 582 /* per-pipe watermark state */
568 struct { 583 struct {
569 /* watermarks currently being used */ 584 /* watermarks currently being used */
570 struct intel_pipe_wm active; 585 union {
571 /* SKL wm values currently in use */ 586 struct intel_pipe_wm ilk;
572 struct skl_pipe_wm skl_active; 587 struct skl_pipe_wm skl;
588 } active;
573 /* allow CxSR on this pipe */ 589 /* allow CxSR on this pipe */
574 bool cxsr_allowed; 590 bool cxsr_allowed;
575 } wm; 591 } wm;
@@ -677,7 +693,7 @@ struct cxsr_latency {
677#define intel_fb_obj(x) (x ? to_intel_framebuffer(x)->obj : NULL) 693#define intel_fb_obj(x) (x ? to_intel_framebuffer(x)->obj : NULL)
678 694
679struct intel_hdmi { 695struct intel_hdmi {
680 u32 hdmi_reg; 696 i915_reg_t hdmi_reg;
681 int ddc_bus; 697 int ddc_bus;
682 bool limited_color_range; 698 bool limited_color_range;
683 bool color_range_auto; 699 bool color_range_auto;
@@ -719,15 +735,10 @@ enum link_m_n_set {
719 M2_N2 735 M2_N2
720}; 736};
721 737
722struct sink_crc {
723 bool started;
724 u8 last_crc[6];
725 int last_count;
726};
727
728struct intel_dp { 738struct intel_dp {
729 uint32_t output_reg; 739 i915_reg_t output_reg;
730 uint32_t aux_ch_ctl_reg; 740 i915_reg_t aux_ch_ctl_reg;
741 i915_reg_t aux_ch_data_reg[5];
731 uint32_t DP; 742 uint32_t DP;
732 int link_rate; 743 int link_rate;
733 uint8_t lane_count; 744 uint8_t lane_count;
@@ -741,7 +752,6 @@ struct intel_dp {
741 /* sink rates as reported by DP_SUPPORTED_LINK_RATES */ 752 /* sink rates as reported by DP_SUPPORTED_LINK_RATES */
742 uint8_t num_sink_rates; 753 uint8_t num_sink_rates;
743 int sink_rates[DP_MAX_SUPPORTED_RATES]; 754 int sink_rates[DP_MAX_SUPPORTED_RATES];
744 struct sink_crc sink_crc;
745 struct drm_dp_aux aux; 755 struct drm_dp_aux aux;
746 uint8_t train_set[4]; 756 uint8_t train_set[4];
747 int panel_power_up_delay; 757 int panel_power_up_delay;
@@ -783,6 +793,10 @@ struct intel_dp {
783 bool has_aux_irq, 793 bool has_aux_irq,
784 int send_bytes, 794 int send_bytes,
785 uint32_t aux_clock_divider); 795 uint32_t aux_clock_divider);
796
797 /* This is called before a link training is starterd */
798 void (*prepare_link_retrain)(struct intel_dp *intel_dp);
799
786 bool train_set_valid; 800 bool train_set_valid;
787 801
788 /* Displayport compliance testing */ 802 /* Displayport compliance testing */
@@ -799,6 +813,8 @@ struct intel_digital_port {
799 struct intel_hdmi hdmi; 813 struct intel_hdmi hdmi;
800 enum irqreturn (*hpd_pulse)(struct intel_digital_port *, bool); 814 enum irqreturn (*hpd_pulse)(struct intel_digital_port *, bool);
801 bool release_cl2_override; 815 bool release_cl2_override;
816 /* for communication with audio component; protected by av_mutex */
817 const struct drm_connector *audio_connector;
802}; 818};
803 819
804struct intel_dp_mst_encoder { 820struct intel_dp_mst_encoder {
@@ -942,7 +958,8 @@ void intel_cpu_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv,
942 enum pipe pipe); 958 enum pipe pipe);
943void intel_pch_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv, 959void intel_pch_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv,
944 enum transcoder pch_transcoder); 960 enum transcoder pch_transcoder);
945void i9xx_check_fifo_underruns(struct drm_i915_private *dev_priv); 961void intel_check_cpu_fifo_underruns(struct drm_i915_private *dev_priv);
962void intel_check_pch_fifo_underruns(struct drm_i915_private *dev_priv);
946 963
947/* i915_irq.c */ 964/* i915_irq.c */
948void gen5_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask); 965void gen5_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask);
@@ -973,6 +990,8 @@ void intel_crt_init(struct drm_device *dev);
973 990
974 991
975/* intel_ddi.c */ 992/* intel_ddi.c */
993void intel_ddi_clk_select(struct intel_encoder *encoder,
994 const struct intel_crtc_state *pipe_config);
976void intel_prepare_ddi(struct drm_device *dev); 995void intel_prepare_ddi(struct drm_device *dev);
977void hsw_fdi_link_train(struct drm_crtc *crtc); 996void hsw_fdi_link_train(struct drm_crtc *crtc);
978void intel_ddi_init(struct drm_device *dev, enum port port); 997void intel_ddi_init(struct drm_device *dev, enum port port);
@@ -987,7 +1006,7 @@ void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc);
987bool intel_ddi_pll_select(struct intel_crtc *crtc, 1006bool intel_ddi_pll_select(struct intel_crtc *crtc,
988 struct intel_crtc_state *crtc_state); 1007 struct intel_crtc_state *crtc_state);
989void intel_ddi_set_pipe_settings(struct drm_crtc *crtc); 1008void intel_ddi_set_pipe_settings(struct drm_crtc *crtc);
990void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder); 1009void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp);
991bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector); 1010bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
992void intel_ddi_fdi_disable(struct drm_crtc *crtc); 1011void intel_ddi_fdi_disable(struct drm_crtc *crtc);
993void intel_ddi_get_config(struct intel_encoder *encoder, 1012void intel_ddi_get_config(struct intel_encoder *encoder,
@@ -1055,6 +1074,15 @@ intel_wait_for_vblank(struct drm_device *dev, int pipe)
1055{ 1074{
1056 drm_wait_one_vblank(dev, pipe); 1075 drm_wait_one_vblank(dev, pipe);
1057} 1076}
1077static inline void
1078intel_wait_for_vblank_if_active(struct drm_device *dev, int pipe)
1079{
1080 const struct intel_crtc *crtc =
1081 to_intel_crtc(intel_get_crtc_for_pipe(dev, pipe));
1082
1083 if (crtc->active)
1084 intel_wait_for_vblank(dev, pipe);
1085}
1058int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp); 1086int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp);
1059void vlv_wait_port_ready(struct drm_i915_private *dev_priv, 1087void vlv_wait_port_ready(struct drm_i915_private *dev_priv,
1060 struct intel_digital_port *dport, 1088 struct intel_digital_port *dport,
@@ -1068,9 +1096,7 @@ void intel_release_load_detect_pipe(struct drm_connector *connector,
1068 struct drm_modeset_acquire_ctx *ctx); 1096 struct drm_modeset_acquire_ctx *ctx);
1069int intel_pin_and_fence_fb_obj(struct drm_plane *plane, 1097int intel_pin_and_fence_fb_obj(struct drm_plane *plane,
1070 struct drm_framebuffer *fb, 1098 struct drm_framebuffer *fb,
1071 const struct drm_plane_state *plane_state, 1099 const struct drm_plane_state *plane_state);
1072 struct intel_engine_cs *pipelined,
1073 struct drm_i915_gem_request **pipelined_request);
1074struct drm_framebuffer * 1100struct drm_framebuffer *
1075__intel_framebuffer_create(struct drm_device *dev, 1101__intel_framebuffer_create(struct drm_device *dev,
1076 struct drm_mode_fb_cmd2 *mode_cmd, 1102 struct drm_mode_fb_cmd2 *mode_cmd,
@@ -1151,7 +1177,10 @@ void broxton_ddi_phy_uninit(struct drm_device *dev);
1151void bxt_enable_dc9(struct drm_i915_private *dev_priv); 1177void bxt_enable_dc9(struct drm_i915_private *dev_priv);
1152void bxt_disable_dc9(struct drm_i915_private *dev_priv); 1178void bxt_disable_dc9(struct drm_i915_private *dev_priv);
1153void skl_init_cdclk(struct drm_i915_private *dev_priv); 1179void skl_init_cdclk(struct drm_i915_private *dev_priv);
1180int skl_sanitize_cdclk(struct drm_i915_private *dev_priv);
1154void skl_uninit_cdclk(struct drm_i915_private *dev_priv); 1181void skl_uninit_cdclk(struct drm_i915_private *dev_priv);
1182void skl_enable_dc6(struct drm_i915_private *dev_priv);
1183void skl_disable_dc6(struct drm_i915_private *dev_priv);
1155void intel_dp_get_m_n(struct intel_crtc *crtc, 1184void intel_dp_get_m_n(struct intel_crtc *crtc,
1156 struct intel_crtc_state *pipe_config); 1185 struct intel_crtc_state *pipe_config);
1157void intel_dp_set_m_n(struct intel_crtc *crtc, enum link_m_n_set m_n); 1186void intel_dp_set_m_n(struct intel_crtc *crtc, enum link_m_n_set m_n);
@@ -1172,31 +1201,26 @@ enum intel_display_power_domain
1172intel_display_port_aux_power_domain(struct intel_encoder *intel_encoder); 1201intel_display_port_aux_power_domain(struct intel_encoder *intel_encoder);
1173void intel_mode_from_pipe_config(struct drm_display_mode *mode, 1202void intel_mode_from_pipe_config(struct drm_display_mode *mode,
1174 struct intel_crtc_state *pipe_config); 1203 struct intel_crtc_state *pipe_config);
1175void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc);
1176void intel_modeset_preclose(struct drm_device *dev, struct drm_file *file); 1204void intel_modeset_preclose(struct drm_device *dev, struct drm_file *file);
1177 1205
1178int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state); 1206int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state);
1179int skl_max_scale(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state); 1207int skl_max_scale(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state);
1180 1208
1181unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane, 1209u32 intel_plane_obj_offset(struct intel_plane *intel_plane,
1182 struct drm_i915_gem_object *obj, 1210 struct drm_i915_gem_object *obj,
1183 unsigned int plane); 1211 unsigned int plane);
1184 1212
1185u32 skl_plane_ctl_format(uint32_t pixel_format); 1213u32 skl_plane_ctl_format(uint32_t pixel_format);
1186u32 skl_plane_ctl_tiling(uint64_t fb_modifier); 1214u32 skl_plane_ctl_tiling(uint64_t fb_modifier);
1187u32 skl_plane_ctl_rotation(unsigned int rotation); 1215u32 skl_plane_ctl_rotation(unsigned int rotation);
1188 1216
1189/* intel_csr.c */ 1217/* intel_csr.c */
1190void intel_csr_ucode_init(struct drm_device *dev); 1218void intel_csr_ucode_init(struct drm_i915_private *);
1191enum csr_state intel_csr_load_status_get(struct drm_i915_private *dev_priv); 1219void intel_csr_load_program(struct drm_i915_private *);
1192void intel_csr_load_status_set(struct drm_i915_private *dev_priv, 1220void intel_csr_ucode_fini(struct drm_i915_private *);
1193 enum csr_state state);
1194void intel_csr_load_program(struct drm_device *dev);
1195void intel_csr_ucode_fini(struct drm_device *dev);
1196void assert_csr_loaded(struct drm_i915_private *dev_priv);
1197 1221
1198/* intel_dp.c */ 1222/* intel_dp.c */
1199void intel_dp_init(struct drm_device *dev, int output_reg, enum port port); 1223void intel_dp_init(struct drm_device *dev, i915_reg_t output_reg, enum port port);
1200bool intel_dp_init_connector(struct intel_digital_port *intel_dig_port, 1224bool intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
1201 struct intel_connector *intel_connector); 1225 struct intel_connector *intel_connector);
1202void intel_dp_set_link_params(struct intel_dp *intel_dp, 1226void intel_dp_set_link_params(struct intel_dp *intel_dp,
@@ -1234,6 +1258,22 @@ bool intel_digital_port_connected(struct drm_i915_private *dev_priv,
1234 struct intel_digital_port *port); 1258 struct intel_digital_port *port);
1235void hsw_dp_set_ddi_pll_sel(struct intel_crtc_state *pipe_config); 1259void hsw_dp_set_ddi_pll_sel(struct intel_crtc_state *pipe_config);
1236 1260
1261void
1262intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
1263 uint8_t dp_train_pat);
1264void
1265intel_dp_set_signal_levels(struct intel_dp *intel_dp);
1266void intel_dp_set_idle_link_train(struct intel_dp *intel_dp);
1267uint8_t
1268intel_dp_voltage_max(struct intel_dp *intel_dp);
1269uint8_t
1270intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing);
1271void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock,
1272 uint8_t *link_bw, uint8_t *rate_select);
1273bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp);
1274bool
1275intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE]);
1276
1237/* intel_dp_mst.c */ 1277/* intel_dp_mst.c */
1238int intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_id); 1278int intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_id);
1239void intel_dp_mst_encoder_cleanup(struct intel_digital_port *intel_dig_port); 1279void intel_dp_mst_encoder_cleanup(struct intel_digital_port *intel_dig_port);
@@ -1248,7 +1288,7 @@ void intel_dvo_init(struct drm_device *dev);
1248/* legacy fbdev emulation in intel_fbdev.c */ 1288/* legacy fbdev emulation in intel_fbdev.c */
1249#ifdef CONFIG_DRM_FBDEV_EMULATION 1289#ifdef CONFIG_DRM_FBDEV_EMULATION
1250extern int intel_fbdev_init(struct drm_device *dev); 1290extern int intel_fbdev_init(struct drm_device *dev);
1251extern void intel_fbdev_initial_config(void *data, async_cookie_t cookie); 1291extern void intel_fbdev_initial_config_async(struct drm_device *dev);
1252extern void intel_fbdev_fini(struct drm_device *dev); 1292extern void intel_fbdev_fini(struct drm_device *dev);
1253extern void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous); 1293extern void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous);
1254extern void intel_fbdev_output_poll_changed(struct drm_device *dev); 1294extern void intel_fbdev_output_poll_changed(struct drm_device *dev);
@@ -1259,7 +1299,7 @@ static inline int intel_fbdev_init(struct drm_device *dev)
1259 return 0; 1299 return 0;
1260} 1300}
1261 1301
1262static inline void intel_fbdev_initial_config(void *data, async_cookie_t cookie) 1302static inline void intel_fbdev_initial_config_async(struct drm_device *dev)
1263{ 1303{
1264} 1304}
1265 1305
@@ -1287,11 +1327,10 @@ void intel_fbc_invalidate(struct drm_i915_private *dev_priv,
1287 enum fb_op_origin origin); 1327 enum fb_op_origin origin);
1288void intel_fbc_flush(struct drm_i915_private *dev_priv, 1328void intel_fbc_flush(struct drm_i915_private *dev_priv,
1289 unsigned int frontbuffer_bits, enum fb_op_origin origin); 1329 unsigned int frontbuffer_bits, enum fb_op_origin origin);
1290const char *intel_no_fbc_reason_str(enum no_fbc_reason reason);
1291void intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv); 1330void intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv);
1292 1331
1293/* intel_hdmi.c */ 1332/* intel_hdmi.c */
1294void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port); 1333void intel_hdmi_init(struct drm_device *dev, i915_reg_t hdmi_reg, enum port port);
1295void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, 1334void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
1296 struct intel_connector *intel_connector); 1335 struct intel_connector *intel_connector);
1297struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder); 1336struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder);
@@ -1367,7 +1406,10 @@ void intel_psr_single_frame_update(struct drm_device *dev,
1367/* intel_runtime_pm.c */ 1406/* intel_runtime_pm.c */
1368int intel_power_domains_init(struct drm_i915_private *); 1407int intel_power_domains_init(struct drm_i915_private *);
1369void intel_power_domains_fini(struct drm_i915_private *); 1408void intel_power_domains_fini(struct drm_i915_private *);
1370void intel_power_domains_init_hw(struct drm_i915_private *dev_priv); 1409void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume);
1410void intel_power_domains_suspend(struct drm_i915_private *dev_priv);
1411void skl_pw1_misc_io_init(struct drm_i915_private *dev_priv);
1412void skl_pw1_misc_io_fini(struct drm_i915_private *dev_priv);
1371void intel_runtime_pm_enable(struct drm_i915_private *dev_priv); 1413void intel_runtime_pm_enable(struct drm_i915_private *dev_priv);
1372 1414
1373bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv, 1415bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
@@ -1395,12 +1437,6 @@ void intel_init_clock_gating(struct drm_device *dev);
1395void intel_suspend_hw(struct drm_device *dev); 1437void intel_suspend_hw(struct drm_device *dev);
1396int ilk_wm_max_level(const struct drm_device *dev); 1438int ilk_wm_max_level(const struct drm_device *dev);
1397void intel_update_watermarks(struct drm_crtc *crtc); 1439void intel_update_watermarks(struct drm_crtc *crtc);
1398void intel_update_sprite_watermarks(struct drm_plane *plane,
1399 struct drm_crtc *crtc,
1400 uint32_t sprite_width,
1401 uint32_t sprite_height,
1402 int pixel_size,
1403 bool enabled, bool scaled);
1404void intel_init_pm(struct drm_device *dev); 1440void intel_init_pm(struct drm_device *dev);
1405void intel_pm_setup(struct drm_device *dev); 1441void intel_pm_setup(struct drm_device *dev);
1406void intel_gpu_ips_init(struct drm_i915_private *dev_priv); 1442void intel_gpu_ips_init(struct drm_i915_private *dev_priv);
@@ -1428,7 +1464,8 @@ void skl_ddb_get_hw_state(struct drm_i915_private *dev_priv,
1428uint32_t ilk_pipe_pixel_rate(const struct intel_crtc_state *pipe_config); 1464uint32_t ilk_pipe_pixel_rate(const struct intel_crtc_state *pipe_config);
1429 1465
1430/* intel_sdvo.c */ 1466/* intel_sdvo.c */
1431bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob); 1467bool intel_sdvo_init(struct drm_device *dev,
1468 i915_reg_t reg, enum port port);
1432 1469
1433 1470
1434/* intel_sprite.c */ 1471/* intel_sprite.c */
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index 170ae6f4866e..efb5a27dd49c 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -60,7 +60,8 @@ static void wait_for_dsi_fifo_empty(struct intel_dsi *intel_dsi, enum port port)
60 DRM_ERROR("DPI FIFOs are not empty\n"); 60 DRM_ERROR("DPI FIFOs are not empty\n");
61} 61}
62 62
63static void write_data(struct drm_i915_private *dev_priv, u32 reg, 63static void write_data(struct drm_i915_private *dev_priv,
64 i915_reg_t reg,
64 const u8 *data, u32 len) 65 const u8 *data, u32 len)
65{ 66{
66 u32 i, j; 67 u32 i, j;
@@ -75,7 +76,8 @@ static void write_data(struct drm_i915_private *dev_priv, u32 reg,
75 } 76 }
76} 77}
77 78
78static void read_data(struct drm_i915_private *dev_priv, u32 reg, 79static void read_data(struct drm_i915_private *dev_priv,
80 i915_reg_t reg,
79 u8 *data, u32 len) 81 u8 *data, u32 len)
80{ 82{
81 u32 i, j; 83 u32 i, j;
@@ -98,7 +100,8 @@ static ssize_t intel_dsi_host_transfer(struct mipi_dsi_host *host,
98 struct mipi_dsi_packet packet; 100 struct mipi_dsi_packet packet;
99 ssize_t ret; 101 ssize_t ret;
100 const u8 *header, *data; 102 const u8 *header, *data;
101 u32 data_reg, data_mask, ctrl_reg, ctrl_mask; 103 i915_reg_t data_reg, ctrl_reg;
104 u32 data_mask, ctrl_mask;
102 105
103 ret = mipi_dsi_create_packet(&packet, msg); 106 ret = mipi_dsi_create_packet(&packet, msg);
104 if (ret < 0) 107 if (ret < 0)
@@ -377,10 +380,10 @@ static void intel_dsi_port_enable(struct intel_encoder *encoder)
377 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc); 380 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
378 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); 381 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
379 enum port port; 382 enum port port;
380 u32 temp;
381 u32 port_ctrl;
382 383
383 if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK) { 384 if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK) {
385 u32 temp;
386
384 temp = I915_READ(VLV_CHICKEN_3); 387 temp = I915_READ(VLV_CHICKEN_3);
385 temp &= ~PIXEL_OVERLAP_CNT_MASK | 388 temp &= ~PIXEL_OVERLAP_CNT_MASK |
386 intel_dsi->pixel_overlap << 389 intel_dsi->pixel_overlap <<
@@ -389,8 +392,9 @@ static void intel_dsi_port_enable(struct intel_encoder *encoder)
389 } 392 }
390 393
391 for_each_dsi_port(port, intel_dsi->ports) { 394 for_each_dsi_port(port, intel_dsi->ports) {
392 port_ctrl = IS_BROXTON(dev) ? BXT_MIPI_PORT_CTRL(port) : 395 i915_reg_t port_ctrl = IS_BROXTON(dev) ?
393 MIPI_PORT_CTRL(port); 396 BXT_MIPI_PORT_CTRL(port) : MIPI_PORT_CTRL(port);
397 u32 temp;
394 398
395 temp = I915_READ(port_ctrl); 399 temp = I915_READ(port_ctrl);
396 400
@@ -416,13 +420,13 @@ static void intel_dsi_port_disable(struct intel_encoder *encoder)
416 struct drm_i915_private *dev_priv = dev->dev_private; 420 struct drm_i915_private *dev_priv = dev->dev_private;
417 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); 421 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
418 enum port port; 422 enum port port;
419 u32 temp;
420 u32 port_ctrl;
421 423
422 for_each_dsi_port(port, intel_dsi->ports) { 424 for_each_dsi_port(port, intel_dsi->ports) {
425 i915_reg_t port_ctrl = IS_BROXTON(dev) ?
426 BXT_MIPI_PORT_CTRL(port) : MIPI_PORT_CTRL(port);
427 u32 temp;
428
423 /* de-assert ip_tg_enable signal */ 429 /* de-assert ip_tg_enable signal */
424 port_ctrl = IS_BROXTON(dev) ? BXT_MIPI_PORT_CTRL(port) :
425 MIPI_PORT_CTRL(port);
426 temp = I915_READ(port_ctrl); 430 temp = I915_READ(port_ctrl);
427 I915_WRITE(port_ctrl, temp & ~DPI_ENABLE); 431 I915_WRITE(port_ctrl, temp & ~DPI_ENABLE);
428 POSTING_READ(port_ctrl); 432 POSTING_READ(port_ctrl);
@@ -580,11 +584,13 @@ static void intel_dsi_clear_device_ready(struct intel_encoder *encoder)
580 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; 584 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
581 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); 585 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
582 enum port port; 586 enum port port;
583 u32 val;
584 u32 port_ctrl = 0;
585 587
586 DRM_DEBUG_KMS("\n"); 588 DRM_DEBUG_KMS("\n");
587 for_each_dsi_port(port, intel_dsi->ports) { 589 for_each_dsi_port(port, intel_dsi->ports) {
590 /* Common bit for both MIPI Port A & MIPI Port C on VLV/CHV */
591 i915_reg_t port_ctrl = IS_BROXTON(dev) ?
592 BXT_MIPI_PORT_CTRL(port) : MIPI_PORT_CTRL(PORT_A);
593 u32 val;
588 594
589 I915_WRITE(MIPI_DEVICE_READY(port), DEVICE_READY | 595 I915_WRITE(MIPI_DEVICE_READY(port), DEVICE_READY |
590 ULPS_STATE_ENTER); 596 ULPS_STATE_ENTER);
@@ -598,12 +604,6 @@ static void intel_dsi_clear_device_ready(struct intel_encoder *encoder)
598 ULPS_STATE_ENTER); 604 ULPS_STATE_ENTER);
599 usleep_range(2000, 2500); 605 usleep_range(2000, 2500);
600 606
601 if (IS_BROXTON(dev))
602 port_ctrl = BXT_MIPI_PORT_CTRL(port);
603 else if (IS_VALLEYVIEW(dev))
604 /* Common bit for both MIPI Port A & MIPI Port C */
605 port_ctrl = MIPI_PORT_CTRL(PORT_A);
606
607 /* Wait till Clock lanes are in LP-00 state for MIPI Port A 607 /* Wait till Clock lanes are in LP-00 state for MIPI Port A
608 * only. MIPI Port C has no similar bit for checking 608 * only. MIPI Port C has no similar bit for checking
609 */ 609 */
@@ -656,7 +656,6 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,
656 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); 656 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
657 struct drm_device *dev = encoder->base.dev; 657 struct drm_device *dev = encoder->base.dev;
658 enum intel_display_power_domain power_domain; 658 enum intel_display_power_domain power_domain;
659 u32 dpi_enabled, func, ctrl_reg;
660 enum port port; 659 enum port port;
661 660
662 DRM_DEBUG_KMS("\n"); 661 DRM_DEBUG_KMS("\n");
@@ -667,9 +666,11 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,
667 666
668 /* XXX: this only works for one DSI output */ 667 /* XXX: this only works for one DSI output */
669 for_each_dsi_port(port, intel_dsi->ports) { 668 for_each_dsi_port(port, intel_dsi->ports) {
669 i915_reg_t ctrl_reg = IS_BROXTON(dev) ?
670 BXT_MIPI_PORT_CTRL(port) : MIPI_PORT_CTRL(port);
671 u32 dpi_enabled, func;
672
670 func = I915_READ(MIPI_DSI_FUNC_PRG(port)); 673 func = I915_READ(MIPI_DSI_FUNC_PRG(port));
671 ctrl_reg = IS_BROXTON(dev) ? BXT_MIPI_PORT_CTRL(port) :
672 MIPI_PORT_CTRL(port);
673 dpi_enabled = I915_READ(ctrl_reg) & DPI_ENABLE; 674 dpi_enabled = I915_READ(ctrl_reg) & DPI_ENABLE;
674 675
675 /* Due to some hardware limitations on BYT, MIPI Port C DPI 676 /* Due to some hardware limitations on BYT, MIPI Port C DPI
diff --git a/drivers/gpu/drm/i915/intel_dsi.h b/drivers/gpu/drm/i915/intel_dsi.h
index e6cb25239941..02551ff228c2 100644
--- a/drivers/gpu/drm/i915/intel_dsi.h
+++ b/drivers/gpu/drm/i915/intel_dsi.h
@@ -117,7 +117,7 @@ static inline struct intel_dsi_host *to_intel_dsi_host(struct mipi_dsi_host *h)
117 117
118#define for_each_dsi_port(__port, __ports_mask) \ 118#define for_each_dsi_port(__port, __ports_mask) \
119 for ((__port) = PORT_A; (__port) < I915_MAX_PORTS; (__port)++) \ 119 for ((__port) = PORT_A; (__port) < I915_MAX_PORTS; (__port)++) \
120 if ((__ports_mask) & (1 << (__port))) 120 for_each_if ((__ports_mask) & (1 << (__port)))
121 121
122static inline struct intel_dsi *enc_to_intel_dsi(struct drm_encoder *encoder) 122static inline struct intel_dsi *enc_to_intel_dsi(struct drm_encoder *encoder)
123{ 123{
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
index 8492053e0ff0..7161deb2aed8 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -44,6 +44,7 @@ static const struct intel_dvo_device intel_dvo_devices[] = {
44 .type = INTEL_DVO_CHIP_TMDS, 44 .type = INTEL_DVO_CHIP_TMDS,
45 .name = "sil164", 45 .name = "sil164",
46 .dvo_reg = DVOC, 46 .dvo_reg = DVOC,
47 .dvo_srcdim_reg = DVOC_SRCDIM,
47 .slave_addr = SIL164_ADDR, 48 .slave_addr = SIL164_ADDR,
48 .dev_ops = &sil164_ops, 49 .dev_ops = &sil164_ops,
49 }, 50 },
@@ -51,6 +52,7 @@ static const struct intel_dvo_device intel_dvo_devices[] = {
51 .type = INTEL_DVO_CHIP_TMDS, 52 .type = INTEL_DVO_CHIP_TMDS,
52 .name = "ch7xxx", 53 .name = "ch7xxx",
53 .dvo_reg = DVOC, 54 .dvo_reg = DVOC,
55 .dvo_srcdim_reg = DVOC_SRCDIM,
54 .slave_addr = CH7xxx_ADDR, 56 .slave_addr = CH7xxx_ADDR,
55 .dev_ops = &ch7xxx_ops, 57 .dev_ops = &ch7xxx_ops,
56 }, 58 },
@@ -58,6 +60,7 @@ static const struct intel_dvo_device intel_dvo_devices[] = {
58 .type = INTEL_DVO_CHIP_TMDS, 60 .type = INTEL_DVO_CHIP_TMDS,
59 .name = "ch7xxx", 61 .name = "ch7xxx",
60 .dvo_reg = DVOC, 62 .dvo_reg = DVOC,
63 .dvo_srcdim_reg = DVOC_SRCDIM,
61 .slave_addr = 0x75, /* For some ch7010 */ 64 .slave_addr = 0x75, /* For some ch7010 */
62 .dev_ops = &ch7xxx_ops, 65 .dev_ops = &ch7xxx_ops,
63 }, 66 },
@@ -65,6 +68,7 @@ static const struct intel_dvo_device intel_dvo_devices[] = {
65 .type = INTEL_DVO_CHIP_LVDS, 68 .type = INTEL_DVO_CHIP_LVDS,
66 .name = "ivch", 69 .name = "ivch",
67 .dvo_reg = DVOA, 70 .dvo_reg = DVOA,
71 .dvo_srcdim_reg = DVOA_SRCDIM,
68 .slave_addr = 0x02, /* Might also be 0x44, 0x84, 0xc4 */ 72 .slave_addr = 0x02, /* Might also be 0x44, 0x84, 0xc4 */
69 .dev_ops = &ivch_ops, 73 .dev_ops = &ivch_ops,
70 }, 74 },
@@ -72,6 +76,7 @@ static const struct intel_dvo_device intel_dvo_devices[] = {
72 .type = INTEL_DVO_CHIP_TMDS, 76 .type = INTEL_DVO_CHIP_TMDS,
73 .name = "tfp410", 77 .name = "tfp410",
74 .dvo_reg = DVOC, 78 .dvo_reg = DVOC,
79 .dvo_srcdim_reg = DVOC_SRCDIM,
75 .slave_addr = TFP410_ADDR, 80 .slave_addr = TFP410_ADDR,
76 .dev_ops = &tfp410_ops, 81 .dev_ops = &tfp410_ops,
77 }, 82 },
@@ -79,6 +84,7 @@ static const struct intel_dvo_device intel_dvo_devices[] = {
79 .type = INTEL_DVO_CHIP_LVDS, 84 .type = INTEL_DVO_CHIP_LVDS,
80 .name = "ch7017", 85 .name = "ch7017",
81 .dvo_reg = DVOC, 86 .dvo_reg = DVOC,
87 .dvo_srcdim_reg = DVOC_SRCDIM,
82 .slave_addr = 0x75, 88 .slave_addr = 0x75,
83 .gpio = GMBUS_PIN_DPB, 89 .gpio = GMBUS_PIN_DPB,
84 .dev_ops = &ch7017_ops, 90 .dev_ops = &ch7017_ops,
@@ -87,6 +93,7 @@ static const struct intel_dvo_device intel_dvo_devices[] = {
87 .type = INTEL_DVO_CHIP_TMDS, 93 .type = INTEL_DVO_CHIP_TMDS,
88 .name = "ns2501", 94 .name = "ns2501",
89 .dvo_reg = DVOB, 95 .dvo_reg = DVOB,
96 .dvo_srcdim_reg = DVOB_SRCDIM,
90 .slave_addr = NS2501_ADDR, 97 .slave_addr = NS2501_ADDR,
91 .dev_ops = &ns2501_ops, 98 .dev_ops = &ns2501_ops,
92 } 99 }
@@ -171,7 +178,7 @@ static void intel_disable_dvo(struct intel_encoder *encoder)
171{ 178{
172 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; 179 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
173 struct intel_dvo *intel_dvo = enc_to_dvo(encoder); 180 struct intel_dvo *intel_dvo = enc_to_dvo(encoder);
174 u32 dvo_reg = intel_dvo->dev.dvo_reg; 181 i915_reg_t dvo_reg = intel_dvo->dev.dvo_reg;
175 u32 temp = I915_READ(dvo_reg); 182 u32 temp = I915_READ(dvo_reg);
176 183
177 intel_dvo->dev.dev_ops->dpms(&intel_dvo->dev, false); 184 intel_dvo->dev.dev_ops->dpms(&intel_dvo->dev, false);
@@ -184,7 +191,7 @@ static void intel_enable_dvo(struct intel_encoder *encoder)
184 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; 191 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
185 struct intel_dvo *intel_dvo = enc_to_dvo(encoder); 192 struct intel_dvo *intel_dvo = enc_to_dvo(encoder);
186 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); 193 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
187 u32 dvo_reg = intel_dvo->dev.dvo_reg; 194 i915_reg_t dvo_reg = intel_dvo->dev.dvo_reg;
188 u32 temp = I915_READ(dvo_reg); 195 u32 temp = I915_READ(dvo_reg);
189 196
190 intel_dvo->dev.dev_ops->mode_set(&intel_dvo->dev, 197 intel_dvo->dev.dev_ops->mode_set(&intel_dvo->dev,
@@ -255,20 +262,8 @@ static void intel_dvo_pre_enable(struct intel_encoder *encoder)
255 struct intel_dvo *intel_dvo = enc_to_dvo(encoder); 262 struct intel_dvo *intel_dvo = enc_to_dvo(encoder);
256 int pipe = crtc->pipe; 263 int pipe = crtc->pipe;
257 u32 dvo_val; 264 u32 dvo_val;
258 u32 dvo_reg = intel_dvo->dev.dvo_reg, dvo_srcdim_reg; 265 i915_reg_t dvo_reg = intel_dvo->dev.dvo_reg;
259 266 i915_reg_t dvo_srcdim_reg = intel_dvo->dev.dvo_srcdim_reg;
260 switch (dvo_reg) {
261 case DVOA:
262 default:
263 dvo_srcdim_reg = DVOA_SRCDIM;
264 break;
265 case DVOB:
266 dvo_srcdim_reg = DVOB_SRCDIM;
267 break;
268 case DVOC:
269 dvo_srcdim_reg = DVOC_SRCDIM;
270 break;
271 }
272 267
273 /* Save the data order, since I don't know what it should be set to. */ 268 /* Save the data order, since I don't know what it should be set to. */
274 dvo_val = I915_READ(dvo_reg) & 269 dvo_val = I915_READ(dvo_reg) &
diff --git a/drivers/gpu/drm/i915/intel_fbc.c b/drivers/gpu/drm/i915/intel_fbc.c
index cf47352b7b8e..11fc5281e8ef 100644
--- a/drivers/gpu/drm/i915/intel_fbc.c
+++ b/drivers/gpu/drm/i915/intel_fbc.c
@@ -46,6 +46,11 @@ static inline bool fbc_supported(struct drm_i915_private *dev_priv)
46 return dev_priv->fbc.enable_fbc != NULL; 46 return dev_priv->fbc.enable_fbc != NULL;
47} 47}
48 48
49static inline bool fbc_on_pipe_a_only(struct drm_i915_private *dev_priv)
50{
51 return IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8;
52}
53
49/* 54/*
50 * In some platforms where the CRTC's x:0/y:0 coordinates doesn't match the 55 * In some platforms where the CRTC's x:0/y:0 coordinates doesn't match the
51 * frontbuffer's x:0/y:0 coordinates we lie to the hardware about the plane's 56 * frontbuffer's x:0/y:0 coordinates we lie to the hardware about the plane's
@@ -182,7 +187,8 @@ static bool g4x_fbc_enabled(struct drm_i915_private *dev_priv)
182 return I915_READ(DPFC_CONTROL) & DPFC_CTL_EN; 187 return I915_READ(DPFC_CONTROL) & DPFC_CTL_EN;
183} 188}
184 189
185static void intel_fbc_nuke(struct drm_i915_private *dev_priv) 190/* This function forces a CFB recompression through the nuke operation. */
191static void intel_fbc_recompress(struct drm_i915_private *dev_priv)
186{ 192{
187 I915_WRITE(MSG_FBC_REND_STATE, FBC_REND_NUKE); 193 I915_WRITE(MSG_FBC_REND_STATE, FBC_REND_NUKE);
188 POSTING_READ(MSG_FBC_REND_STATE); 194 POSTING_READ(MSG_FBC_REND_STATE);
@@ -231,7 +237,7 @@ static void ilk_fbc_enable(struct intel_crtc *crtc)
231 I915_WRITE(DPFC_CPU_FENCE_OFFSET, y_offset); 237 I915_WRITE(DPFC_CPU_FENCE_OFFSET, y_offset);
232 } 238 }
233 239
234 intel_fbc_nuke(dev_priv); 240 intel_fbc_recompress(dev_priv);
235 241
236 DRM_DEBUG_KMS("enabled fbc on plane %c\n", plane_name(crtc->plane)); 242 DRM_DEBUG_KMS("enabled fbc on plane %c\n", plane_name(crtc->plane));
237} 243}
@@ -310,7 +316,7 @@ static void gen7_fbc_enable(struct intel_crtc *crtc)
310 SNB_CPU_FENCE_ENABLE | obj->fence_reg); 316 SNB_CPU_FENCE_ENABLE | obj->fence_reg);
311 I915_WRITE(DPFC_CPU_FENCE_OFFSET, get_crtc_fence_y_offset(crtc)); 317 I915_WRITE(DPFC_CPU_FENCE_OFFSET, get_crtc_fence_y_offset(crtc));
312 318
313 intel_fbc_nuke(dev_priv); 319 intel_fbc_recompress(dev_priv);
314 320
315 DRM_DEBUG_KMS("enabled fbc on plane %c\n", plane_name(crtc->plane)); 321 DRM_DEBUG_KMS("enabled fbc on plane %c\n", plane_name(crtc->plane));
316} 322}
@@ -370,8 +376,6 @@ static void intel_fbc_cancel_work(struct drm_i915_private *dev_priv)
370 if (dev_priv->fbc.fbc_work == NULL) 376 if (dev_priv->fbc.fbc_work == NULL)
371 return; 377 return;
372 378
373 DRM_DEBUG_KMS("cancelling pending FBC enable\n");
374
375 /* Synchronisation is provided by struct_mutex and checking of 379 /* Synchronisation is provided by struct_mutex and checking of
376 * dev_priv->fbc.fbc_work, so we can perform the cancellation 380 * dev_priv->fbc.fbc_work, so we can perform the cancellation
377 * entirely asynchronously. 381 * entirely asynchronously.
@@ -432,7 +436,8 @@ static void __intel_fbc_disable(struct drm_i915_private *dev_priv)
432 436
433 intel_fbc_cancel_work(dev_priv); 437 intel_fbc_cancel_work(dev_priv);
434 438
435 dev_priv->fbc.disable_fbc(dev_priv); 439 if (dev_priv->fbc.enabled)
440 dev_priv->fbc.disable_fbc(dev_priv);
436 dev_priv->fbc.crtc = NULL; 441 dev_priv->fbc.crtc = NULL;
437} 442}
438 443
@@ -471,78 +476,45 @@ void intel_fbc_disable_crtc(struct intel_crtc *crtc)
471 mutex_unlock(&dev_priv->fbc.lock); 476 mutex_unlock(&dev_priv->fbc.lock);
472} 477}
473 478
474const char *intel_no_fbc_reason_str(enum no_fbc_reason reason)
475{
476 switch (reason) {
477 case FBC_OK:
478 return "FBC enabled but currently disabled in hardware";
479 case FBC_UNSUPPORTED:
480 return "unsupported by this chipset";
481 case FBC_NO_OUTPUT:
482 return "no output";
483 case FBC_STOLEN_TOO_SMALL:
484 return "not enough stolen memory";
485 case FBC_UNSUPPORTED_MODE:
486 return "mode incompatible with compression";
487 case FBC_MODE_TOO_LARGE:
488 return "mode too large for compression";
489 case FBC_BAD_PLANE:
490 return "FBC unsupported on plane";
491 case FBC_NOT_TILED:
492 return "framebuffer not tiled or fenced";
493 case FBC_MULTIPLE_PIPES:
494 return "more than one pipe active";
495 case FBC_MODULE_PARAM:
496 return "disabled per module param";
497 case FBC_CHIP_DEFAULT:
498 return "disabled per chip default";
499 case FBC_ROTATION:
500 return "rotation unsupported";
501 case FBC_IN_DBG_MASTER:
502 return "Kernel debugger is active";
503 case FBC_BAD_STRIDE:
504 return "framebuffer stride not supported";
505 case FBC_PIXEL_RATE:
506 return "pixel rate is too big";
507 case FBC_PIXEL_FORMAT:
508 return "pixel format is invalid";
509 default:
510 MISSING_CASE(reason);
511 return "unknown reason";
512 }
513}
514
515static void set_no_fbc_reason(struct drm_i915_private *dev_priv, 479static void set_no_fbc_reason(struct drm_i915_private *dev_priv,
516 enum no_fbc_reason reason) 480 const char *reason)
517{ 481{
518 if (dev_priv->fbc.no_fbc_reason == reason) 482 if (dev_priv->fbc.no_fbc_reason == reason)
519 return; 483 return;
520 484
521 dev_priv->fbc.no_fbc_reason = reason; 485 dev_priv->fbc.no_fbc_reason = reason;
522 DRM_DEBUG_KMS("Disabling FBC: %s\n", intel_no_fbc_reason_str(reason)); 486 DRM_DEBUG_KMS("Disabling FBC: %s\n", reason);
487}
488
489static bool crtc_is_valid(struct intel_crtc *crtc)
490{
491 struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
492
493 if (fbc_on_pipe_a_only(dev_priv) && crtc->pipe != PIPE_A)
494 return false;
495
496 if (!intel_crtc_active(&crtc->base))
497 return false;
498
499 if (!to_intel_plane_state(crtc->base.primary->state)->visible)
500 return false;
501
502 return true;
523} 503}
524 504
525static struct drm_crtc *intel_fbc_find_crtc(struct drm_i915_private *dev_priv) 505static struct drm_crtc *intel_fbc_find_crtc(struct drm_i915_private *dev_priv)
526{ 506{
527 struct drm_crtc *crtc = NULL, *tmp_crtc; 507 struct drm_crtc *crtc = NULL, *tmp_crtc;
528 enum pipe pipe; 508 enum pipe pipe;
529 bool pipe_a_only = false;
530
531 if (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)
532 pipe_a_only = true;
533 509
534 for_each_pipe(dev_priv, pipe) { 510 for_each_pipe(dev_priv, pipe) {
535 tmp_crtc = dev_priv->pipe_to_crtc_mapping[pipe]; 511 tmp_crtc = dev_priv->pipe_to_crtc_mapping[pipe];
536 512
537 if (intel_crtc_active(tmp_crtc) && 513 if (crtc_is_valid(to_intel_crtc(tmp_crtc)))
538 to_intel_plane_state(tmp_crtc->primary->state)->visible)
539 crtc = tmp_crtc; 514 crtc = tmp_crtc;
540
541 if (pipe_a_only)
542 break;
543 } 515 }
544 516
545 if (!crtc || crtc->primary->fb == NULL) 517 if (!crtc)
546 return NULL; 518 return NULL;
547 519
548 return crtc; 520 return crtc;
@@ -581,7 +553,8 @@ static int find_compression_threshold(struct drm_i915_private *dev_priv,
581 * reserved range size, so it always assumes the maximum (8mb) is used. 553 * reserved range size, so it always assumes the maximum (8mb) is used.
582 * If we enable FBC using a CFB on that memory range we'll get FIFO 554 * If we enable FBC using a CFB on that memory range we'll get FIFO
583 * underruns, even if that range is not reserved by the BIOS. */ 555 * underruns, even if that range is not reserved by the BIOS. */
584 if (IS_BROADWELL(dev_priv) || IS_SKYLAKE(dev_priv)) 556 if (IS_BROADWELL(dev_priv) ||
557 IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
585 end = dev_priv->gtt.stolen_size - 8 * 1024 * 1024; 558 end = dev_priv->gtt.stolen_size - 8 * 1024 * 1024;
586 else 559 else
587 end = dev_priv->gtt.stolen_usable_size; 560 end = dev_priv->gtt.stolen_usable_size;
@@ -734,6 +707,7 @@ static int intel_fbc_calculate_cfb_size(struct intel_crtc *crtc)
734 if (INTEL_INFO(dev_priv)->gen >= 7) 707 if (INTEL_INFO(dev_priv)->gen >= 7)
735 lines = min(lines, 2048); 708 lines = min(lines, 2048);
736 709
710 /* Hardware needs the full buffer stride, not just the active area. */
737 return lines * fb->pitches[0]; 711 return lines * fb->pitches[0];
738} 712}
739 713
@@ -832,84 +806,62 @@ static bool intel_fbc_hw_tracking_covers_screen(struct intel_crtc *crtc)
832 * __intel_fbc_update - enable/disable FBC as needed, unlocked 806 * __intel_fbc_update - enable/disable FBC as needed, unlocked
833 * @dev_priv: i915 device instance 807 * @dev_priv: i915 device instance
834 * 808 *
835 * Set up the framebuffer compression hardware at mode set time. We 809 * This function completely reevaluates the status of FBC, then enables,
836 * enable it if possible: 810 * disables or maintains it on the same state.
837 * - plane A only (on pre-965)
838 * - no pixel mulitply/line duplication
839 * - no alpha buffer discard
840 * - no dual wide
841 * - framebuffer <= max_hdisplay in width, max_vdisplay in height
842 *
843 * We can't assume that any compression will take place (worst case),
844 * so the compressed buffer has to be the same size as the uncompressed
845 * one. It also must reside (along with the line length buffer) in
846 * stolen memory.
847 *
848 * We need to enable/disable FBC on a global basis.
849 */ 811 */
850static void __intel_fbc_update(struct drm_i915_private *dev_priv) 812static void __intel_fbc_update(struct drm_i915_private *dev_priv)
851{ 813{
852 struct drm_crtc *crtc = NULL; 814 struct drm_crtc *drm_crtc = NULL;
853 struct intel_crtc *intel_crtc; 815 struct intel_crtc *crtc;
854 struct drm_framebuffer *fb; 816 struct drm_framebuffer *fb;
855 struct drm_i915_gem_object *obj; 817 struct drm_i915_gem_object *obj;
856 const struct drm_display_mode *adjusted_mode; 818 const struct drm_display_mode *adjusted_mode;
857 819
858 WARN_ON(!mutex_is_locked(&dev_priv->fbc.lock)); 820 WARN_ON(!mutex_is_locked(&dev_priv->fbc.lock));
859 821
860 /* disable framebuffer compression in vGPU */
861 if (intel_vgpu_active(dev_priv->dev)) 822 if (intel_vgpu_active(dev_priv->dev))
862 i915.enable_fbc = 0; 823 i915.enable_fbc = 0;
863 824
864 if (i915.enable_fbc < 0) { 825 if (i915.enable_fbc < 0) {
865 set_no_fbc_reason(dev_priv, FBC_CHIP_DEFAULT); 826 set_no_fbc_reason(dev_priv, "disabled per chip default");
866 goto out_disable; 827 goto out_disable;
867 } 828 }
868 829
869 if (!i915.enable_fbc) { 830 if (!i915.enable_fbc) {
870 set_no_fbc_reason(dev_priv, FBC_MODULE_PARAM); 831 set_no_fbc_reason(dev_priv, "disabled per module param");
871 goto out_disable; 832 goto out_disable;
872 } 833 }
873 834
874 /* 835 drm_crtc = intel_fbc_find_crtc(dev_priv);
875 * If FBC is already on, we just have to verify that we can 836 if (!drm_crtc) {
876 * keep it that way... 837 set_no_fbc_reason(dev_priv, "no output");
877 * Need to disable if:
878 * - more than one pipe is active
879 * - changing FBC params (stride, fence, mode)
880 * - new fb is too large to fit in compressed buffer
881 * - going to an unsupported config (interlace, pixel multiply, etc.)
882 */
883 crtc = intel_fbc_find_crtc(dev_priv);
884 if (!crtc) {
885 set_no_fbc_reason(dev_priv, FBC_NO_OUTPUT);
886 goto out_disable; 838 goto out_disable;
887 } 839 }
888 840
889 if (!multiple_pipes_ok(dev_priv)) { 841 if (!multiple_pipes_ok(dev_priv)) {
890 set_no_fbc_reason(dev_priv, FBC_MULTIPLE_PIPES); 842 set_no_fbc_reason(dev_priv, "more than one pipe active");
891 goto out_disable; 843 goto out_disable;
892 } 844 }
893 845
894 intel_crtc = to_intel_crtc(crtc); 846 crtc = to_intel_crtc(drm_crtc);
895 fb = crtc->primary->fb; 847 fb = crtc->base.primary->fb;
896 obj = intel_fb_obj(fb); 848 obj = intel_fb_obj(fb);
897 adjusted_mode = &intel_crtc->config->base.adjusted_mode; 849 adjusted_mode = &crtc->config->base.adjusted_mode;
898 850
899 if ((adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) || 851 if ((adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) ||
900 (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)) { 852 (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)) {
901 set_no_fbc_reason(dev_priv, FBC_UNSUPPORTED_MODE); 853 set_no_fbc_reason(dev_priv, "incompatible mode");
902 goto out_disable; 854 goto out_disable;
903 } 855 }
904 856
905 if (!intel_fbc_hw_tracking_covers_screen(intel_crtc)) { 857 if (!intel_fbc_hw_tracking_covers_screen(crtc)) {
906 set_no_fbc_reason(dev_priv, FBC_MODE_TOO_LARGE); 858 set_no_fbc_reason(dev_priv, "mode too large for compression");
907 goto out_disable; 859 goto out_disable;
908 } 860 }
909 861
910 if ((INTEL_INFO(dev_priv)->gen < 4 || HAS_DDI(dev_priv)) && 862 if ((INTEL_INFO(dev_priv)->gen < 4 || HAS_DDI(dev_priv)) &&
911 intel_crtc->plane != PLANE_A) { 863 crtc->plane != PLANE_A) {
912 set_no_fbc_reason(dev_priv, FBC_BAD_PLANE); 864 set_no_fbc_reason(dev_priv, "FBC unsupported on plane");
913 goto out_disable; 865 goto out_disable;
914 } 866 }
915 867
@@ -918,41 +870,35 @@ static void __intel_fbc_update(struct drm_i915_private *dev_priv)
918 */ 870 */
919 if (obj->tiling_mode != I915_TILING_X || 871 if (obj->tiling_mode != I915_TILING_X ||
920 obj->fence_reg == I915_FENCE_REG_NONE) { 872 obj->fence_reg == I915_FENCE_REG_NONE) {
921 set_no_fbc_reason(dev_priv, FBC_NOT_TILED); 873 set_no_fbc_reason(dev_priv, "framebuffer not tiled or fenced");
922 goto out_disable; 874 goto out_disable;
923 } 875 }
924 if (INTEL_INFO(dev_priv)->gen <= 4 && !IS_G4X(dev_priv) && 876 if (INTEL_INFO(dev_priv)->gen <= 4 && !IS_G4X(dev_priv) &&
925 crtc->primary->state->rotation != BIT(DRM_ROTATE_0)) { 877 crtc->base.primary->state->rotation != BIT(DRM_ROTATE_0)) {
926 set_no_fbc_reason(dev_priv, FBC_ROTATION); 878 set_no_fbc_reason(dev_priv, "rotation unsupported");
927 goto out_disable; 879 goto out_disable;
928 } 880 }
929 881
930 if (!stride_is_valid(dev_priv, fb->pitches[0])) { 882 if (!stride_is_valid(dev_priv, fb->pitches[0])) {
931 set_no_fbc_reason(dev_priv, FBC_BAD_STRIDE); 883 set_no_fbc_reason(dev_priv, "framebuffer stride not supported");
932 goto out_disable; 884 goto out_disable;
933 } 885 }
934 886
935 if (!pixel_format_is_valid(fb)) { 887 if (!pixel_format_is_valid(fb)) {
936 set_no_fbc_reason(dev_priv, FBC_PIXEL_FORMAT); 888 set_no_fbc_reason(dev_priv, "pixel format is invalid");
937 goto out_disable;
938 }
939
940 /* If the kernel debugger is active, always disable compression */
941 if (in_dbg_master()) {
942 set_no_fbc_reason(dev_priv, FBC_IN_DBG_MASTER);
943 goto out_disable; 889 goto out_disable;
944 } 890 }
945 891
946 /* WaFbcExceedCdClockThreshold:hsw,bdw */ 892 /* WaFbcExceedCdClockThreshold:hsw,bdw */
947 if ((IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) && 893 if ((IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) &&
948 ilk_pipe_pixel_rate(intel_crtc->config) >= 894 ilk_pipe_pixel_rate(crtc->config) >=
949 dev_priv->cdclk_freq * 95 / 100) { 895 dev_priv->cdclk_freq * 95 / 100) {
950 set_no_fbc_reason(dev_priv, FBC_PIXEL_RATE); 896 set_no_fbc_reason(dev_priv, "pixel rate is too big");
951 goto out_disable; 897 goto out_disable;
952 } 898 }
953 899
954 if (intel_fbc_setup_cfb(intel_crtc)) { 900 if (intel_fbc_setup_cfb(crtc)) {
955 set_no_fbc_reason(dev_priv, FBC_STOLEN_TOO_SMALL); 901 set_no_fbc_reason(dev_priv, "not enough stolen memory");
956 goto out_disable; 902 goto out_disable;
957 } 903 }
958 904
@@ -961,9 +907,9 @@ static void __intel_fbc_update(struct drm_i915_private *dev_priv)
961 * cannot be unpinned (and have its GTT offset and fence revoked) 907 * cannot be unpinned (and have its GTT offset and fence revoked)
962 * without first being decoupled from the scanout and FBC disabled. 908 * without first being decoupled from the scanout and FBC disabled.
963 */ 909 */
964 if (dev_priv->fbc.crtc == intel_crtc && 910 if (dev_priv->fbc.crtc == crtc &&
965 dev_priv->fbc.fb_id == fb->base.id && 911 dev_priv->fbc.fb_id == fb->base.id &&
966 dev_priv->fbc.y == crtc->y) 912 dev_priv->fbc.y == crtc->base.y)
967 return; 913 return;
968 914
969 if (intel_fbc_enabled(dev_priv)) { 915 if (intel_fbc_enabled(dev_priv)) {
@@ -994,8 +940,8 @@ static void __intel_fbc_update(struct drm_i915_private *dev_priv)
994 __intel_fbc_disable(dev_priv); 940 __intel_fbc_disable(dev_priv);
995 } 941 }
996 942
997 intel_fbc_schedule_enable(intel_crtc); 943 intel_fbc_schedule_enable(crtc);
998 dev_priv->fbc.no_fbc_reason = FBC_OK; 944 dev_priv->fbc.no_fbc_reason = "FBC enabled (not necessarily active)";
999 return; 945 return;
1000 946
1001out_disable: 947out_disable:
@@ -1085,10 +1031,10 @@ void intel_fbc_init(struct drm_i915_private *dev_priv)
1085 enum pipe pipe; 1031 enum pipe pipe;
1086 1032
1087 mutex_init(&dev_priv->fbc.lock); 1033 mutex_init(&dev_priv->fbc.lock);
1034 dev_priv->fbc.enabled = false;
1088 1035
1089 if (!HAS_FBC(dev_priv)) { 1036 if (!HAS_FBC(dev_priv)) {
1090 dev_priv->fbc.enabled = false; 1037 dev_priv->fbc.no_fbc_reason = "unsupported by this chipset";
1091 dev_priv->fbc.no_fbc_reason = FBC_UNSUPPORTED;
1092 return; 1038 return;
1093 } 1039 }
1094 1040
@@ -1096,7 +1042,7 @@ void intel_fbc_init(struct drm_i915_private *dev_priv)
1096 dev_priv->fbc.possible_framebuffer_bits |= 1042 dev_priv->fbc.possible_framebuffer_bits |=
1097 INTEL_FRONTBUFFER_PRIMARY(pipe); 1043 INTEL_FRONTBUFFER_PRIMARY(pipe);
1098 1044
1099 if (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8) 1045 if (fbc_on_pipe_a_only(dev_priv))
1100 break; 1046 break;
1101 } 1047 }
1102 1048
@@ -1121,5 +1067,9 @@ void intel_fbc_init(struct drm_i915_private *dev_priv)
1121 I915_WRITE(FBC_CONTROL, 500 << FBC_CTL_INTERVAL_SHIFT); 1067 I915_WRITE(FBC_CONTROL, 500 << FBC_CTL_INTERVAL_SHIFT);
1122 } 1068 }
1123 1069
1124 dev_priv->fbc.enabled = dev_priv->fbc.fbc_enabled(dev_priv); 1070 /* We still don't have any sort of hardware state readout for FBC, so
1071 * disable it in case the BIOS enabled it to make sure software matches
1072 * the hardware state. */
1073 if (dev_priv->fbc.fbc_enabled(dev_priv))
1074 dev_priv->fbc.disable_fbc(dev_priv);
1125} 1075}
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index 4fd5fdfef6bd..7ccde58f8c98 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -119,7 +119,7 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
119{ 119{
120 struct intel_fbdev *ifbdev = 120 struct intel_fbdev *ifbdev =
121 container_of(helper, struct intel_fbdev, helper); 121 container_of(helper, struct intel_fbdev, helper);
122 struct drm_framebuffer *fb; 122 struct drm_framebuffer *fb = NULL;
123 struct drm_device *dev = helper->dev; 123 struct drm_device *dev = helper->dev;
124 struct drm_i915_private *dev_priv = to_i915(dev); 124 struct drm_i915_private *dev_priv = to_i915(dev);
125 struct drm_mode_fb_cmd2 mode_cmd = {}; 125 struct drm_mode_fb_cmd2 mode_cmd = {};
@@ -138,6 +138,8 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
138 mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, 138 mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
139 sizes->surface_depth); 139 sizes->surface_depth);
140 140
141 mutex_lock(&dev->struct_mutex);
142
141 size = mode_cmd.pitches[0] * mode_cmd.height; 143 size = mode_cmd.pitches[0] * mode_cmd.height;
142 size = PAGE_ALIGN(size); 144 size = PAGE_ALIGN(size);
143 145
@@ -156,26 +158,28 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
156 158
157 fb = __intel_framebuffer_create(dev, &mode_cmd, obj); 159 fb = __intel_framebuffer_create(dev, &mode_cmd, obj);
158 if (IS_ERR(fb)) { 160 if (IS_ERR(fb)) {
161 drm_gem_object_unreference(&obj->base);
159 ret = PTR_ERR(fb); 162 ret = PTR_ERR(fb);
160 goto out_unref; 163 goto out;
161 } 164 }
162 165
163 /* Flush everything out, we'll be doing GTT only from now on */ 166 /* Flush everything out, we'll be doing GTT only from now on */
164 ret = intel_pin_and_fence_fb_obj(NULL, fb, NULL, NULL, NULL); 167 ret = intel_pin_and_fence_fb_obj(NULL, fb, NULL);
165 if (ret) { 168 if (ret) {
166 DRM_ERROR("failed to pin obj: %d\n", ret); 169 DRM_ERROR("failed to pin obj: %d\n", ret);
167 goto out_fb; 170 goto out;
168 } 171 }
169 172
173 mutex_unlock(&dev->struct_mutex);
174
170 ifbdev->fb = to_intel_framebuffer(fb); 175 ifbdev->fb = to_intel_framebuffer(fb);
171 176
172 return 0; 177 return 0;
173 178
174out_fb:
175 drm_framebuffer_remove(fb);
176out_unref:
177 drm_gem_object_unreference(&obj->base);
178out: 179out:
180 mutex_unlock(&dev->struct_mutex);
181 if (!IS_ERR_OR_NULL(fb))
182 drm_framebuffer_unreference(fb);
179 return ret; 183 return ret;
180} 184}
181 185
@@ -193,8 +197,6 @@ static int intelfb_create(struct drm_fb_helper *helper,
193 int size, ret; 197 int size, ret;
194 bool prealloc = false; 198 bool prealloc = false;
195 199
196 mutex_lock(&dev->struct_mutex);
197
198 if (intel_fb && 200 if (intel_fb &&
199 (sizes->fb_width > intel_fb->base.width || 201 (sizes->fb_width > intel_fb->base.width ||
200 sizes->fb_height > intel_fb->base.height)) { 202 sizes->fb_height > intel_fb->base.height)) {
@@ -209,7 +211,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
209 DRM_DEBUG_KMS("no BIOS fb, allocating a new one\n"); 211 DRM_DEBUG_KMS("no BIOS fb, allocating a new one\n");
210 ret = intelfb_alloc(helper, sizes); 212 ret = intelfb_alloc(helper, sizes);
211 if (ret) 213 if (ret)
212 goto out_unlock; 214 return ret;
213 intel_fb = ifbdev->fb; 215 intel_fb = ifbdev->fb;
214 } else { 216 } else {
215 DRM_DEBUG_KMS("re-using BIOS fb\n"); 217 DRM_DEBUG_KMS("re-using BIOS fb\n");
@@ -221,8 +223,11 @@ static int intelfb_create(struct drm_fb_helper *helper,
221 obj = intel_fb->obj; 223 obj = intel_fb->obj;
222 size = obj->base.size; 224 size = obj->base.size;
223 225
226 mutex_lock(&dev->struct_mutex);
227
224 info = drm_fb_helper_alloc_fbi(helper); 228 info = drm_fb_helper_alloc_fbi(helper);
225 if (IS_ERR(info)) { 229 if (IS_ERR(info)) {
230 DRM_ERROR("Failed to allocate fb_info\n");
226 ret = PTR_ERR(info); 231 ret = PTR_ERR(info);
227 goto out_unpin; 232 goto out_unpin;
228 } 233 }
@@ -249,6 +254,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
249 ioremap_wc(dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj), 254 ioremap_wc(dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj),
250 size); 255 size);
251 if (!info->screen_base) { 256 if (!info->screen_base) {
257 DRM_ERROR("Failed to remap framebuffer into virtual memory\n");
252 ret = -ENOSPC; 258 ret = -ENOSPC;
253 goto out_destroy_fbi; 259 goto out_destroy_fbi;
254 } 260 }
@@ -281,8 +287,6 @@ out_destroy_fbi:
281 drm_fb_helper_release_fbi(helper); 287 drm_fb_helper_release_fbi(helper);
282out_unpin: 288out_unpin:
283 i915_gem_object_ggtt_unpin(obj); 289 i915_gem_object_ggtt_unpin(obj);
284 drm_gem_object_unreference(&obj->base);
285out_unlock:
286 mutex_unlock(&dev->struct_mutex); 290 mutex_unlock(&dev->struct_mutex);
287 return ret; 291 return ret;
288} 292}
@@ -526,8 +530,10 @@ static void intel_fbdev_destroy(struct drm_device *dev,
526 530
527 drm_fb_helper_fini(&ifbdev->helper); 531 drm_fb_helper_fini(&ifbdev->helper);
528 532
529 drm_framebuffer_unregister_private(&ifbdev->fb->base); 533 if (ifbdev->fb) {
530 drm_framebuffer_remove(&ifbdev->fb->base); 534 drm_framebuffer_unregister_private(&ifbdev->fb->base);
535 drm_framebuffer_remove(&ifbdev->fb->base);
536 }
531} 537}
532 538
533/* 539/*
@@ -702,13 +708,20 @@ int intel_fbdev_init(struct drm_device *dev)
702 return 0; 708 return 0;
703} 709}
704 710
705void intel_fbdev_initial_config(void *data, async_cookie_t cookie) 711static void intel_fbdev_initial_config(void *data, async_cookie_t cookie)
706{ 712{
707 struct drm_i915_private *dev_priv = data; 713 struct drm_i915_private *dev_priv = data;
708 struct intel_fbdev *ifbdev = dev_priv->fbdev; 714 struct intel_fbdev *ifbdev = dev_priv->fbdev;
709 715
710 /* Due to peculiar init order wrt to hpd handling this is separate. */ 716 /* Due to peculiar init order wrt to hpd handling this is separate. */
711 drm_fb_helper_initial_config(&ifbdev->helper, ifbdev->preferred_bpp); 717 if (drm_fb_helper_initial_config(&ifbdev->helper,
718 ifbdev->preferred_bpp))
719 intel_fbdev_fini(dev_priv->dev);
720}
721
722void intel_fbdev_initial_config_async(struct drm_device *dev)
723{
724 async_schedule(intel_fbdev_initial_config, to_i915(dev));
712} 725}
713 726
714void intel_fbdev_fini(struct drm_device *dev) 727void intel_fbdev_fini(struct drm_device *dev)
@@ -719,7 +732,8 @@ void intel_fbdev_fini(struct drm_device *dev)
719 732
720 flush_work(&dev_priv->fbdev_suspend_work); 733 flush_work(&dev_priv->fbdev_suspend_work);
721 734
722 async_synchronize_full(); 735 if (!current_is_async())
736 async_synchronize_full();
723 intel_fbdev_destroy(dev, dev_priv->fbdev); 737 intel_fbdev_destroy(dev, dev_priv->fbdev);
724 kfree(dev_priv->fbdev); 738 kfree(dev_priv->fbdev);
725 dev_priv->fbdev = NULL; 739 dev_priv->fbdev = NULL;
diff --git a/drivers/gpu/drm/i915/intel_fifo_underrun.c b/drivers/gpu/drm/i915/intel_fifo_underrun.c
index 54daa66c6970..7ae182d0594b 100644
--- a/drivers/gpu/drm/i915/intel_fifo_underrun.c
+++ b/drivers/gpu/drm/i915/intel_fifo_underrun.c
@@ -84,38 +84,21 @@ static bool cpt_can_enable_serr_int(struct drm_device *dev)
84 return true; 84 return true;
85} 85}
86 86
87/** 87static void i9xx_check_fifo_underruns(struct intel_crtc *crtc)
88 * i9xx_check_fifo_underruns - check for fifo underruns
89 * @dev_priv: i915 device instance
90 *
91 * This function checks for fifo underruns on GMCH platforms. This needs to be
92 * done manually on modeset to make sure that we catch all underruns since they
93 * do not generate an interrupt by themselves on these platforms.
94 */
95void i9xx_check_fifo_underruns(struct drm_i915_private *dev_priv)
96{ 88{
97 struct intel_crtc *crtc; 89 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
98 90 i915_reg_t reg = PIPESTAT(crtc->pipe);
99 spin_lock_irq(&dev_priv->irq_lock); 91 u32 pipestat = I915_READ(reg) & 0xffff0000;
100
101 for_each_intel_crtc(dev_priv->dev, crtc) {
102 u32 reg = PIPESTAT(crtc->pipe);
103 u32 pipestat;
104
105 if (crtc->cpu_fifo_underrun_disabled)
106 continue;
107 92
108 pipestat = I915_READ(reg) & 0xffff0000; 93 assert_spin_locked(&dev_priv->irq_lock);
109 if ((pipestat & PIPE_FIFO_UNDERRUN_STATUS) == 0)
110 continue;
111 94
112 I915_WRITE(reg, pipestat | PIPE_FIFO_UNDERRUN_STATUS); 95 if ((pipestat & PIPE_FIFO_UNDERRUN_STATUS) == 0)
113 POSTING_READ(reg); 96 return;
114 97
115 DRM_ERROR("pipe %c underrun\n", pipe_name(crtc->pipe)); 98 I915_WRITE(reg, pipestat | PIPE_FIFO_UNDERRUN_STATUS);
116 } 99 POSTING_READ(reg);
117 100
118 spin_unlock_irq(&dev_priv->irq_lock); 101 DRM_ERROR("pipe %c underrun\n", pipe_name(crtc->pipe));
119} 102}
120 103
121static void i9xx_set_fifo_underrun_reporting(struct drm_device *dev, 104static void i9xx_set_fifo_underrun_reporting(struct drm_device *dev,
@@ -123,7 +106,7 @@ static void i9xx_set_fifo_underrun_reporting(struct drm_device *dev,
123 bool enable, bool old) 106 bool enable, bool old)
124{ 107{
125 struct drm_i915_private *dev_priv = dev->dev_private; 108 struct drm_i915_private *dev_priv = dev->dev_private;
126 u32 reg = PIPESTAT(pipe); 109 i915_reg_t reg = PIPESTAT(pipe);
127 u32 pipestat = I915_READ(reg) & 0xffff0000; 110 u32 pipestat = I915_READ(reg) & 0xffff0000;
128 111
129 assert_spin_locked(&dev_priv->irq_lock); 112 assert_spin_locked(&dev_priv->irq_lock);
@@ -150,6 +133,23 @@ static void ironlake_set_fifo_underrun_reporting(struct drm_device *dev,
150 ironlake_disable_display_irq(dev_priv, bit); 133 ironlake_disable_display_irq(dev_priv, bit);
151} 134}
152 135
136static void ivybridge_check_fifo_underruns(struct intel_crtc *crtc)
137{
138 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
139 enum pipe pipe = crtc->pipe;
140 uint32_t err_int = I915_READ(GEN7_ERR_INT);
141
142 assert_spin_locked(&dev_priv->irq_lock);
143
144 if ((err_int & ERR_INT_FIFO_UNDERRUN(pipe)) == 0)
145 return;
146
147 I915_WRITE(GEN7_ERR_INT, ERR_INT_FIFO_UNDERRUN(pipe));
148 POSTING_READ(GEN7_ERR_INT);
149
150 DRM_ERROR("fifo underrun on pipe %c\n", pipe_name(pipe));
151}
152
153static void ivybridge_set_fifo_underrun_reporting(struct drm_device *dev, 153static void ivybridge_set_fifo_underrun_reporting(struct drm_device *dev,
154 enum pipe pipe, 154 enum pipe pipe,
155 bool enable, bool old) 155 bool enable, bool old)
@@ -202,6 +202,24 @@ static void ibx_set_fifo_underrun_reporting(struct drm_device *dev,
202 ibx_disable_display_interrupt(dev_priv, bit); 202 ibx_disable_display_interrupt(dev_priv, bit);
203} 203}
204 204
205static void cpt_check_pch_fifo_underruns(struct intel_crtc *crtc)
206{
207 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
208 enum transcoder pch_transcoder = (enum transcoder) crtc->pipe;
209 uint32_t serr_int = I915_READ(SERR_INT);
210
211 assert_spin_locked(&dev_priv->irq_lock);
212
213 if ((serr_int & SERR_INT_TRANS_FIFO_UNDERRUN(pch_transcoder)) == 0)
214 return;
215
216 I915_WRITE(SERR_INT, SERR_INT_TRANS_FIFO_UNDERRUN(pch_transcoder));
217 POSTING_READ(SERR_INT);
218
219 DRM_ERROR("pch fifo underrun on pch transcoder %c\n",
220 transcoder_name(pch_transcoder));
221}
222
205static void cpt_set_fifo_underrun_reporting(struct drm_device *dev, 223static void cpt_set_fifo_underrun_reporting(struct drm_device *dev,
206 enum transcoder pch_transcoder, 224 enum transcoder pch_transcoder,
207 bool enable, bool old) 225 bool enable, bool old)
@@ -375,3 +393,56 @@ void intel_pch_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv,
375 DRM_ERROR("PCH transcoder %c FIFO underrun\n", 393 DRM_ERROR("PCH transcoder %c FIFO underrun\n",
376 transcoder_name(pch_transcoder)); 394 transcoder_name(pch_transcoder));
377} 395}
396
397/**
398 * intel_check_cpu_fifo_underruns - check for CPU fifo underruns immediately
399 * @dev_priv: i915 device instance
400 *
401 * Check for CPU fifo underruns immediately. Useful on IVB/HSW where the shared
402 * error interrupt may have been disabled, and so CPU fifo underruns won't
403 * necessarily raise an interrupt, and on GMCH platforms where underruns never
404 * raise an interrupt.
405 */
406void intel_check_cpu_fifo_underruns(struct drm_i915_private *dev_priv)
407{
408 struct intel_crtc *crtc;
409
410 spin_lock_irq(&dev_priv->irq_lock);
411
412 for_each_intel_crtc(dev_priv->dev, crtc) {
413 if (crtc->cpu_fifo_underrun_disabled)
414 continue;
415
416 if (HAS_GMCH_DISPLAY(dev_priv))
417 i9xx_check_fifo_underruns(crtc);
418 else if (IS_GEN7(dev_priv))
419 ivybridge_check_fifo_underruns(crtc);
420 }
421
422 spin_unlock_irq(&dev_priv->irq_lock);
423}
424
425/**
426 * intel_check_pch_fifo_underruns - check for PCH fifo underruns immediately
427 * @dev_priv: i915 device instance
428 *
429 * Check for PCH fifo underruns immediately. Useful on CPT/PPT where the shared
430 * error interrupt may have been disabled, and so PCH fifo underruns won't
431 * necessarily raise an interrupt.
432 */
433void intel_check_pch_fifo_underruns(struct drm_i915_private *dev_priv)
434{
435 struct intel_crtc *crtc;
436
437 spin_lock_irq(&dev_priv->irq_lock);
438
439 for_each_intel_crtc(dev_priv->dev, crtc) {
440 if (crtc->pch_fifo_underrun_disabled)
441 continue;
442
443 if (HAS_PCH_CPT(dev_priv))
444 cpt_check_pch_fifo_underruns(crtc);
445 }
446
447 spin_unlock_irq(&dev_priv->irq_lock);
448}
diff --git a/drivers/gpu/drm/i915/intel_guc.h b/drivers/gpu/drm/i915/intel_guc.h
index 081d5f648d26..5ba586683c87 100644
--- a/drivers/gpu/drm/i915/intel_guc.h
+++ b/drivers/gpu/drm/i915/intel_guc.h
@@ -76,11 +76,17 @@ struct intel_guc_fw {
76 uint16_t guc_fw_minor_wanted; 76 uint16_t guc_fw_minor_wanted;
77 uint16_t guc_fw_major_found; 77 uint16_t guc_fw_major_found;
78 uint16_t guc_fw_minor_found; 78 uint16_t guc_fw_minor_found;
79
80 uint32_t header_size;
81 uint32_t header_offset;
82 uint32_t rsa_size;
83 uint32_t rsa_offset;
84 uint32_t ucode_size;
85 uint32_t ucode_offset;
79}; 86};
80 87
81struct intel_guc { 88struct intel_guc {
82 struct intel_guc_fw guc_fw; 89 struct intel_guc_fw guc_fw;
83
84 uint32_t log_flags; 90 uint32_t log_flags;
85 struct drm_i915_gem_object *log_obj; 91 struct drm_i915_gem_object *log_obj;
86 92
diff --git a/drivers/gpu/drm/i915/intel_guc_fwif.h b/drivers/gpu/drm/i915/intel_guc_fwif.h
index 593d2f585978..40b2ea572e16 100644
--- a/drivers/gpu/drm/i915/intel_guc_fwif.h
+++ b/drivers/gpu/drm/i915/intel_guc_fwif.h
@@ -122,6 +122,78 @@
122 122
123#define GUC_CTL_MAX_DWORDS (GUC_CTL_RSRVD + 1) 123#define GUC_CTL_MAX_DWORDS (GUC_CTL_RSRVD + 1)
124 124
125/**
126 * DOC: GuC Firmware Layout
127 *
128 * The GuC firmware layout looks like this:
129 *
130 * +-------------------------------+
131 * | guc_css_header |
132 * | contains major/minor version |
133 * +-------------------------------+
134 * | uCode |
135 * +-------------------------------+
136 * | RSA signature |
137 * +-------------------------------+
138 * | modulus key |
139 * +-------------------------------+
140 * | exponent val |
141 * +-------------------------------+
142 *
143 * The firmware may or may not have modulus key and exponent data. The header,
144 * uCode and RSA signature are must-have components that will be used by driver.
145 * Length of each components, which is all in dwords, can be found in header.
146 * In the case that modulus and exponent are not present in fw, a.k.a truncated
147 * image, the length value still appears in header.
148 *
149 * Driver will do some basic fw size validation based on the following rules:
150 *
151 * 1. Header, uCode and RSA are must-have components.
152 * 2. All firmware components, if they present, are in the sequence illustrated
153 * in the layout table above.
154 * 3. Length info of each component can be found in header, in dwords.
155 * 4. Modulus and exponent key are not required by driver. They may not appear
156 * in fw. So driver will load a truncated firmware in this case.
157 */
158
159struct guc_css_header {
160 uint32_t module_type;
161 /* header_size includes all non-uCode bits, including css_header, rsa
162 * key, modulus key and exponent data. */
163 uint32_t header_size_dw;
164 uint32_t header_version;
165 uint32_t module_id;
166 uint32_t module_vendor;
167 union {
168 struct {
169 uint8_t day;
170 uint8_t month;
171 uint16_t year;
172 };
173 uint32_t date;
174 };
175 uint32_t size_dw; /* uCode plus header_size_dw */
176 uint32_t key_size_dw;
177 uint32_t modulus_size_dw;
178 uint32_t exponent_size_dw;
179 union {
180 struct {
181 uint8_t hour;
182 uint8_t min;
183 uint16_t sec;
184 };
185 uint32_t time;
186 };
187
188 char username[8];
189 char buildnumber[12];
190 uint32_t device_id;
191 uint32_t guc_sw_version;
192 uint32_t prod_preprod_fw;
193 uint32_t reserved[12];
194 uint32_t header_info;
195} __packed;
196
125struct guc_doorbell_info { 197struct guc_doorbell_info {
126 u32 db_status; 198 u32 db_status;
127 u32 cookie; 199 u32 cookie;
diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c b/drivers/gpu/drm/i915/intel_guc_loader.c
index 3541f76c65a7..550921f2ef7d 100644
--- a/drivers/gpu/drm/i915/intel_guc_loader.c
+++ b/drivers/gpu/drm/i915/intel_guc_loader.c
@@ -31,7 +31,7 @@
31#include "intel_guc.h" 31#include "intel_guc.h"
32 32
33/** 33/**
34 * DOC: GuC 34 * DOC: GuC-specific firmware loader
35 * 35 *
36 * intel_guc: 36 * intel_guc:
37 * Top level structure of guc. It handles firmware loading and manages client 37 * Top level structure of guc. It handles firmware loading and manages client
@@ -208,16 +208,6 @@ static inline bool guc_ucode_response(struct drm_i915_private *dev_priv,
208/* 208/*
209 * Transfer the firmware image to RAM for execution by the microcontroller. 209 * Transfer the firmware image to RAM for execution by the microcontroller.
210 * 210 *
211 * GuC Firmware layout:
212 * +-------------------------------+ ----
213 * | CSS header | 128B
214 * | contains major/minor version |
215 * +-------------------------------+ ----
216 * | uCode |
217 * +-------------------------------+ ----
218 * | RSA signature | 256B
219 * +-------------------------------+ ----
220 *
221 * Architecturally, the DMA engine is bidirectional, and can potentially even 211 * Architecturally, the DMA engine is bidirectional, and can potentially even
222 * transfer between GTT locations. This functionality is left out of the API 212 * transfer between GTT locations. This functionality is left out of the API
223 * for now as there is no need for it. 213 * for now as there is no need for it.
@@ -225,33 +215,29 @@ static inline bool guc_ucode_response(struct drm_i915_private *dev_priv,
225 * Note that GuC needs the CSS header plus uKernel code to be copied by the 215 * Note that GuC needs the CSS header plus uKernel code to be copied by the
226 * DMA engine in one operation, whereas the RSA signature is loaded via MMIO. 216 * DMA engine in one operation, whereas the RSA signature is loaded via MMIO.
227 */ 217 */
228
229#define UOS_CSS_HEADER_OFFSET 0
230#define UOS_VER_MINOR_OFFSET 0x44
231#define UOS_VER_MAJOR_OFFSET 0x46
232#define UOS_CSS_HEADER_SIZE 0x80
233#define UOS_RSA_SIG_SIZE 0x100
234
235static int guc_ucode_xfer_dma(struct drm_i915_private *dev_priv) 218static int guc_ucode_xfer_dma(struct drm_i915_private *dev_priv)
236{ 219{
237 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw; 220 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw;
238 struct drm_i915_gem_object *fw_obj = guc_fw->guc_fw_obj; 221 struct drm_i915_gem_object *fw_obj = guc_fw->guc_fw_obj;
239 unsigned long offset; 222 unsigned long offset;
240 struct sg_table *sg = fw_obj->pages; 223 struct sg_table *sg = fw_obj->pages;
241 u32 status, ucode_size, rsa[UOS_RSA_SIG_SIZE / sizeof(u32)]; 224 u32 status, rsa[UOS_RSA_SCRATCH_MAX_COUNT];
242 int i, ret = 0; 225 int i, ret = 0;
243 226
244 /* uCode size, also is where RSA signature starts */ 227 /* where RSA signature starts */
245 offset = ucode_size = guc_fw->guc_fw_size - UOS_RSA_SIG_SIZE; 228 offset = guc_fw->rsa_offset;
246 I915_WRITE(DMA_COPY_SIZE, ucode_size);
247 229
248 /* Copy RSA signature from the fw image to HW for verification */ 230 /* Copy RSA signature from the fw image to HW for verification */
249 sg_pcopy_to_buffer(sg->sgl, sg->nents, rsa, UOS_RSA_SIG_SIZE, offset); 231 sg_pcopy_to_buffer(sg->sgl, sg->nents, rsa, sizeof(rsa), offset);
250 for (i = 0; i < UOS_RSA_SIG_SIZE / sizeof(u32); i++) 232 for (i = 0; i < UOS_RSA_SCRATCH_MAX_COUNT; i++)
251 I915_WRITE(UOS_RSA_SCRATCH(i), rsa[i]); 233 I915_WRITE(UOS_RSA_SCRATCH(i), rsa[i]);
252 234
235 /* The header plus uCode will be copied to WOPCM via DMA, excluding any
236 * other components */
237 I915_WRITE(DMA_COPY_SIZE, guc_fw->header_size + guc_fw->ucode_size);
238
253 /* Set the source address for the new blob */ 239 /* Set the source address for the new blob */
254 offset = i915_gem_obj_ggtt_offset(fw_obj); 240 offset = i915_gem_obj_ggtt_offset(fw_obj) + guc_fw->header_offset;
255 I915_WRITE(DMA_ADDR_0_LOW, lower_32_bits(offset)); 241 I915_WRITE(DMA_ADDR_0_LOW, lower_32_bits(offset));
256 I915_WRITE(DMA_ADDR_0_HIGH, upper_32_bits(offset) & 0xFFFF); 242 I915_WRITE(DMA_ADDR_0_HIGH, upper_32_bits(offset) & 0xFFFF);
257 243
@@ -322,8 +308,8 @@ static int guc_ucode_xfer(struct drm_i915_private *dev_priv)
322 I915_WRITE(GUC_SHIM_CONTROL, GUC_SHIM_CONTROL_VALUE); 308 I915_WRITE(GUC_SHIM_CONTROL, GUC_SHIM_CONTROL_VALUE);
323 309
324 /* WaDisableMinuteIaClockGating:skl,bxt */ 310 /* WaDisableMinuteIaClockGating:skl,bxt */
325 if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) || 311 if (IS_SKL_REVID(dev, 0, SKL_REVID_B0) ||
326 (IS_BROXTON(dev) && INTEL_REVID(dev) == BXT_REVID_A0)) { 312 IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
327 I915_WRITE(GUC_SHIM_CONTROL, (I915_READ(GUC_SHIM_CONTROL) & 313 I915_WRITE(GUC_SHIM_CONTROL, (I915_READ(GUC_SHIM_CONTROL) &
328 ~GUC_ENABLE_MIA_CLOCK_GATING)); 314 ~GUC_ENABLE_MIA_CLOCK_GATING));
329 } 315 }
@@ -378,6 +364,9 @@ int intel_guc_ucode_load(struct drm_device *dev)
378 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw; 364 struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw;
379 int err = 0; 365 int err = 0;
380 366
367 if (!i915.enable_guc_submission)
368 return 0;
369
381 DRM_DEBUG_DRIVER("GuC fw status: fetch %s, load %s\n", 370 DRM_DEBUG_DRIVER("GuC fw status: fetch %s, load %s\n",
382 intel_guc_fw_status_repr(guc_fw->guc_fw_fetch_status), 371 intel_guc_fw_status_repr(guc_fw->guc_fw_fetch_status),
383 intel_guc_fw_status_repr(guc_fw->guc_fw_load_status)); 372 intel_guc_fw_status_repr(guc_fw->guc_fw_load_status));
@@ -457,10 +446,8 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
457{ 446{
458 struct drm_i915_gem_object *obj; 447 struct drm_i915_gem_object *obj;
459 const struct firmware *fw; 448 const struct firmware *fw;
460 const u8 *css_header; 449 struct guc_css_header *css;
461 const size_t minsize = UOS_CSS_HEADER_SIZE + UOS_RSA_SIG_SIZE; 450 size_t size;
462 const size_t maxsize = GUC_WOPCM_SIZE_VALUE + UOS_RSA_SIG_SIZE
463 - 0x8000; /* 32k reserved (8K stack + 24k context) */
464 int err; 451 int err;
465 452
466 DRM_DEBUG_DRIVER("before requesting firmware: GuC fw fetch status %s\n", 453 DRM_DEBUG_DRIVER("before requesting firmware: GuC fw fetch status %s\n",
@@ -474,12 +461,52 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
474 461
475 DRM_DEBUG_DRIVER("fetch GuC fw from %s succeeded, fw %p\n", 462 DRM_DEBUG_DRIVER("fetch GuC fw from %s succeeded, fw %p\n",
476 guc_fw->guc_fw_path, fw); 463 guc_fw->guc_fw_path, fw);
477 DRM_DEBUG_DRIVER("firmware file size %zu (minimum %zu, maximum %zu)\n",
478 fw->size, minsize, maxsize);
479 464
480 /* Check the size of the blob befoe examining buffer contents */ 465 /* Check the size of the blob before examining buffer contents */
481 if (fw->size < minsize || fw->size > maxsize) 466 if (fw->size < sizeof(struct guc_css_header)) {
467 DRM_ERROR("Firmware header is missing\n");
482 goto fail; 468 goto fail;
469 }
470
471 css = (struct guc_css_header *)fw->data;
472
473 /* Firmware bits always start from header */
474 guc_fw->header_offset = 0;
475 guc_fw->header_size = (css->header_size_dw - css->modulus_size_dw -
476 css->key_size_dw - css->exponent_size_dw) * sizeof(u32);
477
478 if (guc_fw->header_size != sizeof(struct guc_css_header)) {
479 DRM_ERROR("CSS header definition mismatch\n");
480 goto fail;
481 }
482
483 /* then, uCode */
484 guc_fw->ucode_offset = guc_fw->header_offset + guc_fw->header_size;
485 guc_fw->ucode_size = (css->size_dw - css->header_size_dw) * sizeof(u32);
486
487 /* now RSA */
488 if (css->key_size_dw != UOS_RSA_SCRATCH_MAX_COUNT) {
489 DRM_ERROR("RSA key size is bad\n");
490 goto fail;
491 }
492 guc_fw->rsa_offset = guc_fw->ucode_offset + guc_fw->ucode_size;
493 guc_fw->rsa_size = css->key_size_dw * sizeof(u32);
494
495 /* At least, it should have header, uCode and RSA. Size of all three. */
496 size = guc_fw->header_size + guc_fw->ucode_size + guc_fw->rsa_size;
497 if (fw->size < size) {
498 DRM_ERROR("Missing firmware components\n");
499 goto fail;
500 }
501
502 /* Header and uCode will be loaded to WOPCM. Size of the two. */
503 size = guc_fw->header_size + guc_fw->ucode_size;
504
505 /* Top 32k of WOPCM is reserved (8K stack + 24k RC6 context). */
506 if (size > GUC_WOPCM_SIZE_VALUE - 0x8000) {
507 DRM_ERROR("Firmware is too large to fit in WOPCM\n");
508 goto fail;
509 }
483 510
484 /* 511 /*
485 * The GuC firmware image has the version number embedded at a well-known 512 * The GuC firmware image has the version number embedded at a well-known
@@ -487,9 +514,8 @@ static void guc_fw_fetch(struct drm_device *dev, struct intel_guc_fw *guc_fw)
487 * TWO bytes each (i.e. u16), although all pointers and offsets are defined 514 * TWO bytes each (i.e. u16), although all pointers and offsets are defined
488 * in terms of bytes (u8). 515 * in terms of bytes (u8).
489 */ 516 */
490 css_header = fw->data + UOS_CSS_HEADER_OFFSET; 517 guc_fw->guc_fw_major_found = css->guc_sw_version >> 16;
491 guc_fw->guc_fw_major_found = *(u16 *)(css_header + UOS_VER_MAJOR_OFFSET); 518 guc_fw->guc_fw_minor_found = css->guc_sw_version & 0xFFFF;
492 guc_fw->guc_fw_minor_found = *(u16 *)(css_header + UOS_VER_MINOR_OFFSET);
493 519
494 if (guc_fw->guc_fw_major_found != guc_fw->guc_fw_major_wanted || 520 if (guc_fw->guc_fw_major_found != guc_fw->guc_fw_major_wanted ||
495 guc_fw->guc_fw_minor_found < guc_fw->guc_fw_minor_wanted) { 521 guc_fw->guc_fw_minor_found < guc_fw->guc_fw_minor_wanted) {
@@ -566,6 +592,9 @@ void intel_guc_ucode_init(struct drm_device *dev)
566 fw_path = ""; /* unknown device */ 592 fw_path = ""; /* unknown device */
567 } 593 }
568 594
595 if (!i915.enable_guc_submission)
596 return;
597
569 guc_fw->guc_dev = dev; 598 guc_fw->guc_dev = dev;
570 guc_fw->guc_fw_path = fw_path; 599 guc_fw->guc_fw_path = fw_path;
571 guc_fw->guc_fw_fetch_status = GUC_FIRMWARE_NONE; 600 guc_fw->guc_fw_fetch_status = GUC_FIRMWARE_NONE;
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index e6c035b0fc1c..f16cd2a843b2 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -113,10 +113,11 @@ static u32 hsw_infoframe_enable(enum hdmi_infoframe_type type)
113 } 113 }
114} 114}
115 115
116static u32 hsw_dip_data_reg(struct drm_i915_private *dev_priv, 116static i915_reg_t
117 enum transcoder cpu_transcoder, 117hsw_dip_data_reg(struct drm_i915_private *dev_priv,
118 enum hdmi_infoframe_type type, 118 enum transcoder cpu_transcoder,
119 int i) 119 enum hdmi_infoframe_type type,
120 int i)
120{ 121{
121 switch (type) { 122 switch (type) {
122 case HDMI_INFOFRAME_TYPE_AVI: 123 case HDMI_INFOFRAME_TYPE_AVI:
@@ -127,7 +128,7 @@ static u32 hsw_dip_data_reg(struct drm_i915_private *dev_priv,
127 return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder, i); 128 return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder, i);
128 default: 129 default:
129 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type); 130 DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
130 return 0; 131 return INVALID_MMIO_REG;
131 } 132 }
132} 133}
133 134
@@ -193,8 +194,9 @@ static void ibx_write_infoframe(struct drm_encoder *encoder,
193 struct drm_device *dev = encoder->dev; 194 struct drm_device *dev = encoder->dev;
194 struct drm_i915_private *dev_priv = dev->dev_private; 195 struct drm_i915_private *dev_priv = dev->dev_private;
195 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 196 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
196 int i, reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 197 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
197 u32 val = I915_READ(reg); 198 u32 val = I915_READ(reg);
199 int i;
198 200
199 WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n"); 201 WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
200 202
@@ -229,7 +231,7 @@ static bool ibx_infoframe_enabled(struct drm_encoder *encoder)
229 struct drm_i915_private *dev_priv = dev->dev_private; 231 struct drm_i915_private *dev_priv = dev->dev_private;
230 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 232 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
231 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); 233 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
232 int reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 234 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
233 u32 val = I915_READ(reg); 235 u32 val = I915_READ(reg);
234 236
235 if ((val & VIDEO_DIP_ENABLE) == 0) 237 if ((val & VIDEO_DIP_ENABLE) == 0)
@@ -251,8 +253,9 @@ static void cpt_write_infoframe(struct drm_encoder *encoder,
251 struct drm_device *dev = encoder->dev; 253 struct drm_device *dev = encoder->dev;
252 struct drm_i915_private *dev_priv = dev->dev_private; 254 struct drm_i915_private *dev_priv = dev->dev_private;
253 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 255 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
254 int i, reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 256 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
255 u32 val = I915_READ(reg); 257 u32 val = I915_READ(reg);
258 int i;
256 259
257 WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n"); 260 WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
258 261
@@ -289,8 +292,7 @@ static bool cpt_infoframe_enabled(struct drm_encoder *encoder)
289 struct drm_device *dev = encoder->dev; 292 struct drm_device *dev = encoder->dev;
290 struct drm_i915_private *dev_priv = dev->dev_private; 293 struct drm_i915_private *dev_priv = dev->dev_private;
291 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 294 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
292 int reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 295 u32 val = I915_READ(TVIDEO_DIP_CTL(intel_crtc->pipe));
293 u32 val = I915_READ(reg);
294 296
295 if ((val & VIDEO_DIP_ENABLE) == 0) 297 if ((val & VIDEO_DIP_ENABLE) == 0)
296 return false; 298 return false;
@@ -308,8 +310,9 @@ static void vlv_write_infoframe(struct drm_encoder *encoder,
308 struct drm_device *dev = encoder->dev; 310 struct drm_device *dev = encoder->dev;
309 struct drm_i915_private *dev_priv = dev->dev_private; 311 struct drm_i915_private *dev_priv = dev->dev_private;
310 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 312 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
311 int i, reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe); 313 i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
312 u32 val = I915_READ(reg); 314 u32 val = I915_READ(reg);
315 int i;
313 316
314 WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n"); 317 WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
315 318
@@ -344,8 +347,7 @@ static bool vlv_infoframe_enabled(struct drm_encoder *encoder)
344 struct drm_i915_private *dev_priv = dev->dev_private; 347 struct drm_i915_private *dev_priv = dev->dev_private;
345 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 348 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
346 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); 349 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
347 int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe); 350 u32 val = I915_READ(VLV_TVIDEO_DIP_CTL(intel_crtc->pipe));
348 u32 val = I915_READ(reg);
349 351
350 if ((val & VIDEO_DIP_ENABLE) == 0) 352 if ((val & VIDEO_DIP_ENABLE) == 0)
351 return false; 353 return false;
@@ -367,13 +369,13 @@ static void hsw_write_infoframe(struct drm_encoder *encoder,
367 struct drm_i915_private *dev_priv = dev->dev_private; 369 struct drm_i915_private *dev_priv = dev->dev_private;
368 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 370 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
369 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder; 371 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
370 u32 ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder); 372 i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder);
371 u32 data_reg; 373 i915_reg_t data_reg;
372 int i; 374 int i;
373 u32 val = I915_READ(ctl_reg); 375 u32 val = I915_READ(ctl_reg);
374 376
375 data_reg = hsw_dip_data_reg(dev_priv, cpu_transcoder, type, 0); 377 data_reg = hsw_dip_data_reg(dev_priv, cpu_transcoder, type, 0);
376 if (data_reg == 0) 378 if (i915_mmio_reg_valid(data_reg))
377 return; 379 return;
378 380
379 val &= ~hsw_infoframe_enable(type); 381 val &= ~hsw_infoframe_enable(type);
@@ -401,8 +403,7 @@ static bool hsw_infoframe_enabled(struct drm_encoder *encoder)
401 struct drm_device *dev = encoder->dev; 403 struct drm_device *dev = encoder->dev;
402 struct drm_i915_private *dev_priv = dev->dev_private; 404 struct drm_i915_private *dev_priv = dev->dev_private;
403 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 405 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
404 u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder); 406 u32 val = I915_READ(HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder));
405 u32 val = I915_READ(ctl_reg);
406 407
407 return val & (VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW | 408 return val & (VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
408 VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW | 409 VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
@@ -513,7 +514,7 @@ static void g4x_set_infoframes(struct drm_encoder *encoder,
513 struct drm_i915_private *dev_priv = encoder->dev->dev_private; 514 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
514 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); 515 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
515 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi; 516 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
516 u32 reg = VIDEO_DIP_CTL; 517 i915_reg_t reg = VIDEO_DIP_CTL;
517 u32 val = I915_READ(reg); 518 u32 val = I915_READ(reg);
518 u32 port = VIDEO_DIP_PORT(intel_dig_port->port); 519 u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
519 520
@@ -633,7 +634,8 @@ static bool intel_hdmi_set_gcp_infoframe(struct drm_encoder *encoder)
633{ 634{
634 struct drm_i915_private *dev_priv = encoder->dev->dev_private; 635 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
635 struct intel_crtc *crtc = to_intel_crtc(encoder->crtc); 636 struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
636 u32 reg, val = 0; 637 i915_reg_t reg;
638 u32 val = 0;
637 639
638 if (HAS_DDI(dev_priv)) 640 if (HAS_DDI(dev_priv))
639 reg = HSW_TVIDEO_DIP_GCP(crtc->config->cpu_transcoder); 641 reg = HSW_TVIDEO_DIP_GCP(crtc->config->cpu_transcoder);
@@ -666,7 +668,7 @@ static void ibx_set_infoframes(struct drm_encoder *encoder,
666 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 668 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
667 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); 669 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
668 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi; 670 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
669 u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 671 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
670 u32 val = I915_READ(reg); 672 u32 val = I915_READ(reg);
671 u32 port = VIDEO_DIP_PORT(intel_dig_port->port); 673 u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
672 674
@@ -717,7 +719,7 @@ static void cpt_set_infoframes(struct drm_encoder *encoder,
717 struct drm_i915_private *dev_priv = encoder->dev->dev_private; 719 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
718 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 720 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
719 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); 721 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
720 u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 722 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
721 u32 val = I915_READ(reg); 723 u32 val = I915_READ(reg);
722 724
723 assert_hdmi_port_disabled(intel_hdmi); 725 assert_hdmi_port_disabled(intel_hdmi);
@@ -760,7 +762,7 @@ static void vlv_set_infoframes(struct drm_encoder *encoder,
760 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); 762 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
761 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 763 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
762 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); 764 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
763 u32 reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe); 765 i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
764 u32 val = I915_READ(reg); 766 u32 val = I915_READ(reg);
765 u32 port = VIDEO_DIP_PORT(intel_dig_port->port); 767 u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
766 768
@@ -811,7 +813,7 @@ static void hsw_set_infoframes(struct drm_encoder *encoder,
811 struct drm_i915_private *dev_priv = encoder->dev->dev_private; 813 struct drm_i915_private *dev_priv = encoder->dev->dev_private;
812 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 814 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
813 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); 815 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
814 u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder); 816 i915_reg_t reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
815 u32 val = I915_READ(reg); 817 u32 val = I915_READ(reg);
816 818
817 assert_hdmi_port_disabled(intel_hdmi); 819 assert_hdmi_port_disabled(intel_hdmi);
@@ -1108,6 +1110,13 @@ static void intel_disable_hdmi(struct intel_encoder *encoder)
1108 * matching DP port to be enabled on transcoder A. 1110 * matching DP port to be enabled on transcoder A.
1109 */ 1111 */
1110 if (HAS_PCH_IBX(dev) && crtc->pipe == PIPE_B) { 1112 if (HAS_PCH_IBX(dev) && crtc->pipe == PIPE_B) {
1113 /*
1114 * We get CPU/PCH FIFO underruns on the other pipe when
1115 * doing the workaround. Sweep them under the rug.
1116 */
1117 intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, false);
1118 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);
1119
1111 temp &= ~SDVO_PIPE_B_SELECT; 1120 temp &= ~SDVO_PIPE_B_SELECT;
1112 temp |= SDVO_ENABLE; 1121 temp |= SDVO_ENABLE;
1113 /* 1122 /*
@@ -1122,6 +1131,10 @@ static void intel_disable_hdmi(struct intel_encoder *encoder)
1122 temp &= ~SDVO_ENABLE; 1131 temp &= ~SDVO_ENABLE;
1123 I915_WRITE(intel_hdmi->hdmi_reg, temp); 1132 I915_WRITE(intel_hdmi->hdmi_reg, temp);
1124 POSTING_READ(intel_hdmi->hdmi_reg); 1133 POSTING_READ(intel_hdmi->hdmi_reg);
1134
1135 intel_wait_for_vblank_if_active(dev_priv->dev, PIPE_A);
1136 intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true);
1137 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true);
1125 } 1138 }
1126 1139
1127 intel_hdmi->set_infoframes(&encoder->base, false, NULL); 1140 intel_hdmi->set_infoframes(&encoder->base, false, NULL);
@@ -1338,14 +1351,15 @@ intel_hdmi_set_edid(struct drm_connector *connector, bool force)
1338 struct edid *edid = NULL; 1351 struct edid *edid = NULL;
1339 bool connected = false; 1352 bool connected = false;
1340 1353
1341 intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); 1354 if (force) {
1355 intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
1342 1356
1343 if (force)
1344 edid = drm_get_edid(connector, 1357 edid = drm_get_edid(connector,
1345 intel_gmbus_get_adapter(dev_priv, 1358 intel_gmbus_get_adapter(dev_priv,
1346 intel_hdmi->ddc_bus)); 1359 intel_hdmi->ddc_bus));
1347 1360
1348 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); 1361 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1362 }
1349 1363
1350 to_intel_connector(connector)->detect_edid = edid; 1364 to_intel_connector(connector)->detect_edid = edid;
1351 if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) { 1365 if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
@@ -2040,7 +2054,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
2040 * On BXT A0/A1, sw needs to activate DDIA HPD logic and 2054 * On BXT A0/A1, sw needs to activate DDIA HPD logic and
2041 * interrupts to check the external panel connection. 2055 * interrupts to check the external panel connection.
2042 */ 2056 */
2043 if (IS_BROXTON(dev_priv) && (INTEL_REVID(dev) < BXT_REVID_B0)) 2057 if (IS_BXT_REVID(dev_priv, 0, BXT_REVID_A1))
2044 intel_encoder->hpd_pin = HPD_PORT_A; 2058 intel_encoder->hpd_pin = HPD_PORT_A;
2045 else 2059 else
2046 intel_encoder->hpd_pin = HPD_PORT_B; 2060 intel_encoder->hpd_pin = HPD_PORT_B;
@@ -2132,8 +2146,10 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
2132 } 2146 }
2133} 2147}
2134 2148
2135void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port) 2149void intel_hdmi_init(struct drm_device *dev,
2150 i915_reg_t hdmi_reg, enum port port)
2136{ 2151{
2152 struct drm_i915_private *dev_priv = dev->dev_private;
2137 struct intel_digital_port *intel_dig_port; 2153 struct intel_digital_port *intel_dig_port;
2138 struct intel_encoder *intel_encoder; 2154 struct intel_encoder *intel_encoder;
2139 struct intel_connector *intel_connector; 2155 struct intel_connector *intel_connector;
@@ -2202,8 +2218,9 @@ void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
2202 intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI; 2218 intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
2203 2219
2204 intel_dig_port->port = port; 2220 intel_dig_port->port = port;
2221 dev_priv->dig_port_map[port] = intel_encoder;
2205 intel_dig_port->hdmi.hdmi_reg = hdmi_reg; 2222 intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
2206 intel_dig_port->dp.output_reg = 0; 2223 intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
2207 2224
2208 intel_hdmi_init_connector(intel_dig_port, intel_connector); 2225 intel_hdmi_init_connector(intel_dig_port, intel_connector);
2209} 2226}
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c
index 8324654037b6..1110c83953cf 100644
--- a/drivers/gpu/drm/i915/intel_i2c.c
+++ b/drivers/gpu/drm/i915/intel_i2c.c
@@ -36,7 +36,7 @@
36 36
37struct gmbus_pin { 37struct gmbus_pin {
38 const char *name; 38 const char *name;
39 int reg; 39 i915_reg_t reg;
40}; 40};
41 41
42/* Map gmbus pin pairs to names and registers. */ 42/* Map gmbus pin pairs to names and registers. */
@@ -63,9 +63,9 @@ static const struct gmbus_pin gmbus_pins_skl[] = {
63}; 63};
64 64
65static const struct gmbus_pin gmbus_pins_bxt[] = { 65static const struct gmbus_pin gmbus_pins_bxt[] = {
66 [GMBUS_PIN_1_BXT] = { "dpb", PCH_GPIOB }, 66 [GMBUS_PIN_1_BXT] = { "dpb", GPIOB },
67 [GMBUS_PIN_2_BXT] = { "dpc", PCH_GPIOC }, 67 [GMBUS_PIN_2_BXT] = { "dpc", GPIOC },
68 [GMBUS_PIN_3_BXT] = { "misc", PCH_GPIOD }, 68 [GMBUS_PIN_3_BXT] = { "misc", GPIOD },
69}; 69};
70 70
71/* pin is expected to be valid */ 71/* pin is expected to be valid */
@@ -74,7 +74,7 @@ static const struct gmbus_pin *get_gmbus_pin(struct drm_i915_private *dev_priv,
74{ 74{
75 if (IS_BROXTON(dev_priv)) 75 if (IS_BROXTON(dev_priv))
76 return &gmbus_pins_bxt[pin]; 76 return &gmbus_pins_bxt[pin];
77 else if (IS_SKYLAKE(dev_priv)) 77 else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
78 return &gmbus_pins_skl[pin]; 78 return &gmbus_pins_skl[pin];
79 else if (IS_BROADWELL(dev_priv)) 79 else if (IS_BROADWELL(dev_priv))
80 return &gmbus_pins_bdw[pin]; 80 return &gmbus_pins_bdw[pin];
@@ -89,14 +89,15 @@ bool intel_gmbus_is_valid_pin(struct drm_i915_private *dev_priv,
89 89
90 if (IS_BROXTON(dev_priv)) 90 if (IS_BROXTON(dev_priv))
91 size = ARRAY_SIZE(gmbus_pins_bxt); 91 size = ARRAY_SIZE(gmbus_pins_bxt);
92 else if (IS_SKYLAKE(dev_priv)) 92 else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
93 size = ARRAY_SIZE(gmbus_pins_skl); 93 size = ARRAY_SIZE(gmbus_pins_skl);
94 else if (IS_BROADWELL(dev_priv)) 94 else if (IS_BROADWELL(dev_priv))
95 size = ARRAY_SIZE(gmbus_pins_bdw); 95 size = ARRAY_SIZE(gmbus_pins_bdw);
96 else 96 else
97 size = ARRAY_SIZE(gmbus_pins); 97 size = ARRAY_SIZE(gmbus_pins);
98 98
99 return pin < size && get_gmbus_pin(dev_priv, pin)->reg; 99 return pin < size &&
100 i915_mmio_reg_valid(get_gmbus_pin(dev_priv, pin)->reg);
100} 101}
101 102
102/* Intel GPIO access functions */ 103/* Intel GPIO access functions */
@@ -240,9 +241,8 @@ intel_gpio_setup(struct intel_gmbus *bus, unsigned int pin)
240 241
241 algo = &bus->bit_algo; 242 algo = &bus->bit_algo;
242 243
243 bus->gpio_reg = dev_priv->gpio_mmio_base + 244 bus->gpio_reg = _MMIO(dev_priv->gpio_mmio_base +
244 get_gmbus_pin(dev_priv, pin)->reg; 245 i915_mmio_reg_offset(get_gmbus_pin(dev_priv, pin)->reg));
245
246 bus->adapter.algo_data = algo; 246 bus->adapter.algo_data = algo;
247 algo->setsda = set_data; 247 algo->setsda = set_data;
248 algo->setscl = set_clock; 248 algo->setscl = set_clock;
@@ -628,12 +628,13 @@ int intel_setup_gmbus(struct drm_device *dev)
628 628
629 if (HAS_PCH_NOP(dev)) 629 if (HAS_PCH_NOP(dev))
630 return 0; 630 return 0;
631 else if (HAS_PCH_SPLIT(dev)) 631
632 dev_priv->gpio_mmio_base = PCH_GPIOA - GPIOA; 632 if (IS_VALLEYVIEW(dev))
633 else if (IS_VALLEYVIEW(dev))
634 dev_priv->gpio_mmio_base = VLV_DISPLAY_BASE; 633 dev_priv->gpio_mmio_base = VLV_DISPLAY_BASE;
635 else 634 else if (!HAS_GMCH_DISPLAY(dev_priv))
636 dev_priv->gpio_mmio_base = 0; 635 dev_priv->gpio_mmio_base =
636 i915_mmio_reg_offset(PCH_GPIOA) -
637 i915_mmio_reg_offset(GPIOA);
637 638
638 mutex_init(&dev_priv->gmbus_mutex); 639 mutex_init(&dev_priv->gmbus_mutex);
639 init_waitqueue_head(&dev_priv->gmbus_wait_queue); 640 init_waitqueue_head(&dev_priv->gmbus_wait_queue);
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 88e12bdf79e2..4ebafab53f30 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -190,16 +190,21 @@
190#define GEN8_CTX_L3LLC_COHERENT (1<<5) 190#define GEN8_CTX_L3LLC_COHERENT (1<<5)
191#define GEN8_CTX_PRIVILEGE (1<<8) 191#define GEN8_CTX_PRIVILEGE (1<<8)
192 192
193#define ASSIGN_CTX_PDP(ppgtt, reg_state, n) { \ 193#define ASSIGN_CTX_REG(reg_state, pos, reg, val) do { \
194 (reg_state)[(pos)+0] = i915_mmio_reg_offset(reg); \
195 (reg_state)[(pos)+1] = (val); \
196} while (0)
197
198#define ASSIGN_CTX_PDP(ppgtt, reg_state, n) do { \
194 const u64 _addr = i915_page_dir_dma_addr((ppgtt), (n)); \ 199 const u64 _addr = i915_page_dir_dma_addr((ppgtt), (n)); \
195 reg_state[CTX_PDP ## n ## _UDW+1] = upper_32_bits(_addr); \ 200 reg_state[CTX_PDP ## n ## _UDW+1] = upper_32_bits(_addr); \
196 reg_state[CTX_PDP ## n ## _LDW+1] = lower_32_bits(_addr); \ 201 reg_state[CTX_PDP ## n ## _LDW+1] = lower_32_bits(_addr); \
197} 202} while (0)
198 203
199#define ASSIGN_CTX_PML4(ppgtt, reg_state) { \ 204#define ASSIGN_CTX_PML4(ppgtt, reg_state) do { \
200 reg_state[CTX_PDP0_UDW + 1] = upper_32_bits(px_dma(&ppgtt->pml4)); \ 205 reg_state[CTX_PDP0_UDW + 1] = upper_32_bits(px_dma(&ppgtt->pml4)); \
201 reg_state[CTX_PDP0_LDW + 1] = lower_32_bits(px_dma(&ppgtt->pml4)); \ 206 reg_state[CTX_PDP0_LDW + 1] = lower_32_bits(px_dma(&ppgtt->pml4)); \
202} 207} while (0)
203 208
204enum { 209enum {
205 ADVANCED_CONTEXT = 0, 210 ADVANCED_CONTEXT = 0,
@@ -284,8 +289,8 @@ static bool disable_lite_restore_wa(struct intel_engine_cs *ring)
284{ 289{
285 struct drm_device *dev = ring->dev; 290 struct drm_device *dev = ring->dev;
286 291
287 return ((IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) || 292 return (IS_SKL_REVID(dev, 0, SKL_REVID_B0) ||
288 (IS_BROXTON(dev) && INTEL_REVID(dev) == BXT_REVID_A0)) && 293 IS_BXT_REVID(dev, 0, BXT_REVID_A1)) &&
289 (ring->id == VCS || ring->id == VCS2); 294 (ring->id == VCS || ring->id == VCS2);
290} 295}
291 296
@@ -921,7 +926,7 @@ int intel_execlists_submission(struct i915_execbuffer_params *params,
921 926
922 intel_logical_ring_emit(ringbuf, MI_NOOP); 927 intel_logical_ring_emit(ringbuf, MI_NOOP);
923 intel_logical_ring_emit(ringbuf, MI_LOAD_REGISTER_IMM(1)); 928 intel_logical_ring_emit(ringbuf, MI_LOAD_REGISTER_IMM(1));
924 intel_logical_ring_emit(ringbuf, INSTPM); 929 intel_logical_ring_emit_reg(ringbuf, INSTPM);
925 intel_logical_ring_emit(ringbuf, instp_mask << 16 | instp_mode); 930 intel_logical_ring_emit(ringbuf, instp_mask << 16 | instp_mode);
926 intel_logical_ring_advance(ringbuf); 931 intel_logical_ring_advance(ringbuf);
927 932
@@ -1096,7 +1101,7 @@ static int intel_logical_ring_workarounds_emit(struct drm_i915_gem_request *req)
1096 1101
1097 intel_logical_ring_emit(ringbuf, MI_LOAD_REGISTER_IMM(w->count)); 1102 intel_logical_ring_emit(ringbuf, MI_LOAD_REGISTER_IMM(w->count));
1098 for (i = 0; i < w->count; i++) { 1103 for (i = 0; i < w->count; i++) {
1099 intel_logical_ring_emit(ringbuf, w->reg[i].addr); 1104 intel_logical_ring_emit_reg(ringbuf, w->reg[i].addr);
1100 intel_logical_ring_emit(ringbuf, w->reg[i].value); 1105 intel_logical_ring_emit(ringbuf, w->reg[i].value);
1101 } 1106 }
1102 intel_logical_ring_emit(ringbuf, MI_NOOP); 1107 intel_logical_ring_emit(ringbuf, MI_NOOP);
@@ -1120,6 +1125,8 @@ static int intel_logical_ring_workarounds_emit(struct drm_i915_gem_request *req)
1120 batch[__index] = (cmd); \ 1125 batch[__index] = (cmd); \
1121 } while (0) 1126 } while (0)
1122 1127
1128#define wa_ctx_emit_reg(batch, index, reg) \
1129 wa_ctx_emit((batch), (index), i915_mmio_reg_offset(reg))
1123 1130
1124/* 1131/*
1125 * In this WA we need to set GEN8_L3SQCREG4[21:21] and reset it after 1132 * In this WA we need to set GEN8_L3SQCREG4[21:21] and reset it after
@@ -1149,17 +1156,17 @@ static inline int gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *ring,
1149 * this batch updates GEN8_L3SQCREG4 with default value we need to 1156 * this batch updates GEN8_L3SQCREG4 with default value we need to
1150 * set this bit here to retain the WA during flush. 1157 * set this bit here to retain the WA during flush.
1151 */ 1158 */
1152 if (IS_SKYLAKE(ring->dev) && INTEL_REVID(ring->dev) <= SKL_REVID_E0) 1159 if (IS_SKL_REVID(ring->dev, 0, SKL_REVID_E0))
1153 l3sqc4_flush |= GEN8_LQSC_RO_PERF_DIS; 1160 l3sqc4_flush |= GEN8_LQSC_RO_PERF_DIS;
1154 1161
1155 wa_ctx_emit(batch, index, (MI_STORE_REGISTER_MEM_GEN8 | 1162 wa_ctx_emit(batch, index, (MI_STORE_REGISTER_MEM_GEN8 |
1156 MI_SRM_LRM_GLOBAL_GTT)); 1163 MI_SRM_LRM_GLOBAL_GTT));
1157 wa_ctx_emit(batch, index, GEN8_L3SQCREG4); 1164 wa_ctx_emit_reg(batch, index, GEN8_L3SQCREG4);
1158 wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256); 1165 wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256);
1159 wa_ctx_emit(batch, index, 0); 1166 wa_ctx_emit(batch, index, 0);
1160 1167
1161 wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(1)); 1168 wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(1));
1162 wa_ctx_emit(batch, index, GEN8_L3SQCREG4); 1169 wa_ctx_emit_reg(batch, index, GEN8_L3SQCREG4);
1163 wa_ctx_emit(batch, index, l3sqc4_flush); 1170 wa_ctx_emit(batch, index, l3sqc4_flush);
1164 1171
1165 wa_ctx_emit(batch, index, GFX_OP_PIPE_CONTROL(6)); 1172 wa_ctx_emit(batch, index, GFX_OP_PIPE_CONTROL(6));
@@ -1172,7 +1179,7 @@ static inline int gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *ring,
1172 1179
1173 wa_ctx_emit(batch, index, (MI_LOAD_REGISTER_MEM_GEN8 | 1180 wa_ctx_emit(batch, index, (MI_LOAD_REGISTER_MEM_GEN8 |
1174 MI_SRM_LRM_GLOBAL_GTT)); 1181 MI_SRM_LRM_GLOBAL_GTT));
1175 wa_ctx_emit(batch, index, GEN8_L3SQCREG4); 1182 wa_ctx_emit_reg(batch, index, GEN8_L3SQCREG4);
1176 wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256); 1183 wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256);
1177 wa_ctx_emit(batch, index, 0); 1184 wa_ctx_emit(batch, index, 0);
1178 1185
@@ -1314,8 +1321,8 @@ static int gen9_init_indirectctx_bb(struct intel_engine_cs *ring,
1314 uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS); 1321 uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS);
1315 1322
1316 /* WaDisableCtxRestoreArbitration:skl,bxt */ 1323 /* WaDisableCtxRestoreArbitration:skl,bxt */
1317 if ((IS_SKYLAKE(dev) && (INTEL_REVID(dev) <= SKL_REVID_D0)) || 1324 if (IS_SKL_REVID(dev, 0, SKL_REVID_D0) ||
1318 (IS_BROXTON(dev) && (INTEL_REVID(dev) == BXT_REVID_A0))) 1325 IS_BXT_REVID(dev, 0, BXT_REVID_A1))
1319 wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_DISABLE); 1326 wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_DISABLE);
1320 1327
1321 /* WaFlushCoherentL3CacheLinesAtContextSwitch:skl,bxt */ 1328 /* WaFlushCoherentL3CacheLinesAtContextSwitch:skl,bxt */
@@ -1340,18 +1347,18 @@ static int gen9_init_perctx_bb(struct intel_engine_cs *ring,
1340 uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS); 1347 uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS);
1341 1348
1342 /* WaSetDisablePixMaskCammingAndRhwoInCommonSliceChicken:skl,bxt */ 1349 /* WaSetDisablePixMaskCammingAndRhwoInCommonSliceChicken:skl,bxt */
1343 if ((IS_SKYLAKE(dev) && (INTEL_REVID(dev) <= SKL_REVID_B0)) || 1350 if (IS_SKL_REVID(dev, 0, SKL_REVID_B0) ||
1344 (IS_BROXTON(dev) && (INTEL_REVID(dev) == BXT_REVID_A0))) { 1351 IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
1345 wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(1)); 1352 wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(1));
1346 wa_ctx_emit(batch, index, GEN9_SLICE_COMMON_ECO_CHICKEN0); 1353 wa_ctx_emit_reg(batch, index, GEN9_SLICE_COMMON_ECO_CHICKEN0);
1347 wa_ctx_emit(batch, index, 1354 wa_ctx_emit(batch, index,
1348 _MASKED_BIT_ENABLE(DISABLE_PIXEL_MASK_CAMMING)); 1355 _MASKED_BIT_ENABLE(DISABLE_PIXEL_MASK_CAMMING));
1349 wa_ctx_emit(batch, index, MI_NOOP); 1356 wa_ctx_emit(batch, index, MI_NOOP);
1350 } 1357 }
1351 1358
1352 /* WaDisableCtxRestoreArbitration:skl,bxt */ 1359 /* WaDisableCtxRestoreArbitration:skl,bxt */
1353 if ((IS_SKYLAKE(dev) && (INTEL_REVID(dev) <= SKL_REVID_D0)) || 1360 if (IS_SKL_REVID(dev, 0, SKL_REVID_D0) ||
1354 (IS_BROXTON(dev) && (INTEL_REVID(dev) == BXT_REVID_A0))) 1361 IS_BXT_REVID(dev, 0, BXT_REVID_A1))
1355 wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_ENABLE); 1362 wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_ENABLE);
1356 1363
1357 wa_ctx_emit(batch, index, MI_BATCH_BUFFER_END); 1364 wa_ctx_emit(batch, index, MI_BATCH_BUFFER_END);
@@ -1472,12 +1479,6 @@ static int gen8_init_common_ring(struct intel_engine_cs *ring)
1472 I915_WRITE_IMR(ring, ~(ring->irq_enable_mask | ring->irq_keep_mask)); 1479 I915_WRITE_IMR(ring, ~(ring->irq_enable_mask | ring->irq_keep_mask));
1473 I915_WRITE(RING_HWSTAM(ring->mmio_base), 0xffffffff); 1480 I915_WRITE(RING_HWSTAM(ring->mmio_base), 0xffffffff);
1474 1481
1475 if (ring->status_page.obj) {
1476 I915_WRITE(RING_HWS_PGA(ring->mmio_base),
1477 (u32)ring->status_page.gfx_addr);
1478 POSTING_READ(RING_HWS_PGA(ring->mmio_base));
1479 }
1480
1481 I915_WRITE(RING_MODE_GEN7(ring), 1482 I915_WRITE(RING_MODE_GEN7(ring),
1482 _MASKED_BIT_DISABLE(GFX_REPLAY_MODE) | 1483 _MASKED_BIT_DISABLE(GFX_REPLAY_MODE) |
1483 _MASKED_BIT_ENABLE(GFX_RUN_LIST_ENABLE)); 1484 _MASKED_BIT_ENABLE(GFX_RUN_LIST_ENABLE));
@@ -1562,9 +1563,9 @@ static int intel_logical_ring_emit_pdps(struct drm_i915_gem_request *req)
1562 for (i = GEN8_LEGACY_PDPES - 1; i >= 0; i--) { 1563 for (i = GEN8_LEGACY_PDPES - 1; i >= 0; i--) {
1563 const dma_addr_t pd_daddr = i915_page_dir_dma_addr(ppgtt, i); 1564 const dma_addr_t pd_daddr = i915_page_dir_dma_addr(ppgtt, i);
1564 1565
1565 intel_logical_ring_emit(ringbuf, GEN8_RING_PDP_UDW(ring, i)); 1566 intel_logical_ring_emit_reg(ringbuf, GEN8_RING_PDP_UDW(ring, i));
1566 intel_logical_ring_emit(ringbuf, upper_32_bits(pd_daddr)); 1567 intel_logical_ring_emit(ringbuf, upper_32_bits(pd_daddr));
1567 intel_logical_ring_emit(ringbuf, GEN8_RING_PDP_LDW(ring, i)); 1568 intel_logical_ring_emit_reg(ringbuf, GEN8_RING_PDP_LDW(ring, i));
1568 intel_logical_ring_emit(ringbuf, lower_32_bits(pd_daddr)); 1569 intel_logical_ring_emit(ringbuf, lower_32_bits(pd_daddr));
1569 } 1570 }
1570 1571
@@ -1923,6 +1924,7 @@ static int logical_ring_init(struct drm_device *dev, struct intel_engine_cs *rin
1923 i915_gem_batch_pool_init(dev, &ring->batch_pool); 1924 i915_gem_batch_pool_init(dev, &ring->batch_pool);
1924 init_waitqueue_head(&ring->irq_queue); 1925 init_waitqueue_head(&ring->irq_queue);
1925 1926
1927 INIT_LIST_HEAD(&ring->buffers);
1926 INIT_LIST_HEAD(&ring->execlist_queue); 1928 INIT_LIST_HEAD(&ring->execlist_queue);
1927 INIT_LIST_HEAD(&ring->execlist_retired_req_list); 1929 INIT_LIST_HEAD(&ring->execlist_retired_req_list);
1928 spin_lock_init(&ring->execlist_lock); 1930 spin_lock_init(&ring->execlist_lock);
@@ -1972,7 +1974,7 @@ static int logical_render_ring_init(struct drm_device *dev)
1972 ring->init_hw = gen8_init_render_ring; 1974 ring->init_hw = gen8_init_render_ring;
1973 ring->init_context = gen8_init_rcs_context; 1975 ring->init_context = gen8_init_rcs_context;
1974 ring->cleanup = intel_fini_pipe_control; 1976 ring->cleanup = intel_fini_pipe_control;
1975 if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { 1977 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
1976 ring->get_seqno = bxt_a_get_seqno; 1978 ring->get_seqno = bxt_a_get_seqno;
1977 ring->set_seqno = bxt_a_set_seqno; 1979 ring->set_seqno = bxt_a_set_seqno;
1978 } else { 1980 } else {
@@ -2024,7 +2026,7 @@ static int logical_bsd_ring_init(struct drm_device *dev)
2024 GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VCS1_IRQ_SHIFT; 2026 GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VCS1_IRQ_SHIFT;
2025 2027
2026 ring->init_hw = gen8_init_common_ring; 2028 ring->init_hw = gen8_init_common_ring;
2027 if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { 2029 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
2028 ring->get_seqno = bxt_a_get_seqno; 2030 ring->get_seqno = bxt_a_get_seqno;
2029 ring->set_seqno = bxt_a_set_seqno; 2031 ring->set_seqno = bxt_a_set_seqno;
2030 } else { 2032 } else {
@@ -2079,7 +2081,7 @@ static int logical_blt_ring_init(struct drm_device *dev)
2079 GT_CONTEXT_SWITCH_INTERRUPT << GEN8_BCS_IRQ_SHIFT; 2081 GT_CONTEXT_SWITCH_INTERRUPT << GEN8_BCS_IRQ_SHIFT;
2080 2082
2081 ring->init_hw = gen8_init_common_ring; 2083 ring->init_hw = gen8_init_common_ring;
2082 if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { 2084 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
2083 ring->get_seqno = bxt_a_get_seqno; 2085 ring->get_seqno = bxt_a_get_seqno;
2084 ring->set_seqno = bxt_a_set_seqno; 2086 ring->set_seqno = bxt_a_set_seqno;
2085 } else { 2087 } else {
@@ -2109,7 +2111,7 @@ static int logical_vebox_ring_init(struct drm_device *dev)
2109 GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VECS_IRQ_SHIFT; 2111 GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VECS_IRQ_SHIFT;
2110 2112
2111 ring->init_hw = gen8_init_common_ring; 2113 ring->init_hw = gen8_init_common_ring;
2112 if (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0) { 2114 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
2113 ring->get_seqno = bxt_a_get_seqno; 2115 ring->get_seqno = bxt_a_get_seqno;
2114 ring->set_seqno = bxt_a_set_seqno; 2116 ring->set_seqno = bxt_a_set_seqno;
2115 } else { 2117 } else {
@@ -2263,46 +2265,31 @@ populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_o
2263 * only for the first context restore: on a subsequent save, the GPU will 2265 * only for the first context restore: on a subsequent save, the GPU will
2264 * recreate this batchbuffer with new values (including all the missing 2266 * recreate this batchbuffer with new values (including all the missing
2265 * MI_LOAD_REGISTER_IMM commands that we are not initializing here). */ 2267 * MI_LOAD_REGISTER_IMM commands that we are not initializing here). */
2266 if (ring->id == RCS) 2268 reg_state[CTX_LRI_HEADER_0] =
2267 reg_state[CTX_LRI_HEADER_0] = MI_LOAD_REGISTER_IMM(14); 2269 MI_LOAD_REGISTER_IMM(ring->id == RCS ? 14 : 11) | MI_LRI_FORCE_POSTED;
2268 else 2270 ASSIGN_CTX_REG(reg_state, CTX_CONTEXT_CONTROL, RING_CONTEXT_CONTROL(ring),
2269 reg_state[CTX_LRI_HEADER_0] = MI_LOAD_REGISTER_IMM(11); 2271 _MASKED_BIT_ENABLE(CTX_CTRL_INHIBIT_SYN_CTX_SWITCH |
2270 reg_state[CTX_LRI_HEADER_0] |= MI_LRI_FORCE_POSTED; 2272 CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT |
2271 reg_state[CTX_CONTEXT_CONTROL] = RING_CONTEXT_CONTROL(ring); 2273 CTX_CTRL_RS_CTX_ENABLE));
2272 reg_state[CTX_CONTEXT_CONTROL+1] = 2274 ASSIGN_CTX_REG(reg_state, CTX_RING_HEAD, RING_HEAD(ring->mmio_base), 0);
2273 _MASKED_BIT_ENABLE(CTX_CTRL_INHIBIT_SYN_CTX_SWITCH | 2275 ASSIGN_CTX_REG(reg_state, CTX_RING_TAIL, RING_TAIL(ring->mmio_base), 0);
2274 CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT |
2275 CTX_CTRL_RS_CTX_ENABLE);
2276 reg_state[CTX_RING_HEAD] = RING_HEAD(ring->mmio_base);
2277 reg_state[CTX_RING_HEAD+1] = 0;
2278 reg_state[CTX_RING_TAIL] = RING_TAIL(ring->mmio_base);
2279 reg_state[CTX_RING_TAIL+1] = 0;
2280 reg_state[CTX_RING_BUFFER_START] = RING_START(ring->mmio_base);
2281 /* Ring buffer start address is not known until the buffer is pinned. 2276 /* Ring buffer start address is not known until the buffer is pinned.
2282 * It is written to the context image in execlists_update_context() 2277 * It is written to the context image in execlists_update_context()
2283 */ 2278 */
2284 reg_state[CTX_RING_BUFFER_CONTROL] = RING_CTL(ring->mmio_base); 2279 ASSIGN_CTX_REG(reg_state, CTX_RING_BUFFER_START, RING_START(ring->mmio_base), 0);
2285 reg_state[CTX_RING_BUFFER_CONTROL+1] = 2280 ASSIGN_CTX_REG(reg_state, CTX_RING_BUFFER_CONTROL, RING_CTL(ring->mmio_base),
2286 ((ringbuf->size - PAGE_SIZE) & RING_NR_PAGES) | RING_VALID; 2281 ((ringbuf->size - PAGE_SIZE) & RING_NR_PAGES) | RING_VALID);
2287 reg_state[CTX_BB_HEAD_U] = ring->mmio_base + 0x168; 2282 ASSIGN_CTX_REG(reg_state, CTX_BB_HEAD_U, RING_BBADDR_UDW(ring->mmio_base), 0);
2288 reg_state[CTX_BB_HEAD_U+1] = 0; 2283 ASSIGN_CTX_REG(reg_state, CTX_BB_HEAD_L, RING_BBADDR(ring->mmio_base), 0);
2289 reg_state[CTX_BB_HEAD_L] = ring->mmio_base + 0x140; 2284 ASSIGN_CTX_REG(reg_state, CTX_BB_STATE, RING_BBSTATE(ring->mmio_base),
2290 reg_state[CTX_BB_HEAD_L+1] = 0; 2285 RING_BB_PPGTT);
2291 reg_state[CTX_BB_STATE] = ring->mmio_base + 0x110; 2286 ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_HEAD_U, RING_SBBADDR_UDW(ring->mmio_base), 0);
2292 reg_state[CTX_BB_STATE+1] = (1<<5); 2287 ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_HEAD_L, RING_SBBADDR(ring->mmio_base), 0);
2293 reg_state[CTX_SECOND_BB_HEAD_U] = ring->mmio_base + 0x11c; 2288 ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_STATE, RING_SBBSTATE(ring->mmio_base), 0);
2294 reg_state[CTX_SECOND_BB_HEAD_U+1] = 0;
2295 reg_state[CTX_SECOND_BB_HEAD_L] = ring->mmio_base + 0x114;
2296 reg_state[CTX_SECOND_BB_HEAD_L+1] = 0;
2297 reg_state[CTX_SECOND_BB_STATE] = ring->mmio_base + 0x118;
2298 reg_state[CTX_SECOND_BB_STATE+1] = 0;
2299 if (ring->id == RCS) { 2289 if (ring->id == RCS) {
2300 reg_state[CTX_BB_PER_CTX_PTR] = ring->mmio_base + 0x1c0; 2290 ASSIGN_CTX_REG(reg_state, CTX_BB_PER_CTX_PTR, RING_BB_PER_CTX_PTR(ring->mmio_base), 0);
2301 reg_state[CTX_BB_PER_CTX_PTR+1] = 0; 2291 ASSIGN_CTX_REG(reg_state, CTX_RCS_INDIRECT_CTX, RING_INDIRECT_CTX(ring->mmio_base), 0);
2302 reg_state[CTX_RCS_INDIRECT_CTX] = ring->mmio_base + 0x1c4; 2292 ASSIGN_CTX_REG(reg_state, CTX_RCS_INDIRECT_CTX_OFFSET, RING_INDIRECT_CTX_OFFSET(ring->mmio_base), 0);
2303 reg_state[CTX_RCS_INDIRECT_CTX+1] = 0;
2304 reg_state[CTX_RCS_INDIRECT_CTX_OFFSET] = ring->mmio_base + 0x1c8;
2305 reg_state[CTX_RCS_INDIRECT_CTX_OFFSET+1] = 0;
2306 if (ring->wa_ctx.obj) { 2293 if (ring->wa_ctx.obj) {
2307 struct i915_ctx_workarounds *wa_ctx = &ring->wa_ctx; 2294 struct i915_ctx_workarounds *wa_ctx = &ring->wa_ctx;
2308 uint32_t ggtt_offset = i915_gem_obj_ggtt_offset(wa_ctx->obj); 2295 uint32_t ggtt_offset = i915_gem_obj_ggtt_offset(wa_ctx->obj);
@@ -2319,18 +2306,17 @@ populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_o
2319 0x01; 2306 0x01;
2320 } 2307 }
2321 } 2308 }
2322 reg_state[CTX_LRI_HEADER_1] = MI_LOAD_REGISTER_IMM(9); 2309 reg_state[CTX_LRI_HEADER_1] = MI_LOAD_REGISTER_IMM(9) | MI_LRI_FORCE_POSTED;
2323 reg_state[CTX_LRI_HEADER_1] |= MI_LRI_FORCE_POSTED; 2310 ASSIGN_CTX_REG(reg_state, CTX_CTX_TIMESTAMP, RING_CTX_TIMESTAMP(ring->mmio_base), 0);
2324 reg_state[CTX_CTX_TIMESTAMP] = ring->mmio_base + 0x3a8; 2311 /* PDP values well be assigned later if needed */
2325 reg_state[CTX_CTX_TIMESTAMP+1] = 0; 2312 ASSIGN_CTX_REG(reg_state, CTX_PDP3_UDW, GEN8_RING_PDP_UDW(ring, 3), 0);
2326 reg_state[CTX_PDP3_UDW] = GEN8_RING_PDP_UDW(ring, 3); 2313 ASSIGN_CTX_REG(reg_state, CTX_PDP3_LDW, GEN8_RING_PDP_LDW(ring, 3), 0);
2327 reg_state[CTX_PDP3_LDW] = GEN8_RING_PDP_LDW(ring, 3); 2314 ASSIGN_CTX_REG(reg_state, CTX_PDP2_UDW, GEN8_RING_PDP_UDW(ring, 2), 0);
2328 reg_state[CTX_PDP2_UDW] = GEN8_RING_PDP_UDW(ring, 2); 2315 ASSIGN_CTX_REG(reg_state, CTX_PDP2_LDW, GEN8_RING_PDP_LDW(ring, 2), 0);
2329 reg_state[CTX_PDP2_LDW] = GEN8_RING_PDP_LDW(ring, 2); 2316 ASSIGN_CTX_REG(reg_state, CTX_PDP1_UDW, GEN8_RING_PDP_UDW(ring, 1), 0);
2330 reg_state[CTX_PDP1_UDW] = GEN8_RING_PDP_UDW(ring, 1); 2317 ASSIGN_CTX_REG(reg_state, CTX_PDP1_LDW, GEN8_RING_PDP_LDW(ring, 1), 0);
2331 reg_state[CTX_PDP1_LDW] = GEN8_RING_PDP_LDW(ring, 1); 2318 ASSIGN_CTX_REG(reg_state, CTX_PDP0_UDW, GEN8_RING_PDP_UDW(ring, 0), 0);
2332 reg_state[CTX_PDP0_UDW] = GEN8_RING_PDP_UDW(ring, 0); 2319 ASSIGN_CTX_REG(reg_state, CTX_PDP0_LDW, GEN8_RING_PDP_LDW(ring, 0), 0);
2333 reg_state[CTX_PDP0_LDW] = GEN8_RING_PDP_LDW(ring, 0);
2334 2320
2335 if (USES_FULL_48BIT_PPGTT(ppgtt->base.dev)) { 2321 if (USES_FULL_48BIT_PPGTT(ppgtt->base.dev)) {
2336 /* 64b PPGTT (48bit canonical) 2322 /* 64b PPGTT (48bit canonical)
@@ -2352,8 +2338,8 @@ populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_o
2352 2338
2353 if (ring->id == RCS) { 2339 if (ring->id == RCS) {
2354 reg_state[CTX_LRI_HEADER_2] = MI_LOAD_REGISTER_IMM(1); 2340 reg_state[CTX_LRI_HEADER_2] = MI_LOAD_REGISTER_IMM(1);
2355 reg_state[CTX_R_PWR_CLK_STATE] = GEN8_R_PWR_CLK_STATE; 2341 ASSIGN_CTX_REG(reg_state, CTX_R_PWR_CLK_STATE, GEN8_R_PWR_CLK_STATE,
2356 reg_state[CTX_R_PWR_CLK_STATE+1] = make_rpcs(dev); 2342 make_rpcs(dev));
2357 } 2343 }
2358 2344
2359 kunmap_atomic(reg_state); 2345 kunmap_atomic(reg_state);
diff --git a/drivers/gpu/drm/i915/intel_lrc.h b/drivers/gpu/drm/i915/intel_lrc.h
index 4e60d54ba66d..0b821b91723a 100644
--- a/drivers/gpu/drm/i915/intel_lrc.h
+++ b/drivers/gpu/drm/i915/intel_lrc.h
@@ -29,16 +29,16 @@
29#define GEN8_CSB_PTR_MASK 0x07 29#define GEN8_CSB_PTR_MASK 0x07
30 30
31/* Execlists regs */ 31/* Execlists regs */
32#define RING_ELSP(ring) ((ring)->mmio_base+0x230) 32#define RING_ELSP(ring) _MMIO((ring)->mmio_base + 0x230)
33#define RING_EXECLIST_STATUS_LO(ring) ((ring)->mmio_base+0x234) 33#define RING_EXECLIST_STATUS_LO(ring) _MMIO((ring)->mmio_base + 0x234)
34#define RING_EXECLIST_STATUS_HI(ring) ((ring)->mmio_base+0x234 + 4) 34#define RING_EXECLIST_STATUS_HI(ring) _MMIO((ring)->mmio_base + 0x234 + 4)
35#define RING_CONTEXT_CONTROL(ring) ((ring)->mmio_base+0x244) 35#define RING_CONTEXT_CONTROL(ring) _MMIO((ring)->mmio_base + 0x244)
36#define CTX_CTRL_INHIBIT_SYN_CTX_SWITCH (1 << 3) 36#define CTX_CTRL_INHIBIT_SYN_CTX_SWITCH (1 << 3)
37#define CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT (1 << 0) 37#define CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT (1 << 0)
38#define CTX_CTRL_RS_CTX_ENABLE (1 << 1) 38#define CTX_CTRL_RS_CTX_ENABLE (1 << 1)
39#define RING_CONTEXT_STATUS_BUF_LO(ring, i) ((ring)->mmio_base+0x370 + (i) * 8) 39#define RING_CONTEXT_STATUS_BUF_LO(ring, i) _MMIO((ring)->mmio_base + 0x370 + (i) * 8)
40#define RING_CONTEXT_STATUS_BUF_HI(ring, i) ((ring)->mmio_base+0x370 + (i) * 8 + 4) 40#define RING_CONTEXT_STATUS_BUF_HI(ring, i) _MMIO((ring)->mmio_base + 0x370 + (i) * 8 + 4)
41#define RING_CONTEXT_STATUS_PTR(ring) ((ring)->mmio_base+0x3a0) 41#define RING_CONTEXT_STATUS_PTR(ring) _MMIO((ring)->mmio_base + 0x3a0)
42 42
43/* Logical Rings */ 43/* Logical Rings */
44int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request); 44int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request);
@@ -70,6 +70,11 @@ static inline void intel_logical_ring_emit(struct intel_ringbuffer *ringbuf,
70 iowrite32(data, ringbuf->virtual_start + ringbuf->tail); 70 iowrite32(data, ringbuf->virtual_start + ringbuf->tail);
71 ringbuf->tail += 4; 71 ringbuf->tail += 4;
72} 72}
73static inline void intel_logical_ring_emit_reg(struct intel_ringbuffer *ringbuf,
74 i915_reg_t reg)
75{
76 intel_logical_ring_emit(ringbuf, i915_mmio_reg_offset(reg));
77}
73 78
74/* Logical Ring Contexts */ 79/* Logical Ring Contexts */
75 80
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index 7f39b8ad88ae..61f1145f6579 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -51,7 +51,7 @@ struct intel_lvds_encoder {
51 struct intel_encoder base; 51 struct intel_encoder base;
52 52
53 bool is_dual_link; 53 bool is_dual_link;
54 u32 reg; 54 i915_reg_t reg;
55 u32 a3_power; 55 u32 a3_power;
56 56
57 struct intel_lvds_connector *attached_connector; 57 struct intel_lvds_connector *attached_connector;
@@ -210,7 +210,7 @@ static void intel_enable_lvds(struct intel_encoder *encoder)
210 struct intel_connector *intel_connector = 210 struct intel_connector *intel_connector =
211 &lvds_encoder->attached_connector->base; 211 &lvds_encoder->attached_connector->base;
212 struct drm_i915_private *dev_priv = dev->dev_private; 212 struct drm_i915_private *dev_priv = dev->dev_private;
213 u32 ctl_reg, stat_reg; 213 i915_reg_t ctl_reg, stat_reg;
214 214
215 if (HAS_PCH_SPLIT(dev)) { 215 if (HAS_PCH_SPLIT(dev)) {
216 ctl_reg = PCH_PP_CONTROL; 216 ctl_reg = PCH_PP_CONTROL;
@@ -235,7 +235,7 @@ static void intel_disable_lvds(struct intel_encoder *encoder)
235 struct drm_device *dev = encoder->base.dev; 235 struct drm_device *dev = encoder->base.dev;
236 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); 236 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
237 struct drm_i915_private *dev_priv = dev->dev_private; 237 struct drm_i915_private *dev_priv = dev->dev_private;
238 u32 ctl_reg, stat_reg; 238 i915_reg_t ctl_reg, stat_reg;
239 239
240 if (HAS_PCH_SPLIT(dev)) { 240 if (HAS_PCH_SPLIT(dev)) {
241 ctl_reg = PCH_PP_CONTROL; 241 ctl_reg = PCH_PP_CONTROL;
@@ -939,7 +939,7 @@ void intel_lvds_init(struct drm_device *dev)
939 struct drm_display_mode *downclock_mode = NULL; 939 struct drm_display_mode *downclock_mode = NULL;
940 struct edid *edid; 940 struct edid *edid;
941 struct drm_crtc *crtc; 941 struct drm_crtc *crtc;
942 u32 lvds_reg; 942 i915_reg_t lvds_reg;
943 u32 lvds; 943 u32 lvds;
944 int pipe; 944 int pipe;
945 u8 pin; 945 u8 pin;
@@ -1164,8 +1164,7 @@ out:
1164 DRM_DEBUG_KMS("detected %s-link lvds configuration\n", 1164 DRM_DEBUG_KMS("detected %s-link lvds configuration\n",
1165 lvds_encoder->is_dual_link ? "dual" : "single"); 1165 lvds_encoder->is_dual_link ? "dual" : "single");
1166 1166
1167 lvds_encoder->a3_power = I915_READ(lvds_encoder->reg) & 1167 lvds_encoder->a3_power = lvds & LVDS_A3_POWER_MASK;
1168 LVDS_A3_POWER_MASK;
1169 1168
1170 lvds_connector->lid_notifier.notifier_call = intel_lid_notify; 1169 lvds_connector->lid_notifier.notifier_call = intel_lid_notify;
1171 if (acpi_lid_notifier_register(&lvds_connector->lid_notifier)) { 1170 if (acpi_lid_notifier_register(&lvds_connector->lid_notifier)) {
diff --git a/drivers/gpu/drm/i915/intel_mocs.c b/drivers/gpu/drm/i915/intel_mocs.c
index 6d3c6c0a5c62..fed7bea19cc9 100644
--- a/drivers/gpu/drm/i915/intel_mocs.c
+++ b/drivers/gpu/drm/i915/intel_mocs.c
@@ -143,7 +143,7 @@ static bool get_mocs_settings(struct drm_device *dev,
143{ 143{
144 bool result = false; 144 bool result = false;
145 145
146 if (IS_SKYLAKE(dev)) { 146 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
147 table->size = ARRAY_SIZE(skylake_mocs_table); 147 table->size = ARRAY_SIZE(skylake_mocs_table);
148 table->table = skylake_mocs_table; 148 table->table = skylake_mocs_table;
149 result = true; 149 result = true;
@@ -159,11 +159,30 @@ static bool get_mocs_settings(struct drm_device *dev,
159 return result; 159 return result;
160} 160}
161 161
162static i915_reg_t mocs_register(enum intel_ring_id ring, int index)
163{
164 switch (ring) {
165 case RCS:
166 return GEN9_GFX_MOCS(index);
167 case VCS:
168 return GEN9_MFX0_MOCS(index);
169 case BCS:
170 return GEN9_BLT_MOCS(index);
171 case VECS:
172 return GEN9_VEBOX_MOCS(index);
173 case VCS2:
174 return GEN9_MFX1_MOCS(index);
175 default:
176 MISSING_CASE(ring);
177 return INVALID_MMIO_REG;
178 }
179}
180
162/** 181/**
163 * emit_mocs_control_table() - emit the mocs control table 182 * emit_mocs_control_table() - emit the mocs control table
164 * @req: Request to set up the MOCS table for. 183 * @req: Request to set up the MOCS table for.
165 * @table: The values to program into the control regs. 184 * @table: The values to program into the control regs.
166 * @reg_base: The base for the engine that needs to be programmed. 185 * @ring: The engine for whom to emit the registers.
167 * 186 *
168 * This function simply emits a MI_LOAD_REGISTER_IMM command for the 187 * This function simply emits a MI_LOAD_REGISTER_IMM command for the
169 * given table starting at the given address. 188 * given table starting at the given address.
@@ -172,7 +191,7 @@ static bool get_mocs_settings(struct drm_device *dev,
172 */ 191 */
173static int emit_mocs_control_table(struct drm_i915_gem_request *req, 192static int emit_mocs_control_table(struct drm_i915_gem_request *req,
174 const struct drm_i915_mocs_table *table, 193 const struct drm_i915_mocs_table *table,
175 u32 reg_base) 194 enum intel_ring_id ring)
176{ 195{
177 struct intel_ringbuffer *ringbuf = req->ringbuf; 196 struct intel_ringbuffer *ringbuf = req->ringbuf;
178 unsigned int index; 197 unsigned int index;
@@ -191,7 +210,7 @@ static int emit_mocs_control_table(struct drm_i915_gem_request *req,
191 MI_LOAD_REGISTER_IMM(GEN9_NUM_MOCS_ENTRIES)); 210 MI_LOAD_REGISTER_IMM(GEN9_NUM_MOCS_ENTRIES));
192 211
193 for (index = 0; index < table->size; index++) { 212 for (index = 0; index < table->size; index++) {
194 intel_logical_ring_emit(ringbuf, reg_base + index * 4); 213 intel_logical_ring_emit_reg(ringbuf, mocs_register(ring, index));
195 intel_logical_ring_emit(ringbuf, 214 intel_logical_ring_emit(ringbuf,
196 table->table[index].control_value); 215 table->table[index].control_value);
197 } 216 }
@@ -205,7 +224,7 @@ static int emit_mocs_control_table(struct drm_i915_gem_request *req,
205 * that value to all the used entries. 224 * that value to all the used entries.
206 */ 225 */
207 for (; index < GEN9_NUM_MOCS_ENTRIES; index++) { 226 for (; index < GEN9_NUM_MOCS_ENTRIES; index++) {
208 intel_logical_ring_emit(ringbuf, reg_base + index * 4); 227 intel_logical_ring_emit_reg(ringbuf, mocs_register(ring, index));
209 intel_logical_ring_emit(ringbuf, table->table[0].control_value); 228 intel_logical_ring_emit(ringbuf, table->table[0].control_value);
210 } 229 }
211 230
@@ -253,7 +272,7 @@ static int emit_mocs_l3cc_table(struct drm_i915_gem_request *req,
253 value = (table->table[count].l3cc_value & 0xffff) | 272 value = (table->table[count].l3cc_value & 0xffff) |
254 ((table->table[count + 1].l3cc_value & 0xffff) << 16); 273 ((table->table[count + 1].l3cc_value & 0xffff) << 16);
255 274
256 intel_logical_ring_emit(ringbuf, GEN9_LNCFCMOCS0 + i * 4); 275 intel_logical_ring_emit_reg(ringbuf, GEN9_LNCFCMOCS(i));
257 intel_logical_ring_emit(ringbuf, value); 276 intel_logical_ring_emit(ringbuf, value);
258 } 277 }
259 278
@@ -270,7 +289,7 @@ static int emit_mocs_l3cc_table(struct drm_i915_gem_request *req,
270 * they are reserved by the hardware. 289 * they are reserved by the hardware.
271 */ 290 */
272 for (; i < GEN9_NUM_MOCS_ENTRIES / 2; i++) { 291 for (; i < GEN9_NUM_MOCS_ENTRIES / 2; i++) {
273 intel_logical_ring_emit(ringbuf, GEN9_LNCFCMOCS0 + i * 4); 292 intel_logical_ring_emit_reg(ringbuf, GEN9_LNCFCMOCS(i));
274 intel_logical_ring_emit(ringbuf, value); 293 intel_logical_ring_emit(ringbuf, value);
275 294
276 value = filler; 295 value = filler;
@@ -304,26 +323,16 @@ int intel_rcs_context_init_mocs(struct drm_i915_gem_request *req)
304 int ret; 323 int ret;
305 324
306 if (get_mocs_settings(req->ring->dev, &t)) { 325 if (get_mocs_settings(req->ring->dev, &t)) {
307 /* Program the control registers */ 326 struct drm_i915_private *dev_priv = req->i915;
308 ret = emit_mocs_control_table(req, &t, GEN9_GFX_MOCS_0); 327 struct intel_engine_cs *ring;
309 if (ret) 328 enum intel_ring_id ring_id;
310 return ret;
311
312 ret = emit_mocs_control_table(req, &t, GEN9_MFX0_MOCS_0);
313 if (ret)
314 return ret;
315 329
316 ret = emit_mocs_control_table(req, &t, GEN9_MFX1_MOCS_0); 330 /* Program the control registers */
317 if (ret) 331 for_each_ring(ring, dev_priv, ring_id) {
318 return ret; 332 ret = emit_mocs_control_table(req, &t, ring_id);
319 333 if (ret)
320 ret = emit_mocs_control_table(req, &t, GEN9_VEBOX_MOCS_0); 334 return ret;
321 if (ret) 335 }
322 return ret;
323
324 ret = emit_mocs_control_table(req, &t, GEN9_BLT_MOCS_0);
325 if (ret)
326 return ret;
327 336
328 /* Now program the l3cc registers */ 337 /* Now program the l3cc registers */
329 ret = emit_mocs_l3cc_table(req, &t); 338 ret = emit_mocs_l3cc_table(req, &t);
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index 6dc13c02c28e..e362a30776fa 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -682,7 +682,7 @@ static void intel_didl_outputs(struct drm_device *dev)
682 } 682 }
683 683
684 if (!acpi_video_bus) { 684 if (!acpi_video_bus) {
685 DRM_ERROR("No ACPI video bus found\n"); 685 DRM_DEBUG_KMS("No ACPI video bus found\n");
686 return; 686 return;
687 } 687 }
688 688
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index 444542696a2c..76f1980a7541 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -749,7 +749,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
749 if (ret != 0) 749 if (ret != 0)
750 return ret; 750 return ret;
751 751
752 ret = i915_gem_object_pin_to_display_plane(new_bo, 0, NULL, NULL, 752 ret = i915_gem_object_pin_to_display_plane(new_bo, 0,
753 &i915_ggtt_view_normal); 753 &i915_ggtt_view_normal);
754 if (ret != 0) 754 if (ret != 0)
755 return ret; 755 return ret;
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index f091ad12d694..038a81d03b17 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -1708,13 +1708,6 @@ static uint32_t ilk_wm_fbc(uint32_t pri_val, uint32_t horiz_pixels,
1708 return DIV_ROUND_UP(pri_val * 64, horiz_pixels * bytes_per_pixel) + 2; 1708 return DIV_ROUND_UP(pri_val * 64, horiz_pixels * bytes_per_pixel) + 2;
1709} 1709}
1710 1710
1711struct skl_pipe_wm_parameters {
1712 bool active;
1713 uint32_t pipe_htotal;
1714 uint32_t pixel_rate; /* in KHz */
1715 struct intel_plane_wm_parameters plane[I915_MAX_PLANES];
1716};
1717
1718struct ilk_wm_maximums { 1711struct ilk_wm_maximums {
1719 uint16_t pri; 1712 uint16_t pri;
1720 uint16_t spr; 1713 uint16_t spr;
@@ -1722,13 +1715,6 @@ struct ilk_wm_maximums {
1722 uint16_t fbc; 1715 uint16_t fbc;
1723}; 1716};
1724 1717
1725/* used in computing the new watermarks state */
1726struct intel_wm_config {
1727 unsigned int num_pipes_active;
1728 bool sprites_enabled;
1729 bool sprites_scaled;
1730};
1731
1732/* 1718/*
1733 * For both WM_PIPE and WM_LP. 1719 * For both WM_PIPE and WM_LP.
1734 * mem_value must be in 0.1us units. 1720 * mem_value must be in 0.1us units.
@@ -1979,9 +1965,11 @@ static void ilk_compute_wm_level(const struct drm_i915_private *dev_priv,
1979 const struct intel_crtc *intel_crtc, 1965 const struct intel_crtc *intel_crtc,
1980 int level, 1966 int level,
1981 struct intel_crtc_state *cstate, 1967 struct intel_crtc_state *cstate,
1968 struct intel_plane_state *pristate,
1969 struct intel_plane_state *sprstate,
1970 struct intel_plane_state *curstate,
1982 struct intel_wm_level *result) 1971 struct intel_wm_level *result)
1983{ 1972{
1984 struct intel_plane *intel_plane;
1985 uint16_t pri_latency = dev_priv->wm.pri_latency[level]; 1973 uint16_t pri_latency = dev_priv->wm.pri_latency[level];
1986 uint16_t spr_latency = dev_priv->wm.spr_latency[level]; 1974 uint16_t spr_latency = dev_priv->wm.spr_latency[level];
1987 uint16_t cur_latency = dev_priv->wm.cur_latency[level]; 1975 uint16_t cur_latency = dev_priv->wm.cur_latency[level];
@@ -1993,29 +1981,11 @@ static void ilk_compute_wm_level(const struct drm_i915_private *dev_priv,
1993 cur_latency *= 5; 1981 cur_latency *= 5;
1994 } 1982 }
1995 1983
1996 for_each_intel_plane_on_crtc(dev_priv->dev, intel_crtc, intel_plane) { 1984 result->pri_val = ilk_compute_pri_wm(cstate, pristate,
1997 struct intel_plane_state *pstate = 1985 pri_latency, level);
1998 to_intel_plane_state(intel_plane->base.state); 1986 result->spr_val = ilk_compute_spr_wm(cstate, sprstate, spr_latency);
1999 1987 result->cur_val = ilk_compute_cur_wm(cstate, curstate, cur_latency);
2000 switch (intel_plane->base.type) { 1988 result->fbc_val = ilk_compute_fbc_wm(cstate, pristate, result->pri_val);
2001 case DRM_PLANE_TYPE_PRIMARY:
2002 result->pri_val = ilk_compute_pri_wm(cstate, pstate,
2003 pri_latency,
2004 level);
2005 result->fbc_val = ilk_compute_fbc_wm(cstate, pstate,
2006 result->pri_val);
2007 break;
2008 case DRM_PLANE_TYPE_OVERLAY:
2009 result->spr_val = ilk_compute_spr_wm(cstate, pstate,
2010 spr_latency);
2011 break;
2012 case DRM_PLANE_TYPE_CURSOR:
2013 result->cur_val = ilk_compute_cur_wm(cstate, pstate,
2014 cur_latency);
2015 break;
2016 }
2017 }
2018
2019 result->enable = true; 1989 result->enable = true;
2020} 1990}
2021 1991
@@ -2274,34 +2244,19 @@ static void skl_setup_wm_latency(struct drm_device *dev)
2274 intel_print_wm_latency(dev, "Gen9 Plane", dev_priv->wm.skl_latency); 2244 intel_print_wm_latency(dev, "Gen9 Plane", dev_priv->wm.skl_latency);
2275} 2245}
2276 2246
2277static void ilk_compute_wm_config(struct drm_device *dev,
2278 struct intel_wm_config *config)
2279{
2280 struct intel_crtc *intel_crtc;
2281
2282 /* Compute the currently _active_ config */
2283 for_each_intel_crtc(dev, intel_crtc) {
2284 const struct intel_pipe_wm *wm = &intel_crtc->wm.active;
2285
2286 if (!wm->pipe_enabled)
2287 continue;
2288
2289 config->sprites_enabled |= wm->sprites_enabled;
2290 config->sprites_scaled |= wm->sprites_scaled;
2291 config->num_pipes_active++;
2292 }
2293}
2294
2295/* Compute new watermarks for the pipe */ 2247/* Compute new watermarks for the pipe */
2296static bool intel_compute_pipe_wm(struct intel_crtc_state *cstate, 2248static int ilk_compute_pipe_wm(struct intel_crtc *intel_crtc,
2297 struct intel_pipe_wm *pipe_wm) 2249 struct drm_atomic_state *state)
2298{ 2250{
2299 struct drm_crtc *crtc = cstate->base.crtc; 2251 struct intel_pipe_wm *pipe_wm;
2300 struct drm_device *dev = crtc->dev; 2252 struct drm_device *dev = intel_crtc->base.dev;
2301 const struct drm_i915_private *dev_priv = dev->dev_private; 2253 const struct drm_i915_private *dev_priv = dev->dev_private;
2302 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2254 struct intel_crtc_state *cstate = NULL;
2303 struct intel_plane *intel_plane; 2255 struct intel_plane *intel_plane;
2256 struct drm_plane_state *ps;
2257 struct intel_plane_state *pristate = NULL;
2304 struct intel_plane_state *sprstate = NULL; 2258 struct intel_plane_state *sprstate = NULL;
2259 struct intel_plane_state *curstate = NULL;
2305 int level, max_level = ilk_wm_max_level(dev); 2260 int level, max_level = ilk_wm_max_level(dev);
2306 /* LP0 watermark maximums depend on this pipe alone */ 2261 /* LP0 watermark maximums depend on this pipe alone */
2307 struct intel_wm_config config = { 2262 struct intel_wm_config config = {
@@ -2309,11 +2264,24 @@ static bool intel_compute_pipe_wm(struct intel_crtc_state *cstate,
2309 }; 2264 };
2310 struct ilk_wm_maximums max; 2265 struct ilk_wm_maximums max;
2311 2266
2267 cstate = intel_atomic_get_crtc_state(state, intel_crtc);
2268 if (IS_ERR(cstate))
2269 return PTR_ERR(cstate);
2270
2271 pipe_wm = &cstate->wm.optimal.ilk;
2272
2312 for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) { 2273 for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
2313 if (intel_plane->base.type == DRM_PLANE_TYPE_OVERLAY) { 2274 ps = drm_atomic_get_plane_state(state,
2314 sprstate = to_intel_plane_state(intel_plane->base.state); 2275 &intel_plane->base);
2315 break; 2276 if (IS_ERR(ps))
2316 } 2277 return PTR_ERR(ps);
2278
2279 if (intel_plane->base.type == DRM_PLANE_TYPE_PRIMARY)
2280 pristate = to_intel_plane_state(ps);
2281 else if (intel_plane->base.type == DRM_PLANE_TYPE_OVERLAY)
2282 sprstate = to_intel_plane_state(ps);
2283 else if (intel_plane->base.type == DRM_PLANE_TYPE_CURSOR)
2284 curstate = to_intel_plane_state(ps);
2317 } 2285 }
2318 2286
2319 config.sprites_enabled = sprstate->visible; 2287 config.sprites_enabled = sprstate->visible;
@@ -2322,7 +2290,7 @@ static bool intel_compute_pipe_wm(struct intel_crtc_state *cstate,
2322 drm_rect_height(&sprstate->dst) != drm_rect_height(&sprstate->src) >> 16); 2290 drm_rect_height(&sprstate->dst) != drm_rect_height(&sprstate->src) >> 16);
2323 2291
2324 pipe_wm->pipe_enabled = cstate->base.active; 2292 pipe_wm->pipe_enabled = cstate->base.active;
2325 pipe_wm->sprites_enabled = sprstate->visible; 2293 pipe_wm->sprites_enabled = config.sprites_enabled;
2326 pipe_wm->sprites_scaled = config.sprites_scaled; 2294 pipe_wm->sprites_scaled = config.sprites_scaled;
2327 2295
2328 /* ILK/SNB: LP2+ watermarks only w/o sprites */ 2296 /* ILK/SNB: LP2+ watermarks only w/o sprites */
@@ -2333,24 +2301,27 @@ static bool intel_compute_pipe_wm(struct intel_crtc_state *cstate,
2333 if (config.sprites_scaled) 2301 if (config.sprites_scaled)
2334 max_level = 0; 2302 max_level = 0;
2335 2303
2336 ilk_compute_wm_level(dev_priv, intel_crtc, 0, cstate, &pipe_wm->wm[0]); 2304 ilk_compute_wm_level(dev_priv, intel_crtc, 0, cstate,
2305 pristate, sprstate, curstate, &pipe_wm->wm[0]);
2337 2306
2338 if (IS_HASWELL(dev) || IS_BROADWELL(dev)) 2307 if (IS_HASWELL(dev) || IS_BROADWELL(dev))
2339 pipe_wm->linetime = hsw_compute_linetime_wm(dev, crtc); 2308 pipe_wm->linetime = hsw_compute_linetime_wm(dev,
2309 &intel_crtc->base);
2340 2310
2341 /* LP0 watermarks always use 1/2 DDB partitioning */ 2311 /* LP0 watermarks always use 1/2 DDB partitioning */
2342 ilk_compute_wm_maximums(dev, 0, &config, INTEL_DDB_PART_1_2, &max); 2312 ilk_compute_wm_maximums(dev, 0, &config, INTEL_DDB_PART_1_2, &max);
2343 2313
2344 /* At least LP0 must be valid */ 2314 /* At least LP0 must be valid */
2345 if (!ilk_validate_wm_level(0, &max, &pipe_wm->wm[0])) 2315 if (!ilk_validate_wm_level(0, &max, &pipe_wm->wm[0]))
2346 return false; 2316 return -EINVAL;
2347 2317
2348 ilk_compute_wm_reg_maximums(dev, 1, &max); 2318 ilk_compute_wm_reg_maximums(dev, 1, &max);
2349 2319
2350 for (level = 1; level <= max_level; level++) { 2320 for (level = 1; level <= max_level; level++) {
2351 struct intel_wm_level wm = {}; 2321 struct intel_wm_level wm = {};
2352 2322
2353 ilk_compute_wm_level(dev_priv, intel_crtc, level, cstate, &wm); 2323 ilk_compute_wm_level(dev_priv, intel_crtc, level, cstate,
2324 pristate, sprstate, curstate, &wm);
2354 2325
2355 /* 2326 /*
2356 * Disable any watermark level that exceeds the 2327 * Disable any watermark level that exceeds the
@@ -2363,7 +2334,7 @@ static bool intel_compute_pipe_wm(struct intel_crtc_state *cstate,
2363 pipe_wm->wm[level] = wm; 2334 pipe_wm->wm[level] = wm;
2364 } 2335 }
2365 2336
2366 return true; 2337 return 0;
2367} 2338}
2368 2339
2369/* 2340/*
@@ -2378,7 +2349,9 @@ static void ilk_merge_wm_level(struct drm_device *dev,
2378 ret_wm->enable = true; 2349 ret_wm->enable = true;
2379 2350
2380 for_each_intel_crtc(dev, intel_crtc) { 2351 for_each_intel_crtc(dev, intel_crtc) {
2381 const struct intel_pipe_wm *active = &intel_crtc->wm.active; 2352 const struct intel_crtc_state *cstate =
2353 to_intel_crtc_state(intel_crtc->base.state);
2354 const struct intel_pipe_wm *active = &cstate->wm.optimal.ilk;
2382 const struct intel_wm_level *wm = &active->wm[level]; 2355 const struct intel_wm_level *wm = &active->wm[level];
2383 2356
2384 if (!active->pipe_enabled) 2357 if (!active->pipe_enabled)
@@ -2526,14 +2499,15 @@ static void ilk_compute_wm_results(struct drm_device *dev,
2526 2499
2527 /* LP0 register values */ 2500 /* LP0 register values */
2528 for_each_intel_crtc(dev, intel_crtc) { 2501 for_each_intel_crtc(dev, intel_crtc) {
2502 const struct intel_crtc_state *cstate =
2503 to_intel_crtc_state(intel_crtc->base.state);
2529 enum pipe pipe = intel_crtc->pipe; 2504 enum pipe pipe = intel_crtc->pipe;
2530 const struct intel_wm_level *r = 2505 const struct intel_wm_level *r = &cstate->wm.optimal.ilk.wm[0];
2531 &intel_crtc->wm.active.wm[0];
2532 2506
2533 if (WARN_ON(!r->enable)) 2507 if (WARN_ON(!r->enable))
2534 continue; 2508 continue;
2535 2509
2536 results->wm_linetime[pipe] = intel_crtc->wm.active.linetime; 2510 results->wm_linetime[pipe] = cstate->wm.optimal.ilk.linetime;
2537 2511
2538 results->wm_pipe[pipe] = 2512 results->wm_pipe[pipe] =
2539 (r->pri_val << WM0_PIPE_PLANE_SHIFT) | 2513 (r->pri_val << WM0_PIPE_PLANE_SHIFT) |
@@ -2755,18 +2729,40 @@ static bool ilk_disable_lp_wm(struct drm_device *dev)
2755#define SKL_DDB_SIZE 896 /* in blocks */ 2729#define SKL_DDB_SIZE 896 /* in blocks */
2756#define BXT_DDB_SIZE 512 2730#define BXT_DDB_SIZE 512
2757 2731
2732/*
2733 * Return the index of a plane in the SKL DDB and wm result arrays. Primary
2734 * plane is always in slot 0, cursor is always in slot I915_MAX_PLANES-1, and
2735 * other universal planes are in indices 1..n. Note that this may leave unused
2736 * indices between the top "sprite" plane and the cursor.
2737 */
2738static int
2739skl_wm_plane_id(const struct intel_plane *plane)
2740{
2741 switch (plane->base.type) {
2742 case DRM_PLANE_TYPE_PRIMARY:
2743 return 0;
2744 case DRM_PLANE_TYPE_CURSOR:
2745 return PLANE_CURSOR;
2746 case DRM_PLANE_TYPE_OVERLAY:
2747 return plane->plane + 1;
2748 default:
2749 MISSING_CASE(plane->base.type);
2750 return plane->plane;
2751 }
2752}
2753
2758static void 2754static void
2759skl_ddb_get_pipe_allocation_limits(struct drm_device *dev, 2755skl_ddb_get_pipe_allocation_limits(struct drm_device *dev,
2760 struct drm_crtc *for_crtc, 2756 const struct intel_crtc_state *cstate,
2761 const struct intel_wm_config *config, 2757 const struct intel_wm_config *config,
2762 const struct skl_pipe_wm_parameters *params,
2763 struct skl_ddb_entry *alloc /* out */) 2758 struct skl_ddb_entry *alloc /* out */)
2764{ 2759{
2760 struct drm_crtc *for_crtc = cstate->base.crtc;
2765 struct drm_crtc *crtc; 2761 struct drm_crtc *crtc;
2766 unsigned int pipe_size, ddb_size; 2762 unsigned int pipe_size, ddb_size;
2767 int nth_active_pipe; 2763 int nth_active_pipe;
2768 2764
2769 if (!params->active) { 2765 if (!cstate->base.active) {
2770 alloc->start = 0; 2766 alloc->start = 0;
2771 alloc->end = 0; 2767 alloc->end = 0;
2772 return; 2768 return;
@@ -2837,19 +2833,29 @@ void skl_ddb_get_hw_state(struct drm_i915_private *dev_priv,
2837} 2833}
2838 2834
2839static unsigned int 2835static unsigned int
2840skl_plane_relative_data_rate(const struct intel_plane_wm_parameters *p, int y) 2836skl_plane_relative_data_rate(const struct intel_crtc_state *cstate,
2837 const struct drm_plane_state *pstate,
2838 int y)
2841{ 2839{
2840 struct intel_crtc *intel_crtc = to_intel_crtc(cstate->base.crtc);
2841 struct drm_framebuffer *fb = pstate->fb;
2842 2842
2843 /* for planar format */ 2843 /* for planar format */
2844 if (p->y_bytes_per_pixel) { 2844 if (fb->pixel_format == DRM_FORMAT_NV12) {
2845 if (y) /* y-plane data rate */ 2845 if (y) /* y-plane data rate */
2846 return p->horiz_pixels * p->vert_pixels * p->y_bytes_per_pixel; 2846 return intel_crtc->config->pipe_src_w *
2847 intel_crtc->config->pipe_src_h *
2848 drm_format_plane_cpp(fb->pixel_format, 0);
2847 else /* uv-plane data rate */ 2849 else /* uv-plane data rate */
2848 return (p->horiz_pixels/2) * (p->vert_pixels/2) * p->bytes_per_pixel; 2850 return (intel_crtc->config->pipe_src_w/2) *
2851 (intel_crtc->config->pipe_src_h/2) *
2852 drm_format_plane_cpp(fb->pixel_format, 1);
2849 } 2853 }
2850 2854
2851 /* for packed formats */ 2855 /* for packed formats */
2852 return p->horiz_pixels * p->vert_pixels * p->bytes_per_pixel; 2856 return intel_crtc->config->pipe_src_w *
2857 intel_crtc->config->pipe_src_h *
2858 drm_format_plane_cpp(fb->pixel_format, 0);
2853} 2859}
2854 2860
2855/* 2861/*
@@ -2858,46 +2864,55 @@ skl_plane_relative_data_rate(const struct intel_plane_wm_parameters *p, int y)
2858 * 3 * 4096 * 8192 * 4 < 2^32 2864 * 3 * 4096 * 8192 * 4 < 2^32
2859 */ 2865 */
2860static unsigned int 2866static unsigned int
2861skl_get_total_relative_data_rate(struct intel_crtc *intel_crtc, 2867skl_get_total_relative_data_rate(const struct intel_crtc_state *cstate)
2862 const struct skl_pipe_wm_parameters *params)
2863{ 2868{
2869 struct intel_crtc *intel_crtc = to_intel_crtc(cstate->base.crtc);
2870 struct drm_device *dev = intel_crtc->base.dev;
2871 const struct intel_plane *intel_plane;
2864 unsigned int total_data_rate = 0; 2872 unsigned int total_data_rate = 0;
2865 int plane;
2866 2873
2867 for (plane = 0; plane < intel_num_planes(intel_crtc); plane++) { 2874 for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
2868 const struct intel_plane_wm_parameters *p; 2875 const struct drm_plane_state *pstate = intel_plane->base.state;
2869 2876
2870 p = &params->plane[plane]; 2877 if (pstate->fb == NULL)
2871 if (!p->enabled)
2872 continue; 2878 continue;
2873 2879
2874 total_data_rate += skl_plane_relative_data_rate(p, 0); /* packed/uv */ 2880 if (intel_plane->base.type == DRM_PLANE_TYPE_CURSOR)
2875 if (p->y_bytes_per_pixel) { 2881 continue;
2876 total_data_rate += skl_plane_relative_data_rate(p, 1); /* y-plane */ 2882
2877 } 2883 /* packed/uv */
2884 total_data_rate += skl_plane_relative_data_rate(cstate,
2885 pstate,
2886 0);
2887
2888 if (pstate->fb->pixel_format == DRM_FORMAT_NV12)
2889 /* y-plane */
2890 total_data_rate += skl_plane_relative_data_rate(cstate,
2891 pstate,
2892 1);
2878 } 2893 }
2879 2894
2880 return total_data_rate; 2895 return total_data_rate;
2881} 2896}
2882 2897
2883static void 2898static void
2884skl_allocate_pipe_ddb(struct drm_crtc *crtc, 2899skl_allocate_pipe_ddb(struct intel_crtc_state *cstate,
2885 const struct intel_wm_config *config,
2886 const struct skl_pipe_wm_parameters *params,
2887 struct skl_ddb_allocation *ddb /* out */) 2900 struct skl_ddb_allocation *ddb /* out */)
2888{ 2901{
2902 struct drm_crtc *crtc = cstate->base.crtc;
2889 struct drm_device *dev = crtc->dev; 2903 struct drm_device *dev = crtc->dev;
2890 struct drm_i915_private *dev_priv = dev->dev_private; 2904 struct drm_i915_private *dev_priv = to_i915(dev);
2905 struct intel_wm_config *config = &dev_priv->wm.config;
2891 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2906 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2907 struct intel_plane *intel_plane;
2892 enum pipe pipe = intel_crtc->pipe; 2908 enum pipe pipe = intel_crtc->pipe;
2893 struct skl_ddb_entry *alloc = &ddb->pipe[pipe]; 2909 struct skl_ddb_entry *alloc = &ddb->pipe[pipe];
2894 uint16_t alloc_size, start, cursor_blocks; 2910 uint16_t alloc_size, start, cursor_blocks;
2895 uint16_t minimum[I915_MAX_PLANES]; 2911 uint16_t minimum[I915_MAX_PLANES];
2896 uint16_t y_minimum[I915_MAX_PLANES]; 2912 uint16_t y_minimum[I915_MAX_PLANES];
2897 unsigned int total_data_rate; 2913 unsigned int total_data_rate;
2898 int plane;
2899 2914
2900 skl_ddb_get_pipe_allocation_limits(dev, crtc, config, params, alloc); 2915 skl_ddb_get_pipe_allocation_limits(dev, cstate, config, alloc);
2901 alloc_size = skl_ddb_entry_size(alloc); 2916 alloc_size = skl_ddb_entry_size(alloc);
2902 if (alloc_size == 0) { 2917 if (alloc_size == 0) {
2903 memset(ddb->plane[pipe], 0, sizeof(ddb->plane[pipe])); 2918 memset(ddb->plane[pipe], 0, sizeof(ddb->plane[pipe]));
@@ -2914,17 +2929,20 @@ skl_allocate_pipe_ddb(struct drm_crtc *crtc,
2914 alloc->end -= cursor_blocks; 2929 alloc->end -= cursor_blocks;
2915 2930
2916 /* 1. Allocate the mininum required blocks for each active plane */ 2931 /* 1. Allocate the mininum required blocks for each active plane */
2917 for_each_plane(dev_priv, pipe, plane) { 2932 for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
2918 const struct intel_plane_wm_parameters *p; 2933 struct drm_plane *plane = &intel_plane->base;
2934 struct drm_framebuffer *fb = plane->state->fb;
2935 int id = skl_wm_plane_id(intel_plane);
2919 2936
2920 p = &params->plane[plane]; 2937 if (fb == NULL)
2921 if (!p->enabled) 2938 continue;
2939 if (plane->type == DRM_PLANE_TYPE_CURSOR)
2922 continue; 2940 continue;
2923 2941
2924 minimum[plane] = 8; 2942 minimum[id] = 8;
2925 alloc_size -= minimum[plane]; 2943 alloc_size -= minimum[id];
2926 y_minimum[plane] = p->y_bytes_per_pixel ? 8 : 0; 2944 y_minimum[id] = (fb->pixel_format == DRM_FORMAT_NV12) ? 8 : 0;
2927 alloc_size -= y_minimum[plane]; 2945 alloc_size -= y_minimum[id];
2928 } 2946 }
2929 2947
2930 /* 2948 /*
@@ -2933,45 +2951,50 @@ skl_allocate_pipe_ddb(struct drm_crtc *crtc,
2933 * 2951 *
2934 * FIXME: we may not allocate every single block here. 2952 * FIXME: we may not allocate every single block here.
2935 */ 2953 */
2936 total_data_rate = skl_get_total_relative_data_rate(intel_crtc, params); 2954 total_data_rate = skl_get_total_relative_data_rate(cstate);
2937 2955
2938 start = alloc->start; 2956 start = alloc->start;
2939 for (plane = 0; plane < intel_num_planes(intel_crtc); plane++) { 2957 for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
2940 const struct intel_plane_wm_parameters *p; 2958 struct drm_plane *plane = &intel_plane->base;
2959 struct drm_plane_state *pstate = intel_plane->base.state;
2941 unsigned int data_rate, y_data_rate; 2960 unsigned int data_rate, y_data_rate;
2942 uint16_t plane_blocks, y_plane_blocks = 0; 2961 uint16_t plane_blocks, y_plane_blocks = 0;
2962 int id = skl_wm_plane_id(intel_plane);
2943 2963
2944 p = &params->plane[plane]; 2964 if (pstate->fb == NULL)
2945 if (!p->enabled) 2965 continue;
2966 if (plane->type == DRM_PLANE_TYPE_CURSOR)
2946 continue; 2967 continue;
2947 2968
2948 data_rate = skl_plane_relative_data_rate(p, 0); 2969 data_rate = skl_plane_relative_data_rate(cstate, pstate, 0);
2949 2970
2950 /* 2971 /*
2951 * allocation for (packed formats) or (uv-plane part of planar format): 2972 * allocation for (packed formats) or (uv-plane part of planar format):
2952 * promote the expression to 64 bits to avoid overflowing, the 2973 * promote the expression to 64 bits to avoid overflowing, the
2953 * result is < available as data_rate / total_data_rate < 1 2974 * result is < available as data_rate / total_data_rate < 1
2954 */ 2975 */
2955 plane_blocks = minimum[plane]; 2976 plane_blocks = minimum[id];
2956 plane_blocks += div_u64((uint64_t)alloc_size * data_rate, 2977 plane_blocks += div_u64((uint64_t)alloc_size * data_rate,
2957 total_data_rate); 2978 total_data_rate);
2958 2979
2959 ddb->plane[pipe][plane].start = start; 2980 ddb->plane[pipe][id].start = start;
2960 ddb->plane[pipe][plane].end = start + plane_blocks; 2981 ddb->plane[pipe][id].end = start + plane_blocks;
2961 2982
2962 start += plane_blocks; 2983 start += plane_blocks;
2963 2984
2964 /* 2985 /*
2965 * allocation for y_plane part of planar format: 2986 * allocation for y_plane part of planar format:
2966 */ 2987 */
2967 if (p->y_bytes_per_pixel) { 2988 if (pstate->fb->pixel_format == DRM_FORMAT_NV12) {
2968 y_data_rate = skl_plane_relative_data_rate(p, 1); 2989 y_data_rate = skl_plane_relative_data_rate(cstate,
2969 y_plane_blocks = y_minimum[plane]; 2990 pstate,
2991 1);
2992 y_plane_blocks = y_minimum[id];
2970 y_plane_blocks += div_u64((uint64_t)alloc_size * y_data_rate, 2993 y_plane_blocks += div_u64((uint64_t)alloc_size * y_data_rate,
2971 total_data_rate); 2994 total_data_rate);
2972 2995
2973 ddb->y_plane[pipe][plane].start = start; 2996 ddb->y_plane[pipe][id].start = start;
2974 ddb->y_plane[pipe][plane].end = start + y_plane_blocks; 2997 ddb->y_plane[pipe][id].end = start + y_plane_blocks;
2975 2998
2976 start += y_plane_blocks; 2999 start += y_plane_blocks;
2977 } 3000 }
@@ -3041,104 +3064,27 @@ static bool skl_ddb_allocation_changed(const struct skl_ddb_allocation *new_ddb,
3041 struct drm_device *dev = intel_crtc->base.dev; 3064 struct drm_device *dev = intel_crtc->base.dev;
3042 struct drm_i915_private *dev_priv = dev->dev_private; 3065 struct drm_i915_private *dev_priv = dev->dev_private;
3043 const struct skl_ddb_allocation *cur_ddb = &dev_priv->wm.skl_hw.ddb; 3066 const struct skl_ddb_allocation *cur_ddb = &dev_priv->wm.skl_hw.ddb;
3044 enum pipe pipe = intel_crtc->pipe;
3045
3046 if (memcmp(new_ddb->plane[pipe], cur_ddb->plane[pipe],
3047 sizeof(new_ddb->plane[pipe])))
3048 return true;
3049 3067
3050 if (memcmp(&new_ddb->plane[pipe][PLANE_CURSOR], &cur_ddb->plane[pipe][PLANE_CURSOR], 3068 /*
3051 sizeof(new_ddb->plane[pipe][PLANE_CURSOR]))) 3069 * If ddb allocation of pipes changed, it may require recalculation of
3070 * watermarks
3071 */
3072 if (memcmp(new_ddb->pipe, cur_ddb->pipe, sizeof(new_ddb->pipe)))
3052 return true; 3073 return true;
3053 3074
3054 return false; 3075 return false;
3055} 3076}
3056 3077
3057static void skl_compute_wm_global_parameters(struct drm_device *dev,
3058 struct intel_wm_config *config)
3059{
3060 struct drm_crtc *crtc;
3061 struct drm_plane *plane;
3062
3063 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
3064 config->num_pipes_active += to_intel_crtc(crtc)->active;
3065
3066 /* FIXME: I don't think we need those two global parameters on SKL */
3067 list_for_each_entry(plane, &dev->mode_config.plane_list, head) {
3068 struct intel_plane *intel_plane = to_intel_plane(plane);
3069
3070 config->sprites_enabled |= intel_plane->wm.enabled;
3071 config->sprites_scaled |= intel_plane->wm.scaled;
3072 }
3073}
3074
3075static void skl_compute_wm_pipe_parameters(struct drm_crtc *crtc,
3076 struct skl_pipe_wm_parameters *p)
3077{
3078 struct drm_device *dev = crtc->dev;
3079 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3080 enum pipe pipe = intel_crtc->pipe;
3081 struct drm_plane *plane;
3082 struct drm_framebuffer *fb;
3083 int i = 1; /* Index for sprite planes start */
3084
3085 p->active = intel_crtc->active;
3086 if (p->active) {
3087 p->pipe_htotal = intel_crtc->config->base.adjusted_mode.crtc_htotal;
3088 p->pixel_rate = skl_pipe_pixel_rate(intel_crtc->config);
3089
3090 fb = crtc->primary->state->fb;
3091 /* For planar: Bpp is for uv plane, y_Bpp is for y plane */
3092 if (fb) {
3093 p->plane[0].enabled = true;
3094 p->plane[0].bytes_per_pixel = fb->pixel_format == DRM_FORMAT_NV12 ?
3095 drm_format_plane_cpp(fb->pixel_format, 1) :
3096 drm_format_plane_cpp(fb->pixel_format, 0);
3097 p->plane[0].y_bytes_per_pixel = fb->pixel_format == DRM_FORMAT_NV12 ?
3098 drm_format_plane_cpp(fb->pixel_format, 0) : 0;
3099 p->plane[0].tiling = fb->modifier[0];
3100 } else {
3101 p->plane[0].enabled = false;
3102 p->plane[0].bytes_per_pixel = 0;
3103 p->plane[0].y_bytes_per_pixel = 0;
3104 p->plane[0].tiling = DRM_FORMAT_MOD_NONE;
3105 }
3106 p->plane[0].horiz_pixels = intel_crtc->config->pipe_src_w;
3107 p->plane[0].vert_pixels = intel_crtc->config->pipe_src_h;
3108 p->plane[0].rotation = crtc->primary->state->rotation;
3109
3110 fb = crtc->cursor->state->fb;
3111 p->plane[PLANE_CURSOR].y_bytes_per_pixel = 0;
3112 if (fb) {
3113 p->plane[PLANE_CURSOR].enabled = true;
3114 p->plane[PLANE_CURSOR].bytes_per_pixel = fb->bits_per_pixel / 8;
3115 p->plane[PLANE_CURSOR].horiz_pixels = crtc->cursor->state->crtc_w;
3116 p->plane[PLANE_CURSOR].vert_pixels = crtc->cursor->state->crtc_h;
3117 } else {
3118 p->plane[PLANE_CURSOR].enabled = false;
3119 p->plane[PLANE_CURSOR].bytes_per_pixel = 0;
3120 p->plane[PLANE_CURSOR].horiz_pixels = 64;
3121 p->plane[PLANE_CURSOR].vert_pixels = 64;
3122 }
3123 }
3124
3125 list_for_each_entry(plane, &dev->mode_config.plane_list, head) {
3126 struct intel_plane *intel_plane = to_intel_plane(plane);
3127
3128 if (intel_plane->pipe == pipe &&
3129 plane->type == DRM_PLANE_TYPE_OVERLAY)
3130 p->plane[i++] = intel_plane->wm;
3131 }
3132}
3133
3134static bool skl_compute_plane_wm(const struct drm_i915_private *dev_priv, 3078static bool skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
3135 struct skl_pipe_wm_parameters *p, 3079 struct intel_crtc_state *cstate,
3136 struct intel_plane_wm_parameters *p_params, 3080 struct intel_plane *intel_plane,
3137 uint16_t ddb_allocation, 3081 uint16_t ddb_allocation,
3138 int level, 3082 int level,
3139 uint16_t *out_blocks, /* out */ 3083 uint16_t *out_blocks, /* out */
3140 uint8_t *out_lines /* out */) 3084 uint8_t *out_lines /* out */)
3141{ 3085{
3086 struct drm_plane *plane = &intel_plane->base;
3087 struct drm_framebuffer *fb = plane->state->fb;
3142 uint32_t latency = dev_priv->wm.skl_latency[level]; 3088 uint32_t latency = dev_priv->wm.skl_latency[level];
3143 uint32_t method1, method2; 3089 uint32_t method1, method2;
3144 uint32_t plane_bytes_per_line, plane_blocks_per_line; 3090 uint32_t plane_bytes_per_line, plane_blocks_per_line;
@@ -3146,31 +3092,33 @@ static bool skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
3146 uint32_t selected_result; 3092 uint32_t selected_result;
3147 uint8_t bytes_per_pixel; 3093 uint8_t bytes_per_pixel;
3148 3094
3149 if (latency == 0 || !p->active || !p_params->enabled) 3095 if (latency == 0 || !cstate->base.active || !fb)
3150 return false; 3096 return false;
3151 3097
3152 bytes_per_pixel = p_params->y_bytes_per_pixel ? 3098 bytes_per_pixel = drm_format_plane_cpp(fb->pixel_format, 0);
3153 p_params->y_bytes_per_pixel : 3099 method1 = skl_wm_method1(skl_pipe_pixel_rate(cstate),
3154 p_params->bytes_per_pixel;
3155 method1 = skl_wm_method1(p->pixel_rate,
3156 bytes_per_pixel, 3100 bytes_per_pixel,
3157 latency); 3101 latency);
3158 method2 = skl_wm_method2(p->pixel_rate, 3102 method2 = skl_wm_method2(skl_pipe_pixel_rate(cstate),
3159 p->pipe_htotal, 3103 cstate->base.adjusted_mode.crtc_htotal,
3160 p_params->horiz_pixels, 3104 cstate->pipe_src_w,
3161 bytes_per_pixel, 3105 bytes_per_pixel,
3162 p_params->tiling, 3106 fb->modifier[0],
3163 latency); 3107 latency);
3164 3108
3165 plane_bytes_per_line = p_params->horiz_pixels * bytes_per_pixel; 3109 plane_bytes_per_line = cstate->pipe_src_w * bytes_per_pixel;
3166 plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512); 3110 plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512);
3167 3111
3168 if (p_params->tiling == I915_FORMAT_MOD_Y_TILED || 3112 if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
3169 p_params->tiling == I915_FORMAT_MOD_Yf_TILED) { 3113 fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED) {
3170 uint32_t min_scanlines = 4; 3114 uint32_t min_scanlines = 4;
3171 uint32_t y_tile_minimum; 3115 uint32_t y_tile_minimum;
3172 if (intel_rotation_90_or_270(p_params->rotation)) { 3116 if (intel_rotation_90_or_270(plane->state->rotation)) {
3173 switch (p_params->bytes_per_pixel) { 3117 int bpp = (fb->pixel_format == DRM_FORMAT_NV12) ?
3118 drm_format_plane_cpp(fb->pixel_format, 1) :
3119 drm_format_plane_cpp(fb->pixel_format, 0);
3120
3121 switch (bpp) {
3174 case 1: 3122 case 1:
3175 min_scanlines = 16; 3123 min_scanlines = 16;
3176 break; 3124 break;
@@ -3194,8 +3142,8 @@ static bool skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
3194 res_lines = DIV_ROUND_UP(selected_result, plane_blocks_per_line); 3142 res_lines = DIV_ROUND_UP(selected_result, plane_blocks_per_line);
3195 3143
3196 if (level >= 1 && level <= 7) { 3144 if (level >= 1 && level <= 7) {
3197 if (p_params->tiling == I915_FORMAT_MOD_Y_TILED || 3145 if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
3198 p_params->tiling == I915_FORMAT_MOD_Yf_TILED) 3146 fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED)
3199 res_lines += 4; 3147 res_lines += 4;
3200 else 3148 else
3201 res_blocks++; 3149 res_blocks++;
@@ -3212,84 +3160,80 @@ static bool skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
3212 3160
3213static void skl_compute_wm_level(const struct drm_i915_private *dev_priv, 3161static void skl_compute_wm_level(const struct drm_i915_private *dev_priv,
3214 struct skl_ddb_allocation *ddb, 3162 struct skl_ddb_allocation *ddb,
3215 struct skl_pipe_wm_parameters *p, 3163 struct intel_crtc_state *cstate,
3216 enum pipe pipe,
3217 int level, 3164 int level,
3218 int num_planes,
3219 struct skl_wm_level *result) 3165 struct skl_wm_level *result)
3220{ 3166{
3167 struct drm_device *dev = dev_priv->dev;
3168 struct intel_crtc *intel_crtc = to_intel_crtc(cstate->base.crtc);
3169 struct intel_plane *intel_plane;
3221 uint16_t ddb_blocks; 3170 uint16_t ddb_blocks;
3222 int i; 3171 enum pipe pipe = intel_crtc->pipe;
3172
3173 for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
3174 int i = skl_wm_plane_id(intel_plane);
3223 3175
3224 for (i = 0; i < num_planes; i++) {
3225 ddb_blocks = skl_ddb_entry_size(&ddb->plane[pipe][i]); 3176 ddb_blocks = skl_ddb_entry_size(&ddb->plane[pipe][i]);
3226 3177
3227 result->plane_en[i] = skl_compute_plane_wm(dev_priv, 3178 result->plane_en[i] = skl_compute_plane_wm(dev_priv,
3228 p, &p->plane[i], 3179 cstate,
3180 intel_plane,
3229 ddb_blocks, 3181 ddb_blocks,
3230 level, 3182 level,
3231 &result->plane_res_b[i], 3183 &result->plane_res_b[i],
3232 &result->plane_res_l[i]); 3184 &result->plane_res_l[i]);
3233 } 3185 }
3234
3235 ddb_blocks = skl_ddb_entry_size(&ddb->plane[pipe][PLANE_CURSOR]);
3236 result->plane_en[PLANE_CURSOR] = skl_compute_plane_wm(dev_priv, p,
3237 &p->plane[PLANE_CURSOR],
3238 ddb_blocks, level,
3239 &result->plane_res_b[PLANE_CURSOR],
3240 &result->plane_res_l[PLANE_CURSOR]);
3241} 3186}
3242 3187
3243static uint32_t 3188static uint32_t
3244skl_compute_linetime_wm(struct drm_crtc *crtc, struct skl_pipe_wm_parameters *p) 3189skl_compute_linetime_wm(struct intel_crtc_state *cstate)
3245{ 3190{
3246 if (!to_intel_crtc(crtc)->active) 3191 if (!cstate->base.active)
3247 return 0; 3192 return 0;
3248 3193
3249 if (WARN_ON(p->pixel_rate == 0)) 3194 if (WARN_ON(skl_pipe_pixel_rate(cstate) == 0))
3250 return 0; 3195 return 0;
3251 3196
3252 return DIV_ROUND_UP(8 * p->pipe_htotal * 1000, p->pixel_rate); 3197 return DIV_ROUND_UP(8 * cstate->base.adjusted_mode.crtc_htotal * 1000,
3198 skl_pipe_pixel_rate(cstate));
3253} 3199}
3254 3200
3255static void skl_compute_transition_wm(struct drm_crtc *crtc, 3201static void skl_compute_transition_wm(struct intel_crtc_state *cstate,
3256 struct skl_pipe_wm_parameters *params,
3257 struct skl_wm_level *trans_wm /* out */) 3202 struct skl_wm_level *trans_wm /* out */)
3258{ 3203{
3204 struct drm_crtc *crtc = cstate->base.crtc;
3259 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3205 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3260 int i; 3206 struct intel_plane *intel_plane;
3261 3207
3262 if (!params->active) 3208 if (!cstate->base.active)
3263 return; 3209 return;
3264 3210
3265 /* Until we know more, just disable transition WMs */ 3211 /* Until we know more, just disable transition WMs */
3266 for (i = 0; i < intel_num_planes(intel_crtc); i++) 3212 for_each_intel_plane_on_crtc(crtc->dev, intel_crtc, intel_plane) {
3213 int i = skl_wm_plane_id(intel_plane);
3214
3267 trans_wm->plane_en[i] = false; 3215 trans_wm->plane_en[i] = false;
3268 trans_wm->plane_en[PLANE_CURSOR] = false; 3216 }
3269} 3217}
3270 3218
3271static void skl_compute_pipe_wm(struct drm_crtc *crtc, 3219static void skl_compute_pipe_wm(struct intel_crtc_state *cstate,
3272 struct skl_ddb_allocation *ddb, 3220 struct skl_ddb_allocation *ddb,
3273 struct skl_pipe_wm_parameters *params,
3274 struct skl_pipe_wm *pipe_wm) 3221 struct skl_pipe_wm *pipe_wm)
3275{ 3222{
3276 struct drm_device *dev = crtc->dev; 3223 struct drm_device *dev = cstate->base.crtc->dev;
3277 const struct drm_i915_private *dev_priv = dev->dev_private; 3224 const struct drm_i915_private *dev_priv = dev->dev_private;
3278 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3279 int level, max_level = ilk_wm_max_level(dev); 3225 int level, max_level = ilk_wm_max_level(dev);
3280 3226
3281 for (level = 0; level <= max_level; level++) { 3227 for (level = 0; level <= max_level; level++) {
3282 skl_compute_wm_level(dev_priv, ddb, params, intel_crtc->pipe, 3228 skl_compute_wm_level(dev_priv, ddb, cstate,
3283 level, intel_num_planes(intel_crtc), 3229 level, &pipe_wm->wm[level]);
3284 &pipe_wm->wm[level]);
3285 } 3230 }
3286 pipe_wm->linetime = skl_compute_linetime_wm(crtc, params); 3231 pipe_wm->linetime = skl_compute_linetime_wm(cstate);
3287 3232
3288 skl_compute_transition_wm(crtc, params, &pipe_wm->trans_wm); 3233 skl_compute_transition_wm(cstate, &pipe_wm->trans_wm);
3289} 3234}
3290 3235
3291static void skl_compute_wm_results(struct drm_device *dev, 3236static void skl_compute_wm_results(struct drm_device *dev,
3292 struct skl_pipe_wm_parameters *p,
3293 struct skl_pipe_wm *p_wm, 3237 struct skl_pipe_wm *p_wm,
3294 struct skl_wm_values *r, 3238 struct skl_wm_values *r,
3295 struct intel_crtc *intel_crtc) 3239 struct intel_crtc *intel_crtc)
@@ -3346,7 +3290,8 @@ static void skl_compute_wm_results(struct drm_device *dev,
3346 r->wm_linetime[pipe] = p_wm->linetime; 3290 r->wm_linetime[pipe] = p_wm->linetime;
3347} 3291}
3348 3292
3349static void skl_ddb_entry_write(struct drm_i915_private *dev_priv, uint32_t reg, 3293static void skl_ddb_entry_write(struct drm_i915_private *dev_priv,
3294 i915_reg_t reg,
3350 const struct skl_ddb_entry *entry) 3295 const struct skl_ddb_entry *entry)
3351{ 3296{
3352 if (entry->end) 3297 if (entry->end)
@@ -3533,28 +3478,25 @@ static void skl_flush_wm_values(struct drm_i915_private *dev_priv,
3533} 3478}
3534 3479
3535static bool skl_update_pipe_wm(struct drm_crtc *crtc, 3480static bool skl_update_pipe_wm(struct drm_crtc *crtc,
3536 struct skl_pipe_wm_parameters *params,
3537 struct intel_wm_config *config,
3538 struct skl_ddb_allocation *ddb, /* out */ 3481 struct skl_ddb_allocation *ddb, /* out */
3539 struct skl_pipe_wm *pipe_wm /* out */) 3482 struct skl_pipe_wm *pipe_wm /* out */)
3540{ 3483{
3541 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3484 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3485 struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
3542 3486
3543 skl_compute_wm_pipe_parameters(crtc, params); 3487 skl_allocate_pipe_ddb(cstate, ddb);
3544 skl_allocate_pipe_ddb(crtc, config, params, ddb); 3488 skl_compute_pipe_wm(cstate, ddb, pipe_wm);
3545 skl_compute_pipe_wm(crtc, ddb, params, pipe_wm);
3546 3489
3547 if (!memcmp(&intel_crtc->wm.skl_active, pipe_wm, sizeof(*pipe_wm))) 3490 if (!memcmp(&intel_crtc->wm.active.skl, pipe_wm, sizeof(*pipe_wm)))
3548 return false; 3491 return false;
3549 3492
3550 intel_crtc->wm.skl_active = *pipe_wm; 3493 intel_crtc->wm.active.skl = *pipe_wm;
3551 3494
3552 return true; 3495 return true;
3553} 3496}
3554 3497
3555static void skl_update_other_pipe_wm(struct drm_device *dev, 3498static void skl_update_other_pipe_wm(struct drm_device *dev,
3556 struct drm_crtc *crtc, 3499 struct drm_crtc *crtc,
3557 struct intel_wm_config *config,
3558 struct skl_wm_values *r) 3500 struct skl_wm_values *r)
3559{ 3501{
3560 struct intel_crtc *intel_crtc; 3502 struct intel_crtc *intel_crtc;
@@ -3575,7 +3517,6 @@ static void skl_update_other_pipe_wm(struct drm_device *dev,
3575 */ 3517 */
3576 list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list, 3518 list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list,
3577 base.head) { 3519 base.head) {
3578 struct skl_pipe_wm_parameters params = {};
3579 struct skl_pipe_wm pipe_wm = {}; 3520 struct skl_pipe_wm pipe_wm = {};
3580 bool wm_changed; 3521 bool wm_changed;
3581 3522
@@ -3586,7 +3527,6 @@ static void skl_update_other_pipe_wm(struct drm_device *dev,
3586 continue; 3527 continue;
3587 3528
3588 wm_changed = skl_update_pipe_wm(&intel_crtc->base, 3529 wm_changed = skl_update_pipe_wm(&intel_crtc->base,
3589 &params, config,
3590 &r->ddb, &pipe_wm); 3530 &r->ddb, &pipe_wm);
3591 3531
3592 /* 3532 /*
@@ -3596,7 +3536,7 @@ static void skl_update_other_pipe_wm(struct drm_device *dev,
3596 */ 3536 */
3597 WARN_ON(!wm_changed); 3537 WARN_ON(!wm_changed);
3598 3538
3599 skl_compute_wm_results(dev, &params, &pipe_wm, r, intel_crtc); 3539 skl_compute_wm_results(dev, &pipe_wm, r, intel_crtc);
3600 r->dirty[intel_crtc->pipe] = true; 3540 r->dirty[intel_crtc->pipe] = true;
3601 } 3541 }
3602} 3542}
@@ -3626,10 +3566,9 @@ static void skl_update_wm(struct drm_crtc *crtc)
3626 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3566 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3627 struct drm_device *dev = crtc->dev; 3567 struct drm_device *dev = crtc->dev;
3628 struct drm_i915_private *dev_priv = dev->dev_private; 3568 struct drm_i915_private *dev_priv = dev->dev_private;
3629 struct skl_pipe_wm_parameters params = {};
3630 struct skl_wm_values *results = &dev_priv->wm.skl_results; 3569 struct skl_wm_values *results = &dev_priv->wm.skl_results;
3631 struct skl_pipe_wm pipe_wm = {}; 3570 struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
3632 struct intel_wm_config config = {}; 3571 struct skl_pipe_wm *pipe_wm = &cstate->wm.optimal.skl;
3633 3572
3634 3573
3635 /* Clear all dirty flags */ 3574 /* Clear all dirty flags */
@@ -3637,16 +3576,13 @@ static void skl_update_wm(struct drm_crtc *crtc)
3637 3576
3638 skl_clear_wm(results, intel_crtc->pipe); 3577 skl_clear_wm(results, intel_crtc->pipe);
3639 3578
3640 skl_compute_wm_global_parameters(dev, &config); 3579 if (!skl_update_pipe_wm(crtc, &results->ddb, pipe_wm))
3641
3642 if (!skl_update_pipe_wm(crtc, &params, &config,
3643 &results->ddb, &pipe_wm))
3644 return; 3580 return;
3645 3581
3646 skl_compute_wm_results(dev, &params, &pipe_wm, results, intel_crtc); 3582 skl_compute_wm_results(dev, pipe_wm, results, intel_crtc);
3647 results->dirty[intel_crtc->pipe] = true; 3583 results->dirty[intel_crtc->pipe] = true;
3648 3584
3649 skl_update_other_pipe_wm(dev, crtc, &config, results); 3585 skl_update_other_pipe_wm(dev, crtc, results);
3650 skl_write_wm_values(dev_priv, results); 3586 skl_write_wm_values(dev_priv, results);
3651 skl_flush_wm_values(dev_priv, results); 3587 skl_flush_wm_values(dev_priv, results);
3652 3588
@@ -3654,71 +3590,23 @@ static void skl_update_wm(struct drm_crtc *crtc)
3654 dev_priv->wm.skl_hw = *results; 3590 dev_priv->wm.skl_hw = *results;
3655} 3591}
3656 3592
3657static void 3593static void ilk_program_watermarks(struct drm_i915_private *dev_priv)
3658skl_update_sprite_wm(struct drm_plane *plane, struct drm_crtc *crtc,
3659 uint32_t sprite_width, uint32_t sprite_height,
3660 int pixel_size, bool enabled, bool scaled)
3661{
3662 struct intel_plane *intel_plane = to_intel_plane(plane);
3663 struct drm_framebuffer *fb = plane->state->fb;
3664
3665 intel_plane->wm.enabled = enabled;
3666 intel_plane->wm.scaled = scaled;
3667 intel_plane->wm.horiz_pixels = sprite_width;
3668 intel_plane->wm.vert_pixels = sprite_height;
3669 intel_plane->wm.tiling = DRM_FORMAT_MOD_NONE;
3670
3671 /* For planar: Bpp is for UV plane, y_Bpp is for Y plane */
3672 intel_plane->wm.bytes_per_pixel =
3673 (fb && fb->pixel_format == DRM_FORMAT_NV12) ?
3674 drm_format_plane_cpp(plane->state->fb->pixel_format, 1) : pixel_size;
3675 intel_plane->wm.y_bytes_per_pixel =
3676 (fb && fb->pixel_format == DRM_FORMAT_NV12) ?
3677 drm_format_plane_cpp(plane->state->fb->pixel_format, 0) : 0;
3678
3679 /*
3680 * Framebuffer can be NULL on plane disable, but it does not
3681 * matter for watermarks if we assume no tiling in that case.
3682 */
3683 if (fb)
3684 intel_plane->wm.tiling = fb->modifier[0];
3685 intel_plane->wm.rotation = plane->state->rotation;
3686
3687 skl_update_wm(crtc);
3688}
3689
3690static void ilk_update_wm(struct drm_crtc *crtc)
3691{ 3594{
3692 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3595 struct drm_device *dev = dev_priv->dev;
3693 struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state); 3596 struct intel_pipe_wm lp_wm_1_2 = {}, lp_wm_5_6 = {}, *best_lp_wm;
3694 struct drm_device *dev = crtc->dev;
3695 struct drm_i915_private *dev_priv = dev->dev_private;
3696 struct ilk_wm_maximums max; 3597 struct ilk_wm_maximums max;
3598 struct intel_wm_config *config = &dev_priv->wm.config;
3697 struct ilk_wm_values results = {}; 3599 struct ilk_wm_values results = {};
3698 enum intel_ddb_partitioning partitioning; 3600 enum intel_ddb_partitioning partitioning;
3699 struct intel_pipe_wm pipe_wm = {};
3700 struct intel_pipe_wm lp_wm_1_2 = {}, lp_wm_5_6 = {}, *best_lp_wm;
3701 struct intel_wm_config config = {};
3702
3703 WARN_ON(cstate->base.active != intel_crtc->active);
3704
3705 intel_compute_pipe_wm(cstate, &pipe_wm);
3706 3601
3707 if (!memcmp(&intel_crtc->wm.active, &pipe_wm, sizeof(pipe_wm))) 3602 ilk_compute_wm_maximums(dev, 1, config, INTEL_DDB_PART_1_2, &max);
3708 return; 3603 ilk_wm_merge(dev, config, &max, &lp_wm_1_2);
3709
3710 intel_crtc->wm.active = pipe_wm;
3711
3712 ilk_compute_wm_config(dev, &config);
3713
3714 ilk_compute_wm_maximums(dev, 1, &config, INTEL_DDB_PART_1_2, &max);
3715 ilk_wm_merge(dev, &config, &max, &lp_wm_1_2);
3716 3604
3717 /* 5/6 split only in single pipe config on IVB+ */ 3605 /* 5/6 split only in single pipe config on IVB+ */
3718 if (INTEL_INFO(dev)->gen >= 7 && 3606 if (INTEL_INFO(dev)->gen >= 7 &&
3719 config.num_pipes_active == 1 && config.sprites_enabled) { 3607 config->num_pipes_active == 1 && config->sprites_enabled) {
3720 ilk_compute_wm_maximums(dev, 1, &config, INTEL_DDB_PART_5_6, &max); 3608 ilk_compute_wm_maximums(dev, 1, config, INTEL_DDB_PART_5_6, &max);
3721 ilk_wm_merge(dev, &config, &max, &lp_wm_5_6); 3609 ilk_wm_merge(dev, config, &max, &lp_wm_5_6);
3722 3610
3723 best_lp_wm = ilk_find_best_result(dev, &lp_wm_1_2, &lp_wm_5_6); 3611 best_lp_wm = ilk_find_best_result(dev, &lp_wm_1_2, &lp_wm_5_6);
3724 } else { 3612 } else {
@@ -3733,14 +3621,13 @@ static void ilk_update_wm(struct drm_crtc *crtc)
3733 ilk_write_wm_values(dev_priv, &results); 3621 ilk_write_wm_values(dev_priv, &results);
3734} 3622}
3735 3623
3736static void 3624static void ilk_update_wm(struct drm_crtc *crtc)
3737ilk_update_sprite_wm(struct drm_plane *plane,
3738 struct drm_crtc *crtc,
3739 uint32_t sprite_width, uint32_t sprite_height,
3740 int pixel_size, bool enabled, bool scaled)
3741{ 3625{
3742 struct drm_device *dev = plane->dev; 3626 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
3743 struct intel_plane *intel_plane = to_intel_plane(plane); 3627 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3628 struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
3629
3630 WARN_ON(cstate->base.active != intel_crtc->active);
3744 3631
3745 /* 3632 /*
3746 * IVB workaround: must disable low power watermarks for at least 3633 * IVB workaround: must disable low power watermarks for at least
@@ -3749,10 +3636,14 @@ ilk_update_sprite_wm(struct drm_plane *plane,
3749 * 3636 *
3750 * WaCxSRDisabledForSpriteScaling:ivb 3637 * WaCxSRDisabledForSpriteScaling:ivb
3751 */ 3638 */
3752 if (IS_IVYBRIDGE(dev) && scaled && ilk_disable_lp_wm(dev)) 3639 if (cstate->disable_lp_wm) {
3753 intel_wait_for_vblank(dev, intel_plane->pipe); 3640 ilk_disable_lp_wm(crtc->dev);
3641 intel_wait_for_vblank(crtc->dev, intel_crtc->pipe);
3642 }
3643
3644 intel_crtc->wm.active.ilk = cstate->wm.optimal.ilk;
3754 3645
3755 ilk_update_wm(crtc); 3646 ilk_program_watermarks(dev_priv);
3756} 3647}
3757 3648
3758static void skl_pipe_wm_active_state(uint32_t val, 3649static void skl_pipe_wm_active_state(uint32_t val,
@@ -3805,7 +3696,8 @@ static void skl_pipe_wm_get_hw_state(struct drm_crtc *crtc)
3805 struct drm_i915_private *dev_priv = dev->dev_private; 3696 struct drm_i915_private *dev_priv = dev->dev_private;
3806 struct skl_wm_values *hw = &dev_priv->wm.skl_hw; 3697 struct skl_wm_values *hw = &dev_priv->wm.skl_hw;
3807 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3698 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3808 struct skl_pipe_wm *active = &intel_crtc->wm.skl_active; 3699 struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
3700 struct skl_pipe_wm *active = &cstate->wm.optimal.skl;
3809 enum pipe pipe = intel_crtc->pipe; 3701 enum pipe pipe = intel_crtc->pipe;
3810 int level, i, max_level; 3702 int level, i, max_level;
3811 uint32_t temp; 3703 uint32_t temp;
@@ -3849,6 +3741,8 @@ static void skl_pipe_wm_get_hw_state(struct drm_crtc *crtc)
3849 3741
3850 temp = hw->plane_trans[pipe][PLANE_CURSOR]; 3742 temp = hw->plane_trans[pipe][PLANE_CURSOR];
3851 skl_pipe_wm_active_state(temp, active, true, true, i, 0); 3743 skl_pipe_wm_active_state(temp, active, true, true, i, 0);
3744
3745 intel_crtc->wm.active.skl = *active;
3852} 3746}
3853 3747
3854void skl_wm_get_hw_state(struct drm_device *dev) 3748void skl_wm_get_hw_state(struct drm_device *dev)
@@ -3868,9 +3762,10 @@ static void ilk_pipe_wm_get_hw_state(struct drm_crtc *crtc)
3868 struct drm_i915_private *dev_priv = dev->dev_private; 3762 struct drm_i915_private *dev_priv = dev->dev_private;
3869 struct ilk_wm_values *hw = &dev_priv->wm.hw; 3763 struct ilk_wm_values *hw = &dev_priv->wm.hw;
3870 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 3764 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3871 struct intel_pipe_wm *active = &intel_crtc->wm.active; 3765 struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
3766 struct intel_pipe_wm *active = &cstate->wm.optimal.ilk;
3872 enum pipe pipe = intel_crtc->pipe; 3767 enum pipe pipe = intel_crtc->pipe;
3873 static const unsigned int wm0_pipe_reg[] = { 3768 static const i915_reg_t wm0_pipe_reg[] = {
3874 [PIPE_A] = WM0_PIPEA_ILK, 3769 [PIPE_A] = WM0_PIPEA_ILK,
3875 [PIPE_B] = WM0_PIPEB_ILK, 3770 [PIPE_B] = WM0_PIPEB_ILK,
3876 [PIPE_C] = WM0_PIPEC_IVB, 3771 [PIPE_C] = WM0_PIPEC_IVB,
@@ -3907,6 +3802,8 @@ static void ilk_pipe_wm_get_hw_state(struct drm_crtc *crtc)
3907 for (level = 0; level <= max_level; level++) 3802 for (level = 0; level <= max_level; level++)
3908 active->wm[level].enable = true; 3803 active->wm[level].enable = true;
3909 } 3804 }
3805
3806 intel_crtc->wm.active.ilk = *active;
3910} 3807}
3911 3808
3912#define _FW_WM(value, plane) \ 3809#define _FW_WM(value, plane) \
@@ -4132,21 +4029,6 @@ void intel_update_watermarks(struct drm_crtc *crtc)
4132 dev_priv->display.update_wm(crtc); 4029 dev_priv->display.update_wm(crtc);
4133} 4030}
4134 4031
4135void intel_update_sprite_watermarks(struct drm_plane *plane,
4136 struct drm_crtc *crtc,
4137 uint32_t sprite_width,
4138 uint32_t sprite_height,
4139 int pixel_size,
4140 bool enabled, bool scaled)
4141{
4142 struct drm_i915_private *dev_priv = plane->dev->dev_private;
4143
4144 if (dev_priv->display.update_sprite_wm)
4145 dev_priv->display.update_sprite_wm(plane, crtc,
4146 sprite_width, sprite_height,
4147 pixel_size, enabled, scaled);
4148}
4149
4150/** 4032/**
4151 * Lock protecting IPS related data structures 4033 * Lock protecting IPS related data structures
4152 */ 4034 */
@@ -4414,7 +4296,7 @@ static void gen6_set_rps(struct drm_device *dev, u8 val)
4414 struct drm_i915_private *dev_priv = dev->dev_private; 4296 struct drm_i915_private *dev_priv = dev->dev_private;
4415 4297
4416 /* WaGsvDisableTurbo: Workaround to disable turbo on BXT A* */ 4298 /* WaGsvDisableTurbo: Workaround to disable turbo on BXT A* */
4417 if (IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0)) 4299 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1))
4418 return; 4300 return;
4419 4301
4420 WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); 4302 WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
@@ -4689,7 +4571,8 @@ static void gen6_init_rps_frequencies(struct drm_device *dev)
4689 dev_priv->rps.max_freq = dev_priv->rps.rp0_freq; 4571 dev_priv->rps.max_freq = dev_priv->rps.rp0_freq;
4690 4572
4691 dev_priv->rps.efficient_freq = dev_priv->rps.rp1_freq; 4573 dev_priv->rps.efficient_freq = dev_priv->rps.rp1_freq;
4692 if (IS_HASWELL(dev) || IS_BROADWELL(dev) || IS_SKYLAKE(dev)) { 4574 if (IS_HASWELL(dev) || IS_BROADWELL(dev) ||
4575 IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
4693 ret = sandybridge_pcode_read(dev_priv, 4576 ret = sandybridge_pcode_read(dev_priv,
4694 HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL, 4577 HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL,
4695 &ddcc_status); 4578 &ddcc_status);
@@ -4701,7 +4584,7 @@ static void gen6_init_rps_frequencies(struct drm_device *dev)
4701 dev_priv->rps.max_freq); 4584 dev_priv->rps.max_freq);
4702 } 4585 }
4703 4586
4704 if (IS_SKYLAKE(dev)) { 4587 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
4705 /* Store the frequency values in 16.66 MHZ units, which is 4588 /* Store the frequency values in 16.66 MHZ units, which is
4706 the natural hardware unit for SKL */ 4589 the natural hardware unit for SKL */
4707 dev_priv->rps.rp0_freq *= GEN9_FREQ_SCALER; 4590 dev_priv->rps.rp0_freq *= GEN9_FREQ_SCALER;
@@ -4738,7 +4621,7 @@ static void gen9_enable_rps(struct drm_device *dev)
4738 gen6_init_rps_frequencies(dev); 4621 gen6_init_rps_frequencies(dev);
4739 4622
4740 /* WaGsvDisableTurbo: Workaround to disable turbo on BXT A* */ 4623 /* WaGsvDisableTurbo: Workaround to disable turbo on BXT A* */
4741 if (IS_BROXTON(dev) && (INTEL_REVID(dev) < BXT_REVID_B0)) { 4624 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
4742 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); 4625 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
4743 return; 4626 return;
4744 } 4627 }
@@ -4806,8 +4689,8 @@ static void gen9_enable_rc6(struct drm_device *dev)
4806 DRM_INFO("RC6 %s\n", (rc6_mask & GEN6_RC_CTL_RC6_ENABLE) ? 4689 DRM_INFO("RC6 %s\n", (rc6_mask & GEN6_RC_CTL_RC6_ENABLE) ?
4807 "on" : "off"); 4690 "on" : "off");
4808 /* WaRsUseTimeoutMode */ 4691 /* WaRsUseTimeoutMode */
4809 if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_D0) || 4692 if (IS_SKL_REVID(dev, 0, SKL_REVID_D0) ||
4810 (IS_BROXTON(dev) && INTEL_REVID(dev) <= BXT_REVID_A0)) { 4693 IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
4811 I915_WRITE(GEN6_RC6_THRESHOLD, 625); /* 800us */ 4694 I915_WRITE(GEN6_RC6_THRESHOLD, 625); /* 800us */
4812 I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE | 4695 I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE |
4813 GEN7_RC_CTL_TO_MODE | 4696 GEN7_RC_CTL_TO_MODE |
@@ -5055,7 +4938,7 @@ static void __gen6_update_ring_freq(struct drm_device *dev)
5055 /* convert DDR frequency from units of 266.6MHz to bandwidth */ 4938 /* convert DDR frequency from units of 266.6MHz to bandwidth */
5056 min_ring_freq = mult_frac(min_ring_freq, 8, 3); 4939 min_ring_freq = mult_frac(min_ring_freq, 8, 3);
5057 4940
5058 if (IS_SKYLAKE(dev)) { 4941 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
5059 /* Convert GT frequency to 50 HZ units */ 4942 /* Convert GT frequency to 50 HZ units */
5060 min_gpu_freq = dev_priv->rps.min_freq / GEN9_FREQ_SCALER; 4943 min_gpu_freq = dev_priv->rps.min_freq / GEN9_FREQ_SCALER;
5061 max_gpu_freq = dev_priv->rps.max_freq / GEN9_FREQ_SCALER; 4944 max_gpu_freq = dev_priv->rps.max_freq / GEN9_FREQ_SCALER;
@@ -5073,7 +4956,7 @@ static void __gen6_update_ring_freq(struct drm_device *dev)
5073 int diff = max_gpu_freq - gpu_freq; 4956 int diff = max_gpu_freq - gpu_freq;
5074 unsigned int ia_freq = 0, ring_freq = 0; 4957 unsigned int ia_freq = 0, ring_freq = 0;
5075 4958
5076 if (IS_SKYLAKE(dev)) { 4959 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
5077 /* 4960 /*
5078 * ring_freq = 2 * GT. ring_freq is in 100MHz units 4961 * ring_freq = 2 * GT. ring_freq is in 100MHz units
5079 * No floor required for ring frequency on SKL. 4962 * No floor required for ring frequency on SKL.
@@ -6201,7 +6084,7 @@ static void intel_gen6_powersave_work(struct work_struct *work)
6201 } else if (INTEL_INFO(dev)->gen >= 9) { 6084 } else if (INTEL_INFO(dev)->gen >= 9) {
6202 gen9_enable_rc6(dev); 6085 gen9_enable_rc6(dev);
6203 gen9_enable_rps(dev); 6086 gen9_enable_rps(dev);
6204 if (IS_SKYLAKE(dev)) 6087 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
6205 __gen6_update_ring_freq(dev); 6088 __gen6_update_ring_freq(dev);
6206 } else if (IS_BROADWELL(dev)) { 6089 } else if (IS_BROADWELL(dev)) {
6207 gen8_enable_rps(dev); 6090 gen8_enable_rps(dev);
@@ -7057,7 +6940,6 @@ void intel_init_pm(struct drm_device *dev)
7057 dev_priv->display.init_clock_gating = 6940 dev_priv->display.init_clock_gating =
7058 bxt_init_clock_gating; 6941 bxt_init_clock_gating;
7059 dev_priv->display.update_wm = skl_update_wm; 6942 dev_priv->display.update_wm = skl_update_wm;
7060 dev_priv->display.update_sprite_wm = skl_update_sprite_wm;
7061 } else if (HAS_PCH_SPLIT(dev)) { 6943 } else if (HAS_PCH_SPLIT(dev)) {
7062 ilk_setup_wm_latency(dev); 6944 ilk_setup_wm_latency(dev);
7063 6945
@@ -7066,7 +6948,7 @@ void intel_init_pm(struct drm_device *dev)
7066 (!IS_GEN5(dev) && dev_priv->wm.pri_latency[0] && 6948 (!IS_GEN5(dev) && dev_priv->wm.pri_latency[0] &&
7067 dev_priv->wm.spr_latency[0] && dev_priv->wm.cur_latency[0])) { 6949 dev_priv->wm.spr_latency[0] && dev_priv->wm.cur_latency[0])) {
7068 dev_priv->display.update_wm = ilk_update_wm; 6950 dev_priv->display.update_wm = ilk_update_wm;
7069 dev_priv->display.update_sprite_wm = ilk_update_sprite_wm; 6951 dev_priv->display.compute_pipe_wm = ilk_compute_pipe_wm;
7070 } else { 6952 } else {
7071 DRM_DEBUG_KMS("Failed to read display plane latency. " 6953 DRM_DEBUG_KMS("Failed to read display plane latency. "
7072 "Disable CxSR\n"); 6954 "Disable CxSR\n");
diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c
index 213581c215b3..bc5ea2a6cf4c 100644
--- a/drivers/gpu/drm/i915/intel_psr.c
+++ b/drivers/gpu/drm/i915/intel_psr.c
@@ -80,7 +80,7 @@ static void intel_psr_write_vsc(struct intel_dp *intel_dp,
80 struct drm_i915_private *dev_priv = dev->dev_private; 80 struct drm_i915_private *dev_priv = dev->dev_private;
81 struct intel_crtc *crtc = to_intel_crtc(dig_port->base.base.crtc); 81 struct intel_crtc *crtc = to_intel_crtc(dig_port->base.base.crtc);
82 enum transcoder cpu_transcoder = crtc->config->cpu_transcoder; 82 enum transcoder cpu_transcoder = crtc->config->cpu_transcoder;
83 u32 ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder); 83 i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder);
84 uint32_t *data = (uint32_t *) vsc_psr; 84 uint32_t *data = (uint32_t *) vsc_psr;
85 unsigned int i; 85 unsigned int i;
86 86
@@ -151,13 +151,31 @@ static void vlv_psr_enable_sink(struct intel_dp *intel_dp)
151 DP_PSR_ENABLE | DP_PSR_MAIN_LINK_ACTIVE); 151 DP_PSR_ENABLE | DP_PSR_MAIN_LINK_ACTIVE);
152} 152}
153 153
154static i915_reg_t psr_aux_ctl_reg(struct drm_i915_private *dev_priv,
155 enum port port)
156{
157 if (INTEL_INFO(dev_priv)->gen >= 9)
158 return DP_AUX_CH_CTL(port);
159 else
160 return EDP_PSR_AUX_CTL;
161}
162
163static i915_reg_t psr_aux_data_reg(struct drm_i915_private *dev_priv,
164 enum port port, int index)
165{
166 if (INTEL_INFO(dev_priv)->gen >= 9)
167 return DP_AUX_CH_DATA(port, index);
168 else
169 return EDP_PSR_AUX_DATA(index);
170}
171
154static void hsw_psr_enable_sink(struct intel_dp *intel_dp) 172static void hsw_psr_enable_sink(struct intel_dp *intel_dp)
155{ 173{
156 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 174 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
157 struct drm_device *dev = dig_port->base.base.dev; 175 struct drm_device *dev = dig_port->base.base.dev;
158 struct drm_i915_private *dev_priv = dev->dev_private; 176 struct drm_i915_private *dev_priv = dev->dev_private;
159 uint32_t aux_clock_divider; 177 uint32_t aux_clock_divider;
160 uint32_t aux_data_reg, aux_ctl_reg; 178 i915_reg_t aux_ctl_reg;
161 int precharge = 0x3; 179 int precharge = 0x3;
162 static const uint8_t aux_msg[] = { 180 static const uint8_t aux_msg[] = {
163 [0] = DP_AUX_NATIVE_WRITE << 4, 181 [0] = DP_AUX_NATIVE_WRITE << 4,
@@ -166,6 +184,7 @@ static void hsw_psr_enable_sink(struct intel_dp *intel_dp)
166 [3] = 1 - 1, 184 [3] = 1 - 1,
167 [4] = DP_SET_POWER_D0, 185 [4] = DP_SET_POWER_D0,
168 }; 186 };
187 enum port port = dig_port->port;
169 int i; 188 int i;
170 189
171 BUILD_BUG_ON(sizeof(aux_msg) > 20); 190 BUILD_BUG_ON(sizeof(aux_msg) > 20);
@@ -181,14 +200,11 @@ static void hsw_psr_enable_sink(struct intel_dp *intel_dp)
181 DP_SINK_DEVICE_AUX_FRAME_SYNC_CONF, 200 DP_SINK_DEVICE_AUX_FRAME_SYNC_CONF,
182 DP_AUX_FRAME_SYNC_ENABLE); 201 DP_AUX_FRAME_SYNC_ENABLE);
183 202
184 aux_data_reg = (INTEL_INFO(dev)->gen >= 9) ? 203 aux_ctl_reg = psr_aux_ctl_reg(dev_priv, port);
185 DPA_AUX_CH_DATA1 : EDP_PSR_AUX_DATA1(dev);
186 aux_ctl_reg = (INTEL_INFO(dev)->gen >= 9) ?
187 DPA_AUX_CH_CTL : EDP_PSR_AUX_CTL(dev);
188 204
189 /* Setup AUX registers */ 205 /* Setup AUX registers */
190 for (i = 0; i < sizeof(aux_msg); i += 4) 206 for (i = 0; i < sizeof(aux_msg); i += 4)
191 I915_WRITE(aux_data_reg + i, 207 I915_WRITE(psr_aux_data_reg(dev_priv, port, i >> 2),
192 intel_dp_pack_aux(&aux_msg[i], sizeof(aux_msg) - i)); 208 intel_dp_pack_aux(&aux_msg[i], sizeof(aux_msg) - i));
193 209
194 if (INTEL_INFO(dev)->gen >= 9) { 210 if (INTEL_INFO(dev)->gen >= 9) {
@@ -267,16 +283,11 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp)
267 const uint32_t link_entry_time = EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES; 283 const uint32_t link_entry_time = EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES;
268 284
269 if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT) { 285 if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT) {
270 /* It doesn't mean we shouldn't send TPS patters, so let's
271 send the minimal TP1 possible and skip TP2. */
272 val |= EDP_PSR_TP1_TIME_100us;
273 val |= EDP_PSR_TP2_TP3_TIME_0us;
274 val |= EDP_PSR_SKIP_AUX_EXIT;
275 /* Sink should be able to train with the 5 or 6 idle patterns */ 286 /* Sink should be able to train with the 5 or 6 idle patterns */
276 idle_frames += 4; 287 idle_frames += 4;
277 } 288 }
278 289
279 I915_WRITE(EDP_PSR_CTL(dev), val | 290 I915_WRITE(EDP_PSR_CTL, val |
280 (IS_BROADWELL(dev) ? 0 : link_entry_time) | 291 (IS_BROADWELL(dev) ? 0 : link_entry_time) |
281 max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT | 292 max_sleep_time << EDP_PSR_MAX_SLEEP_TIME_SHIFT |
282 idle_frames << EDP_PSR_IDLE_FRAME_SHIFT | 293 idle_frames << EDP_PSR_IDLE_FRAME_SHIFT |
@@ -340,7 +351,7 @@ static void intel_psr_activate(struct intel_dp *intel_dp)
340 struct drm_device *dev = intel_dig_port->base.base.dev; 351 struct drm_device *dev = intel_dig_port->base.base.dev;
341 struct drm_i915_private *dev_priv = dev->dev_private; 352 struct drm_i915_private *dev_priv = dev->dev_private;
342 353
343 WARN_ON(I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE); 354 WARN_ON(I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE);
344 WARN_ON(dev_priv->psr.active); 355 WARN_ON(dev_priv->psr.active);
345 lockdep_assert_held(&dev_priv->psr.lock); 356 lockdep_assert_held(&dev_priv->psr.lock);
346 357
@@ -404,7 +415,7 @@ void intel_psr_enable(struct intel_dp *intel_dp)
404 } 415 }
405 416
406 /* Avoid continuous PSR exit by masking memup and hpd */ 417 /* Avoid continuous PSR exit by masking memup and hpd */
407 I915_WRITE(EDP_PSR_DEBUG_CTL(dev), EDP_PSR_DEBUG_MASK_MEMUP | 418 I915_WRITE(EDP_PSR_DEBUG_CTL, EDP_PSR_DEBUG_MASK_MEMUP |
408 EDP_PSR_DEBUG_MASK_HPD); 419 EDP_PSR_DEBUG_MASK_HPD);
409 420
410 /* Enable PSR on the panel */ 421 /* Enable PSR on the panel */
@@ -427,6 +438,19 @@ void intel_psr_enable(struct intel_dp *intel_dp)
427 vlv_psr_enable_source(intel_dp); 438 vlv_psr_enable_source(intel_dp);
428 } 439 }
429 440
441 /*
442 * FIXME: Activation should happen immediately since this function
443 * is just called after pipe is fully trained and enabled.
444 * However on every platform we face issues when first activation
445 * follows a modeset so quickly.
446 * - On VLV/CHV we get bank screen on first activation
447 * - On HSW/BDW we get a recoverable frozen screen until next
448 * exit-activate sequence.
449 */
450 if (INTEL_INFO(dev)->gen < 9)
451 schedule_delayed_work(&dev_priv->psr.work,
452 msecs_to_jiffies(intel_dp->panel_power_cycle_delay * 5));
453
430 dev_priv->psr.enabled = intel_dp; 454 dev_priv->psr.enabled = intel_dp;
431unlock: 455unlock:
432 mutex_unlock(&dev_priv->psr.lock); 456 mutex_unlock(&dev_priv->psr.lock);
@@ -466,17 +490,17 @@ static void hsw_psr_disable(struct intel_dp *intel_dp)
466 struct drm_i915_private *dev_priv = dev->dev_private; 490 struct drm_i915_private *dev_priv = dev->dev_private;
467 491
468 if (dev_priv->psr.active) { 492 if (dev_priv->psr.active) {
469 I915_WRITE(EDP_PSR_CTL(dev), 493 I915_WRITE(EDP_PSR_CTL,
470 I915_READ(EDP_PSR_CTL(dev)) & ~EDP_PSR_ENABLE); 494 I915_READ(EDP_PSR_CTL) & ~EDP_PSR_ENABLE);
471 495
472 /* Wait till PSR is idle */ 496 /* Wait till PSR is idle */
473 if (_wait_for((I915_READ(EDP_PSR_STATUS_CTL(dev)) & 497 if (_wait_for((I915_READ(EDP_PSR_STATUS_CTL) &
474 EDP_PSR_STATUS_STATE_MASK) == 0, 2000, 10)) 498 EDP_PSR_STATUS_STATE_MASK) == 0, 2000, 10))
475 DRM_ERROR("Timed out waiting for PSR Idle State\n"); 499 DRM_ERROR("Timed out waiting for PSR Idle State\n");
476 500
477 dev_priv->psr.active = false; 501 dev_priv->psr.active = false;
478 } else { 502 } else {
479 WARN_ON(I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE); 503 WARN_ON(I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE);
480 } 504 }
481} 505}
482 506
@@ -523,7 +547,7 @@ static void intel_psr_work(struct work_struct *work)
523 * and be ready for re-enable. 547 * and be ready for re-enable.
524 */ 548 */
525 if (HAS_DDI(dev_priv->dev)) { 549 if (HAS_DDI(dev_priv->dev)) {
526 if (wait_for((I915_READ(EDP_PSR_STATUS_CTL(dev_priv->dev)) & 550 if (wait_for((I915_READ(EDP_PSR_STATUS_CTL) &
527 EDP_PSR_STATUS_STATE_MASK) == 0, 50)) { 551 EDP_PSR_STATUS_STATE_MASK) == 0, 50)) {
528 DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n"); 552 DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n");
529 return; 553 return;
@@ -566,11 +590,11 @@ static void intel_psr_exit(struct drm_device *dev)
566 return; 590 return;
567 591
568 if (HAS_DDI(dev)) { 592 if (HAS_DDI(dev)) {
569 val = I915_READ(EDP_PSR_CTL(dev)); 593 val = I915_READ(EDP_PSR_CTL);
570 594
571 WARN_ON(!(val & EDP_PSR_ENABLE)); 595 WARN_ON(!(val & EDP_PSR_ENABLE));
572 596
573 I915_WRITE(EDP_PSR_CTL(dev), val & ~EDP_PSR_ENABLE); 597 I915_WRITE(EDP_PSR_CTL, val & ~EDP_PSR_ENABLE);
574 } else { 598 } else {
575 val = I915_READ(VLV_PSRCTL(pipe)); 599 val = I915_READ(VLV_PSRCTL(pipe));
576 600
@@ -700,7 +724,6 @@ void intel_psr_flush(struct drm_device *dev,
700 struct drm_i915_private *dev_priv = dev->dev_private; 724 struct drm_i915_private *dev_priv = dev->dev_private;
701 struct drm_crtc *crtc; 725 struct drm_crtc *crtc;
702 enum pipe pipe; 726 enum pipe pipe;
703 int delay_ms = HAS_DDI(dev) ? 100 : 500;
704 727
705 mutex_lock(&dev_priv->psr.lock); 728 mutex_lock(&dev_priv->psr.lock);
706 if (!dev_priv->psr.enabled) { 729 if (!dev_priv->psr.enabled) {
@@ -735,8 +758,9 @@ void intel_psr_flush(struct drm_device *dev,
735 } 758 }
736 759
737 if (!dev_priv->psr.active && !dev_priv->psr.busy_frontbuffer_bits) 760 if (!dev_priv->psr.active && !dev_priv->psr.busy_frontbuffer_bits)
738 schedule_delayed_work(&dev_priv->psr.work, 761 if (!work_busy(&dev_priv->psr.work.work))
739 msecs_to_jiffies(delay_ms)); 762 schedule_delayed_work(&dev_priv->psr.work,
763 msecs_to_jiffies(100));
740 mutex_unlock(&dev_priv->psr.lock); 764 mutex_unlock(&dev_priv->psr.lock);
741} 765}
742 766
@@ -751,6 +775,9 @@ void intel_psr_init(struct drm_device *dev)
751{ 775{
752 struct drm_i915_private *dev_priv = dev->dev_private; 776 struct drm_i915_private *dev_priv = dev->dev_private;
753 777
778 dev_priv->psr_mmio_base = IS_HASWELL(dev_priv) ?
779 HSW_EDP_PSR_BASE : BDW_EDP_PSR_BASE;
780
754 INIT_DELAYED_WORK(&dev_priv->psr.work, intel_psr_work); 781 INIT_DELAYED_WORK(&dev_priv->psr.work, intel_psr_work);
755 mutex_init(&dev_priv->psr.lock); 782 mutex_init(&dev_priv->psr.lock);
756} 783}
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 9461a238f5d5..57d78f264b53 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -481,7 +481,7 @@ static void intel_ring_setup_status_page(struct intel_engine_cs *ring)
481{ 481{
482 struct drm_device *dev = ring->dev; 482 struct drm_device *dev = ring->dev;
483 struct drm_i915_private *dev_priv = ring->dev->dev_private; 483 struct drm_i915_private *dev_priv = ring->dev->dev_private;
484 u32 mmio = 0; 484 i915_reg_t mmio;
485 485
486 /* The ring status page addresses are no longer next to the rest of 486 /* The ring status page addresses are no longer next to the rest of
487 * the ring registers as of gen7. 487 * the ring registers as of gen7.
@@ -524,7 +524,7 @@ static void intel_ring_setup_status_page(struct intel_engine_cs *ring)
524 * invalidating the TLB? 524 * invalidating the TLB?
525 */ 525 */
526 if (INTEL_INFO(dev)->gen >= 6 && INTEL_INFO(dev)->gen < 8) { 526 if (INTEL_INFO(dev)->gen >= 6 && INTEL_INFO(dev)->gen < 8) {
527 u32 reg = RING_INSTPM(ring->mmio_base); 527 i915_reg_t reg = RING_INSTPM(ring->mmio_base);
528 528
529 /* ring should be idle before issuing a sync flush*/ 529 /* ring should be idle before issuing a sync flush*/
530 WARN_ON((I915_READ_MODE(ring) & MODE_IDLE) == 0); 530 WARN_ON((I915_READ_MODE(ring) & MODE_IDLE) == 0);
@@ -733,7 +733,7 @@ static int intel_ring_workarounds_emit(struct drm_i915_gem_request *req)
733 733
734 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(w->count)); 734 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(w->count));
735 for (i = 0; i < w->count; i++) { 735 for (i = 0; i < w->count; i++) {
736 intel_ring_emit(ring, w->reg[i].addr); 736 intel_ring_emit_reg(ring, w->reg[i].addr);
737 intel_ring_emit(ring, w->reg[i].value); 737 intel_ring_emit(ring, w->reg[i].value);
738 } 738 }
739 intel_ring_emit(ring, MI_NOOP); 739 intel_ring_emit(ring, MI_NOOP);
@@ -766,7 +766,8 @@ static int intel_rcs_ctx_init(struct drm_i915_gem_request *req)
766} 766}
767 767
768static int wa_add(struct drm_i915_private *dev_priv, 768static int wa_add(struct drm_i915_private *dev_priv,
769 const u32 addr, const u32 mask, const u32 val) 769 i915_reg_t addr,
770 const u32 mask, const u32 val)
770{ 771{
771 const u32 idx = dev_priv->workarounds.count; 772 const u32 idx = dev_priv->workarounds.count;
772 773
@@ -924,17 +925,15 @@ static int gen9_init_workarounds(struct intel_engine_cs *ring)
924 WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, 925 WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3,
925 GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC); 926 GEN9_DISABLE_OCL_OOB_SUPPRESS_LOGIC);
926 927
927 if ((IS_SKYLAKE(dev) && (INTEL_REVID(dev) == SKL_REVID_A0 || 928 /* WaDisableDgMirrorFixInHalfSliceChicken5:skl,bxt */
928 INTEL_REVID(dev) == SKL_REVID_B0)) || 929 if (IS_SKL_REVID(dev, 0, SKL_REVID_B0) ||
929 (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0)) { 930 IS_BXT_REVID(dev, 0, BXT_REVID_A1))
930 /* WaDisableDgMirrorFixInHalfSliceChicken5:skl,bxt */
931 WA_CLR_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN5, 931 WA_CLR_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN5,
932 GEN9_DG_MIRROR_FIX_ENABLE); 932 GEN9_DG_MIRROR_FIX_ENABLE);
933 }
934 933
935 if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) <= SKL_REVID_B0) || 934 /* WaSetDisablePixMaskCammingAndRhwoInCommonSliceChicken:skl,bxt */
936 (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0)) { 935 if (IS_SKL_REVID(dev, 0, SKL_REVID_B0) ||
937 /* WaSetDisablePixMaskCammingAndRhwoInCommonSliceChicken:skl,bxt */ 936 IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
938 WA_SET_BIT_MASKED(GEN7_COMMON_SLICE_CHICKEN1, 937 WA_SET_BIT_MASKED(GEN7_COMMON_SLICE_CHICKEN1,
939 GEN9_RHWO_OPTIMIZATION_DISABLE); 938 GEN9_RHWO_OPTIMIZATION_DISABLE);
940 /* 939 /*
@@ -944,12 +943,10 @@ static int gen9_init_workarounds(struct intel_engine_cs *ring)
944 */ 943 */
945 } 944 }
946 945
947 if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) >= SKL_REVID_C0) || 946 /* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt */
948 IS_BROXTON(dev)) { 947 if (IS_SKL_REVID(dev, SKL_REVID_C0, REVID_FOREVER) || IS_BROXTON(dev))
949 /* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt */
950 WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7, 948 WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7,
951 GEN9_ENABLE_YV12_BUGFIX); 949 GEN9_ENABLE_YV12_BUGFIX);
952 }
953 950
954 /* Wa4x4STCOptimizationDisable:skl,bxt */ 951 /* Wa4x4STCOptimizationDisable:skl,bxt */
955 /* WaDisablePartialResolveInVc:skl,bxt */ 952 /* WaDisablePartialResolveInVc:skl,bxt */
@@ -961,24 +958,22 @@ static int gen9_init_workarounds(struct intel_engine_cs *ring)
961 GEN9_CCS_TLB_PREFETCH_ENABLE); 958 GEN9_CCS_TLB_PREFETCH_ENABLE);
962 959
963 /* WaDisableMaskBasedCammingInRCC:skl,bxt */ 960 /* WaDisableMaskBasedCammingInRCC:skl,bxt */
964 if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) == SKL_REVID_C0) || 961 if (IS_SKL_REVID(dev, SKL_REVID_C0, SKL_REVID_C0) ||
965 (IS_BROXTON(dev) && INTEL_REVID(dev) < BXT_REVID_B0)) 962 IS_BXT_REVID(dev, 0, BXT_REVID_A1))
966 WA_SET_BIT_MASKED(SLICE_ECO_CHICKEN0, 963 WA_SET_BIT_MASKED(SLICE_ECO_CHICKEN0,
967 PIXEL_MASK_CAMMING_DISABLE); 964 PIXEL_MASK_CAMMING_DISABLE);
968 965
969 /* WaForceContextSaveRestoreNonCoherent:skl,bxt */ 966 /* WaForceContextSaveRestoreNonCoherent:skl,bxt */
970 tmp = HDC_FORCE_CONTEXT_SAVE_RESTORE_NON_COHERENT; 967 tmp = HDC_FORCE_CONTEXT_SAVE_RESTORE_NON_COHERENT;
971 if ((IS_SKYLAKE(dev) && INTEL_REVID(dev) == SKL_REVID_F0) || 968 if (IS_SKL_REVID(dev, SKL_REVID_F0, SKL_REVID_F0) ||
972 (IS_BROXTON(dev) && INTEL_REVID(dev) >= BXT_REVID_B0)) 969 IS_BXT_REVID(dev, BXT_REVID_B0, REVID_FOREVER))
973 tmp |= HDC_FORCE_CSR_NON_COHERENT_OVR_DISABLE; 970 tmp |= HDC_FORCE_CSR_NON_COHERENT_OVR_DISABLE;
974 WA_SET_BIT_MASKED(HDC_CHICKEN0, tmp); 971 WA_SET_BIT_MASKED(HDC_CHICKEN0, tmp);
975 972
976 /* WaDisableSamplerPowerBypassForSOPingPong:skl,bxt */ 973 /* WaDisableSamplerPowerBypassForSOPingPong:skl,bxt */
977 if (IS_SKYLAKE(dev) || 974 if (IS_SKYLAKE(dev) || IS_BXT_REVID(dev, 0, BXT_REVID_B0))
978 (IS_BROXTON(dev) && INTEL_REVID(dev) <= BXT_REVID_B0)) {
979 WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3, 975 WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3,
980 GEN8_SAMPLER_POWER_BYPASS_DIS); 976 GEN8_SAMPLER_POWER_BYPASS_DIS);
981 }
982 977
983 /* WaDisableSTUnitPowerOptimization:skl,bxt */ 978 /* WaDisableSTUnitPowerOptimization:skl,bxt */
984 WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN2, GEN8_ST_PO_DISABLE); 979 WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN2, GEN8_ST_PO_DISABLE);
@@ -1038,7 +1033,7 @@ static int skl_init_workarounds(struct intel_engine_cs *ring)
1038 if (ret) 1033 if (ret)
1039 return ret; 1034 return ret;
1040 1035
1041 if (INTEL_REVID(dev) <= SKL_REVID_D0) { 1036 if (IS_SKL_REVID(dev, 0, SKL_REVID_D0)) {
1042 /* WaDisableHDCInvalidation:skl */ 1037 /* WaDisableHDCInvalidation:skl */
1043 I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | 1038 I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) |
1044 BDW_DISABLE_HDC_INVALIDATION); 1039 BDW_DISABLE_HDC_INVALIDATION);
@@ -1051,23 +1046,23 @@ static int skl_init_workarounds(struct intel_engine_cs *ring)
1051 /* GEN8_L3SQCREG4 has a dependency with WA batch so any new changes 1046 /* GEN8_L3SQCREG4 has a dependency with WA batch so any new changes
1052 * involving this register should also be added to WA batch as required. 1047 * involving this register should also be added to WA batch as required.
1053 */ 1048 */
1054 if (INTEL_REVID(dev) <= SKL_REVID_E0) 1049 if (IS_SKL_REVID(dev, 0, SKL_REVID_E0))
1055 /* WaDisableLSQCROPERFforOCL:skl */ 1050 /* WaDisableLSQCROPERFforOCL:skl */
1056 I915_WRITE(GEN8_L3SQCREG4, I915_READ(GEN8_L3SQCREG4) | 1051 I915_WRITE(GEN8_L3SQCREG4, I915_READ(GEN8_L3SQCREG4) |
1057 GEN8_LQSC_RO_PERF_DIS); 1052 GEN8_LQSC_RO_PERF_DIS);
1058 1053
1059 /* WaEnableGapsTsvCreditFix:skl */ 1054 /* WaEnableGapsTsvCreditFix:skl */
1060 if (IS_SKYLAKE(dev) && (INTEL_REVID(dev) >= SKL_REVID_C0)) { 1055 if (IS_SKL_REVID(dev, SKL_REVID_C0, REVID_FOREVER)) {
1061 I915_WRITE(GEN8_GARBCNTL, (I915_READ(GEN8_GARBCNTL) | 1056 I915_WRITE(GEN8_GARBCNTL, (I915_READ(GEN8_GARBCNTL) |
1062 GEN9_GAPS_TSV_CREDIT_DISABLE)); 1057 GEN9_GAPS_TSV_CREDIT_DISABLE));
1063 } 1058 }
1064 1059
1065 /* WaDisablePowerCompilerClockGating:skl */ 1060 /* WaDisablePowerCompilerClockGating:skl */
1066 if (INTEL_REVID(dev) == SKL_REVID_B0) 1061 if (IS_SKL_REVID(dev, SKL_REVID_B0, SKL_REVID_B0))
1067 WA_SET_BIT_MASKED(HIZ_CHICKEN, 1062 WA_SET_BIT_MASKED(HIZ_CHICKEN,
1068 BDW_HIZ_POWER_COMPILER_CLOCK_GATING_DISABLE); 1063 BDW_HIZ_POWER_COMPILER_CLOCK_GATING_DISABLE);
1069 1064
1070 if (INTEL_REVID(dev) <= SKL_REVID_D0) { 1065 if (IS_SKL_REVID(dev, 0, SKL_REVID_D0)) {
1071 /* 1066 /*
1072 *Use Force Non-Coherent whenever executing a 3D context. This 1067 *Use Force Non-Coherent whenever executing a 3D context. This
1073 * is a workaround for a possible hang in the unlikely event 1068 * is a workaround for a possible hang in the unlikely event
@@ -1078,19 +1073,17 @@ static int skl_init_workarounds(struct intel_engine_cs *ring)
1078 HDC_FORCE_NON_COHERENT); 1073 HDC_FORCE_NON_COHERENT);
1079 } 1074 }
1080 1075
1081 if (INTEL_REVID(dev) == SKL_REVID_C0 || 1076 /* WaBarrierPerformanceFixDisable:skl */
1082 INTEL_REVID(dev) == SKL_REVID_D0) 1077 if (IS_SKL_REVID(dev, SKL_REVID_C0, SKL_REVID_D0))
1083 /* WaBarrierPerformanceFixDisable:skl */
1084 WA_SET_BIT_MASKED(HDC_CHICKEN0, 1078 WA_SET_BIT_MASKED(HDC_CHICKEN0,
1085 HDC_FENCE_DEST_SLM_DISABLE | 1079 HDC_FENCE_DEST_SLM_DISABLE |
1086 HDC_BARRIER_PERFORMANCE_DISABLE); 1080 HDC_BARRIER_PERFORMANCE_DISABLE);
1087 1081
1088 /* WaDisableSbeCacheDispatchPortSharing:skl */ 1082 /* WaDisableSbeCacheDispatchPortSharing:skl */
1089 if (INTEL_REVID(dev) <= SKL_REVID_F0) { 1083 if (IS_SKL_REVID(dev, 0, SKL_REVID_F0))
1090 WA_SET_BIT_MASKED( 1084 WA_SET_BIT_MASKED(
1091 GEN7_HALF_SLICE_CHICKEN1, 1085 GEN7_HALF_SLICE_CHICKEN1,
1092 GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE); 1086 GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE);
1093 }
1094 1087
1095 return skl_tune_iz_hashing(ring); 1088 return skl_tune_iz_hashing(ring);
1096} 1089}
@@ -1107,11 +1100,11 @@ static int bxt_init_workarounds(struct intel_engine_cs *ring)
1107 1100
1108 /* WaStoreMultiplePTEenable:bxt */ 1101 /* WaStoreMultiplePTEenable:bxt */
1109 /* This is a requirement according to Hardware specification */ 1102 /* This is a requirement according to Hardware specification */
1110 if (INTEL_REVID(dev) == BXT_REVID_A0) 1103 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1))
1111 I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_TLBPF); 1104 I915_WRITE(TILECTL, I915_READ(TILECTL) | TILECTL_TLBPF);
1112 1105
1113 /* WaSetClckGatingDisableMedia:bxt */ 1106 /* WaSetClckGatingDisableMedia:bxt */
1114 if (INTEL_REVID(dev) == BXT_REVID_A0) { 1107 if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
1115 I915_WRITE(GEN7_MISCCPCTL, (I915_READ(GEN7_MISCCPCTL) & 1108 I915_WRITE(GEN7_MISCCPCTL, (I915_READ(GEN7_MISCCPCTL) &
1116 ~GEN8_DOP_CLOCK_GATE_MEDIA_ENABLE)); 1109 ~GEN8_DOP_CLOCK_GATE_MEDIA_ENABLE));
1117 } 1110 }
@@ -1121,7 +1114,7 @@ static int bxt_init_workarounds(struct intel_engine_cs *ring)
1121 STALL_DOP_GATING_DISABLE); 1114 STALL_DOP_GATING_DISABLE);
1122 1115
1123 /* WaDisableSbeCacheDispatchPortSharing:bxt */ 1116 /* WaDisableSbeCacheDispatchPortSharing:bxt */
1124 if (INTEL_REVID(dev) <= BXT_REVID_B0) { 1117 if (IS_BXT_REVID(dev, 0, BXT_REVID_B0)) {
1125 WA_SET_BIT_MASKED( 1118 WA_SET_BIT_MASKED(
1126 GEN7_HALF_SLICE_CHICKEN1, 1119 GEN7_HALF_SLICE_CHICKEN1,
1127 GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE); 1120 GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE);
@@ -1319,11 +1312,13 @@ static int gen6_signal(struct drm_i915_gem_request *signaller_req,
1319 return ret; 1312 return ret;
1320 1313
1321 for_each_ring(useless, dev_priv, i) { 1314 for_each_ring(useless, dev_priv, i) {
1322 u32 mbox_reg = signaller->semaphore.mbox.signal[i]; 1315 i915_reg_t mbox_reg = signaller->semaphore.mbox.signal[i];
1323 if (mbox_reg != GEN6_NOSYNC) { 1316
1317 if (i915_mmio_reg_valid(mbox_reg)) {
1324 u32 seqno = i915_gem_request_get_seqno(signaller_req); 1318 u32 seqno = i915_gem_request_get_seqno(signaller_req);
1319
1325 intel_ring_emit(signaller, MI_LOAD_REGISTER_IMM(1)); 1320 intel_ring_emit(signaller, MI_LOAD_REGISTER_IMM(1));
1326 intel_ring_emit(signaller, mbox_reg); 1321 intel_ring_emit_reg(signaller, mbox_reg);
1327 intel_ring_emit(signaller, seqno); 1322 intel_ring_emit(signaller, seqno);
1328 } 1323 }
1329 } 1324 }
@@ -2004,11 +1999,35 @@ static int init_phys_status_page(struct intel_engine_cs *ring)
2004 1999
2005void intel_unpin_ringbuffer_obj(struct intel_ringbuffer *ringbuf) 2000void intel_unpin_ringbuffer_obj(struct intel_ringbuffer *ringbuf)
2006{ 2001{
2007 iounmap(ringbuf->virtual_start); 2002 if (HAS_LLC(ringbuf->obj->base.dev) && !ringbuf->obj->stolen)
2003 vunmap(ringbuf->virtual_start);
2004 else
2005 iounmap(ringbuf->virtual_start);
2008 ringbuf->virtual_start = NULL; 2006 ringbuf->virtual_start = NULL;
2009 i915_gem_object_ggtt_unpin(ringbuf->obj); 2007 i915_gem_object_ggtt_unpin(ringbuf->obj);
2010} 2008}
2011 2009
2010static u32 *vmap_obj(struct drm_i915_gem_object *obj)
2011{
2012 struct sg_page_iter sg_iter;
2013 struct page **pages;
2014 void *addr;
2015 int i;
2016
2017 pages = drm_malloc_ab(obj->base.size >> PAGE_SHIFT, sizeof(*pages));
2018 if (pages == NULL)
2019 return NULL;
2020
2021 i = 0;
2022 for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0)
2023 pages[i++] = sg_page_iter_page(&sg_iter);
2024
2025 addr = vmap(pages, i, 0, PAGE_KERNEL);
2026 drm_free_large(pages);
2027
2028 return addr;
2029}
2030
2012int intel_pin_and_map_ringbuffer_obj(struct drm_device *dev, 2031int intel_pin_and_map_ringbuffer_obj(struct drm_device *dev,
2013 struct intel_ringbuffer *ringbuf) 2032 struct intel_ringbuffer *ringbuf)
2014{ 2033{
@@ -2016,21 +2035,39 @@ int intel_pin_and_map_ringbuffer_obj(struct drm_device *dev,
2016 struct drm_i915_gem_object *obj = ringbuf->obj; 2035 struct drm_i915_gem_object *obj = ringbuf->obj;
2017 int ret; 2036 int ret;
2018 2037
2019 ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, PIN_MAPPABLE); 2038 if (HAS_LLC(dev_priv) && !obj->stolen) {
2020 if (ret) 2039 ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, 0);
2021 return ret; 2040 if (ret)
2041 return ret;
2022 2042
2023 ret = i915_gem_object_set_to_gtt_domain(obj, true); 2043 ret = i915_gem_object_set_to_cpu_domain(obj, true);
2024 if (ret) { 2044 if (ret) {
2025 i915_gem_object_ggtt_unpin(obj); 2045 i915_gem_object_ggtt_unpin(obj);
2026 return ret; 2046 return ret;
2027 } 2047 }
2048
2049 ringbuf->virtual_start = vmap_obj(obj);
2050 if (ringbuf->virtual_start == NULL) {
2051 i915_gem_object_ggtt_unpin(obj);
2052 return -ENOMEM;
2053 }
2054 } else {
2055 ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, PIN_MAPPABLE);
2056 if (ret)
2057 return ret;
2028 2058
2029 ringbuf->virtual_start = ioremap_wc(dev_priv->gtt.mappable_base + 2059 ret = i915_gem_object_set_to_gtt_domain(obj, true);
2030 i915_gem_obj_ggtt_offset(obj), ringbuf->size); 2060 if (ret) {
2031 if (ringbuf->virtual_start == NULL) { 2061 i915_gem_object_ggtt_unpin(obj);
2032 i915_gem_object_ggtt_unpin(obj); 2062 return ret;
2033 return -EINVAL; 2063 }
2064
2065 ringbuf->virtual_start = ioremap_wc(dev_priv->gtt.mappable_base +
2066 i915_gem_obj_ggtt_offset(obj), ringbuf->size);
2067 if (ringbuf->virtual_start == NULL) {
2068 i915_gem_object_ggtt_unpin(obj);
2069 return -EINVAL;
2070 }
2034 } 2071 }
2035 2072
2036 return 0; 2073 return 0;
@@ -2070,10 +2107,14 @@ intel_engine_create_ringbuffer(struct intel_engine_cs *engine, int size)
2070 int ret; 2107 int ret;
2071 2108
2072 ring = kzalloc(sizeof(*ring), GFP_KERNEL); 2109 ring = kzalloc(sizeof(*ring), GFP_KERNEL);
2073 if (ring == NULL) 2110 if (ring == NULL) {
2111 DRM_DEBUG_DRIVER("Failed to allocate ringbuffer %s\n",
2112 engine->name);
2074 return ERR_PTR(-ENOMEM); 2113 return ERR_PTR(-ENOMEM);
2114 }
2075 2115
2076 ring->ring = engine; 2116 ring->ring = engine;
2117 list_add(&ring->link, &engine->buffers);
2077 2118
2078 ring->size = size; 2119 ring->size = size;
2079 /* Workaround an erratum on the i830 which causes a hang if 2120 /* Workaround an erratum on the i830 which causes a hang if
@@ -2089,8 +2130,9 @@ intel_engine_create_ringbuffer(struct intel_engine_cs *engine, int size)
2089 2130
2090 ret = intel_alloc_ringbuffer_obj(engine->dev, ring); 2131 ret = intel_alloc_ringbuffer_obj(engine->dev, ring);
2091 if (ret) { 2132 if (ret) {
2092 DRM_ERROR("Failed to allocate ringbuffer %s: %d\n", 2133 DRM_DEBUG_DRIVER("Failed to allocate ringbuffer %s: %d\n",
2093 engine->name, ret); 2134 engine->name, ret);
2135 list_del(&ring->link);
2094 kfree(ring); 2136 kfree(ring);
2095 return ERR_PTR(ret); 2137 return ERR_PTR(ret);
2096 } 2138 }
@@ -2102,6 +2144,7 @@ void
2102intel_ringbuffer_free(struct intel_ringbuffer *ring) 2144intel_ringbuffer_free(struct intel_ringbuffer *ring)
2103{ 2145{
2104 intel_destroy_ringbuffer_obj(ring); 2146 intel_destroy_ringbuffer_obj(ring);
2147 list_del(&ring->link);
2105 kfree(ring); 2148 kfree(ring);
2106} 2149}
2107 2150
@@ -2117,6 +2160,7 @@ static int intel_init_ring_buffer(struct drm_device *dev,
2117 INIT_LIST_HEAD(&ring->active_list); 2160 INIT_LIST_HEAD(&ring->active_list);
2118 INIT_LIST_HEAD(&ring->request_list); 2161 INIT_LIST_HEAD(&ring->request_list);
2119 INIT_LIST_HEAD(&ring->execlist_queue); 2162 INIT_LIST_HEAD(&ring->execlist_queue);
2163 INIT_LIST_HEAD(&ring->buffers);
2120 i915_gem_batch_pool_init(dev, &ring->batch_pool); 2164 i915_gem_batch_pool_init(dev, &ring->batch_pool);
2121 memset(ring->semaphore.sync_seqno, 0, sizeof(ring->semaphore.sync_seqno)); 2165 memset(ring->semaphore.sync_seqno, 0, sizeof(ring->semaphore.sync_seqno));
2122 2166
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 49fa41dc0eb6..5d1eb206151d 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -100,6 +100,7 @@ struct intel_ringbuffer {
100 void __iomem *virtual_start; 100 void __iomem *virtual_start;
101 101
102 struct intel_engine_cs *ring; 102 struct intel_engine_cs *ring;
103 struct list_head link;
103 104
104 u32 head; 105 u32 head;
105 u32 tail; 106 u32 tail;
@@ -157,6 +158,7 @@ struct intel_engine_cs {
157 u32 mmio_base; 158 u32 mmio_base;
158 struct drm_device *dev; 159 struct drm_device *dev;
159 struct intel_ringbuffer *buffer; 160 struct intel_ringbuffer *buffer;
161 struct list_head buffers;
160 162
161 /* 163 /*
162 * A pool of objects to use as shadow copies of client batch buffers 164 * A pool of objects to use as shadow copies of client batch buffers
@@ -247,7 +249,7 @@ struct intel_engine_cs {
247 /* our mbox written by others */ 249 /* our mbox written by others */
248 u32 wait[I915_NUM_RINGS]; 250 u32 wait[I915_NUM_RINGS];
249 /* mboxes this ring signals to */ 251 /* mboxes this ring signals to */
250 u32 signal[I915_NUM_RINGS]; 252 i915_reg_t signal[I915_NUM_RINGS];
251 } mbox; 253 } mbox;
252 u64 signal_ggtt[I915_NUM_RINGS]; 254 u64 signal_ggtt[I915_NUM_RINGS];
253 }; 255 };
@@ -441,6 +443,11 @@ static inline void intel_ring_emit(struct intel_engine_cs *ring,
441 iowrite32(data, ringbuf->virtual_start + ringbuf->tail); 443 iowrite32(data, ringbuf->virtual_start + ringbuf->tail);
442 ringbuf->tail += 4; 444 ringbuf->tail += 4;
443} 445}
446static inline void intel_ring_emit_reg(struct intel_engine_cs *ring,
447 i915_reg_t reg)
448{
449 intel_ring_emit(ring, i915_mmio_reg_offset(reg));
450}
444static inline void intel_ring_advance(struct intel_engine_cs *ring) 451static inline void intel_ring_advance(struct intel_engine_cs *ring)
445{ 452{
446 struct intel_ringbuffer *ringbuf = ring->buffer; 453 struct intel_ringbuffer *ringbuf = ring->buffer;
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 7e23d65c9b24..afca6c940b9a 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -49,21 +49,18 @@
49 * present for a given platform. 49 * present for a given platform.
50 */ 50 */
51 51
52#define GEN9_ENABLE_DC5(dev) 0
53#define SKL_ENABLE_DC6(dev) IS_SKYLAKE(dev)
54
55#define for_each_power_well(i, power_well, domain_mask, power_domains) \ 52#define for_each_power_well(i, power_well, domain_mask, power_domains) \
56 for (i = 0; \ 53 for (i = 0; \
57 i < (power_domains)->power_well_count && \ 54 i < (power_domains)->power_well_count && \
58 ((power_well) = &(power_domains)->power_wells[i]); \ 55 ((power_well) = &(power_domains)->power_wells[i]); \
59 i++) \ 56 i++) \
60 if ((power_well)->domains & (domain_mask)) 57 for_each_if ((power_well)->domains & (domain_mask))
61 58
62#define for_each_power_well_rev(i, power_well, domain_mask, power_domains) \ 59#define for_each_power_well_rev(i, power_well, domain_mask, power_domains) \
63 for (i = (power_domains)->power_well_count - 1; \ 60 for (i = (power_domains)->power_well_count - 1; \
64 i >= 0 && ((power_well) = &(power_domains)->power_wells[i]);\ 61 i >= 0 && ((power_well) = &(power_domains)->power_wells[i]);\
65 i--) \ 62 i--) \
66 if ((power_well)->domains & (domain_mask)) 63 for_each_if ((power_well)->domains & (domain_mask))
67 64
68bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv, 65bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv,
69 int power_well_id); 66 int power_well_id);
@@ -244,12 +241,6 @@ static void skl_power_well_post_enable(struct drm_i915_private *dev_priv,
244 gen8_irq_power_well_post_enable(dev_priv, 241 gen8_irq_power_well_post_enable(dev_priv,
245 1 << PIPE_C | 1 << PIPE_B); 242 1 << PIPE_C | 1 << PIPE_B);
246 } 243 }
247
248 if (power_well->data == SKL_DISP_PW_1) {
249 if (!dev_priv->power_domains.initializing)
250 intel_prepare_ddi(dev);
251 gen8_irq_power_well_post_enable(dev_priv, 1 << PIPE_A);
252 }
253} 244}
254 245
255static void hsw_set_power_well(struct drm_i915_private *dev_priv, 246static void hsw_set_power_well(struct drm_i915_private *dev_priv,
@@ -292,58 +283,38 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv,
292 BIT(POWER_DOMAIN_TRANSCODER_C) | \ 283 BIT(POWER_DOMAIN_TRANSCODER_C) | \
293 BIT(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 284 BIT(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
294 BIT(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 285 BIT(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
295 BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 286 BIT(POWER_DOMAIN_PORT_DDI_B_LANES) | \
296 BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 287 BIT(POWER_DOMAIN_PORT_DDI_C_LANES) | \
297 BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ 288 BIT(POWER_DOMAIN_PORT_DDI_D_LANES) | \
298 BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 289 BIT(POWER_DOMAIN_PORT_DDI_E_LANES) | \
299 BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \
300 BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \
301 BIT(POWER_DOMAIN_PORT_DDI_E_2_LANES) | \
302 BIT(POWER_DOMAIN_AUX_B) | \ 290 BIT(POWER_DOMAIN_AUX_B) | \
303 BIT(POWER_DOMAIN_AUX_C) | \ 291 BIT(POWER_DOMAIN_AUX_C) | \
304 BIT(POWER_DOMAIN_AUX_D) | \ 292 BIT(POWER_DOMAIN_AUX_D) | \
305 BIT(POWER_DOMAIN_AUDIO) | \ 293 BIT(POWER_DOMAIN_AUDIO) | \
306 BIT(POWER_DOMAIN_VGA) | \ 294 BIT(POWER_DOMAIN_VGA) | \
307 BIT(POWER_DOMAIN_INIT)) 295 BIT(POWER_DOMAIN_INIT))
308#define SKL_DISPLAY_POWERWELL_1_POWER_DOMAINS ( \
309 SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
310 BIT(POWER_DOMAIN_PLLS) | \
311 BIT(POWER_DOMAIN_PIPE_A) | \
312 BIT(POWER_DOMAIN_TRANSCODER_EDP) | \
313 BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
314 BIT(POWER_DOMAIN_PORT_DDI_A_2_LANES) | \
315 BIT(POWER_DOMAIN_PORT_DDI_A_4_LANES) | \
316 BIT(POWER_DOMAIN_AUX_A) | \
317 BIT(POWER_DOMAIN_INIT))
318#define SKL_DISPLAY_DDI_A_E_POWER_DOMAINS ( \ 296#define SKL_DISPLAY_DDI_A_E_POWER_DOMAINS ( \
319 BIT(POWER_DOMAIN_PORT_DDI_A_2_LANES) | \ 297 BIT(POWER_DOMAIN_PORT_DDI_A_LANES) | \
320 BIT(POWER_DOMAIN_PORT_DDI_A_4_LANES) | \ 298 BIT(POWER_DOMAIN_PORT_DDI_E_LANES) | \
321 BIT(POWER_DOMAIN_PORT_DDI_E_2_LANES) | \
322 BIT(POWER_DOMAIN_INIT)) 299 BIT(POWER_DOMAIN_INIT))
323#define SKL_DISPLAY_DDI_B_POWER_DOMAINS ( \ 300#define SKL_DISPLAY_DDI_B_POWER_DOMAINS ( \
324 BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 301 BIT(POWER_DOMAIN_PORT_DDI_B_LANES) | \
325 BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \
326 BIT(POWER_DOMAIN_INIT)) 302 BIT(POWER_DOMAIN_INIT))
327#define SKL_DISPLAY_DDI_C_POWER_DOMAINS ( \ 303#define SKL_DISPLAY_DDI_C_POWER_DOMAINS ( \
328 BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ 304 BIT(POWER_DOMAIN_PORT_DDI_C_LANES) | \
329 BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \
330 BIT(POWER_DOMAIN_INIT)) 305 BIT(POWER_DOMAIN_INIT))
331#define SKL_DISPLAY_DDI_D_POWER_DOMAINS ( \ 306#define SKL_DISPLAY_DDI_D_POWER_DOMAINS ( \
332 BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \ 307 BIT(POWER_DOMAIN_PORT_DDI_D_LANES) | \
333 BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \
334 BIT(POWER_DOMAIN_INIT)) 308 BIT(POWER_DOMAIN_INIT))
335#define SKL_DISPLAY_MISC_IO_POWER_DOMAINS ( \ 309#define SKL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
336 SKL_DISPLAY_POWERWELL_1_POWER_DOMAINS | \ 310 SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
337 BIT(POWER_DOMAIN_PLLS) | \ 311 BIT(POWER_DOMAIN_MODESET) | \
312 BIT(POWER_DOMAIN_AUX_A) | \
338 BIT(POWER_DOMAIN_INIT)) 313 BIT(POWER_DOMAIN_INIT))
339#define SKL_DISPLAY_ALWAYS_ON_POWER_DOMAINS ( \ 314#define SKL_DISPLAY_ALWAYS_ON_POWER_DOMAINS ( \
340 (POWER_DOMAIN_MASK & ~(SKL_DISPLAY_POWERWELL_1_POWER_DOMAINS | \ 315 (POWER_DOMAIN_MASK & ~( \
341 SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ 316 SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
342 SKL_DISPLAY_DDI_A_E_POWER_DOMAINS | \ 317 SKL_DISPLAY_DC_OFF_POWER_DOMAINS)) | \
343 SKL_DISPLAY_DDI_B_POWER_DOMAINS | \
344 SKL_DISPLAY_DDI_C_POWER_DOMAINS | \
345 SKL_DISPLAY_DDI_D_POWER_DOMAINS | \
346 SKL_DISPLAY_MISC_IO_POWER_DOMAINS)) | \
347 BIT(POWER_DOMAIN_INIT)) 318 BIT(POWER_DOMAIN_INIT))
348 319
349#define BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \ 320#define BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
@@ -354,10 +325,8 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv,
354 BIT(POWER_DOMAIN_TRANSCODER_C) | \ 325 BIT(POWER_DOMAIN_TRANSCODER_C) | \
355 BIT(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 326 BIT(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
356 BIT(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 327 BIT(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
357 BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 328 BIT(POWER_DOMAIN_PORT_DDI_B_LANES) | \
358 BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 329 BIT(POWER_DOMAIN_PORT_DDI_C_LANES) | \
359 BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \
360 BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \
361 BIT(POWER_DOMAIN_AUX_B) | \ 330 BIT(POWER_DOMAIN_AUX_B) | \
362 BIT(POWER_DOMAIN_AUX_C) | \ 331 BIT(POWER_DOMAIN_AUX_C) | \
363 BIT(POWER_DOMAIN_AUDIO) | \ 332 BIT(POWER_DOMAIN_AUDIO) | \
@@ -369,11 +338,15 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv,
369 BIT(POWER_DOMAIN_PIPE_A) | \ 338 BIT(POWER_DOMAIN_PIPE_A) | \
370 BIT(POWER_DOMAIN_TRANSCODER_EDP) | \ 339 BIT(POWER_DOMAIN_TRANSCODER_EDP) | \
371 BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \ 340 BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
372 BIT(POWER_DOMAIN_PORT_DDI_A_2_LANES) | \ 341 BIT(POWER_DOMAIN_PORT_DDI_A_LANES) | \
373 BIT(POWER_DOMAIN_PORT_DDI_A_4_LANES) | \
374 BIT(POWER_DOMAIN_AUX_A) | \ 342 BIT(POWER_DOMAIN_AUX_A) | \
375 BIT(POWER_DOMAIN_PLLS) | \ 343 BIT(POWER_DOMAIN_PLLS) | \
376 BIT(POWER_DOMAIN_INIT)) 344 BIT(POWER_DOMAIN_INIT))
345#define BXT_DISPLAY_DC_OFF_POWER_DOMAINS ( \
346 BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
347 BIT(POWER_DOMAIN_MODESET) | \
348 BIT(POWER_DOMAIN_AUX_A) | \
349 BIT(POWER_DOMAIN_INIT))
377#define BXT_DISPLAY_ALWAYS_ON_POWER_DOMAINS ( \ 350#define BXT_DISPLAY_ALWAYS_ON_POWER_DOMAINS ( \
378 (POWER_DOMAIN_MASK & ~(BXT_DISPLAY_POWERWELL_1_POWER_DOMAINS | \ 351 (POWER_DOMAIN_MASK & ~(BXT_DISPLAY_POWERWELL_1_POWER_DOMAINS | \
379 BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS)) | \ 352 BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS)) | \
@@ -417,46 +390,74 @@ static void assert_can_disable_dc9(struct drm_i915_private *dev_priv)
417 */ 390 */
418} 391}
419 392
420void bxt_enable_dc9(struct drm_i915_private *dev_priv) 393static void gen9_set_dc_state_debugmask_memory_up(
394 struct drm_i915_private *dev_priv)
421{ 395{
422 uint32_t val; 396 uint32_t val;
423 397
424 assert_can_enable_dc9(dev_priv); 398 /* The below bit doesn't need to be cleared ever afterwards */
399 val = I915_READ(DC_STATE_DEBUG);
400 if (!(val & DC_STATE_DEBUG_MASK_MEMORY_UP)) {
401 val |= DC_STATE_DEBUG_MASK_MEMORY_UP;
402 I915_WRITE(DC_STATE_DEBUG, val);
403 POSTING_READ(DC_STATE_DEBUG);
404 }
405}
425 406
426 DRM_DEBUG_KMS("Enabling DC9\n"); 407static void gen9_set_dc_state(struct drm_i915_private *dev_priv, uint32_t state)
408{
409 uint32_t val;
410 uint32_t mask;
411
412 mask = DC_STATE_EN_UPTO_DC5;
413 if (IS_BROXTON(dev_priv))
414 mask |= DC_STATE_EN_DC9;
415 else
416 mask |= DC_STATE_EN_UPTO_DC6;
417
418 WARN_ON_ONCE(state & ~mask);
419
420 if (i915.enable_dc == 0)
421 state = DC_STATE_DISABLE;
422 else if (i915.enable_dc == 1 && state > DC_STATE_EN_UPTO_DC5)
423 state = DC_STATE_EN_UPTO_DC5;
424
425 if (state & DC_STATE_EN_UPTO_DC5_DC6_MASK)
426 gen9_set_dc_state_debugmask_memory_up(dev_priv);
427 427
428 val = I915_READ(DC_STATE_EN); 428 val = I915_READ(DC_STATE_EN);
429 val |= DC_STATE_EN_DC9; 429 DRM_DEBUG_KMS("Setting DC state from %02x to %02x\n",
430 val & mask, state);
431 val &= ~mask;
432 val |= state;
430 I915_WRITE(DC_STATE_EN, val); 433 I915_WRITE(DC_STATE_EN, val);
431 POSTING_READ(DC_STATE_EN); 434 POSTING_READ(DC_STATE_EN);
432} 435}
433 436
434void bxt_disable_dc9(struct drm_i915_private *dev_priv) 437void bxt_enable_dc9(struct drm_i915_private *dev_priv)
435{ 438{
436 uint32_t val; 439 assert_can_enable_dc9(dev_priv);
440
441 DRM_DEBUG_KMS("Enabling DC9\n");
442
443 gen9_set_dc_state(dev_priv, DC_STATE_EN_DC9);
444}
437 445
446void bxt_disable_dc9(struct drm_i915_private *dev_priv)
447{
438 assert_can_disable_dc9(dev_priv); 448 assert_can_disable_dc9(dev_priv);
439 449
440 DRM_DEBUG_KMS("Disabling DC9\n"); 450 DRM_DEBUG_KMS("Disabling DC9\n");
441 451
442 val = I915_READ(DC_STATE_EN); 452 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
443 val &= ~DC_STATE_EN_DC9;
444 I915_WRITE(DC_STATE_EN, val);
445 POSTING_READ(DC_STATE_EN);
446} 453}
447 454
448static void gen9_set_dc_state_debugmask_memory_up( 455static void assert_csr_loaded(struct drm_i915_private *dev_priv)
449 struct drm_i915_private *dev_priv)
450{ 456{
451 uint32_t val; 457 WARN_ONCE(!I915_READ(CSR_PROGRAM(0)),
452 458 "CSR program storage start is NULL\n");
453 /* The below bit doesn't need to be cleared ever afterwards */ 459 WARN_ONCE(!I915_READ(CSR_SSP_BASE), "CSR SSP Base Not fine\n");
454 val = I915_READ(DC_STATE_DEBUG); 460 WARN_ONCE(!I915_READ(CSR_HTP_SKL), "CSR HTP Not fine\n");
455 if (!(val & DC_STATE_DEBUG_MASK_MEMORY_UP)) {
456 val |= DC_STATE_DEBUG_MASK_MEMORY_UP;
457 I915_WRITE(DC_STATE_DEBUG, val);
458 POSTING_READ(DC_STATE_DEBUG);
459 }
460} 461}
461 462
462static void assert_can_enable_dc5(struct drm_i915_private *dev_priv) 463static void assert_can_enable_dc5(struct drm_i915_private *dev_priv)
@@ -479,8 +480,6 @@ static void assert_can_enable_dc5(struct drm_i915_private *dev_priv)
479 480
480static void assert_can_disable_dc5(struct drm_i915_private *dev_priv) 481static void assert_can_disable_dc5(struct drm_i915_private *dev_priv)
481{ 482{
482 bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv,
483 SKL_DISP_PW_2);
484 /* 483 /*
485 * During initialization, the firmware may not be loaded yet. 484 * During initialization, the firmware may not be loaded yet.
486 * We still want to make sure that the DC enabling flag is cleared. 485 * We still want to make sure that the DC enabling flag is cleared.
@@ -488,40 +487,17 @@ static void assert_can_disable_dc5(struct drm_i915_private *dev_priv)
488 if (dev_priv->power_domains.initializing) 487 if (dev_priv->power_domains.initializing)
489 return; 488 return;
490 489
491 WARN_ONCE(!pg2_enabled, "PG2 not enabled to disable DC5.\n");
492 WARN_ONCE(dev_priv->pm.suspended, 490 WARN_ONCE(dev_priv->pm.suspended,
493 "Disabling of DC5 while platform is runtime-suspended should never happen.\n"); 491 "Disabling of DC5 while platform is runtime-suspended should never happen.\n");
494} 492}
495 493
496static void gen9_enable_dc5(struct drm_i915_private *dev_priv) 494static void gen9_enable_dc5(struct drm_i915_private *dev_priv)
497{ 495{
498 uint32_t val;
499
500 assert_can_enable_dc5(dev_priv); 496 assert_can_enable_dc5(dev_priv);
501 497
502 DRM_DEBUG_KMS("Enabling DC5\n"); 498 DRM_DEBUG_KMS("Enabling DC5\n");
503 499
504 gen9_set_dc_state_debugmask_memory_up(dev_priv); 500 gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC5);
505
506 val = I915_READ(DC_STATE_EN);
507 val &= ~DC_STATE_EN_UPTO_DC5_DC6_MASK;
508 val |= DC_STATE_EN_UPTO_DC5;
509 I915_WRITE(DC_STATE_EN, val);
510 POSTING_READ(DC_STATE_EN);
511}
512
513static void gen9_disable_dc5(struct drm_i915_private *dev_priv)
514{
515 uint32_t val;
516
517 assert_can_disable_dc5(dev_priv);
518
519 DRM_DEBUG_KMS("Disabling DC5\n");
520
521 val = I915_READ(DC_STATE_EN);
522 val &= ~DC_STATE_EN_UPTO_DC5;
523 I915_WRITE(DC_STATE_EN, val);
524 POSTING_READ(DC_STATE_EN);
525} 501}
526 502
527static void assert_can_enable_dc6(struct drm_i915_private *dev_priv) 503static void assert_can_enable_dc6(struct drm_i915_private *dev_priv)
@@ -547,40 +523,37 @@ static void assert_can_disable_dc6(struct drm_i915_private *dev_priv)
547 if (dev_priv->power_domains.initializing) 523 if (dev_priv->power_domains.initializing)
548 return; 524 return;
549 525
550 assert_csr_loaded(dev_priv);
551 WARN_ONCE(!(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC6), 526 WARN_ONCE(!(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC6),
552 "DC6 already programmed to be disabled.\n"); 527 "DC6 already programmed to be disabled.\n");
553} 528}
554 529
555static void skl_enable_dc6(struct drm_i915_private *dev_priv) 530static void gen9_disable_dc5_dc6(struct drm_i915_private *dev_priv)
556{ 531{
557 uint32_t val; 532 assert_can_disable_dc5(dev_priv);
533
534 if (IS_SKYLAKE(dev_priv) && i915.enable_dc != 0 && i915.enable_dc != 1)
535 assert_can_disable_dc6(dev_priv);
558 536
537 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
538}
539
540void skl_enable_dc6(struct drm_i915_private *dev_priv)
541{
559 assert_can_enable_dc6(dev_priv); 542 assert_can_enable_dc6(dev_priv);
560 543
561 DRM_DEBUG_KMS("Enabling DC6\n"); 544 DRM_DEBUG_KMS("Enabling DC6\n");
562 545
563 gen9_set_dc_state_debugmask_memory_up(dev_priv); 546 gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC6);
564 547
565 val = I915_READ(DC_STATE_EN);
566 val &= ~DC_STATE_EN_UPTO_DC5_DC6_MASK;
567 val |= DC_STATE_EN_UPTO_DC6;
568 I915_WRITE(DC_STATE_EN, val);
569 POSTING_READ(DC_STATE_EN);
570} 548}
571 549
572static void skl_disable_dc6(struct drm_i915_private *dev_priv) 550void skl_disable_dc6(struct drm_i915_private *dev_priv)
573{ 551{
574 uint32_t val;
575
576 assert_can_disable_dc6(dev_priv); 552 assert_can_disable_dc6(dev_priv);
577 553
578 DRM_DEBUG_KMS("Disabling DC6\n"); 554 DRM_DEBUG_KMS("Disabling DC6\n");
579 555
580 val = I915_READ(DC_STATE_EN); 556 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
581 val &= ~DC_STATE_EN_UPTO_DC6;
582 I915_WRITE(DC_STATE_EN, val);
583 POSTING_READ(DC_STATE_EN);
584} 557}
585 558
586static void skl_set_power_well(struct drm_i915_private *dev_priv, 559static void skl_set_power_well(struct drm_i915_private *dev_priv,
@@ -630,20 +603,16 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
630 !I915_READ(HSW_PWR_WELL_BIOS), 603 !I915_READ(HSW_PWR_WELL_BIOS),
631 "Invalid for power well status to be enabled, unless done by the BIOS, \ 604 "Invalid for power well status to be enabled, unless done by the BIOS, \
632 when request is to disable!\n"); 605 when request is to disable!\n");
633 if ((GEN9_ENABLE_DC5(dev) || SKL_ENABLE_DC6(dev)) && 606 if (power_well->data == SKL_DISP_PW_2) {
634 power_well->data == SKL_DISP_PW_2) { 607 /*
635 if (SKL_ENABLE_DC6(dev)) { 608 * DDI buffer programming unnecessary during
636 skl_disable_dc6(dev_priv); 609 * driver-load/resume as it's already done
637 /* 610 * during modeset initialization then. It's
638 * DDI buffer programming unnecessary during driver-load/resume 611 * also invalid here as encoder list is still
639 * as it's already done during modeset initialization then. 612 * uninitialized.
640 * It's also invalid here as encoder list is still uninitialized. 613 */
641 */ 614 if (!dev_priv->power_domains.initializing)
642 if (!dev_priv->power_domains.initializing) 615 intel_prepare_ddi(dev);
643 intel_prepare_ddi(dev);
644 } else {
645 gen9_disable_dc5(dev_priv);
646 }
647 } 616 }
648 I915_WRITE(HSW_PWR_WELL_DRIVER, tmp | req_mask); 617 I915_WRITE(HSW_PWR_WELL_DRIVER, tmp | req_mask);
649 } 618 }
@@ -658,34 +627,9 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
658 } 627 }
659 } else { 628 } else {
660 if (enable_requested) { 629 if (enable_requested) {
661 if (IS_SKYLAKE(dev) && 630 I915_WRITE(HSW_PWR_WELL_DRIVER, tmp & ~req_mask);
662 (power_well->data == SKL_DISP_PW_1) && 631 POSTING_READ(HSW_PWR_WELL_DRIVER);
663 (intel_csr_load_status_get(dev_priv) == FW_LOADED)) 632 DRM_DEBUG_KMS("Disabling %s\n", power_well->name);
664 DRM_DEBUG_KMS("Not Disabling PW1, dmc will handle\n");
665 else {
666 I915_WRITE(HSW_PWR_WELL_DRIVER, tmp & ~req_mask);
667 POSTING_READ(HSW_PWR_WELL_DRIVER);
668 DRM_DEBUG_KMS("Disabling %s\n", power_well->name);
669 }
670
671 if ((GEN9_ENABLE_DC5(dev) || SKL_ENABLE_DC6(dev)) &&
672 power_well->data == SKL_DISP_PW_2) {
673 enum csr_state state;
674 /* TODO: wait for a completion event or
675 * similar here instead of busy
676 * waiting using wait_for function.
677 */
678 wait_for((state = intel_csr_load_status_get(dev_priv)) !=
679 FW_UNINITIALIZED, 1000);
680 if (state != FW_LOADED)
681 DRM_DEBUG("CSR firmware not ready (%d)\n",
682 state);
683 else
684 if (SKL_ENABLE_DC6(dev))
685 skl_enable_dc6(dev_priv);
686 else
687 gen9_enable_dc5(dev_priv);
688 }
689 } 633 }
690 } 634 }
691 635
@@ -760,6 +704,41 @@ static void skl_power_well_disable(struct drm_i915_private *dev_priv,
760 skl_set_power_well(dev_priv, power_well, false); 704 skl_set_power_well(dev_priv, power_well, false);
761} 705}
762 706
707static bool gen9_dc_off_power_well_enabled(struct drm_i915_private *dev_priv,
708 struct i915_power_well *power_well)
709{
710 return (I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC5_DC6_MASK) == 0;
711}
712
713static void gen9_dc_off_power_well_enable(struct drm_i915_private *dev_priv,
714 struct i915_power_well *power_well)
715{
716 gen9_disable_dc5_dc6(dev_priv);
717}
718
719static void gen9_dc_off_power_well_disable(struct drm_i915_private *dev_priv,
720 struct i915_power_well *power_well)
721{
722 if (IS_SKYLAKE(dev_priv) && i915.enable_dc != 0 && i915.enable_dc != 1)
723 skl_enable_dc6(dev_priv);
724 else
725 gen9_enable_dc5(dev_priv);
726}
727
728static void gen9_dc_off_power_well_sync_hw(struct drm_i915_private *dev_priv,
729 struct i915_power_well *power_well)
730{
731 if (power_well->count > 0) {
732 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
733 } else {
734 if (IS_SKYLAKE(dev_priv) && i915.enable_dc != 0 &&
735 i915.enable_dc != 1)
736 gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC6);
737 else
738 gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC5);
739 }
740}
741
763static void i9xx_always_on_power_well_noop(struct drm_i915_private *dev_priv, 742static void i9xx_always_on_power_well_noop(struct drm_i915_private *dev_priv,
764 struct i915_power_well *power_well) 743 struct i915_power_well *power_well)
765{ 744{
@@ -974,10 +953,12 @@ static struct i915_power_well *lookup_power_well(struct drm_i915_private *dev_pr
974 int power_well_id) 953 int power_well_id)
975{ 954{
976 struct i915_power_domains *power_domains = &dev_priv->power_domains; 955 struct i915_power_domains *power_domains = &dev_priv->power_domains;
977 struct i915_power_well *power_well;
978 int i; 956 int i;
979 957
980 for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains) { 958 for (i = 0; i < power_domains->power_well_count; i++) {
959 struct i915_power_well *power_well;
960
961 power_well = &power_domains->power_wells[i];
981 if (power_well->data == power_well_id) 962 if (power_well->data == power_well_id)
982 return power_well; 963 return power_well;
983 } 964 }
@@ -1458,7 +1439,7 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
1458 for_each_power_well_rev(i, power_well, BIT(domain), power_domains) { 1439 for_each_power_well_rev(i, power_well, BIT(domain), power_domains) {
1459 WARN_ON(!power_well->count); 1440 WARN_ON(!power_well->count);
1460 1441
1461 if (!--power_well->count && i915.disable_power_well) 1442 if (!--power_well->count)
1462 intel_power_well_disable(dev_priv, power_well); 1443 intel_power_well_disable(dev_priv, power_well);
1463 } 1444 }
1464 1445
@@ -1470,14 +1451,10 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
1470#define HSW_ALWAYS_ON_POWER_DOMAINS ( \ 1451#define HSW_ALWAYS_ON_POWER_DOMAINS ( \
1471 BIT(POWER_DOMAIN_PIPE_A) | \ 1452 BIT(POWER_DOMAIN_PIPE_A) | \
1472 BIT(POWER_DOMAIN_TRANSCODER_EDP) | \ 1453 BIT(POWER_DOMAIN_TRANSCODER_EDP) | \
1473 BIT(POWER_DOMAIN_PORT_DDI_A_2_LANES) | \ 1454 BIT(POWER_DOMAIN_PORT_DDI_A_LANES) | \
1474 BIT(POWER_DOMAIN_PORT_DDI_A_4_LANES) | \ 1455 BIT(POWER_DOMAIN_PORT_DDI_B_LANES) | \
1475 BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 1456 BIT(POWER_DOMAIN_PORT_DDI_C_LANES) | \
1476 BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 1457 BIT(POWER_DOMAIN_PORT_DDI_D_LANES) | \
1477 BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \
1478 BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \
1479 BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \
1480 BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \
1481 BIT(POWER_DOMAIN_PORT_CRT) | \ 1458 BIT(POWER_DOMAIN_PORT_CRT) | \
1482 BIT(POWER_DOMAIN_PLLS) | \ 1459 BIT(POWER_DOMAIN_PLLS) | \
1483 BIT(POWER_DOMAIN_AUX_A) | \ 1460 BIT(POWER_DOMAIN_AUX_A) | \
@@ -1501,49 +1478,42 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
1501#define VLV_DISPLAY_POWER_DOMAINS POWER_DOMAIN_MASK 1478#define VLV_DISPLAY_POWER_DOMAINS POWER_DOMAIN_MASK
1502 1479
1503#define VLV_DPIO_CMN_BC_POWER_DOMAINS ( \ 1480#define VLV_DPIO_CMN_BC_POWER_DOMAINS ( \
1504 BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 1481 BIT(POWER_DOMAIN_PORT_DDI_B_LANES) | \
1505 BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 1482 BIT(POWER_DOMAIN_PORT_DDI_C_LANES) | \
1506 BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \
1507 BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \
1508 BIT(POWER_DOMAIN_PORT_CRT) | \ 1483 BIT(POWER_DOMAIN_PORT_CRT) | \
1509 BIT(POWER_DOMAIN_AUX_B) | \ 1484 BIT(POWER_DOMAIN_AUX_B) | \
1510 BIT(POWER_DOMAIN_AUX_C) | \ 1485 BIT(POWER_DOMAIN_AUX_C) | \
1511 BIT(POWER_DOMAIN_INIT)) 1486 BIT(POWER_DOMAIN_INIT))
1512 1487
1513#define VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS ( \ 1488#define VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS ( \
1514 BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 1489 BIT(POWER_DOMAIN_PORT_DDI_B_LANES) | \
1515 BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \
1516 BIT(POWER_DOMAIN_AUX_B) | \ 1490 BIT(POWER_DOMAIN_AUX_B) | \
1517 BIT(POWER_DOMAIN_INIT)) 1491 BIT(POWER_DOMAIN_INIT))
1518 1492
1519#define VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS ( \ 1493#define VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS ( \
1520 BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 1494 BIT(POWER_DOMAIN_PORT_DDI_B_LANES) | \
1521 BIT(POWER_DOMAIN_AUX_B) | \ 1495 BIT(POWER_DOMAIN_AUX_B) | \
1522 BIT(POWER_DOMAIN_INIT)) 1496 BIT(POWER_DOMAIN_INIT))
1523 1497
1524#define VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS ( \ 1498#define VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS ( \
1525 BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ 1499 BIT(POWER_DOMAIN_PORT_DDI_C_LANES) | \
1526 BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \
1527 BIT(POWER_DOMAIN_AUX_C) | \ 1500 BIT(POWER_DOMAIN_AUX_C) | \
1528 BIT(POWER_DOMAIN_INIT)) 1501 BIT(POWER_DOMAIN_INIT))
1529 1502
1530#define VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS ( \ 1503#define VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS ( \
1531 BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ 1504 BIT(POWER_DOMAIN_PORT_DDI_C_LANES) | \
1532 BIT(POWER_DOMAIN_AUX_C) | \ 1505 BIT(POWER_DOMAIN_AUX_C) | \
1533 BIT(POWER_DOMAIN_INIT)) 1506 BIT(POWER_DOMAIN_INIT))
1534 1507
1535#define CHV_DPIO_CMN_BC_POWER_DOMAINS ( \ 1508#define CHV_DPIO_CMN_BC_POWER_DOMAINS ( \
1536 BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ 1509 BIT(POWER_DOMAIN_PORT_DDI_B_LANES) | \
1537 BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ 1510 BIT(POWER_DOMAIN_PORT_DDI_C_LANES) | \
1538 BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \
1539 BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \
1540 BIT(POWER_DOMAIN_AUX_B) | \ 1511 BIT(POWER_DOMAIN_AUX_B) | \
1541 BIT(POWER_DOMAIN_AUX_C) | \ 1512 BIT(POWER_DOMAIN_AUX_C) | \
1542 BIT(POWER_DOMAIN_INIT)) 1513 BIT(POWER_DOMAIN_INIT))
1543 1514
1544#define CHV_DPIO_CMN_D_POWER_DOMAINS ( \ 1515#define CHV_DPIO_CMN_D_POWER_DOMAINS ( \
1545 BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \ 1516 BIT(POWER_DOMAIN_PORT_DDI_D_LANES) | \
1546 BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \
1547 BIT(POWER_DOMAIN_AUX_D) | \ 1517 BIT(POWER_DOMAIN_AUX_D) | \
1548 BIT(POWER_DOMAIN_INIT)) 1518 BIT(POWER_DOMAIN_INIT))
1549 1519
@@ -1591,6 +1561,13 @@ static const struct i915_power_well_ops skl_power_well_ops = {
1591 .is_enabled = skl_power_well_enabled, 1561 .is_enabled = skl_power_well_enabled,
1592}; 1562};
1593 1563
1564static const struct i915_power_well_ops gen9_dc_off_power_well_ops = {
1565 .sync_hw = gen9_dc_off_power_well_sync_hw,
1566 .enable = gen9_dc_off_power_well_enable,
1567 .disable = gen9_dc_off_power_well_disable,
1568 .is_enabled = gen9_dc_off_power_well_enabled,
1569};
1570
1594static struct i915_power_well hsw_power_wells[] = { 1571static struct i915_power_well hsw_power_wells[] = {
1595 { 1572 {
1596 .name = "always-on", 1573 .name = "always-on",
@@ -1646,6 +1623,7 @@ static struct i915_power_well vlv_power_wells[] = {
1646 .always_on = 1, 1623 .always_on = 1,
1647 .domains = VLV_ALWAYS_ON_POWER_DOMAINS, 1624 .domains = VLV_ALWAYS_ON_POWER_DOMAINS,
1648 .ops = &i9xx_always_on_power_well_ops, 1625 .ops = &i9xx_always_on_power_well_ops,
1626 .data = PUNIT_POWER_WELL_ALWAYS_ON,
1649 }, 1627 },
1650 { 1628 {
1651 .name = "display", 1629 .name = "display",
@@ -1747,20 +1725,29 @@ static struct i915_power_well skl_power_wells[] = {
1747 .always_on = 1, 1725 .always_on = 1,
1748 .domains = SKL_DISPLAY_ALWAYS_ON_POWER_DOMAINS, 1726 .domains = SKL_DISPLAY_ALWAYS_ON_POWER_DOMAINS,
1749 .ops = &i9xx_always_on_power_well_ops, 1727 .ops = &i9xx_always_on_power_well_ops,
1728 .data = SKL_DISP_PW_ALWAYS_ON,
1750 }, 1729 },
1751 { 1730 {
1752 .name = "power well 1", 1731 .name = "power well 1",
1753 .domains = SKL_DISPLAY_POWERWELL_1_POWER_DOMAINS, 1732 /* Handled by the DMC firmware */
1733 .domains = 0,
1754 .ops = &skl_power_well_ops, 1734 .ops = &skl_power_well_ops,
1755 .data = SKL_DISP_PW_1, 1735 .data = SKL_DISP_PW_1,
1756 }, 1736 },
1757 { 1737 {
1758 .name = "MISC IO power well", 1738 .name = "MISC IO power well",
1759 .domains = SKL_DISPLAY_MISC_IO_POWER_DOMAINS, 1739 /* Handled by the DMC firmware */
1740 .domains = 0,
1760 .ops = &skl_power_well_ops, 1741 .ops = &skl_power_well_ops,
1761 .data = SKL_DISP_PW_MISC_IO, 1742 .data = SKL_DISP_PW_MISC_IO,
1762 }, 1743 },
1763 { 1744 {
1745 .name = "DC off",
1746 .domains = SKL_DISPLAY_DC_OFF_POWER_DOMAINS,
1747 .ops = &gen9_dc_off_power_well_ops,
1748 .data = SKL_DISP_PW_DC_OFF,
1749 },
1750 {
1764 .name = "power well 2", 1751 .name = "power well 2",
1765 .domains = SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS, 1752 .domains = SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS,
1766 .ops = &skl_power_well_ops, 1753 .ops = &skl_power_well_ops,
@@ -1792,6 +1779,34 @@ static struct i915_power_well skl_power_wells[] = {
1792 }, 1779 },
1793}; 1780};
1794 1781
1782void skl_pw1_misc_io_init(struct drm_i915_private *dev_priv)
1783{
1784 struct i915_power_well *well;
1785
1786 if (!IS_SKYLAKE(dev_priv))
1787 return;
1788
1789 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
1790 intel_power_well_enable(dev_priv, well);
1791
1792 well = lookup_power_well(dev_priv, SKL_DISP_PW_MISC_IO);
1793 intel_power_well_enable(dev_priv, well);
1794}
1795
1796void skl_pw1_misc_io_fini(struct drm_i915_private *dev_priv)
1797{
1798 struct i915_power_well *well;
1799
1800 if (!IS_SKYLAKE(dev_priv))
1801 return;
1802
1803 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
1804 intel_power_well_disable(dev_priv, well);
1805
1806 well = lookup_power_well(dev_priv, SKL_DISP_PW_MISC_IO);
1807 intel_power_well_disable(dev_priv, well);
1808}
1809
1795static struct i915_power_well bxt_power_wells[] = { 1810static struct i915_power_well bxt_power_wells[] = {
1796 { 1811 {
1797 .name = "always-on", 1812 .name = "always-on",
@@ -1806,11 +1821,17 @@ static struct i915_power_well bxt_power_wells[] = {
1806 .data = SKL_DISP_PW_1, 1821 .data = SKL_DISP_PW_1,
1807 }, 1822 },
1808 { 1823 {
1824 .name = "DC off",
1825 .domains = BXT_DISPLAY_DC_OFF_POWER_DOMAINS,
1826 .ops = &gen9_dc_off_power_well_ops,
1827 .data = SKL_DISP_PW_DC_OFF,
1828 },
1829 {
1809 .name = "power well 2", 1830 .name = "power well 2",
1810 .domains = BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS, 1831 .domains = BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS,
1811 .ops = &skl_power_well_ops, 1832 .ops = &skl_power_well_ops,
1812 .data = SKL_DISP_PW_2, 1833 .data = SKL_DISP_PW_2,
1813 } 1834 },
1814}; 1835};
1815 1836
1816static int 1837static int
@@ -1859,7 +1880,7 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)
1859 set_power_wells(power_domains, hsw_power_wells); 1880 set_power_wells(power_domains, hsw_power_wells);
1860 } else if (IS_BROADWELL(dev_priv->dev)) { 1881 } else if (IS_BROADWELL(dev_priv->dev)) {
1861 set_power_wells(power_domains, bdw_power_wells); 1882 set_power_wells(power_domains, bdw_power_wells);
1862 } else if (IS_SKYLAKE(dev_priv->dev)) { 1883 } else if (IS_SKYLAKE(dev_priv->dev) || IS_KABYLAKE(dev_priv->dev)) {
1863 set_power_wells(power_domains, skl_power_wells); 1884 set_power_wells(power_domains, skl_power_wells);
1864 } else if (IS_BROXTON(dev_priv->dev)) { 1885 } else if (IS_BROXTON(dev_priv->dev)) {
1865 set_power_wells(power_domains, bxt_power_wells); 1886 set_power_wells(power_domains, bxt_power_wells);
@@ -1874,21 +1895,6 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)
1874 return 0; 1895 return 0;
1875} 1896}
1876 1897
1877static void intel_runtime_pm_disable(struct drm_i915_private *dev_priv)
1878{
1879 struct drm_device *dev = dev_priv->dev;
1880 struct device *device = &dev->pdev->dev;
1881
1882 if (!HAS_RUNTIME_PM(dev))
1883 return;
1884
1885 if (!intel_enable_rc6(dev))
1886 return;
1887
1888 /* Make sure we're not suspended first. */
1889 pm_runtime_get_sync(device);
1890}
1891
1892/** 1898/**
1893 * intel_power_domains_fini - finalizes the power domain structures 1899 * intel_power_domains_fini - finalizes the power domain structures
1894 * @dev_priv: i915 device instance 1900 * @dev_priv: i915 device instance
@@ -1899,15 +1905,17 @@ static void intel_runtime_pm_disable(struct drm_i915_private *dev_priv)
1899 */ 1905 */
1900void intel_power_domains_fini(struct drm_i915_private *dev_priv) 1906void intel_power_domains_fini(struct drm_i915_private *dev_priv)
1901{ 1907{
1902 intel_runtime_pm_disable(dev_priv);
1903
1904 /* The i915.ko module is still not prepared to be loaded when 1908 /* The i915.ko module is still not prepared to be loaded when
1905 * the power well is not enabled, so just enable it in case 1909 * the power well is not enabled, so just enable it in case
1906 * we're going to unload/reload. */ 1910 * we're going to unload/reload. */
1907 intel_display_set_init_power(dev_priv, true); 1911 intel_display_set_init_power(dev_priv, true);
1912
1913 /* Remove the refcount we took to keep power well support disabled. */
1914 if (!i915.disable_power_well)
1915 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
1908} 1916}
1909 1917
1910static void intel_power_domains_resume(struct drm_i915_private *dev_priv) 1918static void intel_power_domains_sync_hw(struct drm_i915_private *dev_priv)
1911{ 1919{
1912 struct i915_power_domains *power_domains = &dev_priv->power_domains; 1920 struct i915_power_domains *power_domains = &dev_priv->power_domains;
1913 struct i915_power_well *power_well; 1921 struct i915_power_well *power_well;
@@ -1922,6 +1930,47 @@ static void intel_power_domains_resume(struct drm_i915_private *dev_priv)
1922 mutex_unlock(&power_domains->lock); 1930 mutex_unlock(&power_domains->lock);
1923} 1931}
1924 1932
1933static void skl_display_core_init(struct drm_i915_private *dev_priv,
1934 bool resume)
1935{
1936 struct i915_power_domains *power_domains = &dev_priv->power_domains;
1937 uint32_t val;
1938
1939 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
1940
1941 /* enable PCH reset handshake */
1942 val = I915_READ(HSW_NDE_RSTWRN_OPT);
1943 I915_WRITE(HSW_NDE_RSTWRN_OPT, val | RESET_PCH_HANDSHAKE_ENABLE);
1944
1945 /* enable PG1 and Misc I/O */
1946 mutex_lock(&power_domains->lock);
1947 skl_pw1_misc_io_init(dev_priv);
1948 mutex_unlock(&power_domains->lock);
1949
1950 if (!resume)
1951 return;
1952
1953 skl_init_cdclk(dev_priv);
1954
1955 if (dev_priv->csr.dmc_payload)
1956 intel_csr_load_program(dev_priv);
1957}
1958
1959static void skl_display_core_uninit(struct drm_i915_private *dev_priv)
1960{
1961 struct i915_power_domains *power_domains = &dev_priv->power_domains;
1962
1963 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
1964
1965 skl_uninit_cdclk(dev_priv);
1966
1967 /* The spec doesn't call for removing the reset handshake flag */
1968 /* disable PG1 and Misc I/O */
1969 mutex_lock(&power_domains->lock);
1970 skl_pw1_misc_io_fini(dev_priv);
1971 mutex_unlock(&power_domains->lock);
1972}
1973
1925static void chv_phy_control_init(struct drm_i915_private *dev_priv) 1974static void chv_phy_control_init(struct drm_i915_private *dev_priv)
1926{ 1975{
1927 struct i915_power_well *cmn_bc = 1976 struct i915_power_well *cmn_bc =
@@ -2044,14 +2093,16 @@ static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv)
2044 * This function initializes the hardware power domain state and enables all 2093 * This function initializes the hardware power domain state and enables all
2045 * power domains using intel_display_set_init_power(). 2094 * power domains using intel_display_set_init_power().
2046 */ 2095 */
2047void intel_power_domains_init_hw(struct drm_i915_private *dev_priv) 2096void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume)
2048{ 2097{
2049 struct drm_device *dev = dev_priv->dev; 2098 struct drm_device *dev = dev_priv->dev;
2050 struct i915_power_domains *power_domains = &dev_priv->power_domains; 2099 struct i915_power_domains *power_domains = &dev_priv->power_domains;
2051 2100
2052 power_domains->initializing = true; 2101 power_domains->initializing = true;
2053 2102
2054 if (IS_CHERRYVIEW(dev)) { 2103 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
2104 skl_display_core_init(dev_priv, resume);
2105 } else if (IS_CHERRYVIEW(dev)) {
2055 mutex_lock(&power_domains->lock); 2106 mutex_lock(&power_domains->lock);
2056 chv_phy_control_init(dev_priv); 2107 chv_phy_control_init(dev_priv);
2057 mutex_unlock(&power_domains->lock); 2108 mutex_unlock(&power_domains->lock);
@@ -2063,11 +2114,34 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv)
2063 2114
2064 /* For now, we need the power well to be always enabled. */ 2115 /* For now, we need the power well to be always enabled. */
2065 intel_display_set_init_power(dev_priv, true); 2116 intel_display_set_init_power(dev_priv, true);
2066 intel_power_domains_resume(dev_priv); 2117 /* Disable power support if the user asked so. */
2118 if (!i915.disable_power_well)
2119 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
2120 intel_power_domains_sync_hw(dev_priv);
2067 power_domains->initializing = false; 2121 power_domains->initializing = false;
2068} 2122}
2069 2123
2070/** 2124/**
2125 * intel_power_domains_suspend - suspend power domain state
2126 * @dev_priv: i915 device instance
2127 *
2128 * This function prepares the hardware power domain state before entering
2129 * system suspend. It must be paired with intel_power_domains_init_hw().
2130 */
2131void intel_power_domains_suspend(struct drm_i915_private *dev_priv)
2132{
2133 if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
2134 skl_display_core_uninit(dev_priv);
2135
2136 /*
2137 * Even if power well support was disabled we still want to disable
2138 * power wells while we are system suspended.
2139 */
2140 if (!i915.disable_power_well)
2141 intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
2142}
2143
2144/**
2071 * intel_runtime_pm_get - grab a runtime pm reference 2145 * intel_runtime_pm_get - grab a runtime pm reference
2072 * @dev_priv: i915 device instance 2146 * @dev_priv: i915 device instance
2073 * 2147 *
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index c42b636c2087..06679f164b3e 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -74,7 +74,7 @@ struct intel_sdvo {
74 struct i2c_adapter ddc; 74 struct i2c_adapter ddc;
75 75
76 /* Register for the SDVO device: SDVOB or SDVOC */ 76 /* Register for the SDVO device: SDVOB or SDVOC */
77 uint32_t sdvo_reg; 77 i915_reg_t sdvo_reg;
78 78
79 /* Active outputs controlled by this SDVO output */ 79 /* Active outputs controlled by this SDVO output */
80 uint16_t controlled_output; 80 uint16_t controlled_output;
@@ -120,8 +120,7 @@ struct intel_sdvo {
120 */ 120 */
121 bool is_tv; 121 bool is_tv;
122 122
123 /* On different gens SDVOB is at different places. */ 123 enum port port;
124 bool is_sdvob;
125 124
126 /* This is for current tv format name */ 125 /* This is for current tv format name */
127 int tv_format_index; 126 int tv_format_index;
@@ -245,7 +244,7 @@ static void intel_sdvo_write_sdvox(struct intel_sdvo *intel_sdvo, u32 val)
245 u32 bval = val, cval = val; 244 u32 bval = val, cval = val;
246 int i; 245 int i;
247 246
248 if (intel_sdvo->sdvo_reg == PCH_SDVOB) { 247 if (HAS_PCH_SPLIT(dev_priv)) {
249 I915_WRITE(intel_sdvo->sdvo_reg, val); 248 I915_WRITE(intel_sdvo->sdvo_reg, val);
250 POSTING_READ(intel_sdvo->sdvo_reg); 249 POSTING_READ(intel_sdvo->sdvo_reg);
251 /* 250 /*
@@ -259,7 +258,7 @@ static void intel_sdvo_write_sdvox(struct intel_sdvo *intel_sdvo, u32 val)
259 return; 258 return;
260 } 259 }
261 260
262 if (intel_sdvo->sdvo_reg == GEN3_SDVOB) 261 if (intel_sdvo->port == PORT_B)
263 cval = I915_READ(GEN3_SDVOC); 262 cval = I915_READ(GEN3_SDVOC);
264 else 263 else
265 bval = I915_READ(GEN3_SDVOB); 264 bval = I915_READ(GEN3_SDVOB);
@@ -422,7 +421,7 @@ static const struct _sdvo_cmd_name {
422 SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_DATA), 421 SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_DATA),
423}; 422};
424 423
425#define SDVO_NAME(svdo) ((svdo)->is_sdvob ? "SDVOB" : "SDVOC") 424#define SDVO_NAME(svdo) ((svdo)->port == PORT_B ? "SDVOB" : "SDVOC")
426 425
427static void intel_sdvo_debug_write(struct intel_sdvo *intel_sdvo, u8 cmd, 426static void intel_sdvo_debug_write(struct intel_sdvo *intel_sdvo, u8 cmd,
428 const void *args, int args_len) 427 const void *args, int args_len)
@@ -1282,14 +1281,10 @@ static void intel_sdvo_pre_enable(struct intel_encoder *intel_encoder)
1282 sdvox |= SDVO_BORDER_ENABLE; 1281 sdvox |= SDVO_BORDER_ENABLE;
1283 } else { 1282 } else {
1284 sdvox = I915_READ(intel_sdvo->sdvo_reg); 1283 sdvox = I915_READ(intel_sdvo->sdvo_reg);
1285 switch (intel_sdvo->sdvo_reg) { 1284 if (intel_sdvo->port == PORT_B)
1286 case GEN3_SDVOB:
1287 sdvox &= SDVOB_PRESERVE_MASK; 1285 sdvox &= SDVOB_PRESERVE_MASK;
1288 break; 1286 else
1289 case GEN3_SDVOC:
1290 sdvox &= SDVOC_PRESERVE_MASK; 1287 sdvox &= SDVOC_PRESERVE_MASK;
1291 break;
1292 }
1293 sdvox |= (9 << 19) | SDVO_BORDER_ENABLE; 1288 sdvox |= (9 << 19) | SDVO_BORDER_ENABLE;
1294 } 1289 }
1295 1290
@@ -1464,12 +1459,23 @@ static void intel_disable_sdvo(struct intel_encoder *encoder)
1464 * matching DP port to be enabled on transcoder A. 1459 * matching DP port to be enabled on transcoder A.
1465 */ 1460 */
1466 if (HAS_PCH_IBX(dev_priv) && crtc->pipe == PIPE_B) { 1461 if (HAS_PCH_IBX(dev_priv) && crtc->pipe == PIPE_B) {
1462 /*
1463 * We get CPU/PCH FIFO underruns on the other pipe when
1464 * doing the workaround. Sweep them under the rug.
1465 */
1466 intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, false);
1467 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);
1468
1467 temp &= ~SDVO_PIPE_B_SELECT; 1469 temp &= ~SDVO_PIPE_B_SELECT;
1468 temp |= SDVO_ENABLE; 1470 temp |= SDVO_ENABLE;
1469 intel_sdvo_write_sdvox(intel_sdvo, temp); 1471 intel_sdvo_write_sdvox(intel_sdvo, temp);
1470 1472
1471 temp &= ~SDVO_ENABLE; 1473 temp &= ~SDVO_ENABLE;
1472 intel_sdvo_write_sdvox(intel_sdvo, temp); 1474 intel_sdvo_write_sdvox(intel_sdvo, temp);
1475
1476 intel_wait_for_vblank_if_active(dev_priv->dev, PIPE_A);
1477 intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true);
1478 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true);
1473 } 1479 }
1474} 1480}
1475 1481
@@ -2251,7 +2257,7 @@ intel_sdvo_select_ddc_bus(struct drm_i915_private *dev_priv,
2251{ 2257{
2252 struct sdvo_device_mapping *mapping; 2258 struct sdvo_device_mapping *mapping;
2253 2259
2254 if (sdvo->is_sdvob) 2260 if (sdvo->port == PORT_B)
2255 mapping = &(dev_priv->sdvo_mappings[0]); 2261 mapping = &(dev_priv->sdvo_mappings[0]);
2256 else 2262 else
2257 mapping = &(dev_priv->sdvo_mappings[1]); 2263 mapping = &(dev_priv->sdvo_mappings[1]);
@@ -2269,7 +2275,7 @@ intel_sdvo_select_i2c_bus(struct drm_i915_private *dev_priv,
2269 struct sdvo_device_mapping *mapping; 2275 struct sdvo_device_mapping *mapping;
2270 u8 pin; 2276 u8 pin;
2271 2277
2272 if (sdvo->is_sdvob) 2278 if (sdvo->port == PORT_B)
2273 mapping = &dev_priv->sdvo_mappings[0]; 2279 mapping = &dev_priv->sdvo_mappings[0];
2274 else 2280 else
2275 mapping = &dev_priv->sdvo_mappings[1]; 2281 mapping = &dev_priv->sdvo_mappings[1];
@@ -2307,7 +2313,7 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, struct intel_sdvo *sdvo)
2307 struct drm_i915_private *dev_priv = dev->dev_private; 2313 struct drm_i915_private *dev_priv = dev->dev_private;
2308 struct sdvo_device_mapping *my_mapping, *other_mapping; 2314 struct sdvo_device_mapping *my_mapping, *other_mapping;
2309 2315
2310 if (sdvo->is_sdvob) { 2316 if (sdvo->port == PORT_B) {
2311 my_mapping = &dev_priv->sdvo_mappings[0]; 2317 my_mapping = &dev_priv->sdvo_mappings[0];
2312 other_mapping = &dev_priv->sdvo_mappings[1]; 2318 other_mapping = &dev_priv->sdvo_mappings[1];
2313 } else { 2319 } else {
@@ -2332,7 +2338,7 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, struct intel_sdvo *sdvo)
2332 /* No SDVO device info is found for another DVO port, 2338 /* No SDVO device info is found for another DVO port,
2333 * so use mapping assumption we had before BIOS parsing. 2339 * so use mapping assumption we had before BIOS parsing.
2334 */ 2340 */
2335 if (sdvo->is_sdvob) 2341 if (sdvo->port == PORT_B)
2336 return 0x70; 2342 return 0x70;
2337 else 2343 else
2338 return 0x72; 2344 return 0x72;
@@ -2939,18 +2945,31 @@ intel_sdvo_init_ddc_proxy(struct intel_sdvo *sdvo,
2939 return i2c_add_adapter(&sdvo->ddc) == 0; 2945 return i2c_add_adapter(&sdvo->ddc) == 0;
2940} 2946}
2941 2947
2942bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) 2948static void assert_sdvo_port_valid(const struct drm_i915_private *dev_priv,
2949 enum port port)
2950{
2951 if (HAS_PCH_SPLIT(dev_priv))
2952 WARN_ON(port != PORT_B);
2953 else
2954 WARN_ON(port != PORT_B && port != PORT_C);
2955}
2956
2957bool intel_sdvo_init(struct drm_device *dev,
2958 i915_reg_t sdvo_reg, enum port port)
2943{ 2959{
2944 struct drm_i915_private *dev_priv = dev->dev_private; 2960 struct drm_i915_private *dev_priv = dev->dev_private;
2945 struct intel_encoder *intel_encoder; 2961 struct intel_encoder *intel_encoder;
2946 struct intel_sdvo *intel_sdvo; 2962 struct intel_sdvo *intel_sdvo;
2947 int i; 2963 int i;
2964
2965 assert_sdvo_port_valid(dev_priv, port);
2966
2948 intel_sdvo = kzalloc(sizeof(*intel_sdvo), GFP_KERNEL); 2967 intel_sdvo = kzalloc(sizeof(*intel_sdvo), GFP_KERNEL);
2949 if (!intel_sdvo) 2968 if (!intel_sdvo)
2950 return false; 2969 return false;
2951 2970
2952 intel_sdvo->sdvo_reg = sdvo_reg; 2971 intel_sdvo->sdvo_reg = sdvo_reg;
2953 intel_sdvo->is_sdvob = is_sdvob; 2972 intel_sdvo->port = port;
2954 intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, intel_sdvo) >> 1; 2973 intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, intel_sdvo) >> 1;
2955 intel_sdvo_select_i2c_bus(dev_priv, intel_sdvo); 2974 intel_sdvo_select_i2c_bus(dev_priv, intel_sdvo);
2956 if (!intel_sdvo_init_ddc_proxy(intel_sdvo, dev)) 2975 if (!intel_sdvo_init_ddc_proxy(intel_sdvo, dev))
@@ -3000,8 +3019,10 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
3000 * hotplug lines. 3019 * hotplug lines.
3001 */ 3020 */
3002 if (intel_sdvo->hotplug_active) { 3021 if (intel_sdvo->hotplug_active) {
3003 intel_encoder->hpd_pin = 3022 if (intel_sdvo->port == PORT_B)
3004 intel_sdvo->is_sdvob ? HPD_SDVO_B : HPD_SDVO_C; 3023 intel_encoder->hpd_pin = HPD_SDVO_B;
3024 else
3025 intel_encoder->hpd_pin = HPD_SDVO_C;
3005 } 3026 }
3006 3027
3007 /* 3028 /*
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index 56dc132e8e20..2b96f336589e 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -192,10 +192,9 @@ skl_update_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc,
192 const int pipe = intel_plane->pipe; 192 const int pipe = intel_plane->pipe;
193 const int plane = intel_plane->plane + 1; 193 const int plane = intel_plane->plane + 1;
194 u32 plane_ctl, stride_div, stride; 194 u32 plane_ctl, stride_div, stride;
195 int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0);
196 const struct drm_intel_sprite_colorkey *key = 195 const struct drm_intel_sprite_colorkey *key =
197 &to_intel_plane_state(drm_plane->state)->ckey; 196 &to_intel_plane_state(drm_plane->state)->ckey;
198 unsigned long surf_addr; 197 u32 surf_addr;
199 u32 tile_height, plane_offset, plane_size; 198 u32 tile_height, plane_offset, plane_size;
200 unsigned int rotation; 199 unsigned int rotation;
201 int x_offset, y_offset; 200 int x_offset, y_offset;
@@ -212,10 +211,6 @@ skl_update_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc,
212 rotation = drm_plane->state->rotation; 211 rotation = drm_plane->state->rotation;
213 plane_ctl |= skl_plane_ctl_rotation(rotation); 212 plane_ctl |= skl_plane_ctl_rotation(rotation);
214 213
215 intel_update_sprite_watermarks(drm_plane, crtc, src_w, src_h,
216 pixel_size, true,
217 src_w != crtc_w || src_h != crtc_h);
218
219 stride_div = intel_fb_stride_alignment(dev, fb->modifier[0], 214 stride_div = intel_fb_stride_alignment(dev, fb->modifier[0],
220 fb->pixel_format); 215 fb->pixel_format);
221 216
@@ -297,8 +292,6 @@ skl_disable_plane(struct drm_plane *dplane, struct drm_crtc *crtc)
297 292
298 I915_WRITE(PLANE_SURF(pipe, plane), 0); 293 I915_WRITE(PLANE_SURF(pipe, plane), 0);
299 POSTING_READ(PLANE_SURF(pipe, plane)); 294 POSTING_READ(PLANE_SURF(pipe, plane));
300
301 intel_update_sprite_watermarks(dplane, crtc, 0, 0, 0, false, false);
302} 295}
303 296
304static void 297static void
@@ -541,10 +534,6 @@ ivb_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
541 if (IS_HASWELL(dev) || IS_BROADWELL(dev)) 534 if (IS_HASWELL(dev) || IS_BROADWELL(dev))
542 sprctl |= SPRITE_PIPE_CSC_ENABLE; 535 sprctl |= SPRITE_PIPE_CSC_ENABLE;
543 536
544 intel_update_sprite_watermarks(plane, crtc, src_w, src_h, pixel_size,
545 true,
546 src_w != crtc_w || src_h != crtc_h);
547
548 /* Sizes are 0 based */ 537 /* Sizes are 0 based */
549 src_w--; 538 src_w--;
550 src_h--; 539 src_h--;
@@ -678,10 +667,6 @@ ilk_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
678 if (IS_GEN6(dev)) 667 if (IS_GEN6(dev))
679 dvscntr |= DVS_TRICKLE_FEED_DISABLE; /* must disable */ 668 dvscntr |= DVS_TRICKLE_FEED_DISABLE; /* must disable */
680 669
681 intel_update_sprite_watermarks(plane, crtc, src_w, src_h,
682 pixel_size, true,
683 src_w != crtc_w || src_h != crtc_h);
684
685 /* Sizes are 0 based */ 670 /* Sizes are 0 based */
686 src_w--; 671 src_w--;
687 src_h--; 672 src_h--;
@@ -832,8 +817,8 @@ intel_check_sprite_plane(struct drm_plane *plane,
832 hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale); 817 hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
833 if (hscale < 0) { 818 if (hscale < 0) {
834 DRM_DEBUG_KMS("Horizontal scaling factor out of limits\n"); 819 DRM_DEBUG_KMS("Horizontal scaling factor out of limits\n");
835 drm_rect_debug_print(src, true); 820 drm_rect_debug_print("src: ", src, true);
836 drm_rect_debug_print(dst, false); 821 drm_rect_debug_print("dst: ", dst, false);
837 822
838 return hscale; 823 return hscale;
839 } 824 }
@@ -841,8 +826,8 @@ intel_check_sprite_plane(struct drm_plane *plane,
841 vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale); 826 vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
842 if (vscale < 0) { 827 if (vscale < 0) {
843 DRM_DEBUG_KMS("Vertical scaling factor out of limits\n"); 828 DRM_DEBUG_KMS("Vertical scaling factor out of limits\n");
844 drm_rect_debug_print(src, true); 829 drm_rect_debug_print("src: ", src, true);
845 drm_rect_debug_print(dst, false); 830 drm_rect_debug_print("dst: ", dst, false);
846 831
847 return vscale; 832 return vscale;
848 } 833 }
@@ -938,9 +923,6 @@ intel_commit_sprite_plane(struct drm_plane *plane,
938 923
939 crtc = crtc ? crtc : plane->crtc; 924 crtc = crtc ? crtc : plane->crtc;
940 925
941 if (!crtc->state->active)
942 return;
943
944 if (state->visible) { 926 if (state->visible) {
945 intel_plane->update_plane(plane, crtc, fb, 927 intel_plane->update_plane(plane, crtc, fb,
946 state->dst.x1, state->dst.y1, 928 state->dst.x1, state->dst.y1,
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 43cba129a0c0..c2358ba78b30 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -29,19 +29,7 @@
29 29
30#define FORCEWAKE_ACK_TIMEOUT_MS 50 30#define FORCEWAKE_ACK_TIMEOUT_MS 50
31 31
32#define __raw_i915_read8(dev_priv__, reg__) readb((dev_priv__)->regs + (reg__)) 32#define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32((dev_priv__), (reg__))
33#define __raw_i915_write8(dev_priv__, reg__, val__) writeb(val__, (dev_priv__)->regs + (reg__))
34
35#define __raw_i915_read16(dev_priv__, reg__) readw((dev_priv__)->regs + (reg__))
36#define __raw_i915_write16(dev_priv__, reg__, val__) writew(val__, (dev_priv__)->regs + (reg__))
37
38#define __raw_i915_read32(dev_priv__, reg__) readl((dev_priv__)->regs + (reg__))
39#define __raw_i915_write32(dev_priv__, reg__, val__) writel(val__, (dev_priv__)->regs + (reg__))
40
41#define __raw_i915_read64(dev_priv__, reg__) readq((dev_priv__)->regs + (reg__))
42#define __raw_i915_write64(dev_priv__, reg__, val__) writeq(val__, (dev_priv__)->regs + (reg__))
43
44#define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32(dev_priv__, reg__)
45 33
46static const char * const forcewake_domain_names[] = { 34static const char * const forcewake_domain_names[] = {
47 "render", 35 "render",
@@ -72,7 +60,7 @@ assert_device_not_suspended(struct drm_i915_private *dev_priv)
72static inline void 60static inline void
73fw_domain_reset(const struct intel_uncore_forcewake_domain *d) 61fw_domain_reset(const struct intel_uncore_forcewake_domain *d)
74{ 62{
75 WARN_ON(d->reg_set == 0); 63 WARN_ON(!i915_mmio_reg_valid(d->reg_set));
76 __raw_i915_write32(d->i915, d->reg_set, d->val_reset); 64 __raw_i915_write32(d->i915, d->reg_set, d->val_reset);
77} 65}
78 66
@@ -118,7 +106,7 @@ static inline void
118fw_domain_posting_read(const struct intel_uncore_forcewake_domain *d) 106fw_domain_posting_read(const struct intel_uncore_forcewake_domain *d)
119{ 107{
120 /* something from same cacheline, but not from the set register */ 108 /* something from same cacheline, but not from the set register */
121 if (d->reg_post) 109 if (i915_mmio_reg_valid(d->reg_post))
122 __raw_posting_read(d->i915, d->reg_post); 110 __raw_posting_read(d->i915, d->reg_post);
123} 111}
124 112
@@ -525,8 +513,7 @@ void assert_forcewakes_inactive(struct drm_i915_private *dev_priv)
525} 513}
526 514
527/* We give fast paths for the really cool registers */ 515/* We give fast paths for the really cool registers */
528#define NEEDS_FORCE_WAKE(reg) \ 516#define NEEDS_FORCE_WAKE(reg) ((reg) < 0x40000)
529 ((reg) < 0x40000 && (reg) != FORCEWAKE)
530 517
531#define REG_RANGE(reg, start, end) ((reg) >= (start) && (reg) < (end)) 518#define REG_RANGE(reg, start, end) ((reg) >= (start) && (reg) < (end))
532 519
@@ -589,7 +576,7 @@ void assert_forcewakes_inactive(struct drm_i915_private *dev_priv)
589 REG_RANGE((reg), 0x9400, 0x9800) 576 REG_RANGE((reg), 0x9400, 0x9800)
590 577
591#define FORCEWAKE_GEN9_BLITTER_RANGE_OFFSET(reg) \ 578#define FORCEWAKE_GEN9_BLITTER_RANGE_OFFSET(reg) \
592 ((reg) < 0x40000 &&\ 579 ((reg) < 0x40000 && \
593 !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg) && \ 580 !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg) && \
594 !FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg) && \ 581 !FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg) && \
595 !FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg) && \ 582 !FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg) && \
@@ -605,8 +592,8 @@ ilk_dummy_write(struct drm_i915_private *dev_priv)
605} 592}
606 593
607static void 594static void
608hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv, u32 reg, bool read, 595hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv,
609 bool before) 596 i915_reg_t reg, bool read, bool before)
610{ 597{
611 const char *op = read ? "reading" : "writing to"; 598 const char *op = read ? "reading" : "writing to";
612 const char *when = before ? "before" : "after"; 599 const char *when = before ? "before" : "after";
@@ -616,7 +603,7 @@ hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv, u32 reg, bool read,
616 603
617 if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) { 604 if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) {
618 WARN(1, "Unclaimed register detected %s %s register 0x%x\n", 605 WARN(1, "Unclaimed register detected %s %s register 0x%x\n",
619 when, op, reg); 606 when, op, i915_mmio_reg_offset(reg));
620 __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM); 607 __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
621 i915.mmio_debug--; /* Only report the first N failures */ 608 i915.mmio_debug--; /* Only report the first N failures */
622 } 609 }
@@ -649,7 +636,7 @@ hsw_unclaimed_reg_detect(struct drm_i915_private *dev_priv)
649 636
650#define __gen2_read(x) \ 637#define __gen2_read(x) \
651static u##x \ 638static u##x \
652gen2_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ 639gen2_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
653 GEN2_READ_HEADER(x); \ 640 GEN2_READ_HEADER(x); \
654 val = __raw_i915_read##x(dev_priv, reg); \ 641 val = __raw_i915_read##x(dev_priv, reg); \
655 GEN2_READ_FOOTER; \ 642 GEN2_READ_FOOTER; \
@@ -657,7 +644,7 @@ gen2_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
657 644
658#define __gen5_read(x) \ 645#define __gen5_read(x) \
659static u##x \ 646static u##x \
660gen5_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ 647gen5_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
661 GEN2_READ_HEADER(x); \ 648 GEN2_READ_HEADER(x); \
662 ilk_dummy_write(dev_priv); \ 649 ilk_dummy_write(dev_priv); \
663 val = __raw_i915_read##x(dev_priv, reg); \ 650 val = __raw_i915_read##x(dev_priv, reg); \
@@ -680,6 +667,7 @@ __gen2_read(64)
680#undef GEN2_READ_HEADER 667#undef GEN2_READ_HEADER
681 668
682#define GEN6_READ_HEADER(x) \ 669#define GEN6_READ_HEADER(x) \
670 u32 offset = i915_mmio_reg_offset(reg); \
683 unsigned long irqflags; \ 671 unsigned long irqflags; \
684 u##x val = 0; \ 672 u##x val = 0; \
685 assert_device_not_suspended(dev_priv); \ 673 assert_device_not_suspended(dev_priv); \
@@ -714,20 +702,12 @@ static inline void __force_wake_get(struct drm_i915_private *dev_priv,
714 dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains); 702 dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_domains);
715} 703}
716 704
717#define __vgpu_read(x) \
718static u##x \
719vgpu_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
720 GEN6_READ_HEADER(x); \
721 val = __raw_i915_read##x(dev_priv, reg); \
722 GEN6_READ_FOOTER; \
723}
724
725#define __gen6_read(x) \ 705#define __gen6_read(x) \
726static u##x \ 706static u##x \
727gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ 707gen6_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
728 GEN6_READ_HEADER(x); \ 708 GEN6_READ_HEADER(x); \
729 hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \ 709 hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \
730 if (NEEDS_FORCE_WAKE(reg)) \ 710 if (NEEDS_FORCE_WAKE(offset)) \
731 __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ 711 __force_wake_get(dev_priv, FORCEWAKE_RENDER); \
732 val = __raw_i915_read##x(dev_priv, reg); \ 712 val = __raw_i915_read##x(dev_priv, reg); \
733 hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \ 713 hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \
@@ -736,47 +716,56 @@ gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
736 716
737#define __vlv_read(x) \ 717#define __vlv_read(x) \
738static u##x \ 718static u##x \
739vlv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ 719vlv_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
720 enum forcewake_domains fw_engine = 0; \
740 GEN6_READ_HEADER(x); \ 721 GEN6_READ_HEADER(x); \
741 if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg)) \ 722 if (!NEEDS_FORCE_WAKE(offset)) \
742 __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ 723 fw_engine = 0; \
743 else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)) \ 724 else if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(offset)) \
744 __force_wake_get(dev_priv, FORCEWAKE_MEDIA); \ 725 fw_engine = FORCEWAKE_RENDER; \
726 else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(offset)) \
727 fw_engine = FORCEWAKE_MEDIA; \
728 if (fw_engine) \
729 __force_wake_get(dev_priv, fw_engine); \
745 val = __raw_i915_read##x(dev_priv, reg); \ 730 val = __raw_i915_read##x(dev_priv, reg); \
746 GEN6_READ_FOOTER; \ 731 GEN6_READ_FOOTER; \
747} 732}
748 733
749#define __chv_read(x) \ 734#define __chv_read(x) \
750static u##x \ 735static u##x \
751chv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ 736chv_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
737 enum forcewake_domains fw_engine = 0; \
752 GEN6_READ_HEADER(x); \ 738 GEN6_READ_HEADER(x); \
753 if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) \ 739 if (!NEEDS_FORCE_WAKE(offset)) \
754 __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ 740 fw_engine = 0; \
755 else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) \ 741 else if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(offset)) \
756 __force_wake_get(dev_priv, FORCEWAKE_MEDIA); \ 742 fw_engine = FORCEWAKE_RENDER; \
757 else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) \ 743 else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(offset)) \
758 __force_wake_get(dev_priv, \ 744 fw_engine = FORCEWAKE_MEDIA; \
759 FORCEWAKE_RENDER | FORCEWAKE_MEDIA); \ 745 else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(offset)) \
746 fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
747 if (fw_engine) \
748 __force_wake_get(dev_priv, fw_engine); \
760 val = __raw_i915_read##x(dev_priv, reg); \ 749 val = __raw_i915_read##x(dev_priv, reg); \
761 GEN6_READ_FOOTER; \ 750 GEN6_READ_FOOTER; \
762} 751}
763 752
764#define SKL_NEEDS_FORCE_WAKE(reg) \ 753#define SKL_NEEDS_FORCE_WAKE(reg) \
765 ((reg) < 0x40000 && !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg)) 754 ((reg) < 0x40000 && !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg))
766 755
767#define __gen9_read(x) \ 756#define __gen9_read(x) \
768static u##x \ 757static u##x \
769gen9_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \ 758gen9_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
770 enum forcewake_domains fw_engine; \ 759 enum forcewake_domains fw_engine; \
771 GEN6_READ_HEADER(x); \ 760 GEN6_READ_HEADER(x); \
772 hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \ 761 hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \
773 if (!SKL_NEEDS_FORCE_WAKE(reg)) \ 762 if (!SKL_NEEDS_FORCE_WAKE(offset)) \
774 fw_engine = 0; \ 763 fw_engine = 0; \
775 else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg)) \ 764 else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
776 fw_engine = FORCEWAKE_RENDER; \ 765 fw_engine = FORCEWAKE_RENDER; \
777 else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg)) \ 766 else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \
778 fw_engine = FORCEWAKE_MEDIA; \ 767 fw_engine = FORCEWAKE_MEDIA; \
779 else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(reg)) \ 768 else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(offset)) \
780 fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \ 769 fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
781 else \ 770 else \
782 fw_engine = FORCEWAKE_BLITTER; \ 771 fw_engine = FORCEWAKE_BLITTER; \
@@ -787,10 +776,6 @@ gen9_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
787 GEN6_READ_FOOTER; \ 776 GEN6_READ_FOOTER; \
788} 777}
789 778
790__vgpu_read(8)
791__vgpu_read(16)
792__vgpu_read(32)
793__vgpu_read(64)
794__gen9_read(8) 779__gen9_read(8)
795__gen9_read(16) 780__gen9_read(16)
796__gen9_read(32) 781__gen9_read(32)
@@ -812,10 +797,37 @@ __gen6_read(64)
812#undef __chv_read 797#undef __chv_read
813#undef __vlv_read 798#undef __vlv_read
814#undef __gen6_read 799#undef __gen6_read
815#undef __vgpu_read
816#undef GEN6_READ_FOOTER 800#undef GEN6_READ_FOOTER
817#undef GEN6_READ_HEADER 801#undef GEN6_READ_HEADER
818 802
803#define VGPU_READ_HEADER(x) \
804 unsigned long irqflags; \
805 u##x val = 0; \
806 assert_device_not_suspended(dev_priv); \
807 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
808
809#define VGPU_READ_FOOTER \
810 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); \
811 trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
812 return val
813
814#define __vgpu_read(x) \
815static u##x \
816vgpu_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
817 VGPU_READ_HEADER(x); \
818 val = __raw_i915_read##x(dev_priv, reg); \
819 VGPU_READ_FOOTER; \
820}
821
822__vgpu_read(8)
823__vgpu_read(16)
824__vgpu_read(32)
825__vgpu_read(64)
826
827#undef __vgpu_read
828#undef VGPU_READ_FOOTER
829#undef VGPU_READ_HEADER
830
819#define GEN2_WRITE_HEADER \ 831#define GEN2_WRITE_HEADER \
820 trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ 832 trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
821 assert_device_not_suspended(dev_priv); \ 833 assert_device_not_suspended(dev_priv); \
@@ -824,7 +836,7 @@ __gen6_read(64)
824 836
825#define __gen2_write(x) \ 837#define __gen2_write(x) \
826static void \ 838static void \
827gen2_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ 839gen2_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
828 GEN2_WRITE_HEADER; \ 840 GEN2_WRITE_HEADER; \
829 __raw_i915_write##x(dev_priv, reg, val); \ 841 __raw_i915_write##x(dev_priv, reg, val); \
830 GEN2_WRITE_FOOTER; \ 842 GEN2_WRITE_FOOTER; \
@@ -832,7 +844,7 @@ gen2_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace
832 844
833#define __gen5_write(x) \ 845#define __gen5_write(x) \
834static void \ 846static void \
835gen5_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ 847gen5_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
836 GEN2_WRITE_HEADER; \ 848 GEN2_WRITE_HEADER; \
837 ilk_dummy_write(dev_priv); \ 849 ilk_dummy_write(dev_priv); \
838 __raw_i915_write##x(dev_priv, reg, val); \ 850 __raw_i915_write##x(dev_priv, reg, val); \
@@ -855,6 +867,7 @@ __gen2_write(64)
855#undef GEN2_WRITE_HEADER 867#undef GEN2_WRITE_HEADER
856 868
857#define GEN6_WRITE_HEADER \ 869#define GEN6_WRITE_HEADER \
870 u32 offset = i915_mmio_reg_offset(reg); \
858 unsigned long irqflags; \ 871 unsigned long irqflags; \
859 trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ 872 trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
860 assert_device_not_suspended(dev_priv); \ 873 assert_device_not_suspended(dev_priv); \
@@ -865,10 +878,10 @@ __gen2_write(64)
865 878
866#define __gen6_write(x) \ 879#define __gen6_write(x) \
867static void \ 880static void \
868gen6_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ 881gen6_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
869 u32 __fifo_ret = 0; \ 882 u32 __fifo_ret = 0; \
870 GEN6_WRITE_HEADER; \ 883 GEN6_WRITE_HEADER; \
871 if (NEEDS_FORCE_WAKE(reg)) { \ 884 if (NEEDS_FORCE_WAKE(offset)) { \
872 __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ 885 __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
873 } \ 886 } \
874 __raw_i915_write##x(dev_priv, reg, val); \ 887 __raw_i915_write##x(dev_priv, reg, val); \
@@ -880,10 +893,10 @@ gen6_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace
880 893
881#define __hsw_write(x) \ 894#define __hsw_write(x) \
882static void \ 895static void \
883hsw_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ 896hsw_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
884 u32 __fifo_ret = 0; \ 897 u32 __fifo_ret = 0; \
885 GEN6_WRITE_HEADER; \ 898 GEN6_WRITE_HEADER; \
886 if (NEEDS_FORCE_WAKE(reg)) { \ 899 if (NEEDS_FORCE_WAKE(offset)) { \
887 __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \ 900 __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
888 } \ 901 } \
889 hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ 902 hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
@@ -896,15 +909,7 @@ hsw_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace)
896 GEN6_WRITE_FOOTER; \ 909 GEN6_WRITE_FOOTER; \
897} 910}
898 911
899#define __vgpu_write(x) \ 912static const i915_reg_t gen8_shadowed_regs[] = {
900static void vgpu_write##x(struct drm_i915_private *dev_priv, \
901 off_t reg, u##x val, bool trace) { \
902 GEN6_WRITE_HEADER; \
903 __raw_i915_write##x(dev_priv, reg, val); \
904 GEN6_WRITE_FOOTER; \
905}
906
907static const u32 gen8_shadowed_regs[] = {
908 FORCEWAKE_MT, 913 FORCEWAKE_MT,
909 GEN6_RPNSWREQ, 914 GEN6_RPNSWREQ,
910 GEN6_RC_VIDEO_FREQ, 915 GEN6_RC_VIDEO_FREQ,
@@ -915,11 +920,12 @@ static const u32 gen8_shadowed_regs[] = {
915 /* TODO: Other registers are not yet used */ 920 /* TODO: Other registers are not yet used */
916}; 921};
917 922
918static bool is_gen8_shadowed(struct drm_i915_private *dev_priv, u32 reg) 923static bool is_gen8_shadowed(struct drm_i915_private *dev_priv,
924 i915_reg_t reg)
919{ 925{
920 int i; 926 int i;
921 for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++) 927 for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++)
922 if (reg == gen8_shadowed_regs[i]) 928 if (i915_mmio_reg_equal(reg, gen8_shadowed_regs[i]))
923 return true; 929 return true;
924 930
925 return false; 931 return false;
@@ -927,10 +933,10 @@ static bool is_gen8_shadowed(struct drm_i915_private *dev_priv, u32 reg)
927 933
928#define __gen8_write(x) \ 934#define __gen8_write(x) \
929static void \ 935static void \
930gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ 936gen8_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
931 GEN6_WRITE_HEADER; \ 937 GEN6_WRITE_HEADER; \
932 hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ 938 hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
933 if (reg < 0x40000 && !is_gen8_shadowed(dev_priv, reg)) \ 939 if (NEEDS_FORCE_WAKE(offset) && !is_gen8_shadowed(dev_priv, reg)) \
934 __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ 940 __force_wake_get(dev_priv, FORCEWAKE_RENDER); \
935 __raw_i915_write##x(dev_priv, reg, val); \ 941 __raw_i915_write##x(dev_priv, reg, val); \
936 hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \ 942 hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
@@ -940,22 +946,25 @@ gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace
940 946
941#define __chv_write(x) \ 947#define __chv_write(x) \
942static void \ 948static void \
943chv_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \ 949chv_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
944 bool shadowed = is_gen8_shadowed(dev_priv, reg); \ 950 enum forcewake_domains fw_engine = 0; \
945 GEN6_WRITE_HEADER; \ 951 GEN6_WRITE_HEADER; \
946 if (!shadowed) { \ 952 if (!NEEDS_FORCE_WAKE(offset) || \
947 if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) \ 953 is_gen8_shadowed(dev_priv, reg)) \
948 __force_wake_get(dev_priv, FORCEWAKE_RENDER); \ 954 fw_engine = 0; \
949 else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) \ 955 else if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(offset)) \
950 __force_wake_get(dev_priv, FORCEWAKE_MEDIA); \ 956 fw_engine = FORCEWAKE_RENDER; \
951 else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) \ 957 else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(offset)) \
952 __force_wake_get(dev_priv, FORCEWAKE_RENDER | FORCEWAKE_MEDIA); \ 958 fw_engine = FORCEWAKE_MEDIA; \
953 } \ 959 else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(offset)) \
960 fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
961 if (fw_engine) \
962 __force_wake_get(dev_priv, fw_engine); \
954 __raw_i915_write##x(dev_priv, reg, val); \ 963 __raw_i915_write##x(dev_priv, reg, val); \
955 GEN6_WRITE_FOOTER; \ 964 GEN6_WRITE_FOOTER; \
956} 965}
957 966
958static const u32 gen9_shadowed_regs[] = { 967static const i915_reg_t gen9_shadowed_regs[] = {
959 RING_TAIL(RENDER_RING_BASE), 968 RING_TAIL(RENDER_RING_BASE),
960 RING_TAIL(GEN6_BSD_RING_BASE), 969 RING_TAIL(GEN6_BSD_RING_BASE),
961 RING_TAIL(VEBOX_RING_BASE), 970 RING_TAIL(VEBOX_RING_BASE),
@@ -968,11 +977,12 @@ static const u32 gen9_shadowed_regs[] = {
968 /* TODO: Other registers are not yet used */ 977 /* TODO: Other registers are not yet used */
969}; 978};
970 979
971static bool is_gen9_shadowed(struct drm_i915_private *dev_priv, u32 reg) 980static bool is_gen9_shadowed(struct drm_i915_private *dev_priv,
981 i915_reg_t reg)
972{ 982{
973 int i; 983 int i;
974 for (i = 0; i < ARRAY_SIZE(gen9_shadowed_regs); i++) 984 for (i = 0; i < ARRAY_SIZE(gen9_shadowed_regs); i++)
975 if (reg == gen9_shadowed_regs[i]) 985 if (i915_mmio_reg_equal(reg, gen9_shadowed_regs[i]))
976 return true; 986 return true;
977 987
978 return false; 988 return false;
@@ -980,19 +990,19 @@ static bool is_gen9_shadowed(struct drm_i915_private *dev_priv, u32 reg)
980 990
981#define __gen9_write(x) \ 991#define __gen9_write(x) \
982static void \ 992static void \
983gen9_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, \ 993gen9_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, \
984 bool trace) { \ 994 bool trace) { \
985 enum forcewake_domains fw_engine; \ 995 enum forcewake_domains fw_engine; \
986 GEN6_WRITE_HEADER; \ 996 GEN6_WRITE_HEADER; \
987 hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \ 997 hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
988 if (!SKL_NEEDS_FORCE_WAKE(reg) || \ 998 if (!SKL_NEEDS_FORCE_WAKE(offset) || \
989 is_gen9_shadowed(dev_priv, reg)) \ 999 is_gen9_shadowed(dev_priv, reg)) \
990 fw_engine = 0; \ 1000 fw_engine = 0; \
991 else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg)) \ 1001 else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
992 fw_engine = FORCEWAKE_RENDER; \ 1002 fw_engine = FORCEWAKE_RENDER; \
993 else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg)) \ 1003 else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \
994 fw_engine = FORCEWAKE_MEDIA; \ 1004 fw_engine = FORCEWAKE_MEDIA; \
995 else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(reg)) \ 1005 else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(offset)) \
996 fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \ 1006 fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
997 else \ 1007 else \
998 fw_engine = FORCEWAKE_BLITTER; \ 1008 fw_engine = FORCEWAKE_BLITTER; \
@@ -1024,20 +1034,41 @@ __gen6_write(8)
1024__gen6_write(16) 1034__gen6_write(16)
1025__gen6_write(32) 1035__gen6_write(32)
1026__gen6_write(64) 1036__gen6_write(64)
1027__vgpu_write(8)
1028__vgpu_write(16)
1029__vgpu_write(32)
1030__vgpu_write(64)
1031 1037
1032#undef __gen9_write 1038#undef __gen9_write
1033#undef __chv_write 1039#undef __chv_write
1034#undef __gen8_write 1040#undef __gen8_write
1035#undef __hsw_write 1041#undef __hsw_write
1036#undef __gen6_write 1042#undef __gen6_write
1037#undef __vgpu_write
1038#undef GEN6_WRITE_FOOTER 1043#undef GEN6_WRITE_FOOTER
1039#undef GEN6_WRITE_HEADER 1044#undef GEN6_WRITE_HEADER
1040 1045
1046#define VGPU_WRITE_HEADER \
1047 unsigned long irqflags; \
1048 trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
1049 assert_device_not_suspended(dev_priv); \
1050 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
1051
1052#define VGPU_WRITE_FOOTER \
1053 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags)
1054
1055#define __vgpu_write(x) \
1056static void vgpu_write##x(struct drm_i915_private *dev_priv, \
1057 i915_reg_t reg, u##x val, bool trace) { \
1058 VGPU_WRITE_HEADER; \
1059 __raw_i915_write##x(dev_priv, reg, val); \
1060 VGPU_WRITE_FOOTER; \
1061}
1062
1063__vgpu_write(8)
1064__vgpu_write(16)
1065__vgpu_write(32)
1066__vgpu_write(64)
1067
1068#undef __vgpu_write
1069#undef VGPU_WRITE_FOOTER
1070#undef VGPU_WRITE_HEADER
1071
1041#define ASSIGN_WRITE_MMIO_VFUNCS(x) \ 1072#define ASSIGN_WRITE_MMIO_VFUNCS(x) \
1042do { \ 1073do { \
1043 dev_priv->uncore.funcs.mmio_writeb = x##_write8; \ 1074 dev_priv->uncore.funcs.mmio_writeb = x##_write8; \
@@ -1057,7 +1088,8 @@ do { \
1057 1088
1058static void fw_domain_init(struct drm_i915_private *dev_priv, 1089static void fw_domain_init(struct drm_i915_private *dev_priv,
1059 enum forcewake_domain_id domain_id, 1090 enum forcewake_domain_id domain_id,
1060 u32 reg_set, u32 reg_ack) 1091 i915_reg_t reg_set,
1092 i915_reg_t reg_ack)
1061{ 1093{
1062 struct intel_uncore_forcewake_domain *d; 1094 struct intel_uncore_forcewake_domain *d;
1063 1095
@@ -1087,8 +1119,6 @@ static void fw_domain_init(struct drm_i915_private *dev_priv,
1087 d->reg_post = FORCEWAKE_ACK_VLV; 1119 d->reg_post = FORCEWAKE_ACK_VLV;
1088 else if (IS_GEN6(dev_priv) || IS_GEN7(dev_priv) || IS_GEN8(dev_priv)) 1120 else if (IS_GEN6(dev_priv) || IS_GEN7(dev_priv) || IS_GEN8(dev_priv))
1089 d->reg_post = ECOBUS; 1121 d->reg_post = ECOBUS;
1090 else
1091 d->reg_post = 0;
1092 1122
1093 d->i915 = dev_priv; 1123 d->i915 = dev_priv;
1094 d->id = domain_id; 1124 d->id = domain_id;
@@ -1262,12 +1292,14 @@ void intel_uncore_fini(struct drm_device *dev)
1262#define GEN_RANGE(l, h) GENMASK(h, l) 1292#define GEN_RANGE(l, h) GENMASK(h, l)
1263 1293
1264static const struct register_whitelist { 1294static const struct register_whitelist {
1265 uint64_t offset; 1295 i915_reg_t offset_ldw, offset_udw;
1266 uint32_t size; 1296 uint32_t size;
1267 /* supported gens, 0x10 for 4, 0x30 for 4 and 5, etc. */ 1297 /* supported gens, 0x10 for 4, 0x30 for 4 and 5, etc. */
1268 uint32_t gen_bitmask; 1298 uint32_t gen_bitmask;
1269} whitelist[] = { 1299} whitelist[] = {
1270 { RING_TIMESTAMP(RENDER_RING_BASE), 8, GEN_RANGE(4, 9) }, 1300 { .offset_ldw = RING_TIMESTAMP(RENDER_RING_BASE),
1301 .offset_udw = RING_TIMESTAMP_UDW(RENDER_RING_BASE),
1302 .size = 8, .gen_bitmask = GEN_RANGE(4, 9) },
1271}; 1303};
1272 1304
1273int i915_reg_read_ioctl(struct drm_device *dev, 1305int i915_reg_read_ioctl(struct drm_device *dev,
@@ -1277,11 +1309,11 @@ int i915_reg_read_ioctl(struct drm_device *dev,
1277 struct drm_i915_reg_read *reg = data; 1309 struct drm_i915_reg_read *reg = data;
1278 struct register_whitelist const *entry = whitelist; 1310 struct register_whitelist const *entry = whitelist;
1279 unsigned size; 1311 unsigned size;
1280 u64 offset; 1312 i915_reg_t offset_ldw, offset_udw;
1281 int i, ret = 0; 1313 int i, ret = 0;
1282 1314
1283 for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) { 1315 for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) {
1284 if (entry->offset == (reg->offset & -entry->size) && 1316 if (i915_mmio_reg_offset(entry->offset_ldw) == (reg->offset & -entry->size) &&
1285 (1 << INTEL_INFO(dev)->gen & entry->gen_bitmask)) 1317 (1 << INTEL_INFO(dev)->gen & entry->gen_bitmask))
1286 break; 1318 break;
1287 } 1319 }
@@ -1293,27 +1325,28 @@ int i915_reg_read_ioctl(struct drm_device *dev,
1293 * be naturally aligned (and those that are not so aligned merely 1325 * be naturally aligned (and those that are not so aligned merely
1294 * limit the available flags for that register). 1326 * limit the available flags for that register).
1295 */ 1327 */
1296 offset = entry->offset; 1328 offset_ldw = entry->offset_ldw;
1329 offset_udw = entry->offset_udw;
1297 size = entry->size; 1330 size = entry->size;
1298 size |= reg->offset ^ offset; 1331 size |= reg->offset ^ i915_mmio_reg_offset(offset_ldw);
1299 1332
1300 intel_runtime_pm_get(dev_priv); 1333 intel_runtime_pm_get(dev_priv);
1301 1334
1302 switch (size) { 1335 switch (size) {
1303 case 8 | 1: 1336 case 8 | 1:
1304 reg->val = I915_READ64_2x32(offset, offset+4); 1337 reg->val = I915_READ64_2x32(offset_ldw, offset_udw);
1305 break; 1338 break;
1306 case 8: 1339 case 8:
1307 reg->val = I915_READ64(offset); 1340 reg->val = I915_READ64(offset_ldw);
1308 break; 1341 break;
1309 case 4: 1342 case 4:
1310 reg->val = I915_READ(offset); 1343 reg->val = I915_READ(offset_ldw);
1311 break; 1344 break;
1312 case 2: 1345 case 2:
1313 reg->val = I915_READ16(offset); 1346 reg->val = I915_READ16(offset_ldw);
1314 break; 1347 break;
1315 case 1: 1348 case 1:
1316 reg->val = I915_READ8(offset); 1349 reg->val = I915_READ8(offset_ldw);
1317 break; 1350 break;
1318 default: 1351 default:
1319 ret = -EINVAL; 1352 ret = -EINVAL;
@@ -1470,7 +1503,7 @@ static int gen6_do_reset(struct drm_device *dev)
1470} 1503}
1471 1504
1472static int wait_for_register(struct drm_i915_private *dev_priv, 1505static int wait_for_register(struct drm_i915_private *dev_priv,
1473 const u32 reg, 1506 i915_reg_t reg,
1474 const u32 mask, 1507 const u32 mask,
1475 const u32 value, 1508 const u32 value,
1476 const unsigned long timeout_ms) 1509 const unsigned long timeout_ms)
diff --git a/drivers/gpu/drm/imx/Kconfig b/drivers/gpu/drm/imx/Kconfig
index 2b81a417cf29..35ca4f007839 100644
--- a/drivers/gpu/drm/imx/Kconfig
+++ b/drivers/gpu/drm/imx/Kconfig
@@ -10,15 +10,6 @@ config DRM_IMX
10 help 10 help
11 enable i.MX graphics support 11 enable i.MX graphics support
12 12
13config DRM_IMX_FB_HELPER
14 tristate "provide legacy framebuffer /dev/fb0"
15 select DRM_KMS_CMA_HELPER
16 depends on DRM_IMX
17 help
18 The DRM framework can provide a legacy /dev/fb0 framebuffer
19 for your device. This is necessary to get a framebuffer console
20 and also for applications using the legacy framebuffer API
21
22config DRM_IMX_PARALLEL_DISPLAY 13config DRM_IMX_PARALLEL_DISPLAY
23 tristate "Support for parallel displays" 14 tristate "Support for parallel displays"
24 select DRM_PANEL 15 select DRM_PANEL
diff --git a/drivers/gpu/drm/imx/imx-drm-core.c b/drivers/gpu/drm/imx/imx-drm-core.c
index 7b990b4e96d2..882cf3d4b7a8 100644
--- a/drivers/gpu/drm/imx/imx-drm-core.c
+++ b/drivers/gpu/drm/imx/imx-drm-core.c
@@ -49,8 +49,10 @@ struct imx_drm_crtc {
49 struct imx_drm_crtc_helper_funcs imx_drm_helper_funcs; 49 struct imx_drm_crtc_helper_funcs imx_drm_helper_funcs;
50}; 50};
51 51
52#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION)
52static int legacyfb_depth = 16; 53static int legacyfb_depth = 16;
53module_param(legacyfb_depth, int, 0444); 54module_param(legacyfb_depth, int, 0444);
55#endif
54 56
55int imx_drm_crtc_id(struct imx_drm_crtc *crtc) 57int imx_drm_crtc_id(struct imx_drm_crtc *crtc)
56{ 58{
@@ -60,25 +62,19 @@ EXPORT_SYMBOL_GPL(imx_drm_crtc_id);
60 62
61static void imx_drm_driver_lastclose(struct drm_device *drm) 63static void imx_drm_driver_lastclose(struct drm_device *drm)
62{ 64{
63#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
64 struct imx_drm_device *imxdrm = drm->dev_private; 65 struct imx_drm_device *imxdrm = drm->dev_private;
65 66
66 drm_fbdev_cma_restore_mode(imxdrm->fbhelper); 67 drm_fbdev_cma_restore_mode(imxdrm->fbhelper);
67#endif
68} 68}
69 69
70static int imx_drm_driver_unload(struct drm_device *drm) 70static int imx_drm_driver_unload(struct drm_device *drm)
71{ 71{
72#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
73 struct imx_drm_device *imxdrm = drm->dev_private; 72 struct imx_drm_device *imxdrm = drm->dev_private;
74#endif
75 73
76 drm_kms_helper_poll_fini(drm); 74 drm_kms_helper_poll_fini(drm);
77 75
78#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
79 if (imxdrm->fbhelper) 76 if (imxdrm->fbhelper)
80 drm_fbdev_cma_fini(imxdrm->fbhelper); 77 drm_fbdev_cma_fini(imxdrm->fbhelper);
81#endif
82 78
83 component_unbind_all(drm->dev, drm); 79 component_unbind_all(drm->dev, drm);
84 80
@@ -214,11 +210,9 @@ EXPORT_SYMBOL_GPL(imx_drm_encoder_destroy);
214 210
215static void imx_drm_output_poll_changed(struct drm_device *drm) 211static void imx_drm_output_poll_changed(struct drm_device *drm)
216{ 212{
217#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
218 struct imx_drm_device *imxdrm = drm->dev_private; 213 struct imx_drm_device *imxdrm = drm->dev_private;
219 214
220 drm_fbdev_cma_hotplug_event(imxdrm->fbhelper); 215 drm_fbdev_cma_hotplug_event(imxdrm->fbhelper);
221#endif
222} 216}
223 217
224static struct drm_mode_config_funcs imx_drm_mode_config_funcs = { 218static struct drm_mode_config_funcs imx_drm_mode_config_funcs = {
@@ -307,7 +301,7 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
307 * The fb helper takes copies of key hardware information, so the 301 * The fb helper takes copies of key hardware information, so the
308 * crtcs/connectors/encoders must not change after this point. 302 * crtcs/connectors/encoders must not change after this point.
309 */ 303 */
310#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER) 304#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION)
311 if (legacyfb_depth != 16 && legacyfb_depth != 32) { 305 if (legacyfb_depth != 16 && legacyfb_depth != 32) {
312 dev_warn(drm->dev, "Invalid legacyfb_depth. Defaulting to 16bpp\n"); 306 dev_warn(drm->dev, "Invalid legacyfb_depth. Defaulting to 16bpp\n");
313 legacyfb_depth = 16; 307 legacyfb_depth = 16;
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
index 912151c36d59..205b2801d3b8 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.h
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
@@ -252,7 +252,7 @@ void mgag200_fbdev_fini(struct mga_device *mdev);
252 /* mgag200_main.c */ 252 /* mgag200_main.c */
253int mgag200_framebuffer_init(struct drm_device *dev, 253int mgag200_framebuffer_init(struct drm_device *dev,
254 struct mga_framebuffer *mfb, 254 struct mga_framebuffer *mfb,
255 struct drm_mode_fb_cmd2 *mode_cmd, 255 const struct drm_mode_fb_cmd2 *mode_cmd,
256 struct drm_gem_object *obj); 256 struct drm_gem_object *obj);
257 257
258 258
diff --git a/drivers/gpu/drm/mgag200/mgag200_fb.c b/drivers/gpu/drm/mgag200/mgag200_fb.c
index b35b5b2db4ec..d9b04b008feb 100644
--- a/drivers/gpu/drm/mgag200/mgag200_fb.c
+++ b/drivers/gpu/drm/mgag200/mgag200_fb.c
@@ -138,7 +138,7 @@ static struct fb_ops mgag200fb_ops = {
138}; 138};
139 139
140static int mgag200fb_create_object(struct mga_fbdev *afbdev, 140static int mgag200fb_create_object(struct mga_fbdev *afbdev,
141 struct drm_mode_fb_cmd2 *mode_cmd, 141 const struct drm_mode_fb_cmd2 *mode_cmd,
142 struct drm_gem_object **gobj_p) 142 struct drm_gem_object **gobj_p)
143{ 143{
144 struct drm_device *dev = afbdev->helper.dev; 144 struct drm_device *dev = afbdev->helper.dev;
diff --git a/drivers/gpu/drm/mgag200/mgag200_main.c b/drivers/gpu/drm/mgag200/mgag200_main.c
index b1a0f5656175..9147444d5bf2 100644
--- a/drivers/gpu/drm/mgag200/mgag200_main.c
+++ b/drivers/gpu/drm/mgag200/mgag200_main.c
@@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs mga_fb_funcs = {
29 29
30int mgag200_framebuffer_init(struct drm_device *dev, 30int mgag200_framebuffer_init(struct drm_device *dev,
31 struct mga_framebuffer *gfb, 31 struct mga_framebuffer *gfb,
32 struct drm_mode_fb_cmd2 *mode_cmd, 32 const struct drm_mode_fb_cmd2 *mode_cmd,
33 struct drm_gem_object *obj) 33 struct drm_gem_object *obj)
34{ 34{
35 int ret; 35 int ret;
@@ -47,7 +47,7 @@ int mgag200_framebuffer_init(struct drm_device *dev,
47static struct drm_framebuffer * 47static struct drm_framebuffer *
48mgag200_user_framebuffer_create(struct drm_device *dev, 48mgag200_user_framebuffer_create(struct drm_device *dev,
49 struct drm_file *filp, 49 struct drm_file *filp,
50 struct drm_mode_fb_cmd2 *mode_cmd) 50 const struct drm_mode_fb_cmd2 *mode_cmd)
51{ 51{
52 struct drm_gem_object *obj; 52 struct drm_gem_object *obj;
53 struct mga_framebuffer *mga_fb; 53 struct mga_framebuffer *mga_fb;
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 3be7a56b14f1..9a713b7a009d 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -240,9 +240,9 @@ uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane);
240struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane); 240struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane);
241const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb); 241const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb);
242struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev, 242struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
243 struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos); 243 const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
244struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev, 244struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
245 struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd); 245 struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
246 246
247struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev); 247struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev);
248 248
diff --git a/drivers/gpu/drm/msm/msm_fb.c b/drivers/gpu/drm/msm/msm_fb.c
index 121713281417..a474d6cf5d9f 100644
--- a/drivers/gpu/drm/msm/msm_fb.c
+++ b/drivers/gpu/drm/msm/msm_fb.c
@@ -138,7 +138,7 @@ const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb)
138} 138}
139 139
140struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev, 140struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
141 struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd) 141 struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
142{ 142{
143 struct drm_gem_object *bos[4] = {0}; 143 struct drm_gem_object *bos[4] = {0};
144 struct drm_framebuffer *fb; 144 struct drm_framebuffer *fb;
@@ -168,7 +168,7 @@ out_unref:
168} 168}
169 169
170struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev, 170struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
171 struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos) 171 const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
172{ 172{
173 struct msm_drm_private *priv = dev->dev_private; 173 struct msm_drm_private *priv = dev->dev_private;
174 struct msm_kms *kms = priv->kms; 174 struct msm_kms *kms = priv->kms;
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
index 64c8d932d5f1..18676b8c1721 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -246,7 +246,7 @@ static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
246int 246int
247nouveau_framebuffer_init(struct drm_device *dev, 247nouveau_framebuffer_init(struct drm_device *dev,
248 struct nouveau_framebuffer *nv_fb, 248 struct nouveau_framebuffer *nv_fb,
249 struct drm_mode_fb_cmd2 *mode_cmd, 249 const struct drm_mode_fb_cmd2 *mode_cmd,
250 struct nouveau_bo *nvbo) 250 struct nouveau_bo *nvbo)
251{ 251{
252 struct nouveau_display *disp = nouveau_display(dev); 252 struct nouveau_display *disp = nouveau_display(dev);
@@ -272,7 +272,7 @@ nouveau_framebuffer_init(struct drm_device *dev,
272static struct drm_framebuffer * 272static struct drm_framebuffer *
273nouveau_user_framebuffer_create(struct drm_device *dev, 273nouveau_user_framebuffer_create(struct drm_device *dev,
274 struct drm_file *file_priv, 274 struct drm_file *file_priv,
275 struct drm_mode_fb_cmd2 *mode_cmd) 275 const struct drm_mode_fb_cmd2 *mode_cmd)
276{ 276{
277 struct nouveau_framebuffer *nouveau_fb; 277 struct nouveau_framebuffer *nouveau_fb;
278 struct drm_gem_object *gem; 278 struct drm_gem_object *gem;
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.h b/drivers/gpu/drm/nouveau/nouveau_display.h
index 856abe0f070d..5a57d8b472c4 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.h
+++ b/drivers/gpu/drm/nouveau/nouveau_display.h
@@ -23,7 +23,7 @@ nouveau_framebuffer(struct drm_framebuffer *fb)
23} 23}
24 24
25int nouveau_framebuffer_init(struct drm_device *, struct nouveau_framebuffer *, 25int nouveau_framebuffer_init(struct drm_device *, struct nouveau_framebuffer *,
26 struct drm_mode_fb_cmd2 *, struct nouveau_bo *); 26 const struct drm_mode_fb_cmd2 *, struct nouveau_bo *);
27 27
28struct nouveau_page_flip_state { 28struct nouveau_page_flip_state {
29 struct list_head head; 29 struct list_head head;
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.h b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
index 1e2e9e27a03b..ca77ad001978 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.h
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
@@ -34,7 +34,6 @@
34struct nouveau_fbdev { 34struct nouveau_fbdev {
35 struct drm_fb_helper helper; 35 struct drm_fb_helper helper;
36 struct nouveau_framebuffer nouveau_fb; 36 struct nouveau_framebuffer nouveau_fb;
37 struct list_head fbdev_list;
38 struct drm_device *dev; 37 struct drm_device *dev;
39 unsigned int saved_flags; 38 unsigned int saved_flags;
40 struct nvif_object surf2d; 39 struct nvif_object surf2d;
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index 5c367aad8a6e..130fca70bfd7 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -172,9 +172,9 @@ void copy_timings_drm_to_omap(struct omap_video_timings *timings,
172uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats, 172uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats,
173 uint32_t max_formats, enum omap_color_mode supported_modes); 173 uint32_t max_formats, enum omap_color_mode supported_modes);
174struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev, 174struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
175 struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd); 175 struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
176struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, 176struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
177 struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos); 177 const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
178struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p); 178struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p);
179int omap_framebuffer_pin(struct drm_framebuffer *fb); 179int omap_framebuffer_pin(struct drm_framebuffer *fb);
180void omap_framebuffer_unpin(struct drm_framebuffer *fb); 180void omap_framebuffer_unpin(struct drm_framebuffer *fb);
@@ -248,7 +248,7 @@ struct omap_dss_device *omap_encoder_get_dssdev(struct drm_encoder *encoder);
248 248
249static inline int objects_lookup(struct drm_device *dev, 249static inline int objects_lookup(struct drm_device *dev,
250 struct drm_file *filp, uint32_t pixel_format, 250 struct drm_file *filp, uint32_t pixel_format,
251 struct drm_gem_object **bos, uint32_t *handles) 251 struct drm_gem_object **bos, const uint32_t *handles)
252{ 252{
253 int i, n = drm_format_num_planes(pixel_format); 253 int i, n = drm_format_num_planes(pixel_format);
254 254
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c
index 636a1f921569..ad202dfc1a49 100644
--- a/drivers/gpu/drm/omapdrm/omap_fb.c
+++ b/drivers/gpu/drm/omapdrm/omap_fb.c
@@ -364,7 +364,7 @@ void omap_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m)
364#endif 364#endif
365 365
366struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev, 366struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
367 struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd) 367 struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
368{ 368{
369 struct drm_gem_object *bos[4]; 369 struct drm_gem_object *bos[4];
370 struct drm_framebuffer *fb; 370 struct drm_framebuffer *fb;
@@ -386,7 +386,7 @@ struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
386} 386}
387 387
388struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, 388struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
389 struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos) 389 const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
390{ 390{
391 struct omap_framebuffer *omap_fb = NULL; 391 struct omap_framebuffer *omap_fb = NULL;
392 struct drm_framebuffer *fb = NULL; 392 struct drm_framebuffer *fb = NULL;
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
index 183aea1abebc..cddba079197f 100644
--- a/drivers/gpu/drm/qxl/qxl_display.c
+++ b/drivers/gpu/drm/qxl/qxl_display.c
@@ -521,7 +521,7 @@ static const struct drm_framebuffer_funcs qxl_fb_funcs = {
521int 521int
522qxl_framebuffer_init(struct drm_device *dev, 522qxl_framebuffer_init(struct drm_device *dev,
523 struct qxl_framebuffer *qfb, 523 struct qxl_framebuffer *qfb,
524 struct drm_mode_fb_cmd2 *mode_cmd, 524 const struct drm_mode_fb_cmd2 *mode_cmd,
525 struct drm_gem_object *obj) 525 struct drm_gem_object *obj)
526{ 526{
527 int ret; 527 int ret;
@@ -1003,7 +1003,7 @@ static int qdev_output_init(struct drm_device *dev, int num_output)
1003static struct drm_framebuffer * 1003static struct drm_framebuffer *
1004qxl_user_framebuffer_create(struct drm_device *dev, 1004qxl_user_framebuffer_create(struct drm_device *dev,
1005 struct drm_file *file_priv, 1005 struct drm_file *file_priv,
1006 struct drm_mode_fb_cmd2 *mode_cmd) 1006 const struct drm_mode_fb_cmd2 *mode_cmd)
1007{ 1007{
1008 struct drm_gem_object *obj; 1008 struct drm_gem_object *obj;
1009 struct qxl_framebuffer *qxl_fb; 1009 struct qxl_framebuffer *qxl_fb;
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index 01a86948eb8c..6e6b9b1519b8 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -390,7 +390,7 @@ void qxl_fbdev_set_suspend(struct qxl_device *qdev, int state);
390int 390int
391qxl_framebuffer_init(struct drm_device *dev, 391qxl_framebuffer_init(struct drm_device *dev,
392 struct qxl_framebuffer *rfb, 392 struct qxl_framebuffer *rfb,
393 struct drm_mode_fb_cmd2 *mode_cmd, 393 const struct drm_mode_fb_cmd2 *mode_cmd,
394 struct drm_gem_object *obj); 394 struct drm_gem_object *obj);
395void qxl_display_read_client_monitors_config(struct qxl_device *qdev); 395void qxl_display_read_client_monitors_config(struct qxl_device *qdev);
396void qxl_send_monitors_config(struct qxl_device *qdev); 396void qxl_send_monitors_config(struct qxl_device *qdev);
diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c
index c4a552637c93..7136e521e6db 100644
--- a/drivers/gpu/drm/qxl/qxl_fb.c
+++ b/drivers/gpu/drm/qxl/qxl_fb.c
@@ -40,7 +40,6 @@
40struct qxl_fbdev { 40struct qxl_fbdev {
41 struct drm_fb_helper helper; 41 struct drm_fb_helper helper;
42 struct qxl_framebuffer qfb; 42 struct qxl_framebuffer qfb;
43 struct list_head fbdev_list;
44 struct qxl_device *qdev; 43 struct qxl_device *qdev;
45 44
46 spinlock_t delayed_ops_lock; 45 spinlock_t delayed_ops_lock;
@@ -283,7 +282,7 @@ int qxl_get_handle_for_primary_fb(struct qxl_device *qdev,
283} 282}
284 283
285static int qxlfb_create_pinned_object(struct qxl_fbdev *qfbdev, 284static int qxlfb_create_pinned_object(struct qxl_fbdev *qfbdev,
286 struct drm_mode_fb_cmd2 *mode_cmd, 285 const struct drm_mode_fb_cmd2 *mode_cmd,
287 struct drm_gem_object **gobj_p) 286 struct drm_gem_object **gobj_p)
288{ 287{
289 struct qxl_device *qdev = qfbdev->qdev; 288 struct qxl_device *qdev = qfbdev->qdev;
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index 1eca0acac016..b3bb92368ae0 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -1331,7 +1331,7 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = {
1331int 1331int
1332radeon_framebuffer_init(struct drm_device *dev, 1332radeon_framebuffer_init(struct drm_device *dev,
1333 struct radeon_framebuffer *rfb, 1333 struct radeon_framebuffer *rfb,
1334 struct drm_mode_fb_cmd2 *mode_cmd, 1334 const struct drm_mode_fb_cmd2 *mode_cmd,
1335 struct drm_gem_object *obj) 1335 struct drm_gem_object *obj)
1336{ 1336{
1337 int ret; 1337 int ret;
@@ -1348,7 +1348,7 @@ radeon_framebuffer_init(struct drm_device *dev,
1348static struct drm_framebuffer * 1348static struct drm_framebuffer *
1349radeon_user_framebuffer_create(struct drm_device *dev, 1349radeon_user_framebuffer_create(struct drm_device *dev,
1350 struct drm_file *file_priv, 1350 struct drm_file *file_priv,
1351 struct drm_mode_fb_cmd2 *mode_cmd) 1351 const struct drm_mode_fb_cmd2 *mode_cmd)
1352{ 1352{
1353 struct drm_gem_object *obj; 1353 struct drm_gem_object *obj;
1354 struct radeon_framebuffer *radeon_fb; 1354 struct radeon_framebuffer *radeon_fb;
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
index 26da2f4d7b4f..adc44bbc81a9 100644
--- a/drivers/gpu/drm/radeon/radeon_fb.c
+++ b/drivers/gpu/drm/radeon/radeon_fb.c
@@ -44,7 +44,6 @@
44struct radeon_fbdev { 44struct radeon_fbdev {
45 struct drm_fb_helper helper; 45 struct drm_fb_helper helper;
46 struct radeon_framebuffer rfb; 46 struct radeon_framebuffer rfb;
47 struct list_head fbdev_list;
48 struct radeon_device *rdev; 47 struct radeon_device *rdev;
49}; 48};
50 49
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index bba112628b47..cddd41b32eda 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -934,7 +934,7 @@ extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green
934 u16 *blue, int regno); 934 u16 *blue, int regno);
935int radeon_framebuffer_init(struct drm_device *dev, 935int radeon_framebuffer_init(struct drm_device *dev,
936 struct radeon_framebuffer *rfb, 936 struct radeon_framebuffer *rfb,
937 struct drm_mode_fb_cmd2 *mode_cmd, 937 const struct drm_mode_fb_cmd2 *mode_cmd,
938 struct drm_gem_object *obj); 938 struct drm_gem_object *obj);
939 939
940int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb); 940int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
index ca12e8ca5552..43bce69d8560 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
@@ -136,7 +136,7 @@ int rcar_du_dumb_create(struct drm_file *file, struct drm_device *dev,
136 136
137static struct drm_framebuffer * 137static struct drm_framebuffer *
138rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv, 138rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
139 struct drm_mode_fb_cmd2 *mode_cmd) 139 const struct drm_mode_fb_cmd2 *mode_cmd)
140{ 140{
141 struct rcar_du_device *rcdu = dev->dev_private; 141 struct rcar_du_device *rcdu = dev->dev_private;
142 const struct rcar_du_format_info *format; 142 const struct rcar_du_format_info *format;
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
index 002645bb5bbf..b8ac5911c102 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
@@ -72,7 +72,7 @@ static struct drm_framebuffer_funcs rockchip_drm_fb_funcs = {
72}; 72};
73 73
74static struct rockchip_drm_fb * 74static struct rockchip_drm_fb *
75rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd, 75rockchip_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd,
76 struct drm_gem_object **obj, unsigned int num_planes) 76 struct drm_gem_object **obj, unsigned int num_planes)
77{ 77{
78 struct rockchip_drm_fb *rockchip_fb; 78 struct rockchip_drm_fb *rockchip_fb;
@@ -102,7 +102,7 @@ rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd,
102 102
103static struct drm_framebuffer * 103static struct drm_framebuffer *
104rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, 104rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
105 struct drm_mode_fb_cmd2 *mode_cmd) 105 const struct drm_mode_fb_cmd2 *mode_cmd)
106{ 106{
107 struct rockchip_drm_fb *rockchip_fb; 107 struct rockchip_drm_fb *rockchip_fb;
108 struct drm_gem_object *objs[ROCKCHIP_MAX_FB_BUFFER]; 108 struct drm_gem_object *objs[ROCKCHIP_MAX_FB_BUFFER];
@@ -173,7 +173,7 @@ static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = {
173 173
174struct drm_framebuffer * 174struct drm_framebuffer *
175rockchip_drm_framebuffer_init(struct drm_device *dev, 175rockchip_drm_framebuffer_init(struct drm_device *dev,
176 struct drm_mode_fb_cmd2 *mode_cmd, 176 const struct drm_mode_fb_cmd2 *mode_cmd,
177 struct drm_gem_object *obj) 177 struct drm_gem_object *obj)
178{ 178{
179 struct rockchip_drm_fb *rockchip_fb; 179 struct rockchip_drm_fb *rockchip_fb;
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
index 09574d48226f..2fe47f1ee98f 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
@@ -17,7 +17,7 @@
17 17
18struct drm_framebuffer * 18struct drm_framebuffer *
19rockchip_drm_framebuffer_init(struct drm_device *dev, 19rockchip_drm_framebuffer_init(struct drm_device *dev,
20 struct drm_mode_fb_cmd2 *mode_cmd, 20 const struct drm_mode_fb_cmd2 *mode_cmd,
21 struct drm_gem_object *obj); 21 struct drm_gem_object *obj);
22void rockchip_drm_framebuffer_fini(struct drm_framebuffer *fb); 22void rockchip_drm_framebuffer_fini(struct drm_framebuffer *fb);
23 23
diff --git a/drivers/gpu/drm/shmobile/shmob_drm_kms.c b/drivers/gpu/drm/shmobile/shmob_drm_kms.c
index aaf98ace4a90..388a0fc13564 100644
--- a/drivers/gpu/drm/shmobile/shmob_drm_kms.c
+++ b/drivers/gpu/drm/shmobile/shmob_drm_kms.c
@@ -104,7 +104,7 @@ const struct shmob_drm_format_info *shmob_drm_format_info(u32 fourcc)
104 104
105static struct drm_framebuffer * 105static struct drm_framebuffer *
106shmob_drm_fb_create(struct drm_device *dev, struct drm_file *file_priv, 106shmob_drm_fb_create(struct drm_device *dev, struct drm_file *file_priv,
107 struct drm_mode_fb_cmd2 *mode_cmd) 107 const struct drm_mode_fb_cmd2 *mode_cmd)
108{ 108{
109 const struct shmob_drm_format_info *format; 109 const struct shmob_drm_format_info *format;
110 110
diff --git a/drivers/gpu/drm/tegra/Kconfig b/drivers/gpu/drm/tegra/Kconfig
index 74d9d621453d..63ebb154b9b5 100644
--- a/drivers/gpu/drm/tegra/Kconfig
+++ b/drivers/gpu/drm/tegra/Kconfig
@@ -16,18 +16,6 @@ config DRM_TEGRA
16 16
17if DRM_TEGRA 17if DRM_TEGRA
18 18
19config DRM_TEGRA_FBDEV
20 bool "Enable legacy fbdev support"
21 select DRM_KMS_FB_HELPER
22 select FB_SYS_FILLRECT
23 select FB_SYS_COPYAREA
24 select FB_SYS_IMAGEBLIT
25 default y
26 help
27 Choose this option if you have a need for the legacy fbdev support.
28 Note that this support also provides the Linux console on top of
29 the Tegra modesetting driver.
30
31config DRM_TEGRA_DEBUG 19config DRM_TEGRA_DEBUG
32 bool "NVIDIA Tegra DRM debug support" 20 bool "NVIDIA Tegra DRM debug support"
33 help 21 help
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index 159ef515cab1..e0f827790a5e 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -106,7 +106,7 @@ static int tegra_atomic_commit(struct drm_device *drm,
106 106
107static const struct drm_mode_config_funcs tegra_drm_mode_funcs = { 107static const struct drm_mode_config_funcs tegra_drm_mode_funcs = {
108 .fb_create = tegra_fb_create, 108 .fb_create = tegra_fb_create,
109#ifdef CONFIG_DRM_TEGRA_FBDEV 109#ifdef CONFIG_DRM_FBDEV_EMULATION
110 .output_poll_changed = tegra_fb_output_poll_changed, 110 .output_poll_changed = tegra_fb_output_poll_changed,
111#endif 111#endif
112 .atomic_check = drm_atomic_helper_check, 112 .atomic_check = drm_atomic_helper_check,
@@ -260,7 +260,7 @@ static void tegra_drm_context_free(struct tegra_drm_context *context)
260 260
261static void tegra_drm_lastclose(struct drm_device *drm) 261static void tegra_drm_lastclose(struct drm_device *drm)
262{ 262{
263#ifdef CONFIG_DRM_TEGRA_FBDEV 263#ifdef CONFIG_DRM_FBDEV_EMULATION
264 struct tegra_drm *tegra = drm->dev_private; 264 struct tegra_drm *tegra = drm->dev_private;
265 265
266 tegra_fbdev_restore_mode(tegra->fbdev); 266 tegra_fbdev_restore_mode(tegra->fbdev);
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index ec49275ffb24..d88a2d18c1a4 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -30,7 +30,7 @@ struct tegra_fb {
30 unsigned int num_planes; 30 unsigned int num_planes;
31}; 31};
32 32
33#ifdef CONFIG_DRM_TEGRA_FBDEV 33#ifdef CONFIG_DRM_FBDEV_EMULATION
34struct tegra_fbdev { 34struct tegra_fbdev {
35 struct drm_fb_helper base; 35 struct drm_fb_helper base;
36 struct tegra_fb *fb; 36 struct tegra_fb *fb;
@@ -46,7 +46,7 @@ struct tegra_drm {
46 struct mutex clients_lock; 46 struct mutex clients_lock;
47 struct list_head clients; 47 struct list_head clients;
48 48
49#ifdef CONFIG_DRM_TEGRA_FBDEV 49#ifdef CONFIG_DRM_FBDEV_EMULATION
50 struct tegra_fbdev *fbdev; 50 struct tegra_fbdev *fbdev;
51#endif 51#endif
52 52
@@ -268,12 +268,12 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
268 struct tegra_bo_tiling *tiling); 268 struct tegra_bo_tiling *tiling);
269struct drm_framebuffer *tegra_fb_create(struct drm_device *drm, 269struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
270 struct drm_file *file, 270 struct drm_file *file,
271 struct drm_mode_fb_cmd2 *cmd); 271 const struct drm_mode_fb_cmd2 *cmd);
272int tegra_drm_fb_prepare(struct drm_device *drm); 272int tegra_drm_fb_prepare(struct drm_device *drm);
273void tegra_drm_fb_free(struct drm_device *drm); 273void tegra_drm_fb_free(struct drm_device *drm);
274int tegra_drm_fb_init(struct drm_device *drm); 274int tegra_drm_fb_init(struct drm_device *drm);
275void tegra_drm_fb_exit(struct drm_device *drm); 275void tegra_drm_fb_exit(struct drm_device *drm);
276#ifdef CONFIG_DRM_TEGRA_FBDEV 276#ifdef CONFIG_DRM_FBDEV_EMULATION
277void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev); 277void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev);
278void tegra_fb_output_poll_changed(struct drm_device *drm); 278void tegra_fb_output_poll_changed(struct drm_device *drm);
279#endif 279#endif
diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
index 1004075fd088..ede9e94f3312 100644
--- a/drivers/gpu/drm/tegra/fb.c
+++ b/drivers/gpu/drm/tegra/fb.c
@@ -18,7 +18,7 @@ static inline struct tegra_fb *to_tegra_fb(struct drm_framebuffer *fb)
18 return container_of(fb, struct tegra_fb, base); 18 return container_of(fb, struct tegra_fb, base);
19} 19}
20 20
21#ifdef CONFIG_DRM_TEGRA_FBDEV 21#ifdef CONFIG_DRM_FBDEV_EMULATION
22static inline struct tegra_fbdev *to_tegra_fbdev(struct drm_fb_helper *helper) 22static inline struct tegra_fbdev *to_tegra_fbdev(struct drm_fb_helper *helper)
23{ 23{
24 return container_of(helper, struct tegra_fbdev, base); 24 return container_of(helper, struct tegra_fbdev, base);
@@ -92,7 +92,7 @@ static struct drm_framebuffer_funcs tegra_fb_funcs = {
92}; 92};
93 93
94static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm, 94static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
95 struct drm_mode_fb_cmd2 *mode_cmd, 95 const struct drm_mode_fb_cmd2 *mode_cmd,
96 struct tegra_bo **planes, 96 struct tegra_bo **planes,
97 unsigned int num_planes) 97 unsigned int num_planes)
98{ 98{
@@ -131,7 +131,7 @@ static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
131 131
132struct drm_framebuffer *tegra_fb_create(struct drm_device *drm, 132struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
133 struct drm_file *file, 133 struct drm_file *file,
134 struct drm_mode_fb_cmd2 *cmd) 134 const struct drm_mode_fb_cmd2 *cmd)
135{ 135{
136 unsigned int hsub, vsub, i; 136 unsigned int hsub, vsub, i;
137 struct tegra_bo *planes[4]; 137 struct tegra_bo *planes[4];
@@ -181,7 +181,7 @@ unreference:
181 return ERR_PTR(err); 181 return ERR_PTR(err);
182} 182}
183 183
184#ifdef CONFIG_DRM_TEGRA_FBDEV 184#ifdef CONFIG_DRM_FBDEV_EMULATION
185static struct fb_ops tegra_fb_ops = { 185static struct fb_ops tegra_fb_ops = {
186 .owner = THIS_MODULE, 186 .owner = THIS_MODULE,
187 .fb_fillrect = drm_fb_helper_sys_fillrect, 187 .fb_fillrect = drm_fb_helper_sys_fillrect,
@@ -370,7 +370,7 @@ void tegra_fb_output_poll_changed(struct drm_device *drm)
370 370
371int tegra_drm_fb_prepare(struct drm_device *drm) 371int tegra_drm_fb_prepare(struct drm_device *drm)
372{ 372{
373#ifdef CONFIG_DRM_TEGRA_FBDEV 373#ifdef CONFIG_DRM_FBDEV_EMULATION
374 struct tegra_drm *tegra = drm->dev_private; 374 struct tegra_drm *tegra = drm->dev_private;
375 375
376 tegra->fbdev = tegra_fbdev_create(drm); 376 tegra->fbdev = tegra_fbdev_create(drm);
@@ -383,7 +383,7 @@ int tegra_drm_fb_prepare(struct drm_device *drm)
383 383
384void tegra_drm_fb_free(struct drm_device *drm) 384void tegra_drm_fb_free(struct drm_device *drm)
385{ 385{
386#ifdef CONFIG_DRM_TEGRA_FBDEV 386#ifdef CONFIG_DRM_FBDEV_EMULATION
387 struct tegra_drm *tegra = drm->dev_private; 387 struct tegra_drm *tegra = drm->dev_private;
388 388
389 tegra_fbdev_free(tegra->fbdev); 389 tegra_fbdev_free(tegra->fbdev);
@@ -392,7 +392,7 @@ void tegra_drm_fb_free(struct drm_device *drm)
392 392
393int tegra_drm_fb_init(struct drm_device *drm) 393int tegra_drm_fb_init(struct drm_device *drm)
394{ 394{
395#ifdef CONFIG_DRM_TEGRA_FBDEV 395#ifdef CONFIG_DRM_FBDEV_EMULATION
396 struct tegra_drm *tegra = drm->dev_private; 396 struct tegra_drm *tegra = drm->dev_private;
397 int err; 397 int err;
398 398
@@ -407,7 +407,7 @@ int tegra_drm_fb_init(struct drm_device *drm)
407 407
408void tegra_drm_fb_exit(struct drm_device *drm) 408void tegra_drm_fb_exit(struct drm_device *drm)
409{ 409{
410#ifdef CONFIG_DRM_TEGRA_FBDEV 410#ifdef CONFIG_DRM_FBDEV_EMULATION
411 struct tegra_drm *tegra = drm->dev_private; 411 struct tegra_drm *tegra = drm->dev_private;
412 412
413 tegra_fbdev_exit(tegra->fbdev); 413 tegra_fbdev_exit(tegra->fbdev);
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index 876cad58b1f9..4ddb21e7f52f 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
@@ -46,7 +46,7 @@ void tilcdc_module_cleanup(struct tilcdc_module *mod)
46static struct of_device_id tilcdc_of_match[]; 46static struct of_device_id tilcdc_of_match[];
47 47
48static struct drm_framebuffer *tilcdc_fb_create(struct drm_device *dev, 48static struct drm_framebuffer *tilcdc_fb_create(struct drm_device *dev,
49 struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd) 49 struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
50{ 50{
51 return drm_fb_cma_create(dev, file_priv, mode_cmd); 51 return drm_fb_cma_create(dev, file_priv, mode_cmd);
52} 52}
diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
index 80adbac82bde..4a064efcea58 100644
--- a/drivers/gpu/drm/udl/udl_drv.h
+++ b/drivers/gpu/drm/udl/udl_drv.h
@@ -108,7 +108,7 @@ void udl_fbdev_unplug(struct drm_device *dev);
108struct drm_framebuffer * 108struct drm_framebuffer *
109udl_fb_user_fb_create(struct drm_device *dev, 109udl_fb_user_fb_create(struct drm_device *dev,
110 struct drm_file *file, 110 struct drm_file *file,
111 struct drm_mode_fb_cmd2 *mode_cmd); 111 const struct drm_mode_fb_cmd2 *mode_cmd);
112 112
113int udl_render_hline(struct drm_device *dev, int bpp, struct urb **urb_ptr, 113int udl_render_hline(struct drm_device *dev, int bpp, struct urb **urb_ptr,
114 const char *front, char **urb_buf_ptr, 114 const char *front, char **urb_buf_ptr,
diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
index 62c7b1dafaa4..200419d4d43c 100644
--- a/drivers/gpu/drm/udl/udl_fb.c
+++ b/drivers/gpu/drm/udl/udl_fb.c
@@ -33,7 +33,6 @@ module_param(fb_defio, int, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
33struct udl_fbdev { 33struct udl_fbdev {
34 struct drm_fb_helper helper; 34 struct drm_fb_helper helper;
35 struct udl_framebuffer ufb; 35 struct udl_framebuffer ufb;
36 struct list_head fbdev_list;
37 int fb_count; 36 int fb_count;
38}; 37};
39 38
@@ -456,7 +455,7 @@ static const struct drm_framebuffer_funcs udlfb_funcs = {
456static int 455static int
457udl_framebuffer_init(struct drm_device *dev, 456udl_framebuffer_init(struct drm_device *dev,
458 struct udl_framebuffer *ufb, 457 struct udl_framebuffer *ufb,
459 struct drm_mode_fb_cmd2 *mode_cmd, 458 const struct drm_mode_fb_cmd2 *mode_cmd,
460 struct udl_gem_object *obj) 459 struct udl_gem_object *obj)
461{ 460{
462 int ret; 461 int ret;
@@ -624,7 +623,7 @@ void udl_fbdev_unplug(struct drm_device *dev)
624struct drm_framebuffer * 623struct drm_framebuffer *
625udl_fb_user_fb_create(struct drm_device *dev, 624udl_fb_user_fb_create(struct drm_device *dev,
626 struct drm_file *file, 625 struct drm_file *file,
627 struct drm_mode_fb_cmd2 *mode_cmd) 626 const struct drm_mode_fb_cmd2 *mode_cmd)
628{ 627{
629 struct drm_gem_object *obj; 628 struct drm_gem_object *obj;
630 struct udl_framebuffer *ufb; 629 struct udl_framebuffer *ufb;
diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c
index 578fe0a9324c..8e6044d7660a 100644
--- a/drivers/gpu/drm/virtio/virtgpu_display.c
+++ b/drivers/gpu/drm/virtio/virtgpu_display.c
@@ -215,7 +215,7 @@ static const struct drm_framebuffer_funcs virtio_gpu_fb_funcs = {
215int 215int
216virtio_gpu_framebuffer_init(struct drm_device *dev, 216virtio_gpu_framebuffer_init(struct drm_device *dev,
217 struct virtio_gpu_framebuffer *vgfb, 217 struct virtio_gpu_framebuffer *vgfb,
218 struct drm_mode_fb_cmd2 *mode_cmd, 218 const struct drm_mode_fb_cmd2 *mode_cmd,
219 struct drm_gem_object *obj) 219 struct drm_gem_object *obj)
220{ 220{
221 int ret; 221 int ret;
@@ -465,7 +465,7 @@ static int vgdev_output_init(struct virtio_gpu_device *vgdev, int index)
465static struct drm_framebuffer * 465static struct drm_framebuffer *
466virtio_gpu_user_framebuffer_create(struct drm_device *dev, 466virtio_gpu_user_framebuffer_create(struct drm_device *dev,
467 struct drm_file *file_priv, 467 struct drm_file *file_priv,
468 struct drm_mode_fb_cmd2 *mode_cmd) 468 const struct drm_mode_fb_cmd2 *mode_cmd)
469{ 469{
470 struct drm_gem_object *obj = NULL; 470 struct drm_gem_object *obj = NULL;
471 struct virtio_gpu_framebuffer *virtio_gpu_fb; 471 struct virtio_gpu_framebuffer *virtio_gpu_fb;
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 79f0abe69b64..8f486f4c7023 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -328,7 +328,7 @@ void virtio_gpu_dequeue_fence_func(struct work_struct *work);
328/* virtio_gpu_display.c */ 328/* virtio_gpu_display.c */
329int virtio_gpu_framebuffer_init(struct drm_device *dev, 329int virtio_gpu_framebuffer_init(struct drm_device *dev,
330 struct virtio_gpu_framebuffer *vgfb, 330 struct virtio_gpu_framebuffer *vgfb,
331 struct drm_mode_fb_cmd2 *mode_cmd, 331 const struct drm_mode_fb_cmd2 *mode_cmd,
332 struct drm_gem_object *obj); 332 struct drm_gem_object *obj);
333int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev); 333int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev);
334void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev); 334void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev);
diff --git a/drivers/gpu/drm/virtio/virtgpu_fb.c b/drivers/gpu/drm/virtio/virtgpu_fb.c
index 6a81e084593b..2242a80866a9 100644
--- a/drivers/gpu/drm/virtio/virtgpu_fb.c
+++ b/drivers/gpu/drm/virtio/virtgpu_fb.c
@@ -32,7 +32,6 @@
32struct virtio_gpu_fbdev { 32struct virtio_gpu_fbdev {
33 struct drm_fb_helper helper; 33 struct drm_fb_helper helper;
34 struct virtio_gpu_framebuffer vgfb; 34 struct virtio_gpu_framebuffer vgfb;
35 struct list_head fbdev_list;
36 struct virtio_gpu_device *vgdev; 35 struct virtio_gpu_device *vgdev;
37 struct delayed_work work; 36 struct delayed_work work;
38}; 37};
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index 9b4bb9e74d73..27652b08c2e4 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -968,7 +968,7 @@ vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
968 968
969static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev, 969static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
970 struct drm_file *file_priv, 970 struct drm_file *file_priv,
971 struct drm_mode_fb_cmd2 *mode_cmd2) 971 const struct drm_mode_fb_cmd2 *mode_cmd2)
972{ 972{
973 struct vmw_private *dev_priv = vmw_priv(dev); 973 struct vmw_private *dev_priv = vmw_priv(dev);
974 struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile; 974 struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 7e327309cf69..c2dd52ea4198 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -3405,7 +3405,9 @@ static int reset_intel_82599_sfp_virtfn(struct pci_dev *dev, int probe)
3405 return 0; 3405 return 0;
3406} 3406}
3407 3407
3408#include "../gpu/drm/i915/i915_reg.h" 3408#define SOUTH_CHICKEN2 0xc2004
3409#define PCH_PP_STATUS 0xc7200
3410#define PCH_PP_CONTROL 0xc7204
3409#define MSG_CTL 0x45010 3411#define MSG_CTL 0x45010
3410#define NSDE_PWR_STATE 0xd0100 3412#define NSDE_PWR_STATE 0xd0100
3411#define IGD_OPERATION_TIMEOUT 10000 /* set timeout 10 seconds */ 3413#define IGD_OPERATION_TIMEOUT 10000 /* set timeout 10 seconds */
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 0a271ca1f7c7..a8e01aaca087 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -349,6 +349,8 @@ struct drm_file {
349 struct list_head event_list; 349 struct list_head event_list;
350 int event_space; 350 int event_space;
351 351
352 struct mutex event_read_lock;
353
352 struct drm_prime_file_private prime; 354 struct drm_prime_file_private prime;
353}; 355};
354 356
@@ -1121,4 +1123,7 @@ static __inline__ bool drm_can_sleep(void)
1121 return true; 1123 return true;
1122} 1124}
1123 1125
1126/* helper for handling conditionals in various for_each macros */
1127#define for_each_if(condition) if (!(condition)) {} else
1128
1124#endif 1129#endif
diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
index 4b74c97d297a..d8576ac55693 100644
--- a/include/drm/drm_atomic.h
+++ b/include/drm/drm_atomic.h
@@ -149,7 +149,7 @@ int __must_check drm_atomic_async_commit(struct drm_atomic_state *state);
149 ((connector) = (state)->connectors[__i], \ 149 ((connector) = (state)->connectors[__i], \
150 (connector_state) = (state)->connector_states[__i], 1); \ 150 (connector_state) = (state)->connector_states[__i], 1); \
151 (__i)++) \ 151 (__i)++) \
152 if (connector) 152 for_each_if (connector)
153 153
154#define for_each_crtc_in_state(state, crtc, crtc_state, __i) \ 154#define for_each_crtc_in_state(state, crtc, crtc_state, __i) \
155 for ((__i) = 0; \ 155 for ((__i) = 0; \
@@ -157,7 +157,7 @@ int __must_check drm_atomic_async_commit(struct drm_atomic_state *state);
157 ((crtc) = (state)->crtcs[__i], \ 157 ((crtc) = (state)->crtcs[__i], \
158 (crtc_state) = (state)->crtc_states[__i], 1); \ 158 (crtc_state) = (state)->crtc_states[__i], 1); \
159 (__i)++) \ 159 (__i)++) \
160 if (crtc_state) 160 for_each_if (crtc_state)
161 161
162#define for_each_plane_in_state(state, plane, plane_state, __i) \ 162#define for_each_plane_in_state(state, plane, plane_state, __i) \
163 for ((__i) = 0; \ 163 for ((__i) = 0; \
@@ -165,7 +165,7 @@ int __must_check drm_atomic_async_commit(struct drm_atomic_state *state);
165 ((plane) = (state)->planes[__i], \ 165 ((plane) = (state)->planes[__i], \
166 (plane_state) = (state)->plane_states[__i], 1); \ 166 (plane_state) = (state)->plane_states[__i], 1); \
167 (__i)++) \ 167 (__i)++) \
168 if (plane_state) 168 for_each_if (plane_state)
169static inline bool 169static inline bool
170drm_atomic_crtc_needs_modeset(struct drm_crtc_state *state) 170drm_atomic_crtc_needs_modeset(struct drm_crtc_state *state)
171{ 171{
diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h
index 8cba54a2a0a0..a286cce98720 100644
--- a/include/drm/drm_atomic_helper.h
+++ b/include/drm/drm_atomic_helper.h
@@ -62,6 +62,8 @@ void drm_atomic_helper_commit_planes(struct drm_device *dev,
62void drm_atomic_helper_cleanup_planes(struct drm_device *dev, 62void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
63 struct drm_atomic_state *old_state); 63 struct drm_atomic_state *old_state);
64void drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state); 64void drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state);
65void drm_atomic_helper_disable_planes_on_crtc(struct drm_crtc *crtc,
66 bool atomic);
65 67
66void drm_atomic_helper_swap_state(struct drm_device *dev, 68void drm_atomic_helper_swap_state(struct drm_device *dev,
67 struct drm_atomic_state *state); 69 struct drm_atomic_state *state);
@@ -81,6 +83,12 @@ int drm_atomic_helper_set_config(struct drm_mode_set *set);
81int __drm_atomic_helper_set_config(struct drm_mode_set *set, 83int __drm_atomic_helper_set_config(struct drm_mode_set *set,
82 struct drm_atomic_state *state); 84 struct drm_atomic_state *state);
83 85
86int drm_atomic_helper_disable_all(struct drm_device *dev,
87 struct drm_modeset_acquire_ctx *ctx);
88struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev);
89int drm_atomic_helper_resume(struct drm_device *dev,
90 struct drm_atomic_state *state);
91
84int drm_atomic_helper_crtc_set_property(struct drm_crtc *crtc, 92int drm_atomic_helper_crtc_set_property(struct drm_crtc *crtc,
85 struct drm_property *property, 93 struct drm_property *property,
86 uint64_t val); 94 uint64_t val);
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 3f0c6909dda1..4765df331002 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -85,7 +85,11 @@ static inline uint64_t I642U64(int64_t val)
85 return (uint64_t)*((uint64_t *)&val); 85 return (uint64_t)*((uint64_t *)&val);
86} 86}
87 87
88/* rotation property bits */ 88/*
89 * Rotation property bits. DRM_ROTATE_<degrees> rotates the image by the
90 * specified amount in degrees in counter clockwise direction. DRM_REFLECT_X and
91 * DRM_REFLECT_Y reflects the image along the specified axis prior to rotation
92 */
89#define DRM_ROTATE_MASK 0x0f 93#define DRM_ROTATE_MASK 0x0f
90#define DRM_ROTATE_0 0 94#define DRM_ROTATE_0 0
91#define DRM_ROTATE_90 1 95#define DRM_ROTATE_90 1
@@ -992,7 +996,7 @@ struct drm_mode_set {
992struct drm_mode_config_funcs { 996struct drm_mode_config_funcs {
993 struct drm_framebuffer *(*fb_create)(struct drm_device *dev, 997 struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
994 struct drm_file *file_priv, 998 struct drm_file *file_priv,
995 struct drm_mode_fb_cmd2 *mode_cmd); 999 const struct drm_mode_fb_cmd2 *mode_cmd);
996 void (*output_poll_changed)(struct drm_device *dev); 1000 void (*output_poll_changed)(struct drm_device *dev);
997 1001
998 int (*atomic_check)(struct drm_device *dev, 1002 int (*atomic_check)(struct drm_device *dev,
@@ -1166,7 +1170,7 @@ struct drm_mode_config {
1166 */ 1170 */
1167#define drm_for_each_plane_mask(plane, dev, plane_mask) \ 1171#define drm_for_each_plane_mask(plane, dev, plane_mask) \
1168 list_for_each_entry((plane), &(dev)->mode_config.plane_list, head) \ 1172 list_for_each_entry((plane), &(dev)->mode_config.plane_list, head) \
1169 if ((plane_mask) & (1 << drm_plane_index(plane))) 1173 for_each_if ((plane_mask) & (1 << drm_plane_index(plane)))
1170 1174
1171 1175
1172#define obj_to_crtc(x) container_of(x, struct drm_crtc, base) 1176#define obj_to_crtc(x) container_of(x, struct drm_crtc, base)
@@ -1543,7 +1547,7 @@ static inline struct drm_property *drm_property_find(struct drm_device *dev,
1543/* Plane list iterator for legacy (overlay only) planes. */ 1547/* Plane list iterator for legacy (overlay only) planes. */
1544#define drm_for_each_legacy_plane(plane, dev) \ 1548#define drm_for_each_legacy_plane(plane, dev) \
1545 list_for_each_entry(plane, &(dev)->mode_config.plane_list, head) \ 1549 list_for_each_entry(plane, &(dev)->mode_config.plane_list, head) \
1546 if (plane->type == DRM_PLANE_TYPE_OVERLAY) 1550 for_each_if (plane->type == DRM_PLANE_TYPE_OVERLAY)
1547 1551
1548#define drm_for_each_plane(plane, dev) \ 1552#define drm_for_each_plane(plane, dev) \
1549 list_for_each_entry(plane, &(dev)->mode_config.plane_list, head) 1553 list_for_each_entry(plane, &(dev)->mode_config.plane_list, head)
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
index 3febb4b9fce9..e22ab29d2d00 100644
--- a/include/drm/drm_crtc_helper.h
+++ b/include/drm/drm_crtc_helper.h
@@ -197,7 +197,7 @@ extern int drm_helper_connector_dpms(struct drm_connector *connector, int mode);
197extern void drm_helper_move_panel_connectors_to_head(struct drm_device *); 197extern void drm_helper_move_panel_connectors_to_head(struct drm_device *);
198 198
199extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, 199extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
200 struct drm_mode_fb_cmd2 *mode_cmd); 200 const struct drm_mode_fb_cmd2 *mode_cmd);
201 201
202static inline void drm_crtc_helper_add(struct drm_crtc *crtc, 202static inline void drm_crtc_helper_add(struct drm_crtc *crtc,
203 const struct drm_crtc_helper_funcs *funcs) 203 const struct drm_crtc_helper_funcs *funcs)
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
index bb9d0deca07c..1252108da0ef 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -455,16 +455,52 @@
455# define DP_EDP_14 0x03 455# define DP_EDP_14 0x03
456 456
457#define DP_EDP_GENERAL_CAP_1 0x701 457#define DP_EDP_GENERAL_CAP_1 0x701
458# define DP_EDP_TCON_BACKLIGHT_ADJUSTMENT_CAP (1 << 0)
459# define DP_EDP_BACKLIGHT_PIN_ENABLE_CAP (1 << 1)
460# define DP_EDP_BACKLIGHT_AUX_ENABLE_CAP (1 << 2)
461# define DP_EDP_PANEL_SELF_TEST_PIN_ENABLE_CAP (1 << 3)
462# define DP_EDP_PANEL_SELF_TEST_AUX_ENABLE_CAP (1 << 4)
463# define DP_EDP_FRC_ENABLE_CAP (1 << 5)
464# define DP_EDP_COLOR_ENGINE_CAP (1 << 6)
465# define DP_EDP_SET_POWER_CAP (1 << 7)
458 466
459#define DP_EDP_BACKLIGHT_ADJUSTMENT_CAP 0x702 467#define DP_EDP_BACKLIGHT_ADJUSTMENT_CAP 0x702
468# define DP_EDP_BACKLIGHT_BRIGHTNESS_PWM_PIN_CAP (1 << 0)
469# define DP_EDP_BACKLIGHT_BRIGHTNESS_AUX_SET_CAP (1 << 1)
470# define DP_EDP_BACKLIGHT_BRIGHTNESS_BYTE_COUNT (1 << 2)
471# define DP_EDP_BACKLIGHT_AUX_PWM_PRODUCT_CAP (1 << 3)
472# define DP_EDP_BACKLIGHT_FREQ_PWM_PIN_PASSTHRU_CAP (1 << 4)
473# define DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP (1 << 5)
474# define DP_EDP_DYNAMIC_BACKLIGHT_CAP (1 << 6)
475# define DP_EDP_VBLANK_BACKLIGHT_UPDATE_CAP (1 << 7)
460 476
461#define DP_EDP_GENERAL_CAP_2 0x703 477#define DP_EDP_GENERAL_CAP_2 0x703
478# define DP_EDP_OVERDRIVE_ENGINE_ENABLED (1 << 0)
462 479
463#define DP_EDP_GENERAL_CAP_3 0x704 /* eDP 1.4 */ 480#define DP_EDP_GENERAL_CAP_3 0x704 /* eDP 1.4 */
481# define DP_EDP_X_REGION_CAP_MASK (0xf << 0)
482# define DP_EDP_X_REGION_CAP_SHIFT 0
483# define DP_EDP_Y_REGION_CAP_MASK (0xf << 4)
484# define DP_EDP_Y_REGION_CAP_SHIFT 4
464 485
465#define DP_EDP_DISPLAY_CONTROL_REGISTER 0x720 486#define DP_EDP_DISPLAY_CONTROL_REGISTER 0x720
487# define DP_EDP_BACKLIGHT_ENABLE (1 << 0)
488# define DP_EDP_BLACK_VIDEO_ENABLE (1 << 1)
489# define DP_EDP_FRC_ENABLE (1 << 2)
490# define DP_EDP_COLOR_ENGINE_ENABLE (1 << 3)
491# define DP_EDP_VBLANK_BACKLIGHT_UPDATE_ENABLE (1 << 7)
466 492
467#define DP_EDP_BACKLIGHT_MODE_SET_REGISTER 0x721 493#define DP_EDP_BACKLIGHT_MODE_SET_REGISTER 0x721
494# define DP_EDP_BACKLIGHT_CONTROL_MODE_MASK (3 << 0)
495# define DP_EDP_BACKLIGHT_CONTROL_MODE_PWM (0 << 0)
496# define DP_EDP_BACKLIGHT_CONTROL_MODE_PRESET (1 << 0)
497# define DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD (2 << 0)
498# define DP_EDP_BACKLIGHT_CONTROL_MODE_PRODUCT (3 << 0)
499# define DP_EDP_BACKLIGHT_FREQ_PWM_PIN_PASSTHRU_ENABLE (1 << 2)
500# define DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE (1 << 3)
501# define DP_EDP_DYNAMIC_BACKLIGHT_ENABLE (1 << 4)
502# define DP_EDP_REGIONAL_BACKLIGHT_ENABLE (1 << 5)
503# define DP_EDP_UPDATE_REGION_BRIGHTNESS (1 << 6) /* eDP 1.4 */
468 504
469#define DP_EDP_BACKLIGHT_BRIGHTNESS_MSB 0x722 505#define DP_EDP_BACKLIGHT_BRIGHTNESS_MSB 0x722
470#define DP_EDP_BACKLIGHT_BRIGHTNESS_LSB 0x723 506#define DP_EDP_BACKLIGHT_BRIGHTNESS_LSB 0x723
diff --git a/include/drm/drm_fb_cma_helper.h b/include/drm/drm_fb_cma_helper.h
index c54cf3d4a03f..be62bd321e75 100644
--- a/include/drm/drm_fb_cma_helper.h
+++ b/include/drm/drm_fb_cma_helper.h
@@ -18,7 +18,7 @@ void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma);
18void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma); 18void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma);
19 19
20struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev, 20struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
21 struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd); 21 struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd);
22 22
23struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb, 23struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,
24 unsigned int plane); 24 unsigned int plane);
diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
index 15e7f007380f..0b3e11ab8757 100644
--- a/include/drm/drm_gem.h
+++ b/include/drm/drm_gem.h
@@ -35,76 +35,129 @@
35 */ 35 */
36 36
37/** 37/**
38 * This structure defines the drm_mm memory object, which will be used by the 38 * struct drm_gem_object - GEM buffer object
39 * DRM for its buffer objects. 39 *
40 * This structure defines the generic parts for GEM buffer objects, which are
41 * mostly around handling mmap and userspace handles.
42 *
43 * Buffer objects are often abbreviated to BO.
40 */ 44 */
41struct drm_gem_object { 45struct drm_gem_object {
42 /** Reference count of this object */ 46 /**
47 * @refcount:
48 *
49 * Reference count of this object
50 *
51 * Please use drm_gem_object_reference() to acquire and
52 * drm_gem_object_unreference() or drm_gem_object_unreference_unlocked()
53 * to release a reference to a GEM buffer object.
54 */
43 struct kref refcount; 55 struct kref refcount;
44 56
45 /** 57 /**
46 * handle_count - gem file_priv handle count of this object 58 * @handle_count:
59 *
60 * This is the GEM file_priv handle count of this object.
47 * 61 *
48 * Each handle also holds a reference. Note that when the handle_count 62 * Each handle also holds a reference. Note that when the handle_count
49 * drops to 0 any global names (e.g. the id in the flink namespace) will 63 * drops to 0 any global names (e.g. the id in the flink namespace) will
50 * be cleared. 64 * be cleared.
51 * 65 *
52 * Protected by dev->object_name_lock. 66 * Protected by dev->object_name_lock.
53 * */ 67 */
54 unsigned handle_count; 68 unsigned handle_count;
55 69
56 /** Related drm device */ 70 /**
71 * @dev: DRM dev this object belongs to.
72 */
57 struct drm_device *dev; 73 struct drm_device *dev;
58 74
59 /** File representing the shmem storage */ 75 /**
76 * @filp:
77 *
78 * SHMEM file node used as backing storage for swappable buffer objects.
79 * GEM also supports driver private objects with driver-specific backing
80 * storage (contiguous CMA memory, special reserved blocks). In this
81 * case @filp is NULL.
82 */
60 struct file *filp; 83 struct file *filp;
61 84
62 /* Mapping info for this object */ 85 /**
86 * @vma_node:
87 *
88 * Mapping info for this object to support mmap. Drivers are supposed to
89 * allocate the mmap offset using drm_gem_create_mmap_offset(). The
90 * offset itself can be retrieved using drm_vma_node_offset_addr().
91 *
92 * Memory mapping itself is handled by drm_gem_mmap(), which also checks
93 * that userspace is allowed to access the object.
94 */
63 struct drm_vma_offset_node vma_node; 95 struct drm_vma_offset_node vma_node;
64 96
65 /** 97 /**
98 * @size:
99 *
66 * Size of the object, in bytes. Immutable over the object's 100 * Size of the object, in bytes. Immutable over the object's
67 * lifetime. 101 * lifetime.
68 */ 102 */
69 size_t size; 103 size_t size;
70 104
71 /** 105 /**
106 * @name:
107 *
72 * Global name for this object, starts at 1. 0 means unnamed. 108 * Global name for this object, starts at 1. 0 means unnamed.
73 * Access is covered by the object_name_lock in the related drm_device 109 * Access is covered by dev->object_name_lock. This is used by the GEM_FLINK
110 * and GEM_OPEN ioctls.
74 */ 111 */
75 int name; 112 int name;
76 113
77 /** 114 /**
78 * Memory domains. These monitor which caches contain read/write data 115 * @read_domains:
116 *
117 * Read memory domains. These monitor which caches contain read/write data
79 * related to the object. When transitioning from one set of domains 118 * related to the object. When transitioning from one set of domains
80 * to another, the driver is called to ensure that caches are suitably 119 * to another, the driver is called to ensure that caches are suitably
81 * flushed and invalidated 120 * flushed and invalidated.
82 */ 121 */
83 uint32_t read_domains; 122 uint32_t read_domains;
123
124 /**
125 * @write_domain: Corresponding unique write memory domain.
126 */
84 uint32_t write_domain; 127 uint32_t write_domain;
85 128
86 /** 129 /**
130 * @pending_read_domains:
131 *
87 * While validating an exec operation, the 132 * While validating an exec operation, the
88 * new read/write domain values are computed here. 133 * new read/write domain values are computed here.
89 * They will be transferred to the above values 134 * They will be transferred to the above values
90 * at the point that any cache flushing occurs 135 * at the point that any cache flushing occurs
91 */ 136 */
92 uint32_t pending_read_domains; 137 uint32_t pending_read_domains;
138
139 /**
140 * @pending_write_domain: Write domain similar to @pending_read_domains.
141 */
93 uint32_t pending_write_domain; 142 uint32_t pending_write_domain;
94 143
95 /** 144 /**
96 * dma_buf - dma buf associated with this GEM object 145 * @dma_buf:
146 *
147 * dma-buf associated with this GEM object.
97 * 148 *
98 * Pointer to the dma-buf associated with this gem object (either 149 * Pointer to the dma-buf associated with this gem object (either
99 * through importing or exporting). We break the resulting reference 150 * through importing or exporting). We break the resulting reference
100 * loop when the last gem handle for this object is released. 151 * loop when the last gem handle for this object is released.
101 * 152 *
102 * Protected by obj->object_name_lock 153 * Protected by obj->object_name_lock.
103 */ 154 */
104 struct dma_buf *dma_buf; 155 struct dma_buf *dma_buf;
105 156
106 /** 157 /**
107 * import_attach - dma buf attachment backing this object 158 * @import_attach:
159 *
160 * dma-buf attachment backing this object.
108 * 161 *
109 * Any foreign dma_buf imported as a gem object has this set to the 162 * Any foreign dma_buf imported as a gem object has this set to the
110 * attachment point for the device. This is invariant over the lifetime 163 * attachment point for the device. This is invariant over the lifetime
@@ -133,12 +186,30 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
133 struct vm_area_struct *vma); 186 struct vm_area_struct *vma);
134int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); 187int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
135 188
189/**
190 * drm_gem_object_reference - acquire a GEM BO reference
191 * @obj: GEM buffer object
192 *
193 * This acquires additional reference to @obj. It is illegal to call this
194 * without already holding a reference. No locks required.
195 */
136static inline void 196static inline void
137drm_gem_object_reference(struct drm_gem_object *obj) 197drm_gem_object_reference(struct drm_gem_object *obj)
138{ 198{
139 kref_get(&obj->refcount); 199 kref_get(&obj->refcount);
140} 200}
141 201
202/**
203 * drm_gem_object_unreference - release a GEM BO reference
204 * @obj: GEM buffer object
205 *
206 * This releases a reference to @obj. Callers must hold the dev->struct_mutex
207 * lock when calling this function, even when the driver doesn't use
208 * dev->struct_mutex for anything.
209 *
210 * For drivers not encumbered with legacy locking use
211 * drm_gem_object_unreference_unlocked() instead.
212 */
142static inline void 213static inline void
143drm_gem_object_unreference(struct drm_gem_object *obj) 214drm_gem_object_unreference(struct drm_gem_object *obj)
144{ 215{
@@ -149,6 +220,13 @@ drm_gem_object_unreference(struct drm_gem_object *obj)
149 } 220 }
150} 221}
151 222
223/**
224 * drm_gem_object_unreference_unlocked - release a GEM BO reference
225 * @obj: GEM buffer object
226 *
227 * This releases a reference to @obj. Callers must not hold the
228 * dev->struct_mutex lock when calling this function.
229 */
152static inline void 230static inline void
153drm_gem_object_unreference_unlocked(struct drm_gem_object *obj) 231drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
154{ 232{
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h
index 0de6290df4da..fc65118e5077 100644
--- a/include/drm/drm_mm.h
+++ b/include/drm/drm_mm.h
@@ -148,8 +148,7 @@ static inline u64 drm_mm_hole_node_start(struct drm_mm_node *hole_node)
148 148
149static inline u64 __drm_mm_hole_node_end(struct drm_mm_node *hole_node) 149static inline u64 __drm_mm_hole_node_end(struct drm_mm_node *hole_node)
150{ 150{
151 return list_entry(hole_node->node_list.next, 151 return list_next_entry(hole_node, node_list)->start;
152 struct drm_mm_node, node_list)->start;
153} 152}
154 153
155/** 154/**
@@ -180,6 +179,14 @@ static inline u64 drm_mm_hole_node_end(struct drm_mm_node *hole_node)
180 &(mm)->head_node.node_list, \ 179 &(mm)->head_node.node_list, \
181 node_list) 180 node_list)
182 181
182#define __drm_mm_for_each_hole(entry, mm, hole_start, hole_end, backwards) \
183 for (entry = list_entry((backwards) ? (mm)->hole_stack.prev : (mm)->hole_stack.next, struct drm_mm_node, hole_stack); \
184 &entry->hole_stack != &(mm)->hole_stack ? \
185 hole_start = drm_mm_hole_node_start(entry), \
186 hole_end = drm_mm_hole_node_end(entry), \
187 1 : 0; \
188 entry = list_entry((backwards) ? entry->hole_stack.prev : entry->hole_stack.next, struct drm_mm_node, hole_stack))
189
183/** 190/**
184 * drm_mm_for_each_hole - iterator to walk over all holes 191 * drm_mm_for_each_hole - iterator to walk over all holes
185 * @entry: drm_mm_node used internally to track progress 192 * @entry: drm_mm_node used internally to track progress
@@ -200,20 +207,7 @@ static inline u64 drm_mm_hole_node_end(struct drm_mm_node *hole_node)
200 * going backwards. 207 * going backwards.
201 */ 208 */
202#define drm_mm_for_each_hole(entry, mm, hole_start, hole_end) \ 209#define drm_mm_for_each_hole(entry, mm, hole_start, hole_end) \
203 for (entry = list_entry((mm)->hole_stack.next, struct drm_mm_node, hole_stack); \ 210 __drm_mm_for_each_hole(entry, mm, hole_start, hole_end, 0)
204 &entry->hole_stack != &(mm)->hole_stack ? \
205 hole_start = drm_mm_hole_node_start(entry), \
206 hole_end = drm_mm_hole_node_end(entry), \
207 1 : 0; \
208 entry = list_entry(entry->hole_stack.next, struct drm_mm_node, hole_stack))
209
210#define __drm_mm_for_each_hole(entry, mm, hole_start, hole_end, backwards) \
211 for (entry = list_entry((backwards) ? (mm)->hole_stack.prev : (mm)->hole_stack.next, struct drm_mm_node, hole_stack); \
212 &entry->hole_stack != &(mm)->hole_stack ? \
213 hole_start = drm_mm_hole_node_start(entry), \
214 hole_end = drm_mm_hole_node_end(entry), \
215 1 : 0; \
216 entry = list_entry((backwards) ? entry->hole_stack.prev : entry->hole_stack.next, struct drm_mm_node, hole_stack))
217 211
218/* 212/*
219 * Basic range manager support (drm_mm.c) 213 * Basic range manager support (drm_mm.c)
diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h
index 08a8cac9e555..f9115aee43f4 100644
--- a/include/drm/drm_modes.h
+++ b/include/drm/drm_modes.h
@@ -222,6 +222,8 @@ struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
222 const struct drm_display_mode *mode); 222 const struct drm_display_mode *mode);
223bool drm_mode_equal(const struct drm_display_mode *mode1, 223bool drm_mode_equal(const struct drm_display_mode *mode1,
224 const struct drm_display_mode *mode2); 224 const struct drm_display_mode *mode2);
225bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1,
226 const struct drm_display_mode *mode2);
225bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, 227bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1,
226 const struct drm_display_mode *mode2); 228 const struct drm_display_mode *mode2);
227 229
diff --git a/include/drm/drm_modeset_lock.h b/include/drm/drm_modeset_lock.h
index 94938d89347c..c5576fbcb909 100644
--- a/include/drm/drm_modeset_lock.h
+++ b/include/drm/drm_modeset_lock.h
@@ -138,7 +138,7 @@ void drm_warn_on_modeset_not_all_locked(struct drm_device *dev);
138struct drm_modeset_acquire_ctx * 138struct drm_modeset_acquire_ctx *
139drm_modeset_legacy_acquire_ctx(struct drm_crtc *crtc); 139drm_modeset_legacy_acquire_ctx(struct drm_crtc *crtc);
140 140
141int drm_modeset_lock_all_crtcs(struct drm_device *dev, 141int drm_modeset_lock_all_ctx(struct drm_device *dev,
142 struct drm_modeset_acquire_ctx *ctx); 142 struct drm_modeset_acquire_ctx *ctx);
143 143
144#endif /* DRM_MODESET_LOCK_H_ */ 144#endif /* DRM_MODESET_LOCK_H_ */
diff --git a/include/drm/drm_rect.h b/include/drm/drm_rect.h
index 26bb55e9e8b6..83bb156d4356 100644
--- a/include/drm/drm_rect.h
+++ b/include/drm/drm_rect.h
@@ -162,7 +162,8 @@ int drm_rect_calc_hscale_relaxed(struct drm_rect *src,
162int drm_rect_calc_vscale_relaxed(struct drm_rect *src, 162int drm_rect_calc_vscale_relaxed(struct drm_rect *src,
163 struct drm_rect *dst, 163 struct drm_rect *dst,
164 int min_vscale, int max_vscale); 164 int min_vscale, int max_vscale);
165void drm_rect_debug_print(const struct drm_rect *r, bool fixed_point); 165void drm_rect_debug_print(const char *prefix,
166 const struct drm_rect *r, bool fixed_point);
166void drm_rect_rotate(struct drm_rect *r, 167void drm_rect_rotate(struct drm_rect *r,
167 int width, int height, 168 int width, int height,
168 unsigned int rotation); 169 unsigned int rotation);
diff --git a/include/drm/i915_component.h b/include/drm/i915_component.h
index 30d89e0da2c6..b46fa0ef3005 100644
--- a/include/drm/i915_component.h
+++ b/include/drm/i915_component.h
@@ -31,47 +31,94 @@
31#define MAX_PORTS 5 31#define MAX_PORTS 5
32 32
33/** 33/**
34 * struct i915_audio_component_ops - callbacks defined in gfx driver 34 * struct i915_audio_component_ops - Ops implemented by i915 driver, called by hda driver
35 * @owner: the module owner
36 * @get_power: get the POWER_DOMAIN_AUDIO power well
37 * @put_power: put the POWER_DOMAIN_AUDIO power well
38 * @codec_wake_override: Enable/Disable generating the codec wake signal
39 * @get_cdclk_freq: get the Core Display Clock in KHz
40 * @sync_audio_rate: set n/cts based on the sample rate
41 */ 35 */
42struct i915_audio_component_ops { 36struct i915_audio_component_ops {
37 /**
38 * @owner: i915 module
39 */
43 struct module *owner; 40 struct module *owner;
41 /**
42 * @get_power: get the POWER_DOMAIN_AUDIO power well
43 *
44 * Request the power well to be turned on.
45 */
44 void (*get_power)(struct device *); 46 void (*get_power)(struct device *);
47 /**
48 * @put_power: put the POWER_DOMAIN_AUDIO power well
49 *
50 * Allow the power well to be turned off.
51 */
45 void (*put_power)(struct device *); 52 void (*put_power)(struct device *);
53 /**
54 * @codec_wake_override: Enable/disable codec wake signal
55 */
46 void (*codec_wake_override)(struct device *, bool enable); 56 void (*codec_wake_override)(struct device *, bool enable);
57 /**
58 * @get_cdclk_freq: Get the Core Display Clock in kHz
59 */
47 int (*get_cdclk_freq)(struct device *); 60 int (*get_cdclk_freq)(struct device *);
61 /**
62 * @sync_audio_rate: set n/cts based on the sample rate
63 *
64 * Called from audio driver. After audio driver sets the
65 * sample rate, it will call this function to set n/cts
66 */
48 int (*sync_audio_rate)(struct device *, int port, int rate); 67 int (*sync_audio_rate)(struct device *, int port, int rate);
68 /**
69 * @get_eld: fill the audio state and ELD bytes for the given port
70 *
71 * Called from audio driver to get the HDMI/DP audio state of the given
72 * digital port, and also fetch ELD bytes to the given pointer.
73 *
74 * It returns the byte size of the original ELD (not the actually
75 * copied size), zero for an invalid ELD, or a negative error code.
76 *
77 * Note that the returned size may be over @max_bytes. Then it
78 * implies that only a part of ELD has been copied to the buffer.
79 */
80 int (*get_eld)(struct device *, int port, bool *enabled,
81 unsigned char *buf, int max_bytes);
49}; 82};
50 83
84/**
85 * struct i915_audio_component_audio_ops - Ops implemented by hda driver, called by i915 driver
86 */
51struct i915_audio_component_audio_ops { 87struct i915_audio_component_audio_ops {
88 /**
89 * @audio_ptr: Pointer to be used in call to pin_eld_notify
90 */
52 void *audio_ptr; 91 void *audio_ptr;
53 /** 92 /**
54 * Call from i915 driver, notifying the HDA driver that 93 * @pin_eld_notify: Notify the HDA driver that pin sense and/or ELD information has changed
55 * pin sense and/or ELD information has changed. 94 *
56 * @audio_ptr: HDA driver object 95 * Called when the i915 driver has set up audio pipeline or has just
57 * @port: Which port has changed (PORTA / PORTB / PORTC etc) 96 * begun to tear it down. This allows the HDA driver to update its
97 * status accordingly (even when the HDA controller is in power save
98 * mode).
58 */ 99 */
59 void (*pin_eld_notify)(void *audio_ptr, int port); 100 void (*pin_eld_notify)(void *audio_ptr, int port);
60}; 101};
61 102
62/** 103/**
63 * struct i915_audio_component - used for audio video interaction 104 * struct i915_audio_component - Used for direct communication between i915 and hda drivers
64 * @dev: the device from gfx driver
65 * @aud_sample_rate: the array of audio sample rate per port
66 * @ops: callback for audio driver calling
67 * @audio_ops: Call from i915 driver
68 */ 105 */
69struct i915_audio_component { 106struct i915_audio_component {
107 /**
108 * @dev: i915 device, used as parameter for ops
109 */
70 struct device *dev; 110 struct device *dev;
111 /**
112 * @aud_sample_rate: the array of audio sample rate per port
113 */
71 int aud_sample_rate[MAX_PORTS]; 114 int aud_sample_rate[MAX_PORTS];
72 115 /**
116 * @ops: Ops implemented by i915 driver, called by hda driver
117 */
73 const struct i915_audio_component_ops *ops; 118 const struct i915_audio_component_ops *ops;
74 119 /**
120 * @audio_ops: Ops implemented by hda driver, called by i915 driver
121 */
75 const struct i915_audio_component_audio_ops *audio_ops; 122 const struct i915_audio_component_audio_ops *audio_ops;
76}; 123};
77 124
diff --git a/include/drm/i915_pciids.h b/include/drm/i915_pciids.h
index 17c445612e01..f1a113e35f98 100644
--- a/include/drm/i915_pciids.h
+++ b/include/drm/i915_pciids.h
@@ -291,4 +291,40 @@
291 INTEL_VGA_DEVICE(0x1A84, info), \ 291 INTEL_VGA_DEVICE(0x1A84, info), \
292 INTEL_VGA_DEVICE(0x5A84, info) 292 INTEL_VGA_DEVICE(0x5A84, info)
293 293
294#define INTEL_KBL_GT1_IDS(info) \
295 INTEL_VGA_DEVICE(0x5913, info), /* ULT GT1.5 */ \
296 INTEL_VGA_DEVICE(0x5915, info), /* ULX GT1.5 */ \
297 INTEL_VGA_DEVICE(0x5917, info), /* DT GT1.5 */ \
298 INTEL_VGA_DEVICE(0x5906, info), /* ULT GT1 */ \
299 INTEL_VGA_DEVICE(0x590E, info), /* ULX GT1 */ \
300 INTEL_VGA_DEVICE(0x5902, info), /* DT GT1 */ \
301 INTEL_VGA_DEVICE(0x590B, info), /* Halo GT1 */ \
302 INTEL_VGA_DEVICE(0x590A, info) /* SRV GT1 */
303
304#define INTEL_KBL_GT2_IDS(info) \
305 INTEL_VGA_DEVICE(0x5916, info), /* ULT GT2 */ \
306 INTEL_VGA_DEVICE(0x5921, info), /* ULT GT2F */ \
307 INTEL_VGA_DEVICE(0x591E, info), /* ULX GT2 */ \
308 INTEL_VGA_DEVICE(0x5912, info), /* DT GT2 */ \
309 INTEL_VGA_DEVICE(0x591B, info), /* Halo GT2 */ \
310 INTEL_VGA_DEVICE(0x591A, info), /* SRV GT2 */ \
311 INTEL_VGA_DEVICE(0x591D, info) /* WKS GT2 */
312
313#define INTEL_KBL_GT3_IDS(info) \
314 INTEL_VGA_DEVICE(0x5926, info), /* ULT GT3 */ \
315 INTEL_VGA_DEVICE(0x592B, info), /* Halo GT3 */ \
316 INTEL_VGA_DEVICE(0x592A, info) /* SRV GT3 */
317
318#define INTEL_KBL_GT4_IDS(info) \
319 INTEL_VGA_DEVICE(0x5932, info), /* DT GT4 */ \
320 INTEL_VGA_DEVICE(0x593B, info), /* Halo GT4 */ \
321 INTEL_VGA_DEVICE(0x593A, info), /* SRV GT4 */ \
322 INTEL_VGA_DEVICE(0x593D, info) /* WKS GT4 */
323
324#define INTEL_KBL_IDS(info) \
325 INTEL_KBL_GT1_IDS(info), \
326 INTEL_KBL_GT2_IDS(info), \
327 INTEL_KBL_GT3_IDS(info), \
328 INTEL_KBL_GT4_IDS(info)
329
294#endif /* _I915_PCIIDS_H */ 330#endif /* _I915_PCIIDS_H */
diff --git a/include/linux/platform_data/asoc-s3c.h b/include/linux/platform_data/asoc-s3c.h
index 5e0bc779e6c5..15bf56ee8af7 100644
--- a/include/linux/platform_data/asoc-s3c.h
+++ b/include/linux/platform_data/asoc-s3c.h
@@ -13,6 +13,9 @@
13 */ 13 */
14#define S3C64XX_AC97_GPD 0 14#define S3C64XX_AC97_GPD 0
15#define S3C64XX_AC97_GPE 1 15#define S3C64XX_AC97_GPE 1
16
17#include <linux/dmaengine.h>
18
16extern void s3c64xx_ac97_setup_gpio(int); 19extern void s3c64xx_ac97_setup_gpio(int);
17 20
18struct samsung_i2s { 21struct samsung_i2s {
@@ -39,6 +42,11 @@ struct samsung_i2s {
39 */ 42 */
40struct s3c_audio_pdata { 43struct s3c_audio_pdata {
41 int (*cfg_gpio)(struct platform_device *); 44 int (*cfg_gpio)(struct platform_device *);
45 dma_filter_fn dma_filter;
46 void *dma_playback;
47 void *dma_capture;
48 void *dma_play_sec;
49 void *dma_capture_mic;
42 union { 50 union {
43 struct samsung_i2s i2s; 51 struct samsung_i2s i2s;
44 } type; 52 } type;
diff --git a/include/sound/ac97_codec.h b/include/sound/ac97_codec.h
index 74bc85473b58..15aa5f07c955 100644
--- a/include/sound/ac97_codec.h
+++ b/include/sound/ac97_codec.h
@@ -417,11 +417,13 @@
417#define AC97_RATES_MIC_ADC 4 417#define AC97_RATES_MIC_ADC 4
418#define AC97_RATES_SPDIF 5 418#define AC97_RATES_SPDIF 5
419 419
420#define AC97_NUM_GPIOS 16
420/* 421/*
421 * 422 *
422 */ 423 */
423 424
424struct snd_ac97; 425struct snd_ac97;
426struct snd_ac97_gpio_priv;
425struct snd_pcm_chmap; 427struct snd_pcm_chmap;
426 428
427struct snd_ac97_build_ops { 429struct snd_ac97_build_ops {
@@ -529,6 +531,7 @@ struct snd_ac97 {
529 struct delayed_work power_work; 531 struct delayed_work power_work;
530#endif 532#endif
531 struct device dev; 533 struct device dev;
534 struct snd_ac97_gpio_priv *gpio_priv;
532 535
533 struct snd_pcm_chmap *chmaps[2]; /* channel-maps (optional) */ 536 struct snd_pcm_chmap *chmaps[2]; /* channel-maps (optional) */
534}; 537};
diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h
index fa1d05512c09..c0abcdc11470 100644
--- a/include/sound/compress_driver.h
+++ b/include/sound/compress_driver.h
@@ -152,13 +152,18 @@ struct snd_compr {
152 unsigned int direction; 152 unsigned int direction;
153 struct mutex lock; 153 struct mutex lock;
154 int device; 154 int device;
155#ifdef CONFIG_SND_VERBOSE_PROCFS
156 char id[64];
157 struct snd_info_entry *proc_root;
158 struct snd_info_entry *proc_info_entry;
159#endif
155}; 160};
156 161
157/* compress device register APIs */ 162/* compress device register APIs */
158int snd_compress_register(struct snd_compr *device); 163int snd_compress_register(struct snd_compr *device);
159int snd_compress_deregister(struct snd_compr *device); 164int snd_compress_deregister(struct snd_compr *device);
160int snd_compress_new(struct snd_card *card, int device, 165int snd_compress_new(struct snd_card *card, int device,
161 int type, struct snd_compr *compr); 166 int type, const char *id, struct snd_compr *compr);
162 167
163/* dsp driver callback apis 168/* dsp driver callback apis
164 * For playback: driver should call snd_compress_fragment_elapsed() to let the 169 * For playback: driver should call snd_compress_fragment_elapsed() to let the
diff --git a/include/sound/core.h b/include/sound/core.h
index cdfecafff0f4..31079ea5e484 100644
--- a/include/sound/core.h
+++ b/include/sound/core.h
@@ -99,6 +99,7 @@ struct snd_card {
99 char driver[16]; /* driver name */ 99 char driver[16]; /* driver name */
100 char shortname[32]; /* short name of this soundcard */ 100 char shortname[32]; /* short name of this soundcard */
101 char longname[80]; /* name of this soundcard */ 101 char longname[80]; /* name of this soundcard */
102 char irq_descr[32]; /* Interrupt description */
102 char mixername[80]; /* mixer name */ 103 char mixername[80]; /* mixer name */
103 char components[128]; /* card components delimited with 104 char components[128]; /* card components delimited with
104 space */ 105 space */
diff --git a/include/sound/da7218.h b/include/sound/da7218.h
new file mode 100644
index 000000000000..0dbb818ac116
--- /dev/null
+++ b/include/sound/da7218.h
@@ -0,0 +1,109 @@
1/*
2 * da7218.h - DA7218 ASoC Codec Driver Platform Data
3 *
4 * Copyright (c) 2015 Dialog Semiconductor
5 *
6 * Author: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 */
13
14#ifndef _DA7218_PDATA_H
15#define _DA7218_PDATA_H
16
17/* Mic Bias */
18enum da7218_micbias_voltage {
19 DA7218_MICBIAS_1_2V = -1,
20 DA7218_MICBIAS_1_6V,
21 DA7218_MICBIAS_1_8V,
22 DA7218_MICBIAS_2_0V,
23 DA7218_MICBIAS_2_2V,
24 DA7218_MICBIAS_2_4V,
25 DA7218_MICBIAS_2_6V,
26 DA7218_MICBIAS_2_8V,
27 DA7218_MICBIAS_3_0V,
28};
29
30enum da7218_mic_amp_in_sel {
31 DA7218_MIC_AMP_IN_SEL_DIFF = 0,
32 DA7218_MIC_AMP_IN_SEL_SE_P,
33 DA7218_MIC_AMP_IN_SEL_SE_N,
34};
35
36/* DMIC */
37enum da7218_dmic_data_sel {
38 DA7218_DMIC_DATA_LRISE_RFALL = 0,
39 DA7218_DMIC_DATA_LFALL_RRISE,
40};
41
42enum da7218_dmic_samplephase {
43 DA7218_DMIC_SAMPLE_ON_CLKEDGE = 0,
44 DA7218_DMIC_SAMPLE_BETWEEN_CLKEDGE,
45};
46
47enum da7218_dmic_clk_rate {
48 DA7218_DMIC_CLK_3_0MHZ = 0,
49 DA7218_DMIC_CLK_1_5MHZ,
50};
51
52/* Headphone Detect */
53enum da7218_hpldet_jack_rate {
54 DA7218_HPLDET_JACK_RATE_5US = 0,
55 DA7218_HPLDET_JACK_RATE_10US,
56 DA7218_HPLDET_JACK_RATE_20US,
57 DA7218_HPLDET_JACK_RATE_40US,
58 DA7218_HPLDET_JACK_RATE_80US,
59 DA7218_HPLDET_JACK_RATE_160US,
60 DA7218_HPLDET_JACK_RATE_320US,
61 DA7218_HPLDET_JACK_RATE_640US,
62};
63
64enum da7218_hpldet_jack_debounce {
65 DA7218_HPLDET_JACK_DEBOUNCE_OFF = 0,
66 DA7218_HPLDET_JACK_DEBOUNCE_2,
67 DA7218_HPLDET_JACK_DEBOUNCE_3,
68 DA7218_HPLDET_JACK_DEBOUNCE_4,
69};
70
71enum da7218_hpldet_jack_thr {
72 DA7218_HPLDET_JACK_THR_84PCT = 0,
73 DA7218_HPLDET_JACK_THR_88PCT,
74 DA7218_HPLDET_JACK_THR_92PCT,
75 DA7218_HPLDET_JACK_THR_96PCT,
76};
77
78struct da7218_hpldet_pdata {
79 enum da7218_hpldet_jack_rate jack_rate;
80 enum da7218_hpldet_jack_debounce jack_debounce;
81 enum da7218_hpldet_jack_thr jack_thr;
82 bool comp_inv;
83 bool hyst;
84 bool discharge;
85};
86
87struct da7218_pdata {
88 /* Mic */
89 enum da7218_micbias_voltage micbias1_lvl;
90 enum da7218_micbias_voltage micbias2_lvl;
91 enum da7218_mic_amp_in_sel mic1_amp_in_sel;
92 enum da7218_mic_amp_in_sel mic2_amp_in_sel;
93
94 /* DMIC */
95 enum da7218_dmic_data_sel dmic1_data_sel;
96 enum da7218_dmic_data_sel dmic2_data_sel;
97 enum da7218_dmic_samplephase dmic1_samplephase;
98 enum da7218_dmic_samplephase dmic2_samplephase;
99 enum da7218_dmic_clk_rate dmic1_clk_rate;
100 enum da7218_dmic_clk_rate dmic2_clk_rate;
101
102 /* HP Diff Supply - DA7217 only */
103 bool hp_diff_single_supply;
104
105 /* HP Detect - DA7218 only */
106 struct da7218_hpldet_pdata *hpldet_pdata;
107};
108
109#endif /* _DA7218_PDATA_H */
diff --git a/include/sound/da7219.h b/include/sound/da7219.h
index 3f39e135312d..02876acdc840 100644
--- a/include/sound/da7219.h
+++ b/include/sound/da7219.h
@@ -14,17 +14,10 @@
14#ifndef __DA7219_PDATA_H 14#ifndef __DA7219_PDATA_H
15#define __DA7219_PDATA_H 15#define __DA7219_PDATA_H
16 16
17/* LDO */
18enum da7219_ldo_lvl_sel {
19 DA7219_LDO_LVL_SEL_1_05V = 0,
20 DA7219_LDO_LVL_SEL_1_10V,
21 DA7219_LDO_LVL_SEL_1_20V,
22 DA7219_LDO_LVL_SEL_1_40V,
23};
24
25/* Mic Bias */ 17/* Mic Bias */
26enum da7219_micbias_voltage { 18enum da7219_micbias_voltage {
27 DA7219_MICBIAS_1_8V = 1, 19 DA7219_MICBIAS_1_6V = 0,
20 DA7219_MICBIAS_1_8V,
28 DA7219_MICBIAS_2_0V, 21 DA7219_MICBIAS_2_0V,
29 DA7219_MICBIAS_2_2V, 22 DA7219_MICBIAS_2_2V,
30 DA7219_MICBIAS_2_4V, 23 DA7219_MICBIAS_2_4V,
@@ -41,9 +34,6 @@ enum da7219_mic_amp_in_sel {
41struct da7219_aad_pdata; 34struct da7219_aad_pdata;
42 35
43struct da7219_pdata { 36struct da7219_pdata {
44 /* Internal LDO */
45 enum da7219_ldo_lvl_sel ldo_lvl_sel;
46
47 /* Mic */ 37 /* Mic */
48 enum da7219_micbias_voltage micbias_lvl; 38 enum da7219_micbias_voltage micbias_lvl;
49 enum da7219_mic_amp_in_sel mic_amp_in_sel; 39 enum da7219_mic_amp_in_sel mic_amp_in_sel;
diff --git a/include/sound/designware_i2s.h b/include/sound/designware_i2s.h
index 8966ba7c9629..5681855396c4 100644
--- a/include/sound/designware_i2s.h
+++ b/include/sound/designware_i2s.h
@@ -45,6 +45,12 @@ struct i2s_platform_data {
45 u32 snd_fmts; 45 u32 snd_fmts;
46 u32 snd_rates; 46 u32 snd_rates;
47 47
48 #define DW_I2S_QUIRK_COMP_REG_OFFSET (1 << 0)
49 #define DW_I2S_QUIRK_COMP_PARAM1 (1 << 1)
50 unsigned int quirks;
51 unsigned int i2s_reg_comp1;
52 unsigned int i2s_reg_comp2;
53
48 void *play_dma_data; 54 void *play_dma_data;
49 void *capture_dma_data; 55 void *capture_dma_data;
50 bool (*filter)(struct dma_chan *chan, void *slave); 56 bool (*filter)(struct dma_chan *chan, void *slave);
diff --git a/include/sound/hda_i915.h b/include/sound/hda_i915.h
index 930b41e5acf4..fa341fcb5829 100644
--- a/include/sound/hda_i915.h
+++ b/include/sound/hda_i915.h
@@ -10,6 +10,9 @@
10int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable); 10int snd_hdac_set_codec_wakeup(struct hdac_bus *bus, bool enable);
11int snd_hdac_display_power(struct hdac_bus *bus, bool enable); 11int snd_hdac_display_power(struct hdac_bus *bus, bool enable);
12int snd_hdac_get_display_clk(struct hdac_bus *bus); 12int snd_hdac_get_display_clk(struct hdac_bus *bus);
13int snd_hdac_sync_audio_rate(struct hdac_bus *bus, hda_nid_t nid, int rate);
14int snd_hdac_acomp_get_eld(struct hdac_bus *bus, hda_nid_t nid,
15 bool *audio_enabled, char *buffer, int max_bytes);
13int snd_hdac_i915_init(struct hdac_bus *bus); 16int snd_hdac_i915_init(struct hdac_bus *bus);
14int snd_hdac_i915_exit(struct hdac_bus *bus); 17int snd_hdac_i915_exit(struct hdac_bus *bus);
15int snd_hdac_i915_register_notifier(const struct i915_audio_component_audio_ops *); 18int snd_hdac_i915_register_notifier(const struct i915_audio_component_audio_ops *);
@@ -26,6 +29,17 @@ static inline int snd_hdac_get_display_clk(struct hdac_bus *bus)
26{ 29{
27 return 0; 30 return 0;
28} 31}
32static inline int snd_hdac_sync_audio_rate(struct hdac_bus *bus, hda_nid_t nid,
33 int rate)
34{
35 return 0;
36}
37static inline int snd_hdac_acomp_get_eld(struct hdac_bus *bus, hda_nid_t nid,
38 bool *audio_enabled, char *buffer,
39 int max_bytes)
40{
41 return -ENODEV;
42}
29static inline int snd_hdac_i915_init(struct hdac_bus *bus) 43static inline int snd_hdac_i915_init(struct hdac_bus *bus)
30{ 44{
31 return -ENODEV; 45 return -ENODEV;
diff --git a/include/sound/hda_register.h b/include/sound/hda_register.h
index 94dc6a9772e0..ff1aecf325e8 100644
--- a/include/sound/hda_register.h
+++ b/include/sound/hda_register.h
@@ -233,6 +233,15 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
233#define AZX_MLCTL_SPA (1<<16) 233#define AZX_MLCTL_SPA (1<<16)
234#define AZX_MLCTL_CPA 23 234#define AZX_MLCTL_CPA 23
235 235
236
237/* registers for DMA Resume Capability Structure */
238#define AZX_DRSM_CAP_ID 0x5
239#define AZX_REG_DRSM_CTL 0x4
240/* Base used to calculate the iterating register offset */
241#define AZX_DRSM_BASE 0x08
242/* Interval used to calculate the iterating register offset */
243#define AZX_DRSM_INTERVAL 0x08
244
236/* 245/*
237 * helpers to read the stream position 246 * helpers to read the stream position
238 */ 247 */
diff --git a/include/sound/hdaudio_ext.h b/include/sound/hdaudio_ext.h
index a4cadd9c297a..07fa59237feb 100644
--- a/include/sound/hdaudio_ext.h
+++ b/include/sound/hdaudio_ext.h
@@ -12,6 +12,7 @@
12 * @spbcap: SPIB capabilities pointer 12 * @spbcap: SPIB capabilities pointer
13 * @mlcap: MultiLink capabilities pointer 13 * @mlcap: MultiLink capabilities pointer
14 * @gtscap: gts capabilities pointer 14 * @gtscap: gts capabilities pointer
15 * @drsmcap: dma resume capabilities pointer
15 * @hlink_list: link list of HDA links 16 * @hlink_list: link list of HDA links
16 */ 17 */
17struct hdac_ext_bus { 18struct hdac_ext_bus {
@@ -23,6 +24,7 @@ struct hdac_ext_bus {
23 void __iomem *spbcap; 24 void __iomem *spbcap;
24 void __iomem *mlcap; 25 void __iomem *mlcap;
25 void __iomem *gtscap; 26 void __iomem *gtscap;
27 void __iomem *drsmcap;
26 28
27 struct list_head hlink_list; 29 struct list_head hlink_list;
28}; 30};
@@ -72,6 +74,9 @@ enum hdac_ext_stream_type {
72 * @pplc_addr: processing pipe link stream pointer 74 * @pplc_addr: processing pipe link stream pointer
73 * @spib_addr: software position in buffers stream pointer 75 * @spib_addr: software position in buffers stream pointer
74 * @fifo_addr: software position Max fifos stream pointer 76 * @fifo_addr: software position Max fifos stream pointer
77 * @dpibr_addr: DMA position in buffer resume pointer
78 * @dpib: DMA position in buffer
79 * @lpib: Linear position in buffer
75 * @decoupled: stream host and link is decoupled 80 * @decoupled: stream host and link is decoupled
76 * @link_locked: link is locked 81 * @link_locked: link is locked
77 * @link_prepared: link is prepared 82 * @link_prepared: link is prepared
@@ -86,6 +91,10 @@ struct hdac_ext_stream {
86 void __iomem *spib_addr; 91 void __iomem *spib_addr;
87 void __iomem *fifo_addr; 92 void __iomem *fifo_addr;
88 93
94 void __iomem *dpibr_addr;
95
96 u32 dpib;
97 u32 lpib;
89 bool decoupled:1; 98 bool decoupled:1;
90 bool link_locked:1; 99 bool link_locked:1;
91 bool link_prepared; 100 bool link_prepared;
@@ -116,6 +125,11 @@ int snd_hdac_ext_stream_set_spib(struct hdac_ext_bus *ebus,
116 struct hdac_ext_stream *stream, u32 value); 125 struct hdac_ext_stream *stream, u32 value);
117int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_ext_bus *ebus, 126int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_ext_bus *ebus,
118 struct hdac_ext_stream *stream); 127 struct hdac_ext_stream *stream);
128void snd_hdac_ext_stream_drsm_enable(struct hdac_ext_bus *ebus,
129 bool enable, int index);
130int snd_hdac_ext_stream_set_dpibr(struct hdac_ext_bus *ebus,
131 struct hdac_ext_stream *stream, u32 value);
132int snd_hdac_ext_stream_set_lpib(struct hdac_ext_stream *stream, u32 value);
119 133
120void snd_hdac_ext_link_stream_start(struct hdac_ext_stream *hstream); 134void snd_hdac_ext_link_stream_start(struct hdac_ext_stream *hstream);
121void snd_hdac_ext_link_stream_clear(struct hdac_ext_stream *hstream); 135void snd_hdac_ext_link_stream_clear(struct hdac_ext_stream *hstream);
@@ -133,6 +147,7 @@ struct hdac_ext_link {
133 147
134int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link); 148int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link);
135int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link); 149int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link);
150int snd_hdac_ext_bus_link_power_up_all(struct hdac_ext_bus *ebus);
136int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus); 151int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus);
137void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link, 152void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link,
138 int stream); 153 int stream);
@@ -186,9 +201,15 @@ struct hdac_ext_device {
186 /* codec ops */ 201 /* codec ops */
187 struct hdac_ext_codec_ops ops; 202 struct hdac_ext_codec_ops ops;
188 203
204 struct snd_card *card;
205 void *scodec;
189 void *private_data; 206 void *private_data;
190}; 207};
191 208
209struct hdac_ext_dma_params {
210 u32 format;
211 u8 stream_tag;
212};
192#define to_ehdac_device(dev) (container_of((dev), \ 213#define to_ehdac_device(dev) (container_of((dev), \
193 struct hdac_ext_device, hdac)) 214 struct hdac_ext_device, hdac))
194/* 215/*
diff --git a/include/sound/i2c.h b/include/sound/i2c.h
index d125ff8c85e8..835254de2039 100644
--- a/include/sound/i2c.h
+++ b/include/sound/i2c.h
@@ -66,7 +66,7 @@ struct snd_i2c_bus {
66 struct snd_i2c_bit_ops *bit; 66 struct snd_i2c_bit_ops *bit;
67 void *ops; 67 void *ops;
68 } hw_ops; /* lowlevel operations */ 68 } hw_ops; /* lowlevel operations */
69 struct snd_i2c_ops *ops; /* midlevel operations */ 69 const struct snd_i2c_ops *ops; /* midlevel operations */
70 70
71 unsigned long private_value; 71 unsigned long private_value;
72 void *private_data; 72 void *private_data;
diff --git a/include/sound/rawmidi.h b/include/sound/rawmidi.h
index f6cbef78db62..fdabbb4ddba9 100644
--- a/include/sound/rawmidi.h
+++ b/include/sound/rawmidi.h
@@ -130,7 +130,7 @@ struct snd_rawmidi {
130 int ossreg; 130 int ossreg;
131#endif 131#endif
132 132
133 struct snd_rawmidi_global_ops *ops; 133 const struct snd_rawmidi_global_ops *ops;
134 134
135 struct snd_rawmidi_str streams[2]; 135 struct snd_rawmidi_str streams[2];
136 136
diff --git a/include/sound/rt5659.h b/include/sound/rt5659.h
new file mode 100644
index 000000000000..656c4d58948d
--- /dev/null
+++ b/include/sound/rt5659.h
@@ -0,0 +1,49 @@
1/*
2 * linux/sound/rt5659.h -- Platform data for RT5659
3 *
4 * Copyright 2013 Realtek Microelectronics
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#ifndef __LINUX_SND_RT5659_H
12#define __LINUX_SND_RT5659_H
13
14enum rt5659_dmic1_data_pin {
15 RT5659_DMIC1_NULL,
16 RT5659_DMIC1_DATA_IN2N,
17 RT5659_DMIC1_DATA_GPIO5,
18 RT5659_DMIC1_DATA_GPIO9,
19 RT5659_DMIC1_DATA_GPIO11,
20};
21
22enum rt5659_dmic2_data_pin {
23 RT5659_DMIC2_NULL,
24 RT5659_DMIC2_DATA_IN2P,
25 RT5659_DMIC2_DATA_GPIO6,
26 RT5659_DMIC2_DATA_GPIO10,
27 RT5659_DMIC2_DATA_GPIO12,
28};
29
30enum rt5659_jd_src {
31 RT5659_JD_NULL,
32 RT5659_JD3,
33};
34
35struct rt5659_platform_data {
36 bool in1_diff;
37 bool in3_diff;
38 bool in4_diff;
39
40 int ldo1_en; /* GPIO for LDO1_EN */
41 int reset; /* GPIO for RESET */
42
43 enum rt5659_dmic1_data_pin dmic1_data_pin;
44 enum rt5659_dmic2_data_pin dmic2_data_pin;
45 enum rt5659_jd_src jd_src;
46};
47
48#endif
49
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
index 212eaaf172ed..964b7de1a1cc 100644
--- a/include/sound/soc-dai.h
+++ b/include/sound/soc-dai.h
@@ -222,6 +222,7 @@ struct snd_soc_dai_driver {
222 const char *name; 222 const char *name;
223 unsigned int id; 223 unsigned int id;
224 unsigned int base; 224 unsigned int base;
225 struct snd_soc_dobj dobj;
225 226
226 /* DAI driver callbacks */ 227 /* DAI driver callbacks */
227 int (*probe)(struct snd_soc_dai *dai); 228 int (*probe)(struct snd_soc_dai *dai);
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h
index 95a937eafb79..97069466c38d 100644
--- a/include/sound/soc-dapm.h
+++ b/include/sound/soc-dapm.h
@@ -49,6 +49,9 @@ struct device;
49#define SND_SOC_DAPM_SIGGEN(wname) \ 49#define SND_SOC_DAPM_SIGGEN(wname) \
50{ .id = snd_soc_dapm_siggen, .name = wname, .kcontrol_news = NULL, \ 50{ .id = snd_soc_dapm_siggen, .name = wname, .kcontrol_news = NULL, \
51 .num_kcontrols = 0, .reg = SND_SOC_NOPM } 51 .num_kcontrols = 0, .reg = SND_SOC_NOPM }
52#define SND_SOC_DAPM_SINK(wname) \
53{ .id = snd_soc_dapm_sink, .name = wname, .kcontrol_news = NULL, \
54 .num_kcontrols = 0, .reg = SND_SOC_NOPM }
52#define SND_SOC_DAPM_INPUT(wname) \ 55#define SND_SOC_DAPM_INPUT(wname) \
53{ .id = snd_soc_dapm_input, .name = wname, .kcontrol_news = NULL, \ 56{ .id = snd_soc_dapm_input, .name = wname, .kcontrol_news = NULL, \
54 .num_kcontrols = 0, .reg = SND_SOC_NOPM } 57 .num_kcontrols = 0, .reg = SND_SOC_NOPM }
@@ -485,6 +488,7 @@ enum snd_soc_dapm_type {
485 snd_soc_dapm_aif_in, /* audio interface input */ 488 snd_soc_dapm_aif_in, /* audio interface input */
486 snd_soc_dapm_aif_out, /* audio interface output */ 489 snd_soc_dapm_aif_out, /* audio interface output */
487 snd_soc_dapm_siggen, /* signal generator */ 490 snd_soc_dapm_siggen, /* signal generator */
491 snd_soc_dapm_sink,
488 snd_soc_dapm_dai_in, /* link to DAI structure */ 492 snd_soc_dapm_dai_in, /* link to DAI structure */
489 snd_soc_dapm_dai_out, 493 snd_soc_dapm_dai_out,
490 snd_soc_dapm_dai_link, /* link between two DAI structures */ 494 snd_soc_dapm_dai_link, /* link between two DAI structures */
diff --git a/include/sound/soc-topology.h b/include/sound/soc-topology.h
index 086cd7ff6ddc..5b68e3f5aa85 100644
--- a/include/sound/soc-topology.h
+++ b/include/sound/soc-topology.h
@@ -92,8 +92,10 @@ struct snd_soc_tplg_kcontrol_ops {
92/* Bytes ext operations, for TLV byte controls */ 92/* Bytes ext operations, for TLV byte controls */
93struct snd_soc_tplg_bytes_ext_ops { 93struct snd_soc_tplg_bytes_ext_ops {
94 u32 id; 94 u32 id;
95 int (*get)(unsigned int __user *bytes, unsigned int size); 95 int (*get)(struct snd_kcontrol *kcontrol, unsigned int __user *bytes,
96 int (*put)(const unsigned int __user *bytes, unsigned int size); 96 unsigned int size);
97 int (*put)(struct snd_kcontrol *kcontrol,
98 const unsigned int __user *bytes, unsigned int size);
97}; 99};
98 100
99/* 101/*
diff --git a/include/sound/soc.h b/include/sound/soc.h
index fb955e69a78e..7afb72ceac56 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -110,6 +110,14 @@
110 .put = snd_soc_put_volsw, \ 110 .put = snd_soc_put_volsw, \
111 .private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \ 111 .private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
112 max, invert, 0) } 112 max, invert, 0) }
113#define SOC_DOUBLE_STS(xname, reg, shift_left, shift_right, max, invert) \
114{ \
115 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
116 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
117 .access = SNDRV_CTL_ELEM_ACCESS_READ | \
118 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
119 .private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
120 max, invert, 0) }
113#define SOC_DOUBLE_R(xname, reg_left, reg_right, xshift, xmax, xinvert) \ 121#define SOC_DOUBLE_R(xname, reg_left, reg_right, xshift, xmax, xinvert) \
114{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ 122{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
115 .info = snd_soc_info_volsw, \ 123 .info = snd_soc_info_volsw, \
@@ -293,6 +301,9 @@
293 {.base = xbase, .num_regs = xregs, \ 301 {.base = xbase, .num_regs = xregs, \
294 .mask = xmask }) } 302 .mask = xmask }) }
295 303
304/*
305 * SND_SOC_BYTES_EXT is deprecated, please USE SND_SOC_BYTES_TLV instead
306 */
296#define SND_SOC_BYTES_EXT(xname, xcount, xhandler_get, xhandler_put) \ 307#define SND_SOC_BYTES_EXT(xname, xcount, xhandler_get, xhandler_put) \
297{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ 308{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
298 .info = snd_soc_bytes_info_ext, \ 309 .info = snd_soc_bytes_info_ext, \
@@ -787,6 +798,7 @@ struct snd_soc_component {
787 unsigned int registered_as_component:1; 798 unsigned int registered_as_component:1;
788 799
789 struct list_head list; 800 struct list_head list;
801 struct list_head list_aux; /* for auxiliary component of the card */
790 802
791 struct snd_soc_dai_driver *dai_drv; 803 struct snd_soc_dai_driver *dai_drv;
792 int num_dai; 804 int num_dai;
@@ -830,6 +842,9 @@ struct snd_soc_component {
830 int (*probe)(struct snd_soc_component *); 842 int (*probe)(struct snd_soc_component *);
831 void (*remove)(struct snd_soc_component *); 843 void (*remove)(struct snd_soc_component *);
832 844
845 /* machine specific init */
846 int (*init)(struct snd_soc_component *component);
847
833#ifdef CONFIG_DEBUG_FS 848#ifdef CONFIG_DEBUG_FS
834 void (*init_debugfs)(struct snd_soc_component *component); 849 void (*init_debugfs)(struct snd_soc_component *component);
835 const char *debugfs_prefix; 850 const char *debugfs_prefix;
@@ -1037,6 +1052,9 @@ struct snd_soc_dai_link {
1037 1052
1038 /* pmdown_time is ignored at stop */ 1053 /* pmdown_time is ignored at stop */
1039 unsigned int ignore_pmdown_time:1; 1054 unsigned int ignore_pmdown_time:1;
1055
1056 struct list_head list; /* DAI link list of the soc card */
1057 struct snd_soc_dobj dobj; /* For topology */
1040}; 1058};
1041 1059
1042struct snd_soc_codec_conf { 1060struct snd_soc_codec_conf {
@@ -1101,12 +1119,20 @@ struct snd_soc_card {
1101 struct snd_soc_dapm_context *dapm, 1119 struct snd_soc_dapm_context *dapm,
1102 enum snd_soc_bias_level level); 1120 enum snd_soc_bias_level level);
1103 1121
1122 int (*add_dai_link)(struct snd_soc_card *,
1123 struct snd_soc_dai_link *link);
1124 void (*remove_dai_link)(struct snd_soc_card *,
1125 struct snd_soc_dai_link *link);
1126
1104 long pmdown_time; 1127 long pmdown_time;
1105 1128
1106 /* CPU <--> Codec DAI links */ 1129 /* CPU <--> Codec DAI links */
1107 struct snd_soc_dai_link *dai_link; 1130 struct snd_soc_dai_link *dai_link; /* predefined links only */
1108 int num_links; 1131 int num_links; /* predefined links only */
1109 struct snd_soc_pcm_runtime *rtd; 1132 struct list_head dai_link_list; /* all links */
1133 int num_dai_links;
1134
1135 struct list_head rtd_list;
1110 int num_rtd; 1136 int num_rtd;
1111 1137
1112 /* optional codec specific configuration */ 1138 /* optional codec specific configuration */
@@ -1119,8 +1145,7 @@ struct snd_soc_card {
1119 */ 1145 */
1120 struct snd_soc_aux_dev *aux_dev; 1146 struct snd_soc_aux_dev *aux_dev;
1121 int num_aux_devs; 1147 int num_aux_devs;
1122 struct snd_soc_pcm_runtime *rtd_aux; 1148 struct list_head aux_comp_list;
1123 int num_aux_rtd;
1124 1149
1125 const struct snd_kcontrol_new *controls; 1150 const struct snd_kcontrol_new *controls;
1126 int num_controls; 1151 int num_controls;
@@ -1201,6 +1226,9 @@ struct snd_soc_pcm_runtime {
1201 struct dentry *debugfs_dpcm_root; 1226 struct dentry *debugfs_dpcm_root;
1202 struct dentry *debugfs_dpcm_state; 1227 struct dentry *debugfs_dpcm_state;
1203#endif 1228#endif
1229
1230 unsigned int num; /* 0-based and monotonic increasing */
1231 struct list_head list; /* rtd list of the soc card */
1204}; 1232};
1205 1233
1206/* mixer control */ 1234/* mixer control */
@@ -1225,8 +1253,10 @@ struct soc_bytes_ext {
1225 struct snd_soc_dobj dobj; 1253 struct snd_soc_dobj dobj;
1226 1254
1227 /* used for TLV byte control */ 1255 /* used for TLV byte control */
1228 int (*get)(unsigned int __user *bytes, unsigned int size); 1256 int (*get)(struct snd_kcontrol *kcontrol, unsigned int __user *bytes,
1229 int (*put)(const unsigned int __user *bytes, unsigned int size); 1257 unsigned int size);
1258 int (*put)(struct snd_kcontrol *kcontrol, const unsigned int __user *bytes,
1259 unsigned int size);
1230}; 1260};
1231 1261
1232/* multi register control */ 1262/* multi register control */
@@ -1523,6 +1553,7 @@ static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card)
1523 INIT_LIST_HEAD(&card->widgets); 1553 INIT_LIST_HEAD(&card->widgets);
1524 INIT_LIST_HEAD(&card->paths); 1554 INIT_LIST_HEAD(&card->paths);
1525 INIT_LIST_HEAD(&card->dapm_list); 1555 INIT_LIST_HEAD(&card->dapm_list);
1556 INIT_LIST_HEAD(&card->aux_comp_list);
1526} 1557}
1527 1558
1528static inline bool snd_soc_volsw_is_stereo(struct soc_mixer_control *mc) 1559static inline bool snd_soc_volsw_is_stereo(struct soc_mixer_control *mc)
@@ -1644,6 +1675,14 @@ int snd_soc_of_get_dai_link_codecs(struct device *dev,
1644 struct device_node *of_node, 1675 struct device_node *of_node,
1645 struct snd_soc_dai_link *dai_link); 1676 struct snd_soc_dai_link *dai_link);
1646 1677
1678int snd_soc_add_dai_link(struct snd_soc_card *card,
1679 struct snd_soc_dai_link *dai_link);
1680void snd_soc_remove_dai_link(struct snd_soc_card *card,
1681 struct snd_soc_dai_link *dai_link);
1682
1683int snd_soc_register_dai(struct snd_soc_component *component,
1684 struct snd_soc_dai_driver *dai_drv);
1685
1647#include <sound/soc-dai.h> 1686#include <sound/soc-dai.h>
1648 1687
1649#ifdef CONFIG_DEBUG_FS 1688#ifdef CONFIG_DEBUG_FS
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index 484a9fb20479..67ef73a5d6eb 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -1079,6 +1079,12 @@ struct drm_i915_gem_context_destroy {
1079}; 1079};
1080 1080
1081struct drm_i915_reg_read { 1081struct drm_i915_reg_read {
1082 /*
1083 * Register offset.
1084 * For 64bit wide registers where the upper 32bits don't immediately
1085 * follow the lower 32bits, the offset of the lower 32bits must
1086 * be specified
1087 */
1082 __u64 offset; 1088 __u64 offset;
1083 __u64 val; /* Return value */ 1089 __u64 val; /* Return value */
1084}; 1090};
@@ -1125,8 +1131,9 @@ struct drm_i915_gem_context_param {
1125 __u32 ctx_id; 1131 __u32 ctx_id;
1126 __u32 size; 1132 __u32 size;
1127 __u64 param; 1133 __u64 param;
1128#define I915_CONTEXT_PARAM_BAN_PERIOD 0x1 1134#define I915_CONTEXT_PARAM_BAN_PERIOD 0x1
1129#define I915_CONTEXT_PARAM_NO_ZEROMAP 0x2 1135#define I915_CONTEXT_PARAM_NO_ZEROMAP 0x2
1136#define I915_CONTEXT_PARAM_GTT_SIZE 0x3
1130 __u64 value; 1137 __u64 value;
1131}; 1138};
1132 1139
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index 26539a7e4880..c4cc1e40b35c 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -243,7 +243,7 @@ struct snd_soc_tplg_manifest {
243 __le32 control_elems; /* number of control elements */ 243 __le32 control_elems; /* number of control elements */
244 __le32 widget_elems; /* number of widget elements */ 244 __le32 widget_elems; /* number of widget elements */
245 __le32 graph_elems; /* number of graph elements */ 245 __le32 graph_elems; /* number of graph elements */
246 __le32 dai_elems; /* number of DAI elements */ 246 __le32 pcm_elems; /* number of PCM elements */
247 __le32 dai_link_elems; /* number of DAI link elements */ 247 __le32 dai_link_elems; /* number of DAI link elements */
248 struct snd_soc_tplg_private priv; 248 struct snd_soc_tplg_private priv;
249} __attribute__((packed)); 249} __attribute__((packed));
diff --git a/include/uapi/sound/compress_params.h b/include/uapi/sound/compress_params.h
index d9bd9ca0d5b0..9625484a4a2a 100644
--- a/include/uapi/sound/compress_params.h
+++ b/include/uapi/sound/compress_params.h
@@ -73,7 +73,8 @@
73#define SND_AUDIOCODEC_IEC61937 ((__u32) 0x0000000B) 73#define SND_AUDIOCODEC_IEC61937 ((__u32) 0x0000000B)
74#define SND_AUDIOCODEC_G723_1 ((__u32) 0x0000000C) 74#define SND_AUDIOCODEC_G723_1 ((__u32) 0x0000000C)
75#define SND_AUDIOCODEC_G729 ((__u32) 0x0000000D) 75#define SND_AUDIOCODEC_G729 ((__u32) 0x0000000D)
76#define SND_AUDIOCODEC_MAX SND_AUDIOCODEC_G729 76#define SND_AUDIOCODEC_BESPOKE ((__u32) 0x0000000E)
77#define SND_AUDIOCODEC_MAX SND_AUDIOCODEC_BESPOKE
77 78
78/* 79/*
79 * Profile and modes are listed with bit masks. This allows for a 80 * Profile and modes are listed with bit masks. This allows for a
@@ -312,7 +313,7 @@ struct snd_enc_flac {
312 313
313struct snd_enc_generic { 314struct snd_enc_generic {
314 __u32 bw; /* encoder bandwidth */ 315 __u32 bw; /* encoder bandwidth */
315 __s32 reserved[15]; 316 __s32 reserved[15]; /* Can be used for SND_AUDIOCODEC_BESPOKE */
316} __attribute__((packed, aligned(4))); 317} __attribute__((packed, aligned(4)));
317 318
318union snd_codec_options { 319union snd_codec_options {
diff --git a/kernel/async.c b/kernel/async.c
index 4c3773c0bf63..d2edd6efec56 100644
--- a/kernel/async.c
+++ b/kernel/async.c
@@ -326,3 +326,4 @@ bool current_is_async(void)
326 326
327 return worker && worker->current_func == async_run_entry_fn; 327 return worker && worker->current_func == async_run_entry_fn;
328} 328}
329EXPORT_SYMBOL_GPL(current_is_async);
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
index b123c42e7dc8..18b8dc45bb8f 100644
--- a/sound/core/compress_offload.c
+++ b/sound/core/compress_offload.c
@@ -38,8 +38,10 @@
38#include <linux/uio.h> 38#include <linux/uio.h>
39#include <linux/uaccess.h> 39#include <linux/uaccess.h>
40#include <linux/module.h> 40#include <linux/module.h>
41#include <linux/compat.h>
41#include <sound/core.h> 42#include <sound/core.h>
42#include <sound/initval.h> 43#include <sound/initval.h>
44#include <sound/info.h>
43#include <sound/compress_params.h> 45#include <sound/compress_params.h>
44#include <sound/compress_offload.h> 46#include <sound/compress_offload.h>
45#include <sound/compress_driver.h> 47#include <sound/compress_driver.h>
@@ -847,6 +849,15 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
847 return retval; 849 return retval;
848} 850}
849 851
852/* support of 32bit userspace on 64bit platforms */
853#ifdef CONFIG_COMPAT
854static long snd_compr_ioctl_compat(struct file *file, unsigned int cmd,
855 unsigned long arg)
856{
857 return snd_compr_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
858}
859#endif
860
850static const struct file_operations snd_compr_file_ops = { 861static const struct file_operations snd_compr_file_ops = {
851 .owner = THIS_MODULE, 862 .owner = THIS_MODULE,
852 .open = snd_compr_open, 863 .open = snd_compr_open,
@@ -854,6 +865,9 @@ static const struct file_operations snd_compr_file_ops = {
854 .write = snd_compr_write, 865 .write = snd_compr_write,
855 .read = snd_compr_read, 866 .read = snd_compr_read,
856 .unlocked_ioctl = snd_compr_ioctl, 867 .unlocked_ioctl = snd_compr_ioctl,
868#ifdef CONFIG_COMPAT
869 .compat_ioctl = snd_compr_ioctl_compat,
870#endif
857 .mmap = snd_compr_mmap, 871 .mmap = snd_compr_mmap,
858 .poll = snd_compr_poll, 872 .poll = snd_compr_poll,
859}; 873};
@@ -891,11 +905,85 @@ static int snd_compress_dev_disconnect(struct snd_device *device)
891 return 0; 905 return 0;
892} 906}
893 907
908#ifdef CONFIG_SND_VERBOSE_PROCFS
909static void snd_compress_proc_info_read(struct snd_info_entry *entry,
910 struct snd_info_buffer *buffer)
911{
912 struct snd_compr *compr = (struct snd_compr *)entry->private_data;
913
914 snd_iprintf(buffer, "card: %d\n", compr->card->number);
915 snd_iprintf(buffer, "device: %d\n", compr->device);
916 snd_iprintf(buffer, "stream: %s\n",
917 compr->direction == SND_COMPRESS_PLAYBACK
918 ? "PLAYBACK" : "CAPTURE");
919 snd_iprintf(buffer, "id: %s\n", compr->id);
920}
921
922static int snd_compress_proc_init(struct snd_compr *compr)
923{
924 struct snd_info_entry *entry;
925 char name[16];
926
927 sprintf(name, "compr%i", compr->device);
928 entry = snd_info_create_card_entry(compr->card, name,
929 compr->card->proc_root);
930 if (!entry)
931 return -ENOMEM;
932 entry->mode = S_IFDIR | S_IRUGO | S_IXUGO;
933 if (snd_info_register(entry) < 0) {
934 snd_info_free_entry(entry);
935 return -ENOMEM;
936 }
937 compr->proc_root = entry;
938
939 entry = snd_info_create_card_entry(compr->card, "info",
940 compr->proc_root);
941 if (entry) {
942 snd_info_set_text_ops(entry, compr,
943 snd_compress_proc_info_read);
944 if (snd_info_register(entry) < 0) {
945 snd_info_free_entry(entry);
946 entry = NULL;
947 }
948 }
949 compr->proc_info_entry = entry;
950
951 return 0;
952}
953
954static void snd_compress_proc_done(struct snd_compr *compr)
955{
956 snd_info_free_entry(compr->proc_info_entry);
957 compr->proc_info_entry = NULL;
958 snd_info_free_entry(compr->proc_root);
959 compr->proc_root = NULL;
960}
961
962static inline void snd_compress_set_id(struct snd_compr *compr, const char *id)
963{
964 strlcpy(compr->id, id, sizeof(compr->id));
965}
966#else
967static inline int snd_compress_proc_init(struct snd_compr *compr)
968{
969 return 0;
970}
971
972static inline void snd_compress_proc_done(struct snd_compr *compr)
973{
974}
975
976static inline void snd_compress_set_id(struct snd_compr *compr, const char *id)
977{
978}
979#endif
980
894static int snd_compress_dev_free(struct snd_device *device) 981static int snd_compress_dev_free(struct snd_device *device)
895{ 982{
896 struct snd_compr *compr; 983 struct snd_compr *compr;
897 984
898 compr = device->device_data; 985 compr = device->device_data;
986 snd_compress_proc_done(compr);
899 put_device(&compr->dev); 987 put_device(&compr->dev);
900 return 0; 988 return 0;
901} 989}
@@ -908,22 +996,29 @@ static int snd_compress_dev_free(struct snd_device *device)
908 * @compr: compress device pointer 996 * @compr: compress device pointer
909 */ 997 */
910int snd_compress_new(struct snd_card *card, int device, 998int snd_compress_new(struct snd_card *card, int device,
911 int dirn, struct snd_compr *compr) 999 int dirn, const char *id, struct snd_compr *compr)
912{ 1000{
913 static struct snd_device_ops ops = { 1001 static struct snd_device_ops ops = {
914 .dev_free = snd_compress_dev_free, 1002 .dev_free = snd_compress_dev_free,
915 .dev_register = snd_compress_dev_register, 1003 .dev_register = snd_compress_dev_register,
916 .dev_disconnect = snd_compress_dev_disconnect, 1004 .dev_disconnect = snd_compress_dev_disconnect,
917 }; 1005 };
1006 int ret;
918 1007
919 compr->card = card; 1008 compr->card = card;
920 compr->device = device; 1009 compr->device = device;
921 compr->direction = dirn; 1010 compr->direction = dirn;
922 1011
1012 snd_compress_set_id(compr, id);
1013
923 snd_device_initialize(&compr->dev, card); 1014 snd_device_initialize(&compr->dev, card);
924 dev_set_name(&compr->dev, "comprC%iD%i", card->number, device); 1015 dev_set_name(&compr->dev, "comprC%iD%i", card->number, device);
925 1016
926 return snd_device_new(card, SNDRV_DEV_COMPRESS, compr, &ops); 1017 ret = snd_device_new(card, SNDRV_DEV_COMPRESS, compr, &ops);
1018 if (ret == 0)
1019 snd_compress_proc_init(compr);
1020
1021 return ret;
927} 1022}
928EXPORT_SYMBOL_GPL(snd_compress_new); 1023EXPORT_SYMBOL_GPL(snd_compress_new);
929 1024
diff --git a/sound/core/init.c b/sound/core/init.c
index 20f37fb3800e..6bda8436d765 100644
--- a/sound/core/init.c
+++ b/sound/core/init.c
@@ -268,6 +268,9 @@ int snd_card_new(struct device *parent, int idx, const char *xid,
268 if (err < 0) 268 if (err < 0)
269 goto __error; 269 goto __error;
270 270
271 snprintf(card->irq_descr, sizeof(card->irq_descr), "%s:%s",
272 dev_driver_string(card->dev), dev_name(&card->card_dev));
273
271 /* the control interface cannot be accessed from the user space until */ 274 /* the control interface cannot be accessed from the user space until */
272 /* snd_cards_bitmask and snd_cards are set with snd_card_register */ 275 /* snd_cards_bitmask and snd_cards are set with snd_card_register */
273 err = snd_ctl_create(card); 276 err = snd_ctl_create(card);
diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c
index 7a8c79dd9734..2ff9c12d664a 100644
--- a/sound/core/oss/mixer_oss.c
+++ b/sound/core/oss/mixer_oss.c
@@ -24,6 +24,7 @@
24#include <linux/time.h> 24#include <linux/time.h>
25#include <linux/string.h> 25#include <linux/string.h>
26#include <linux/module.h> 26#include <linux/module.h>
27#include <linux/compat.h>
27#include <sound/core.h> 28#include <sound/core.h>
28#include <sound/minors.h> 29#include <sound/minors.h>
29#include <sound/control.h> 30#include <sound/control.h>
@@ -397,7 +398,12 @@ int snd_mixer_oss_ioctl_card(struct snd_card *card, unsigned int cmd, unsigned l
397 398
398#ifdef CONFIG_COMPAT 399#ifdef CONFIG_COMPAT
399/* all compatible */ 400/* all compatible */
400#define snd_mixer_oss_ioctl_compat snd_mixer_oss_ioctl 401static long snd_mixer_oss_ioctl_compat(struct file *file, unsigned int cmd,
402 unsigned long arg)
403{
404 return snd_mixer_oss_ioctl1(file->private_data, cmd,
405 (unsigned long)compat_ptr(arg));
406}
401#else 407#else
402#define snd_mixer_oss_ioctl_compat NULL 408#define snd_mixer_oss_ioctl_compat NULL
403#endif 409#endif
diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c
index 58550cc93f28..0e73d03b30e3 100644
--- a/sound/core/oss/pcm_oss.c
+++ b/sound/core/oss/pcm_oss.c
@@ -33,6 +33,7 @@
33#include <linux/module.h> 33#include <linux/module.h>
34#include <linux/math64.h> 34#include <linux/math64.h>
35#include <linux/string.h> 35#include <linux/string.h>
36#include <linux/compat.h>
36#include <sound/core.h> 37#include <sound/core.h>
37#include <sound/minors.h> 38#include <sound/minors.h>
38#include <sound/pcm.h> 39#include <sound/pcm.h>
@@ -850,7 +851,7 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream)
850 851
851 if (mutex_lock_interruptible(&runtime->oss.params_lock)) 852 if (mutex_lock_interruptible(&runtime->oss.params_lock))
852 return -EINTR; 853 return -EINTR;
853 sw_params = kmalloc(sizeof(*sw_params), GFP_KERNEL); 854 sw_params = kzalloc(sizeof(*sw_params), GFP_KERNEL);
854 params = kmalloc(sizeof(*params), GFP_KERNEL); 855 params = kmalloc(sizeof(*params), GFP_KERNEL);
855 sparams = kmalloc(sizeof(*sparams), GFP_KERNEL); 856 sparams = kmalloc(sizeof(*sparams), GFP_KERNEL);
856 if (!sw_params || !params || !sparams) { 857 if (!sw_params || !params || !sparams) {
@@ -988,7 +989,6 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream)
988 goto failure; 989 goto failure;
989 } 990 }
990 991
991 memset(sw_params, 0, sizeof(*sw_params));
992 if (runtime->oss.trigger) { 992 if (runtime->oss.trigger) {
993 sw_params->start_threshold = 1; 993 sw_params->start_threshold = 1;
994 } else { 994 } else {
@@ -2648,7 +2648,11 @@ static long snd_pcm_oss_ioctl(struct file *file, unsigned int cmd, unsigned long
2648 2648
2649#ifdef CONFIG_COMPAT 2649#ifdef CONFIG_COMPAT
2650/* all compatible */ 2650/* all compatible */
2651#define snd_pcm_oss_ioctl_compat snd_pcm_oss_ioctl 2651static long snd_pcm_oss_ioctl_compat(struct file *file, unsigned int cmd,
2652 unsigned long arg)
2653{
2654 return snd_pcm_oss_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
2655}
2652#else 2656#else
2653#define snd_pcm_oss_ioctl_compat NULL 2657#define snd_pcm_oss_ioctl_compat NULL
2654#endif 2658#endif
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index a8b27cdc2844..fadd3eb8e8bb 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -875,7 +875,7 @@ struct action_ops {
875 * Note: the stream state might be changed also on failure 875 * Note: the stream state might be changed also on failure
876 * Note2: call with calling stream lock + link lock 876 * Note2: call with calling stream lock + link lock
877 */ 877 */
878static int snd_pcm_action_group(struct action_ops *ops, 878static int snd_pcm_action_group(const struct action_ops *ops,
879 struct snd_pcm_substream *substream, 879 struct snd_pcm_substream *substream,
880 int state, int do_lock) 880 int state, int do_lock)
881{ 881{
@@ -932,7 +932,7 @@ static int snd_pcm_action_group(struct action_ops *ops,
932/* 932/*
933 * Note: call with stream lock 933 * Note: call with stream lock
934 */ 934 */
935static int snd_pcm_action_single(struct action_ops *ops, 935static int snd_pcm_action_single(const struct action_ops *ops,
936 struct snd_pcm_substream *substream, 936 struct snd_pcm_substream *substream,
937 int state) 937 int state)
938{ 938{
@@ -952,7 +952,7 @@ static int snd_pcm_action_single(struct action_ops *ops,
952/* 952/*
953 * Note: call with stream lock 953 * Note: call with stream lock
954 */ 954 */
955static int snd_pcm_action(struct action_ops *ops, 955static int snd_pcm_action(const struct action_ops *ops,
956 struct snd_pcm_substream *substream, 956 struct snd_pcm_substream *substream,
957 int state) 957 int state)
958{ 958{
@@ -984,7 +984,7 @@ static int snd_pcm_action(struct action_ops *ops,
984/* 984/*
985 * Note: don't use any locks before 985 * Note: don't use any locks before
986 */ 986 */
987static int snd_pcm_action_lock_irq(struct action_ops *ops, 987static int snd_pcm_action_lock_irq(const struct action_ops *ops,
988 struct snd_pcm_substream *substream, 988 struct snd_pcm_substream *substream,
989 int state) 989 int state)
990{ 990{
@@ -998,7 +998,7 @@ static int snd_pcm_action_lock_irq(struct action_ops *ops,
998 998
999/* 999/*
1000 */ 1000 */
1001static int snd_pcm_action_nonatomic(struct action_ops *ops, 1001static int snd_pcm_action_nonatomic(const struct action_ops *ops,
1002 struct snd_pcm_substream *substream, 1002 struct snd_pcm_substream *substream,
1003 int state) 1003 int state)
1004{ 1004{
@@ -1056,7 +1056,7 @@ static void snd_pcm_post_start(struct snd_pcm_substream *substream, int state)
1056 snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MSTART); 1056 snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MSTART);
1057} 1057}
1058 1058
1059static struct action_ops snd_pcm_action_start = { 1059static const struct action_ops snd_pcm_action_start = {
1060 .pre_action = snd_pcm_pre_start, 1060 .pre_action = snd_pcm_pre_start,
1061 .do_action = snd_pcm_do_start, 1061 .do_action = snd_pcm_do_start,
1062 .undo_action = snd_pcm_undo_start, 1062 .undo_action = snd_pcm_undo_start,
@@ -1107,7 +1107,7 @@ static void snd_pcm_post_stop(struct snd_pcm_substream *substream, int state)
1107 wake_up(&runtime->tsleep); 1107 wake_up(&runtime->tsleep);
1108} 1108}
1109 1109
1110static struct action_ops snd_pcm_action_stop = { 1110static const struct action_ops snd_pcm_action_stop = {
1111 .pre_action = snd_pcm_pre_stop, 1111 .pre_action = snd_pcm_pre_stop,
1112 .do_action = snd_pcm_do_stop, 1112 .do_action = snd_pcm_do_stop,
1113 .post_action = snd_pcm_post_stop 1113 .post_action = snd_pcm_post_stop
@@ -1224,7 +1224,7 @@ static void snd_pcm_post_pause(struct snd_pcm_substream *substream, int push)
1224 } 1224 }
1225} 1225}
1226 1226
1227static struct action_ops snd_pcm_action_pause = { 1227static const struct action_ops snd_pcm_action_pause = {
1228 .pre_action = snd_pcm_pre_pause, 1228 .pre_action = snd_pcm_pre_pause,
1229 .do_action = snd_pcm_do_pause, 1229 .do_action = snd_pcm_do_pause,
1230 .undo_action = snd_pcm_undo_pause, 1230 .undo_action = snd_pcm_undo_pause,
@@ -1273,7 +1273,7 @@ static void snd_pcm_post_suspend(struct snd_pcm_substream *substream, int state)
1273 wake_up(&runtime->tsleep); 1273 wake_up(&runtime->tsleep);
1274} 1274}
1275 1275
1276static struct action_ops snd_pcm_action_suspend = { 1276static const struct action_ops snd_pcm_action_suspend = {
1277 .pre_action = snd_pcm_pre_suspend, 1277 .pre_action = snd_pcm_pre_suspend,
1278 .do_action = snd_pcm_do_suspend, 1278 .do_action = snd_pcm_do_suspend,
1279 .post_action = snd_pcm_post_suspend 1279 .post_action = snd_pcm_post_suspend
@@ -1375,7 +1375,7 @@ static void snd_pcm_post_resume(struct snd_pcm_substream *substream, int state)
1375 snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MRESUME); 1375 snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MRESUME);
1376} 1376}
1377 1377
1378static struct action_ops snd_pcm_action_resume = { 1378static const struct action_ops snd_pcm_action_resume = {
1379 .pre_action = snd_pcm_pre_resume, 1379 .pre_action = snd_pcm_pre_resume,
1380 .do_action = snd_pcm_do_resume, 1380 .do_action = snd_pcm_do_resume,
1381 .undo_action = snd_pcm_undo_resume, 1381 .undo_action = snd_pcm_undo_resume,
@@ -1478,7 +1478,7 @@ static void snd_pcm_post_reset(struct snd_pcm_substream *substream, int state)
1478 snd_pcm_playback_silence(substream, ULONG_MAX); 1478 snd_pcm_playback_silence(substream, ULONG_MAX);
1479} 1479}
1480 1480
1481static struct action_ops snd_pcm_action_reset = { 1481static const struct action_ops snd_pcm_action_reset = {
1482 .pre_action = snd_pcm_pre_reset, 1482 .pre_action = snd_pcm_pre_reset,
1483 .do_action = snd_pcm_do_reset, 1483 .do_action = snd_pcm_do_reset,
1484 .post_action = snd_pcm_post_reset 1484 .post_action = snd_pcm_post_reset
@@ -1522,7 +1522,7 @@ static void snd_pcm_post_prepare(struct snd_pcm_substream *substream, int state)
1522 snd_pcm_set_state(substream, SNDRV_PCM_STATE_PREPARED); 1522 snd_pcm_set_state(substream, SNDRV_PCM_STATE_PREPARED);
1523} 1523}
1524 1524
1525static struct action_ops snd_pcm_action_prepare = { 1525static const struct action_ops snd_pcm_action_prepare = {
1526 .pre_action = snd_pcm_pre_prepare, 1526 .pre_action = snd_pcm_pre_prepare,
1527 .do_action = snd_pcm_do_prepare, 1527 .do_action = snd_pcm_do_prepare,
1528 .post_action = snd_pcm_post_prepare 1528 .post_action = snd_pcm_post_prepare
@@ -1618,7 +1618,7 @@ static void snd_pcm_post_drain_init(struct snd_pcm_substream *substream, int sta
1618{ 1618{
1619} 1619}
1620 1620
1621static struct action_ops snd_pcm_action_drain_init = { 1621static const struct action_ops snd_pcm_action_drain_init = {
1622 .pre_action = snd_pcm_pre_drain_init, 1622 .pre_action = snd_pcm_pre_drain_init,
1623 .do_action = snd_pcm_do_drain_init, 1623 .do_action = snd_pcm_do_drain_init,
1624 .post_action = snd_pcm_post_drain_init 1624 .post_action = snd_pcm_post_drain_init
diff --git a/sound/core/seq/oss/seq_oss.c b/sound/core/seq/oss/seq_oss.c
index 7354b8bed860..8db156b207f1 100644
--- a/sound/core/seq/oss/seq_oss.c
+++ b/sound/core/seq/oss/seq_oss.c
@@ -23,6 +23,7 @@
23#include <linux/init.h> 23#include <linux/init.h>
24#include <linux/module.h> 24#include <linux/module.h>
25#include <linux/mutex.h> 25#include <linux/mutex.h>
26#include <linux/compat.h>
26#include <sound/core.h> 27#include <sound/core.h>
27#include <sound/minors.h> 28#include <sound/minors.h>
28#include <sound/initval.h> 29#include <sound/initval.h>
@@ -189,7 +190,11 @@ odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
189} 190}
190 191
191#ifdef CONFIG_COMPAT 192#ifdef CONFIG_COMPAT
192#define odev_ioctl_compat odev_ioctl 193static long odev_ioctl_compat(struct file *file, unsigned int cmd,
194 unsigned long arg)
195{
196 return odev_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
197}
193#else 198#else
194#define odev_ioctl_compat NULL 199#define odev_ioctl_compat NULL
195#endif 200#endif
diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c
index b64f20deba90..13cfa815732d 100644
--- a/sound/core/seq/seq_clientmgr.c
+++ b/sound/core/seq/seq_clientmgr.c
@@ -1962,7 +1962,7 @@ static int snd_seq_ioctl_remove_events(struct snd_seq_client *client,
1962 * No restrictions so for a user client we can clear 1962 * No restrictions so for a user client we can clear
1963 * the whole fifo 1963 * the whole fifo
1964 */ 1964 */
1965 if (client->type == USER_CLIENT) 1965 if (client->type == USER_CLIENT && client->data.user.fifo)
1966 snd_seq_fifo_clear(client->data.user.fifo); 1966 snd_seq_fifo_clear(client->data.user.fifo);
1967 } 1967 }
1968 1968
diff --git a/sound/core/seq/seq_queue.c b/sound/core/seq/seq_queue.c
index 7dfd0f429410..0bec02e89d51 100644
--- a/sound/core/seq/seq_queue.c
+++ b/sound/core/seq/seq_queue.c
@@ -142,8 +142,10 @@ static struct snd_seq_queue *queue_new(int owner, int locked)
142static void queue_delete(struct snd_seq_queue *q) 142static void queue_delete(struct snd_seq_queue *q)
143{ 143{
144 /* stop and release the timer */ 144 /* stop and release the timer */
145 mutex_lock(&q->timer_mutex);
145 snd_seq_timer_stop(q->timer); 146 snd_seq_timer_stop(q->timer);
146 snd_seq_timer_close(q); 147 snd_seq_timer_close(q);
148 mutex_unlock(&q->timer_mutex);
147 /* wait until access free */ 149 /* wait until access free */
148 snd_use_lock_sync(&q->use_lock); 150 snd_use_lock_sync(&q->use_lock);
149 /* release resources... */ 151 /* release resources... */
diff --git a/sound/core/seq/seq_virmidi.c b/sound/core/seq/seq_virmidi.c
index 56e0f4cd3f82..3da2d48610b3 100644
--- a/sound/core/seq/seq_virmidi.c
+++ b/sound/core/seq/seq_virmidi.c
@@ -468,7 +468,7 @@ static int snd_virmidi_dev_unregister(struct snd_rawmidi *rmidi)
468/* 468/*
469 * 469 *
470 */ 470 */
471static struct snd_rawmidi_global_ops snd_virmidi_global_ops = { 471static const struct snd_rawmidi_global_ops snd_virmidi_global_ops = {
472 .dev_register = snd_virmidi_dev_register, 472 .dev_register = snd_virmidi_dev_register,
473 .dev_unregister = snd_virmidi_dev_unregister, 473 .dev_unregister = snd_virmidi_dev_unregister,
474}; 474};
diff --git a/sound/core/timer.c b/sound/core/timer.c
index 31f40f03e5b7..cb25aded5349 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -73,7 +73,7 @@ struct snd_timer_user {
73 struct timespec tstamp; /* trigger tstamp */ 73 struct timespec tstamp; /* trigger tstamp */
74 wait_queue_head_t qchange_sleep; 74 wait_queue_head_t qchange_sleep;
75 struct fasync_struct *fasync; 75 struct fasync_struct *fasync;
76 struct mutex tread_sem; 76 struct mutex ioctl_lock;
77}; 77};
78 78
79/* list of timers */ 79/* list of timers */
@@ -215,11 +215,13 @@ static void snd_timer_check_master(struct snd_timer_instance *master)
215 slave->slave_id == master->slave_id) { 215 slave->slave_id == master->slave_id) {
216 list_move_tail(&slave->open_list, &master->slave_list_head); 216 list_move_tail(&slave->open_list, &master->slave_list_head);
217 spin_lock_irq(&slave_active_lock); 217 spin_lock_irq(&slave_active_lock);
218 spin_lock(&master->timer->lock);
218 slave->master = master; 219 slave->master = master;
219 slave->timer = master->timer; 220 slave->timer = master->timer;
220 if (slave->flags & SNDRV_TIMER_IFLG_RUNNING) 221 if (slave->flags & SNDRV_TIMER_IFLG_RUNNING)
221 list_add_tail(&slave->active_list, 222 list_add_tail(&slave->active_list,
222 &master->slave_active_head); 223 &master->slave_active_head);
224 spin_unlock(&master->timer->lock);
223 spin_unlock_irq(&slave_active_lock); 225 spin_unlock_irq(&slave_active_lock);
224 } 226 }
225 } 227 }
@@ -299,8 +301,7 @@ int snd_timer_open(struct snd_timer_instance **ti,
299 return 0; 301 return 0;
300} 302}
301 303
302static int _snd_timer_stop(struct snd_timer_instance *timeri, 304static int _snd_timer_stop(struct snd_timer_instance *timeri, int event);
303 int keep_flag, int event);
304 305
305/* 306/*
306 * close a timer instance 307 * close a timer instance
@@ -342,19 +343,22 @@ int snd_timer_close(struct snd_timer_instance *timeri)
342 spin_unlock_irq(&timer->lock); 343 spin_unlock_irq(&timer->lock);
343 mutex_lock(&register_mutex); 344 mutex_lock(&register_mutex);
344 list_del(&timeri->open_list); 345 list_del(&timeri->open_list);
345 if (timer && list_empty(&timer->open_list_head) && 346 if (list_empty(&timer->open_list_head) &&
346 timer->hw.close) 347 timer->hw.close)
347 timer->hw.close(timer); 348 timer->hw.close(timer);
348 /* remove slave links */ 349 /* remove slave links */
350 spin_lock_irq(&slave_active_lock);
351 spin_lock(&timer->lock);
349 list_for_each_entry_safe(slave, tmp, &timeri->slave_list_head, 352 list_for_each_entry_safe(slave, tmp, &timeri->slave_list_head,
350 open_list) { 353 open_list) {
351 spin_lock_irq(&slave_active_lock);
352 _snd_timer_stop(slave, 1, SNDRV_TIMER_EVENT_RESOLUTION);
353 list_move_tail(&slave->open_list, &snd_timer_slave_list); 354 list_move_tail(&slave->open_list, &snd_timer_slave_list);
354 slave->master = NULL; 355 slave->master = NULL;
355 slave->timer = NULL; 356 slave->timer = NULL;
356 spin_unlock_irq(&slave_active_lock); 357 list_del_init(&slave->ack_list);
358 list_del_init(&slave->active_list);
357 } 359 }
360 spin_unlock(&timer->lock);
361 spin_unlock_irq(&slave_active_lock);
358 mutex_unlock(&register_mutex); 362 mutex_unlock(&register_mutex);
359 } 363 }
360 out: 364 out:
@@ -441,9 +445,12 @@ static int snd_timer_start_slave(struct snd_timer_instance *timeri)
441 445
442 spin_lock_irqsave(&slave_active_lock, flags); 446 spin_lock_irqsave(&slave_active_lock, flags);
443 timeri->flags |= SNDRV_TIMER_IFLG_RUNNING; 447 timeri->flags |= SNDRV_TIMER_IFLG_RUNNING;
444 if (timeri->master) 448 if (timeri->master && timeri->timer) {
449 spin_lock(&timeri->timer->lock);
445 list_add_tail(&timeri->active_list, 450 list_add_tail(&timeri->active_list,
446 &timeri->master->slave_active_head); 451 &timeri->master->slave_active_head);
452 spin_unlock(&timeri->timer->lock);
453 }
447 spin_unlock_irqrestore(&slave_active_lock, flags); 454 spin_unlock_irqrestore(&slave_active_lock, flags);
448 return 1; /* delayed start */ 455 return 1; /* delayed start */
449} 456}
@@ -476,8 +483,7 @@ int snd_timer_start(struct snd_timer_instance *timeri, unsigned int ticks)
476 return result; 483 return result;
477} 484}
478 485
479static int _snd_timer_stop(struct snd_timer_instance * timeri, 486static int _snd_timer_stop(struct snd_timer_instance *timeri, int event)
480 int keep_flag, int event)
481{ 487{
482 struct snd_timer *timer; 488 struct snd_timer *timer;
483 unsigned long flags; 489 unsigned long flags;
@@ -486,11 +492,11 @@ static int _snd_timer_stop(struct snd_timer_instance * timeri,
486 return -ENXIO; 492 return -ENXIO;
487 493
488 if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) { 494 if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) {
489 if (!keep_flag) { 495 spin_lock_irqsave(&slave_active_lock, flags);
490 spin_lock_irqsave(&slave_active_lock, flags); 496 timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING;
491 timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING; 497 list_del_init(&timeri->ack_list);
492 spin_unlock_irqrestore(&slave_active_lock, flags); 498 list_del_init(&timeri->active_list);
493 } 499 spin_unlock_irqrestore(&slave_active_lock, flags);
494 goto __end; 500 goto __end;
495 } 501 }
496 timer = timeri->timer; 502 timer = timeri->timer;
@@ -511,9 +517,7 @@ static int _snd_timer_stop(struct snd_timer_instance * timeri,
511 } 517 }
512 } 518 }
513 } 519 }
514 if (!keep_flag) 520 timeri->flags &= ~(SNDRV_TIMER_IFLG_RUNNING | SNDRV_TIMER_IFLG_START);
515 timeri->flags &=
516 ~(SNDRV_TIMER_IFLG_RUNNING | SNDRV_TIMER_IFLG_START);
517 spin_unlock_irqrestore(&timer->lock, flags); 521 spin_unlock_irqrestore(&timer->lock, flags);
518 __end: 522 __end:
519 if (event != SNDRV_TIMER_EVENT_RESOLUTION) 523 if (event != SNDRV_TIMER_EVENT_RESOLUTION)
@@ -532,7 +536,7 @@ int snd_timer_stop(struct snd_timer_instance *timeri)
532 unsigned long flags; 536 unsigned long flags;
533 int err; 537 int err;
534 538
535 err = _snd_timer_stop(timeri, 0, SNDRV_TIMER_EVENT_STOP); 539 err = _snd_timer_stop(timeri, SNDRV_TIMER_EVENT_STOP);
536 if (err < 0) 540 if (err < 0)
537 return err; 541 return err;
538 timer = timeri->timer; 542 timer = timeri->timer;
@@ -576,7 +580,7 @@ int snd_timer_continue(struct snd_timer_instance *timeri)
576 */ 580 */
577int snd_timer_pause(struct snd_timer_instance * timeri) 581int snd_timer_pause(struct snd_timer_instance * timeri)
578{ 582{
579 return _snd_timer_stop(timeri, 0, SNDRV_TIMER_EVENT_PAUSE); 583 return _snd_timer_stop(timeri, SNDRV_TIMER_EVENT_PAUSE);
580} 584}
581 585
582/* 586/*
@@ -694,7 +698,7 @@ void snd_timer_interrupt(struct snd_timer * timer, unsigned long ticks_left)
694 } else { 698 } else {
695 ti->flags &= ~SNDRV_TIMER_IFLG_RUNNING; 699 ti->flags &= ~SNDRV_TIMER_IFLG_RUNNING;
696 if (--timer->running) 700 if (--timer->running)
697 list_del(&ti->active_list); 701 list_del_init(&ti->active_list);
698 } 702 }
699 if ((timer->hw.flags & SNDRV_TIMER_HW_TASKLET) || 703 if ((timer->hw.flags & SNDRV_TIMER_HW_TASKLET) ||
700 (ti->flags & SNDRV_TIMER_IFLG_FAST)) 704 (ti->flags & SNDRV_TIMER_IFLG_FAST))
@@ -1253,7 +1257,7 @@ static int snd_timer_user_open(struct inode *inode, struct file *file)
1253 return -ENOMEM; 1257 return -ENOMEM;
1254 spin_lock_init(&tu->qlock); 1258 spin_lock_init(&tu->qlock);
1255 init_waitqueue_head(&tu->qchange_sleep); 1259 init_waitqueue_head(&tu->qchange_sleep);
1256 mutex_init(&tu->tread_sem); 1260 mutex_init(&tu->ioctl_lock);
1257 tu->ticks = 1; 1261 tu->ticks = 1;
1258 tu->queue_size = 128; 1262 tu->queue_size = 128;
1259 tu->queue = kmalloc(tu->queue_size * sizeof(struct snd_timer_read), 1263 tu->queue = kmalloc(tu->queue_size * sizeof(struct snd_timer_read),
@@ -1273,8 +1277,10 @@ static int snd_timer_user_release(struct inode *inode, struct file *file)
1273 if (file->private_data) { 1277 if (file->private_data) {
1274 tu = file->private_data; 1278 tu = file->private_data;
1275 file->private_data = NULL; 1279 file->private_data = NULL;
1280 mutex_lock(&tu->ioctl_lock);
1276 if (tu->timeri) 1281 if (tu->timeri)
1277 snd_timer_close(tu->timeri); 1282 snd_timer_close(tu->timeri);
1283 mutex_unlock(&tu->ioctl_lock);
1278 kfree(tu->queue); 1284 kfree(tu->queue);
1279 kfree(tu->tqueue); 1285 kfree(tu->tqueue);
1280 kfree(tu); 1286 kfree(tu);
@@ -1512,7 +1518,6 @@ static int snd_timer_user_tselect(struct file *file,
1512 int err = 0; 1518 int err = 0;
1513 1519
1514 tu = file->private_data; 1520 tu = file->private_data;
1515 mutex_lock(&tu->tread_sem);
1516 if (tu->timeri) { 1521 if (tu->timeri) {
1517 snd_timer_close(tu->timeri); 1522 snd_timer_close(tu->timeri);
1518 tu->timeri = NULL; 1523 tu->timeri = NULL;
@@ -1556,7 +1561,6 @@ static int snd_timer_user_tselect(struct file *file,
1556 } 1561 }
1557 1562
1558 __err: 1563 __err:
1559 mutex_unlock(&tu->tread_sem);
1560 return err; 1564 return err;
1561} 1565}
1562 1566
@@ -1769,7 +1773,7 @@ enum {
1769 SNDRV_TIMER_IOCTL_PAUSE_OLD = _IO('T', 0x23), 1773 SNDRV_TIMER_IOCTL_PAUSE_OLD = _IO('T', 0x23),
1770}; 1774};
1771 1775
1772static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, 1776static long __snd_timer_user_ioctl(struct file *file, unsigned int cmd,
1773 unsigned long arg) 1777 unsigned long arg)
1774{ 1778{
1775 struct snd_timer_user *tu; 1779 struct snd_timer_user *tu;
@@ -1786,17 +1790,11 @@ static long snd_timer_user_ioctl(struct file *file, unsigned int cmd,
1786 { 1790 {
1787 int xarg; 1791 int xarg;
1788 1792
1789 mutex_lock(&tu->tread_sem); 1793 if (tu->timeri) /* too late */
1790 if (tu->timeri) { /* too late */
1791 mutex_unlock(&tu->tread_sem);
1792 return -EBUSY; 1794 return -EBUSY;
1793 } 1795 if (get_user(xarg, p))
1794 if (get_user(xarg, p)) {
1795 mutex_unlock(&tu->tread_sem);
1796 return -EFAULT; 1796 return -EFAULT;
1797 }
1798 tu->tread = xarg ? 1 : 0; 1797 tu->tread = xarg ? 1 : 0;
1799 mutex_unlock(&tu->tread_sem);
1800 return 0; 1798 return 0;
1801 } 1799 }
1802 case SNDRV_TIMER_IOCTL_GINFO: 1800 case SNDRV_TIMER_IOCTL_GINFO:
@@ -1829,6 +1827,18 @@ static long snd_timer_user_ioctl(struct file *file, unsigned int cmd,
1829 return -ENOTTY; 1827 return -ENOTTY;
1830} 1828}
1831 1829
1830static long snd_timer_user_ioctl(struct file *file, unsigned int cmd,
1831 unsigned long arg)
1832{
1833 struct snd_timer_user *tu = file->private_data;
1834 long ret;
1835
1836 mutex_lock(&tu->ioctl_lock);
1837 ret = __snd_timer_user_ioctl(file, cmd, arg);
1838 mutex_unlock(&tu->ioctl_lock);
1839 return ret;
1840}
1841
1832static int snd_timer_user_fasync(int fd, struct file * file, int on) 1842static int snd_timer_user_fasync(int fd, struct file * file, int on)
1833{ 1843{
1834 struct snd_timer_user *tu; 1844 struct snd_timer_user *tu;
diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c
index 016e451ed506..75b74850c005 100644
--- a/sound/drivers/dummy.c
+++ b/sound/drivers/dummy.c
@@ -351,7 +351,7 @@ static void dummy_systimer_free(struct snd_pcm_substream *substream)
351 kfree(substream->runtime->private_data); 351 kfree(substream->runtime->private_data);
352} 352}
353 353
354static struct dummy_timer_ops dummy_systimer_ops = { 354static const struct dummy_timer_ops dummy_systimer_ops = {
355 .create = dummy_systimer_create, 355 .create = dummy_systimer_create,
356 .free = dummy_systimer_free, 356 .free = dummy_systimer_free,
357 .prepare = dummy_systimer_prepare, 357 .prepare = dummy_systimer_prepare,
@@ -475,7 +475,7 @@ static void dummy_hrtimer_free(struct snd_pcm_substream *substream)
475 kfree(dpcm); 475 kfree(dpcm);
476} 476}
477 477
478static struct dummy_timer_ops dummy_hrtimer_ops = { 478static const struct dummy_timer_ops dummy_hrtimer_ops = {
479 .create = dummy_hrtimer_create, 479 .create = dummy_hrtimer_create,
480 .free = dummy_hrtimer_free, 480 .free = dummy_hrtimer_free,
481 .prepare = dummy_hrtimer_prepare, 481 .prepare = dummy_hrtimer_prepare,
diff --git a/sound/firewire/Kconfig b/sound/firewire/Kconfig
index e92a6d949847..2a779c2f63ab 100644
--- a/sound/firewire/Kconfig
+++ b/sound/firewire/Kconfig
@@ -39,6 +39,7 @@ config SND_OXFW
39 * Mackie(Loud) d.2 pro/d.4 pro 39 * Mackie(Loud) d.2 pro/d.4 pro
40 * Mackie(Loud) U.420/U.420d 40 * Mackie(Loud) U.420/U.420d
41 * TASCAM FireOne 41 * TASCAM FireOne
42 * Stanton Controllers & Systems 1 Deck/Mixer
42 43
43 To compile this driver as a module, choose M here: the module 44 To compile this driver as a module, choose M here: the module
44 will be called snd-oxfw. 45 will be called snd-oxfw.
@@ -53,17 +54,6 @@ config SND_ISIGHT
53 To compile this driver as a module, choose M here: the module 54 To compile this driver as a module, choose M here: the module
54 will be called snd-isight. 55 will be called snd-isight.
55 56
56config SND_SCS1X
57 tristate "Stanton Control System 1 MIDI"
58 select SND_FIREWIRE_LIB
59 help
60 Say Y here to include support for the MIDI ports of the Stanton
61 SCS.1d/SCS.1m DJ controllers. (SCS.1m audio is still handled
62 by FFADO.)
63
64 To compile this driver as a module, choose M here: the module
65 will be called snd-scs1x.
66
67config SND_FIREWORKS 57config SND_FIREWORKS
68 tristate "Echo Fireworks board module support" 58 tristate "Echo Fireworks board module support"
69 select SND_FIREWIRE_LIB 59 select SND_FIREWIRE_LIB
diff --git a/sound/firewire/Makefile b/sound/firewire/Makefile
index f5fb62551c60..003c09029786 100644
--- a/sound/firewire/Makefile
+++ b/sound/firewire/Makefile
@@ -1,13 +1,11 @@
1snd-firewire-lib-objs := lib.o iso-resources.o packets-buffer.o \ 1snd-firewire-lib-objs := lib.o iso-resources.o packets-buffer.o \
2 fcp.o cmp.o amdtp-stream.o amdtp-am824.o 2 fcp.o cmp.o amdtp-stream.o amdtp-am824.o
3snd-isight-objs := isight.o 3snd-isight-objs := isight.o
4snd-scs1x-objs := scs1x.o
5 4
6obj-$(CONFIG_SND_FIREWIRE_LIB) += snd-firewire-lib.o 5obj-$(CONFIG_SND_FIREWIRE_LIB) += snd-firewire-lib.o
7obj-$(CONFIG_SND_DICE) += dice/ 6obj-$(CONFIG_SND_DICE) += dice/
8obj-$(CONFIG_SND_OXFW) += oxfw/ 7obj-$(CONFIG_SND_OXFW) += oxfw/
9obj-$(CONFIG_SND_ISIGHT) += snd-isight.o 8obj-$(CONFIG_SND_ISIGHT) += snd-isight.o
10obj-$(CONFIG_SND_SCS1X) += snd-scs1x.o
11obj-$(CONFIG_SND_FIREWORKS) += fireworks/ 9obj-$(CONFIG_SND_FIREWORKS) += fireworks/
12obj-$(CONFIG_SND_BEBOB) += bebob/ 10obj-$(CONFIG_SND_BEBOB) += bebob/
13obj-$(CONFIG_SND_FIREWIRE_DIGI00X) += digi00x/ 11obj-$(CONFIG_SND_FIREWIRE_DIGI00X) += digi00x/
diff --git a/sound/firewire/dice/dice-transaction.c b/sound/firewire/dice/dice-transaction.c
index aee746187665..a4ff4e0bc0af 100644
--- a/sound/firewire/dice/dice-transaction.c
+++ b/sound/firewire/dice/dice-transaction.c
@@ -9,7 +9,7 @@
9 9
10#include "dice.h" 10#include "dice.h"
11 11
12#define NOTIFICATION_TIMEOUT_MS 100 12#define NOTIFICATION_TIMEOUT_MS (2 * MSEC_PER_SEC)
13 13
14static u64 get_subaddr(struct snd_dice *dice, enum snd_dice_addr_type type, 14static u64 get_subaddr(struct snd_dice *dice, enum snd_dice_addr_type type,
15 u64 offset) 15 u64 offset)
@@ -65,16 +65,15 @@ static unsigned int get_clock_info(struct snd_dice *dice, __be32 *info)
65static int set_clock_info(struct snd_dice *dice, 65static int set_clock_info(struct snd_dice *dice,
66 unsigned int rate, unsigned int source) 66 unsigned int rate, unsigned int source)
67{ 67{
68 unsigned int retries = 3;
69 unsigned int i; 68 unsigned int i;
70 __be32 info; 69 __be32 info;
71 u32 mask; 70 u32 mask;
72 u32 clock; 71 u32 clock;
73 int err; 72 int err;
74retry: 73
75 err = get_clock_info(dice, &info); 74 err = get_clock_info(dice, &info);
76 if (err < 0) 75 if (err < 0)
77 goto end; 76 return err;
78 77
79 clock = be32_to_cpu(info); 78 clock = be32_to_cpu(info);
80 if (source != UINT_MAX) { 79 if (source != UINT_MAX) {
@@ -87,10 +86,8 @@ retry:
87 if (snd_dice_rates[i] == rate) 86 if (snd_dice_rates[i] == rate)
88 break; 87 break;
89 } 88 }
90 if (i == ARRAY_SIZE(snd_dice_rates)) { 89 if (i == ARRAY_SIZE(snd_dice_rates))
91 err = -EINVAL; 90 return -EINVAL;
92 goto end;
93 }
94 91
95 mask = CLOCK_RATE_MASK; 92 mask = CLOCK_RATE_MASK;
96 clock &= ~mask; 93 clock &= ~mask;
@@ -104,25 +101,13 @@ retry:
104 err = snd_dice_transaction_write_global(dice, GLOBAL_CLOCK_SELECT, 101 err = snd_dice_transaction_write_global(dice, GLOBAL_CLOCK_SELECT,
105 &info, 4); 102 &info, 4);
106 if (err < 0) 103 if (err < 0)
107 goto end; 104 return err;
108 105
109 /* Timeout means it's invalid request, probably bus reset occurred. */
110 if (wait_for_completion_timeout(&dice->clock_accepted, 106 if (wait_for_completion_timeout(&dice->clock_accepted,
111 msecs_to_jiffies(NOTIFICATION_TIMEOUT_MS)) == 0) { 107 msecs_to_jiffies(NOTIFICATION_TIMEOUT_MS)) == 0)
112 if (retries-- == 0) { 108 return -ETIMEDOUT;
113 err = -ETIMEDOUT;
114 goto end;
115 }
116 109
117 err = snd_dice_transaction_reinit(dice); 110 return 0;
118 if (err < 0)
119 goto end;
120
121 msleep(500); /* arbitrary */
122 goto retry;
123 }
124end:
125 return err;
126} 111}
127 112
128int snd_dice_transaction_get_clock_source(struct snd_dice *dice, 113int snd_dice_transaction_get_clock_source(struct snd_dice *dice,
@@ -331,39 +316,60 @@ int snd_dice_transaction_reinit(struct snd_dice *dice)
331 return register_notification_address(dice, false); 316 return register_notification_address(dice, false);
332} 317}
333 318
334int snd_dice_transaction_init(struct snd_dice *dice) 319static int get_subaddrs(struct snd_dice *dice)
335{ 320{
336 struct fw_address_handler *handler = &dice->notification_handler; 321 static const int min_values[10] = {
322 10, 0x64 / 4,
323 10, 0x18 / 4,
324 10, 0x18 / 4,
325 0, 0,
326 0, 0,
327 };
337 __be32 *pointers; 328 __be32 *pointers;
329 __be32 version;
330 u32 data;
331 unsigned int i;
338 int err; 332 int err;
339 333
340 /* Use the same way which dice_interface_check() does. */ 334 pointers = kmalloc_array(ARRAY_SIZE(min_values), sizeof(__be32),
341 pointers = kmalloc(sizeof(__be32) * 10, GFP_KERNEL); 335 GFP_KERNEL);
342 if (pointers == NULL) 336 if (pointers == NULL)
343 return -ENOMEM; 337 return -ENOMEM;
344 338
345 /* Get offsets for sub-addresses */ 339 /*
340 * Check that the sub address spaces exist and are located inside the
341 * private address space. The minimum values are chosen so that all
342 * minimally required registers are included.
343 */
346 err = snd_fw_transaction(dice->unit, TCODE_READ_BLOCK_REQUEST, 344 err = snd_fw_transaction(dice->unit, TCODE_READ_BLOCK_REQUEST,
347 DICE_PRIVATE_SPACE, 345 DICE_PRIVATE_SPACE, pointers,
348 pointers, sizeof(__be32) * 10, 0); 346 sizeof(__be32) * ARRAY_SIZE(min_values), 0);
349 if (err < 0) 347 if (err < 0)
350 goto end; 348 goto end;
351 349
352 /* Allocation callback in address space over host controller */ 350 for (i = 0; i < ARRAY_SIZE(min_values); ++i) {
353 handler->length = 4; 351 data = be32_to_cpu(pointers[i]);
354 handler->address_callback = dice_notification; 352 if (data < min_values[i] || data >= 0x40000) {
355 handler->callback_data = dice; 353 err = -ENODEV;
356 err = fw_core_add_address_handler(handler, &fw_high_memory_region); 354 goto end;
357 if (err < 0) { 355 }
358 handler->callback_data = NULL;
359 goto end;
360 } 356 }
361 357
362 /* Register the address space */ 358 /*
363 err = register_notification_address(dice, true); 359 * Check that the implemented DICE driver specification major version
364 if (err < 0) { 360 * number matches.
365 fw_core_remove_address_handler(handler); 361 */
366 handler->callback_data = NULL; 362 err = snd_fw_transaction(dice->unit, TCODE_READ_QUADLET_REQUEST,
363 DICE_PRIVATE_SPACE +
364 be32_to_cpu(pointers[0]) * 4 + GLOBAL_VERSION,
365 &version, sizeof(version), 0);
366 if (err < 0)
367 goto end;
368
369 if ((version & cpu_to_be32(0xff000000)) != cpu_to_be32(0x01000000)) {
370 dev_err(&dice->unit->device,
371 "unknown DICE version: 0x%08x\n", be32_to_cpu(version));
372 err = -ENODEV;
367 goto end; 373 goto end;
368 } 374 }
369 375
@@ -380,3 +386,32 @@ end:
380 kfree(pointers); 386 kfree(pointers);
381 return err; 387 return err;
382} 388}
389
390int snd_dice_transaction_init(struct snd_dice *dice)
391{
392 struct fw_address_handler *handler = &dice->notification_handler;
393 int err;
394
395 err = get_subaddrs(dice);
396 if (err < 0)
397 return err;
398
399 /* Allocation callback in address space over host controller */
400 handler->length = 4;
401 handler->address_callback = dice_notification;
402 handler->callback_data = dice;
403 err = fw_core_add_address_handler(handler, &fw_high_memory_region);
404 if (err < 0) {
405 handler->callback_data = NULL;
406 return err;
407 }
408
409 /* Register the address space */
410 err = register_notification_address(dice, true);
411 if (err < 0) {
412 fw_core_remove_address_handler(handler);
413 handler->callback_data = NULL;
414 }
415
416 return err;
417}
diff --git a/sound/firewire/dice/dice.c b/sound/firewire/dice/dice.c
index 0cda05c72f50..b91b3739c810 100644
--- a/sound/firewire/dice/dice.c
+++ b/sound/firewire/dice/dice.c
@@ -18,27 +18,14 @@ MODULE_LICENSE("GPL v2");
18#define WEISS_CATEGORY_ID 0x00 18#define WEISS_CATEGORY_ID 0x00
19#define LOUD_CATEGORY_ID 0x10 19#define LOUD_CATEGORY_ID 0x10
20 20
21static int dice_interface_check(struct fw_unit *unit) 21#define PROBE_DELAY_MS (2 * MSEC_PER_SEC)
22
23static int check_dice_category(struct fw_unit *unit)
22{ 24{
23 static const int min_values[10] = {
24 10, 0x64 / 4,
25 10, 0x18 / 4,
26 10, 0x18 / 4,
27 0, 0,
28 0, 0,
29 };
30 struct fw_device *device = fw_parent_device(unit); 25 struct fw_device *device = fw_parent_device(unit);
31 struct fw_csr_iterator it; 26 struct fw_csr_iterator it;
32 int key, val, vendor = -1, model = -1, err; 27 int key, val, vendor = -1, model = -1;
33 unsigned int category, i; 28 unsigned int category;
34 __be32 *pointers;
35 u32 value;
36 __be32 version;
37
38 pointers = kmalloc_array(ARRAY_SIZE(min_values), sizeof(__be32),
39 GFP_KERNEL);
40 if (pointers == NULL)
41 return -ENOMEM;
42 29
43 /* 30 /*
44 * Check that GUID and unit directory are constructed according to DICE 31 * Check that GUID and unit directory are constructed according to DICE
@@ -64,51 +51,10 @@ static int dice_interface_check(struct fw_unit *unit)
64 else 51 else
65 category = DICE_CATEGORY_ID; 52 category = DICE_CATEGORY_ID;
66 if (device->config_rom[3] != ((vendor << 8) | category) || 53 if (device->config_rom[3] != ((vendor << 8) | category) ||
67 device->config_rom[4] >> 22 != model) { 54 device->config_rom[4] >> 22 != model)
68 err = -ENODEV; 55 return -ENODEV;
69 goto end;
70 }
71
72 /*
73 * Check that the sub address spaces exist and are located inside the
74 * private address space. The minimum values are chosen so that all
75 * minimally required registers are included.
76 */
77 err = snd_fw_transaction(unit, TCODE_READ_BLOCK_REQUEST,
78 DICE_PRIVATE_SPACE, pointers,
79 sizeof(__be32) * ARRAY_SIZE(min_values), 0);
80 if (err < 0) {
81 err = -ENODEV;
82 goto end;
83 }
84 for (i = 0; i < ARRAY_SIZE(min_values); ++i) {
85 value = be32_to_cpu(pointers[i]);
86 if (value < min_values[i] || value >= 0x40000) {
87 err = -ENODEV;
88 goto end;
89 }
90 }
91 56
92 /* 57 return 0;
93 * Check that the implemented DICE driver specification major version
94 * number matches.
95 */
96 err = snd_fw_transaction(unit, TCODE_READ_QUADLET_REQUEST,
97 DICE_PRIVATE_SPACE +
98 be32_to_cpu(pointers[0]) * 4 + GLOBAL_VERSION,
99 &version, 4, 0);
100 if (err < 0) {
101 err = -ENODEV;
102 goto end;
103 }
104 if ((version & cpu_to_be32(0xff000000)) != cpu_to_be32(0x01000000)) {
105 dev_err(&unit->device,
106 "unknown DICE version: 0x%08x\n", be32_to_cpu(version));
107 err = -ENODEV;
108 goto end;
109 }
110end:
111 return err;
112} 58}
113 59
114static int highest_supported_mode_rate(struct snd_dice *dice, 60static int highest_supported_mode_rate(struct snd_dice *dice,
@@ -231,6 +177,16 @@ static void dice_card_strings(struct snd_dice *dice)
231 strcpy(card->mixername, "DICE"); 177 strcpy(card->mixername, "DICE");
232} 178}
233 179
180static void dice_free(struct snd_dice *dice)
181{
182 snd_dice_stream_destroy_duplex(dice);
183 snd_dice_transaction_destroy(dice);
184 fw_unit_put(dice->unit);
185
186 mutex_destroy(&dice->mutex);
187 kfree(dice);
188}
189
234/* 190/*
235 * This module releases the FireWire unit data after all ALSA character devices 191 * This module releases the FireWire unit data after all ALSA character devices
236 * are released by applications. This is for releasing stream data or finishing 192 * are released by applications. This is for releasing stream data or finishing
@@ -239,39 +195,21 @@ static void dice_card_strings(struct snd_dice *dice)
239 */ 195 */
240static void dice_card_free(struct snd_card *card) 196static void dice_card_free(struct snd_card *card)
241{ 197{
242 struct snd_dice *dice = card->private_data; 198 dice_free(card->private_data);
243
244 snd_dice_stream_destroy_duplex(dice);
245 snd_dice_transaction_destroy(dice);
246 fw_unit_put(dice->unit);
247
248 mutex_destroy(&dice->mutex);
249} 199}
250 200
251static int dice_probe(struct fw_unit *unit, const struct ieee1394_device_id *id) 201static void do_registration(struct work_struct *work)
252{ 202{
253 struct snd_card *card; 203 struct snd_dice *dice = container_of(work, struct snd_dice, dwork.work);
254 struct snd_dice *dice;
255 int err; 204 int err;
256 205
257 err = dice_interface_check(unit); 206 if (dice->registered)
258 if (err < 0) 207 return;
259 goto end;
260 208
261 err = snd_card_new(&unit->device, -1, NULL, THIS_MODULE, 209 err = snd_card_new(&dice->unit->device, -1, NULL, THIS_MODULE, 0,
262 sizeof(*dice), &card); 210 &dice->card);
263 if (err < 0) 211 if (err < 0)
264 goto end; 212 return;
265
266 dice = card->private_data;
267 dice->card = card;
268 dice->unit = fw_unit_get(unit);
269 card->private_free = dice_card_free;
270
271 spin_lock_init(&dice->lock);
272 mutex_init(&dice->mutex);
273 init_completion(&dice->clock_accepted);
274 init_waitqueue_head(&dice->hwdep_wait);
275 213
276 err = snd_dice_transaction_init(dice); 214 err = snd_dice_transaction_init(dice);
277 if (err < 0) 215 if (err < 0)
@@ -283,56 +221,131 @@ static int dice_probe(struct fw_unit *unit, const struct ieee1394_device_id *id)
283 221
284 dice_card_strings(dice); 222 dice_card_strings(dice);
285 223
224 snd_dice_create_proc(dice);
225
286 err = snd_dice_create_pcm(dice); 226 err = snd_dice_create_pcm(dice);
287 if (err < 0) 227 if (err < 0)
288 goto error; 228 goto error;
289 229
290 err = snd_dice_create_hwdep(dice); 230 err = snd_dice_create_midi(dice);
291 if (err < 0) 231 if (err < 0)
292 goto error; 232 goto error;
293 233
294 snd_dice_create_proc(dice); 234 err = snd_dice_create_hwdep(dice);
295
296 err = snd_dice_create_midi(dice);
297 if (err < 0) 235 if (err < 0)
298 goto error; 236 goto error;
299 237
300 err = snd_dice_stream_init_duplex(dice); 238 err = snd_card_register(dice->card);
301 if (err < 0) 239 if (err < 0)
302 goto error; 240 goto error;
303 241
304 err = snd_card_register(card); 242 /*
243 * After registered, dice instance can be released corresponding to
244 * releasing the sound card instance.
245 */
246 dice->card->private_free = dice_card_free;
247 dice->card->private_data = dice;
248 dice->registered = true;
249
250 return;
251error:
252 snd_dice_transaction_destroy(dice);
253 snd_card_free(dice->card);
254 dev_info(&dice->unit->device,
255 "Sound card registration failed: %d\n", err);
256}
257
258static void schedule_registration(struct snd_dice *dice)
259{
260 struct fw_card *fw_card = fw_parent_device(dice->unit)->card;
261 u64 now, delay;
262
263 now = get_jiffies_64();
264 delay = fw_card->reset_jiffies + msecs_to_jiffies(PROBE_DELAY_MS);
265
266 if (time_after64(delay, now))
267 delay -= now;
268 else
269 delay = 0;
270
271 mod_delayed_work(system_wq, &dice->dwork, delay);
272}
273
274static int dice_probe(struct fw_unit *unit, const struct ieee1394_device_id *id)
275{
276 struct snd_dice *dice;
277 int err;
278
279 err = check_dice_category(unit);
280 if (err < 0)
281 return -ENODEV;
282
283 /* Allocate this independent of sound card instance. */
284 dice = kzalloc(sizeof(struct snd_dice), GFP_KERNEL);
285 if (dice == NULL)
286 return -ENOMEM;
287
288 dice->unit = fw_unit_get(unit);
289 dev_set_drvdata(&unit->device, dice);
290
291 spin_lock_init(&dice->lock);
292 mutex_init(&dice->mutex);
293 init_completion(&dice->clock_accepted);
294 init_waitqueue_head(&dice->hwdep_wait);
295
296 err = snd_dice_stream_init_duplex(dice);
305 if (err < 0) { 297 if (err < 0) {
306 snd_dice_stream_destroy_duplex(dice); 298 dice_free(dice);
307 goto error; 299 return err;
308 } 300 }
309 301
310 dev_set_drvdata(&unit->device, dice); 302 /* Allocate and register this sound card later. */
311end: 303 INIT_DEFERRABLE_WORK(&dice->dwork, do_registration);
312 return err; 304 schedule_registration(dice);
313error: 305
314 snd_card_free(card); 306 return 0;
315 return err;
316} 307}
317 308
318static void dice_remove(struct fw_unit *unit) 309static void dice_remove(struct fw_unit *unit)
319{ 310{
320 struct snd_dice *dice = dev_get_drvdata(&unit->device); 311 struct snd_dice *dice = dev_get_drvdata(&unit->device);
321 312
322 /* No need to wait for releasing card object in this context. */ 313 /*
323 snd_card_free_when_closed(dice->card); 314 * Confirm to stop the work for registration before the sound card is
315 * going to be released. The work is not scheduled again because bus
316 * reset handler is not called anymore.
317 */
318 cancel_delayed_work_sync(&dice->dwork);
319
320 if (dice->registered) {
321 /* No need to wait for releasing card object in this context. */
322 snd_card_free_when_closed(dice->card);
323 } else {
324 /* Don't forget this case. */
325 dice_free(dice);
326 }
324} 327}
325 328
326static void dice_bus_reset(struct fw_unit *unit) 329static void dice_bus_reset(struct fw_unit *unit)
327{ 330{
328 struct snd_dice *dice = dev_get_drvdata(&unit->device); 331 struct snd_dice *dice = dev_get_drvdata(&unit->device);
329 332
333 /* Postpone a workqueue for deferred registration. */
334 if (!dice->registered)
335 schedule_registration(dice);
336
330 /* The handler address register becomes initialized. */ 337 /* The handler address register becomes initialized. */
331 snd_dice_transaction_reinit(dice); 338 snd_dice_transaction_reinit(dice);
332 339
333 mutex_lock(&dice->mutex); 340 /*
334 snd_dice_stream_update_duplex(dice); 341 * After registration, userspace can start packet streaming, then this
335 mutex_unlock(&dice->mutex); 342 * code block works fine.
343 */
344 if (dice->registered) {
345 mutex_lock(&dice->mutex);
346 snd_dice_stream_update_duplex(dice);
347 mutex_unlock(&dice->mutex);
348 }
336} 349}
337 350
338#define DICE_INTERFACE 0x000001 351#define DICE_INTERFACE 0x000001
diff --git a/sound/firewire/dice/dice.h b/sound/firewire/dice/dice.h
index 101550ac1a24..3d5ebebe61ea 100644
--- a/sound/firewire/dice/dice.h
+++ b/sound/firewire/dice/dice.h
@@ -45,6 +45,9 @@ struct snd_dice {
45 spinlock_t lock; 45 spinlock_t lock;
46 struct mutex mutex; 46 struct mutex mutex;
47 47
48 bool registered;
49 struct delayed_work dwork;
50
48 /* Offsets for sub-addresses */ 51 /* Offsets for sub-addresses */
49 unsigned int global_offset; 52 unsigned int global_offset;
50 unsigned int rx_offset; 53 unsigned int rx_offset;
diff --git a/sound/firewire/fireworks/fireworks.h b/sound/firewire/fireworks/fireworks.h
index c7cb7deafe48..96c4e0c6a9bd 100644
--- a/sound/firewire/fireworks/fireworks.h
+++ b/sound/firewire/fireworks/fireworks.h
@@ -86,8 +86,8 @@ struct snd_efw {
86 struct amdtp_stream rx_stream; 86 struct amdtp_stream rx_stream;
87 struct cmp_connection out_conn; 87 struct cmp_connection out_conn;
88 struct cmp_connection in_conn; 88 struct cmp_connection in_conn;
89 atomic_t capture_substreams; 89 unsigned int capture_substreams;
90 atomic_t playback_substreams; 90 unsigned int playback_substreams;
91 91
92 /* hardware metering parameters */ 92 /* hardware metering parameters */
93 unsigned int phys_out; 93 unsigned int phys_out;
diff --git a/sound/firewire/fireworks/fireworks_midi.c b/sound/firewire/fireworks/fireworks_midi.c
index fba01bbba456..3e8c4cf9fe1e 100644
--- a/sound/firewire/fireworks/fireworks_midi.c
+++ b/sound/firewire/fireworks/fireworks_midi.c
@@ -17,8 +17,10 @@ static int midi_capture_open(struct snd_rawmidi_substream *substream)
17 if (err < 0) 17 if (err < 0)
18 goto end; 18 goto end;
19 19
20 atomic_inc(&efw->capture_substreams); 20 mutex_lock(&efw->mutex);
21 efw->capture_substreams++;
21 err = snd_efw_stream_start_duplex(efw, 0); 22 err = snd_efw_stream_start_duplex(efw, 0);
23 mutex_unlock(&efw->mutex);
22 if (err < 0) 24 if (err < 0)
23 snd_efw_stream_lock_release(efw); 25 snd_efw_stream_lock_release(efw);
24 26
@@ -35,8 +37,10 @@ static int midi_playback_open(struct snd_rawmidi_substream *substream)
35 if (err < 0) 37 if (err < 0)
36 goto end; 38 goto end;
37 39
38 atomic_inc(&efw->playback_substreams); 40 mutex_lock(&efw->mutex);
41 efw->playback_substreams++;
39 err = snd_efw_stream_start_duplex(efw, 0); 42 err = snd_efw_stream_start_duplex(efw, 0);
43 mutex_unlock(&efw->mutex);
40 if (err < 0) 44 if (err < 0)
41 snd_efw_stream_lock_release(efw); 45 snd_efw_stream_lock_release(efw);
42end: 46end:
@@ -47,8 +51,10 @@ static int midi_capture_close(struct snd_rawmidi_substream *substream)
47{ 51{
48 struct snd_efw *efw = substream->rmidi->private_data; 52 struct snd_efw *efw = substream->rmidi->private_data;
49 53
50 atomic_dec(&efw->capture_substreams); 54 mutex_lock(&efw->mutex);
55 efw->capture_substreams--;
51 snd_efw_stream_stop_duplex(efw); 56 snd_efw_stream_stop_duplex(efw);
57 mutex_unlock(&efw->mutex);
52 58
53 snd_efw_stream_lock_release(efw); 59 snd_efw_stream_lock_release(efw);
54 return 0; 60 return 0;
@@ -58,8 +64,10 @@ static int midi_playback_close(struct snd_rawmidi_substream *substream)
58{ 64{
59 struct snd_efw *efw = substream->rmidi->private_data; 65 struct snd_efw *efw = substream->rmidi->private_data;
60 66
61 atomic_dec(&efw->playback_substreams); 67 mutex_lock(&efw->mutex);
68 efw->playback_substreams--;
62 snd_efw_stream_stop_duplex(efw); 69 snd_efw_stream_stop_duplex(efw);
70 mutex_unlock(&efw->mutex);
63 71
64 snd_efw_stream_lock_release(efw); 72 snd_efw_stream_lock_release(efw);
65 return 0; 73 return 0;
diff --git a/sound/firewire/fireworks/fireworks_pcm.c b/sound/firewire/fireworks/fireworks_pcm.c
index d27135bac513..f4fbf75ed198 100644
--- a/sound/firewire/fireworks/fireworks_pcm.c
+++ b/sound/firewire/fireworks/fireworks_pcm.c
@@ -251,8 +251,11 @@ static int pcm_capture_hw_params(struct snd_pcm_substream *substream,
251 if (err < 0) 251 if (err < 0)
252 return err; 252 return err;
253 253
254 if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) 254 if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) {
255 atomic_inc(&efw->capture_substreams); 255 mutex_lock(&efw->mutex);
256 efw->capture_substreams++;
257 mutex_unlock(&efw->mutex);
258 }
256 259
257 amdtp_am824_set_pcm_format(&efw->tx_stream, params_format(hw_params)); 260 amdtp_am824_set_pcm_format(&efw->tx_stream, params_format(hw_params));
258 261
@@ -269,8 +272,11 @@ static int pcm_playback_hw_params(struct snd_pcm_substream *substream,
269 if (err < 0) 272 if (err < 0)
270 return err; 273 return err;
271 274
272 if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) 275 if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) {
273 atomic_inc(&efw->playback_substreams); 276 mutex_lock(&efw->mutex);
277 efw->playback_substreams++;
278 mutex_unlock(&efw->mutex);
279 }
274 280
275 amdtp_am824_set_pcm_format(&efw->rx_stream, params_format(hw_params)); 281 amdtp_am824_set_pcm_format(&efw->rx_stream, params_format(hw_params));
276 282
@@ -281,8 +287,11 @@ static int pcm_capture_hw_free(struct snd_pcm_substream *substream)
281{ 287{
282 struct snd_efw *efw = substream->private_data; 288 struct snd_efw *efw = substream->private_data;
283 289
284 if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) 290 if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) {
285 atomic_dec(&efw->capture_substreams); 291 mutex_lock(&efw->mutex);
292 efw->capture_substreams--;
293 mutex_unlock(&efw->mutex);
294 }
286 295
287 snd_efw_stream_stop_duplex(efw); 296 snd_efw_stream_stop_duplex(efw);
288 297
@@ -292,8 +301,11 @@ static int pcm_playback_hw_free(struct snd_pcm_substream *substream)
292{ 301{
293 struct snd_efw *efw = substream->private_data; 302 struct snd_efw *efw = substream->private_data;
294 303
295 if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) 304 if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN) {
296 atomic_dec(&efw->playback_substreams); 305 mutex_lock(&efw->mutex);
306 efw->playback_substreams--;
307 mutex_unlock(&efw->mutex);
308 }
297 309
298 snd_efw_stream_stop_duplex(efw); 310 snd_efw_stream_stop_duplex(efw);
299 311
diff --git a/sound/firewire/fireworks/fireworks_stream.c b/sound/firewire/fireworks/fireworks_stream.c
index 759f6e3ed44a..968a40a1beb2 100644
--- a/sound/firewire/fireworks/fireworks_stream.c
+++ b/sound/firewire/fireworks/fireworks_stream.c
@@ -209,16 +209,13 @@ end:
209int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate) 209int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate)
210{ 210{
211 struct amdtp_stream *master, *slave; 211 struct amdtp_stream *master, *slave;
212 atomic_t *slave_substreams; 212 unsigned int slave_substreams;
213 enum cip_flags sync_mode; 213 enum cip_flags sync_mode;
214 unsigned int curr_rate; 214 unsigned int curr_rate;
215 int err = 0; 215 int err = 0;
216 216
217 mutex_lock(&efw->mutex);
218
219 /* Need no substreams */ 217 /* Need no substreams */
220 if ((atomic_read(&efw->playback_substreams) == 0) && 218 if (efw->playback_substreams == 0 && efw->capture_substreams == 0)
221 (atomic_read(&efw->capture_substreams) == 0))
222 goto end; 219 goto end;
223 220
224 err = get_sync_mode(efw, &sync_mode); 221 err = get_sync_mode(efw, &sync_mode);
@@ -227,11 +224,11 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate)
227 if (sync_mode == CIP_SYNC_TO_DEVICE) { 224 if (sync_mode == CIP_SYNC_TO_DEVICE) {
228 master = &efw->tx_stream; 225 master = &efw->tx_stream;
229 slave = &efw->rx_stream; 226 slave = &efw->rx_stream;
230 slave_substreams = &efw->playback_substreams; 227 slave_substreams = efw->playback_substreams;
231 } else { 228 } else {
232 master = &efw->rx_stream; 229 master = &efw->rx_stream;
233 slave = &efw->tx_stream; 230 slave = &efw->tx_stream;
234 slave_substreams = &efw->capture_substreams; 231 slave_substreams = efw->capture_substreams;
235 } 232 }
236 233
237 /* 234 /*
@@ -277,7 +274,7 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate)
277 } 274 }
278 275
279 /* start slave if needed */ 276 /* start slave if needed */
280 if (atomic_read(slave_substreams) > 0 && !amdtp_stream_running(slave)) { 277 if (slave_substreams > 0 && !amdtp_stream_running(slave)) {
281 err = start_stream(efw, slave, rate); 278 err = start_stream(efw, slave, rate);
282 if (err < 0) { 279 if (err < 0) {
283 dev_err(&efw->unit->device, 280 dev_err(&efw->unit->device,
@@ -286,37 +283,32 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate)
286 } 283 }
287 } 284 }
288end: 285end:
289 mutex_unlock(&efw->mutex);
290 return err; 286 return err;
291} 287}
292 288
293void snd_efw_stream_stop_duplex(struct snd_efw *efw) 289void snd_efw_stream_stop_duplex(struct snd_efw *efw)
294{ 290{
295 struct amdtp_stream *master, *slave; 291 struct amdtp_stream *master, *slave;
296 atomic_t *master_substreams, *slave_substreams; 292 unsigned int master_substreams, slave_substreams;
297 293
298 if (efw->master == &efw->rx_stream) { 294 if (efw->master == &efw->rx_stream) {
299 slave = &efw->tx_stream; 295 slave = &efw->tx_stream;
300 master = &efw->rx_stream; 296 master = &efw->rx_stream;
301 slave_substreams = &efw->capture_substreams; 297 slave_substreams = efw->capture_substreams;
302 master_substreams = &efw->playback_substreams; 298 master_substreams = efw->playback_substreams;
303 } else { 299 } else {
304 slave = &efw->rx_stream; 300 slave = &efw->rx_stream;
305 master = &efw->tx_stream; 301 master = &efw->tx_stream;
306 slave_substreams = &efw->playback_substreams; 302 slave_substreams = efw->playback_substreams;
307 master_substreams = &efw->capture_substreams; 303 master_substreams = efw->capture_substreams;
308 } 304 }
309 305
310 mutex_lock(&efw->mutex); 306 if (slave_substreams == 0) {
311
312 if (atomic_read(slave_substreams) == 0) {
313 stop_stream(efw, slave); 307 stop_stream(efw, slave);
314 308
315 if (atomic_read(master_substreams) == 0) 309 if (master_substreams == 0)
316 stop_stream(efw, master); 310 stop_stream(efw, master);
317 } 311 }
318
319 mutex_unlock(&efw->mutex);
320} 312}
321 313
322void snd_efw_stream_update_duplex(struct snd_efw *efw) 314void snd_efw_stream_update_duplex(struct snd_efw *efw)
diff --git a/sound/firewire/oxfw/Makefile b/sound/firewire/oxfw/Makefile
index 06ff50f4e6c0..b474da7c6a1f 100644
--- a/sound/firewire/oxfw/Makefile
+++ b/sound/firewire/oxfw/Makefile
@@ -1,3 +1,3 @@
1snd-oxfw-objs := oxfw-command.o oxfw-stream.o oxfw-control.o oxfw-pcm.o \ 1snd-oxfw-objs := oxfw-command.o oxfw-stream.o oxfw-pcm.o oxfw-proc.o \
2 oxfw-proc.o oxfw-midi.o oxfw-hwdep.o oxfw.o 2 oxfw-midi.o oxfw-hwdep.o oxfw-spkr.o oxfw-scs1x.o oxfw.o
3obj-$(CONFIG_SND_OXFW) += snd-oxfw.o 3obj-$(CONFIG_SND_OXFW) += snd-oxfw.o
diff --git a/sound/firewire/oxfw/oxfw-scs1x.c b/sound/firewire/oxfw/oxfw-scs1x.c
new file mode 100644
index 000000000000..bb53eb35721b
--- /dev/null
+++ b/sound/firewire/oxfw/oxfw-scs1x.c
@@ -0,0 +1,406 @@
1/*
2 * oxfw-scs1x.c - a part of driver for OXFW970/971 based devices
3 *
4 * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
5 * Copyright (c) 2015 Takashi Sakamoto <o-takashi@sakamocchi.jp>
6 *
7 * Licensed under the terms of the GNU General Public License, version 2.
8 */
9
10#include "oxfw.h"
11
12#define HSS1394_ADDRESS 0xc007dedadadaULL
13#define HSS1394_MAX_PACKET_SIZE 64
14#define HSS1394_TAG_USER_DATA 0x00
15#define HSS1394_TAG_CHANGE_ADDRESS 0xf1
16
17struct fw_scs1x {
18 struct fw_address_handler hss_handler;
19 u8 input_escape_count;
20 struct snd_rawmidi_substream *input;
21
22 /* For MIDI playback. */
23 struct snd_rawmidi_substream *output;
24 bool output_idle;
25 u8 output_status;
26 u8 output_bytes;
27 bool output_escaped;
28 bool output_escape_high_nibble;
29 struct tasklet_struct tasklet;
30 wait_queue_head_t idle_wait;
31 u8 buffer[HSS1394_MAX_PACKET_SIZE];
32 bool transaction_running;
33 struct fw_transaction transaction;
34 struct fw_device *fw_dev;
35};
36
37static const u8 sysex_escape_prefix[] = {
38 0xf0, /* SysEx begin */
39 0x00, 0x01, 0x60, /* Stanton DJ */
40 0x48, 0x53, 0x53, /* "HSS" */
41};
42
43static void midi_input_escaped_byte(struct snd_rawmidi_substream *stream,
44 u8 byte)
45{
46 u8 nibbles[2];
47
48 nibbles[0] = byte >> 4;
49 nibbles[1] = byte & 0x0f;
50 snd_rawmidi_receive(stream, nibbles, 2);
51}
52
53static void midi_input_byte(struct fw_scs1x *scs,
54 struct snd_rawmidi_substream *stream, u8 byte)
55{
56 const u8 eox = 0xf7;
57
58 if (scs->input_escape_count > 0) {
59 midi_input_escaped_byte(stream, byte);
60 scs->input_escape_count--;
61 if (scs->input_escape_count == 0)
62 snd_rawmidi_receive(stream, &eox, sizeof(eox));
63 } else if (byte == 0xf9) {
64 snd_rawmidi_receive(stream, sysex_escape_prefix,
65 ARRAY_SIZE(sysex_escape_prefix));
66 midi_input_escaped_byte(stream, 0x00);
67 midi_input_escaped_byte(stream, 0xf9);
68 scs->input_escape_count = 3;
69 } else {
70 snd_rawmidi_receive(stream, &byte, 1);
71 }
72}
73
74static void midi_input_packet(struct fw_scs1x *scs,
75 struct snd_rawmidi_substream *stream,
76 const u8 *data, unsigned int bytes)
77{
78 unsigned int i;
79 const u8 eox = 0xf7;
80
81 if (data[0] == HSS1394_TAG_USER_DATA) {
82 for (i = 1; i < bytes; ++i)
83 midi_input_byte(scs, stream, data[i]);
84 } else {
85 snd_rawmidi_receive(stream, sysex_escape_prefix,
86 ARRAY_SIZE(sysex_escape_prefix));
87 for (i = 0; i < bytes; ++i)
88 midi_input_escaped_byte(stream, data[i]);
89 snd_rawmidi_receive(stream, &eox, sizeof(eox));
90 }
91}
92
93static void handle_hss(struct fw_card *card, struct fw_request *request,
94 int tcode, int destination, int source, int generation,
95 unsigned long long offset, void *data, size_t length,
96 void *callback_data)
97{
98 struct fw_scs1x *scs = callback_data;
99 struct snd_rawmidi_substream *stream;
100 int rcode;
101
102 if (offset != scs->hss_handler.offset) {
103 rcode = RCODE_ADDRESS_ERROR;
104 goto end;
105 }
106 if (tcode != TCODE_WRITE_QUADLET_REQUEST &&
107 tcode != TCODE_WRITE_BLOCK_REQUEST) {
108 rcode = RCODE_TYPE_ERROR;
109 goto end;
110 }
111
112 if (length >= 1) {
113 stream = ACCESS_ONCE(scs->input);
114 if (stream)
115 midi_input_packet(scs, stream, data, length);
116 }
117
118 rcode = RCODE_COMPLETE;
119end:
120 fw_send_response(card, request, rcode);
121}
122
123static void scs_write_callback(struct fw_card *card, int rcode,
124 void *data, size_t length, void *callback_data)
125{
126 struct fw_scs1x *scs = callback_data;
127
128 if (rcode == RCODE_GENERATION)
129 ; /* TODO: retry this packet */
130
131 scs->transaction_running = false;
132 tasklet_schedule(&scs->tasklet);
133}
134
135static bool is_valid_running_status(u8 status)
136{
137 return status >= 0x80 && status <= 0xef;
138}
139
140static bool is_one_byte_cmd(u8 status)
141{
142 return status == 0xf6 ||
143 status >= 0xf8;
144}
145
146static bool is_two_bytes_cmd(u8 status)
147{
148 return (status >= 0xc0 && status <= 0xdf) ||
149 status == 0xf1 ||
150 status == 0xf3;
151}
152
153static bool is_three_bytes_cmd(u8 status)
154{
155 return (status >= 0x80 && status <= 0xbf) ||
156 (status >= 0xe0 && status <= 0xef) ||
157 status == 0xf2;
158}
159
160static bool is_invalid_cmd(u8 status)
161{
162 return status == 0xf4 ||
163 status == 0xf5 ||
164 status == 0xf9 ||
165 status == 0xfd;
166}
167
168static void scs_output_tasklet(unsigned long data)
169{
170 struct fw_scs1x *scs = (struct fw_scs1x *)data;
171 struct snd_rawmidi_substream *stream;
172 unsigned int i;
173 u8 byte;
174 int generation;
175
176 if (scs->transaction_running)
177 return;
178
179 stream = ACCESS_ONCE(scs->output);
180 if (!stream) {
181 scs->output_idle = true;
182 wake_up(&scs->idle_wait);
183 return;
184 }
185
186 i = scs->output_bytes;
187 for (;;) {
188 if (snd_rawmidi_transmit(stream, &byte, 1) != 1) {
189 scs->output_bytes = i;
190 scs->output_idle = true;
191 wake_up(&scs->idle_wait);
192 return;
193 }
194 /*
195 * Convert from real MIDI to what I think the device expects (no
196 * running status, one command per packet, unescaped SysExs).
197 */
198 if (scs->output_escaped && byte < 0x80) {
199 if (scs->output_escape_high_nibble) {
200 if (i < HSS1394_MAX_PACKET_SIZE) {
201 scs->buffer[i] = byte << 4;
202 scs->output_escape_high_nibble = false;
203 }
204 } else {
205 scs->buffer[i++] |= byte & 0x0f;
206 scs->output_escape_high_nibble = true;
207 }
208 } else if (byte < 0x80) {
209 if (i == 1) {
210 if (!is_valid_running_status(
211 scs->output_status))
212 continue;
213 scs->buffer[0] = HSS1394_TAG_USER_DATA;
214 scs->buffer[i++] = scs->output_status;
215 }
216 scs->buffer[i++] = byte;
217 if ((i == 3 && is_two_bytes_cmd(scs->output_status)) ||
218 (i == 4 && is_three_bytes_cmd(scs->output_status)))
219 break;
220 if (i == 1 + ARRAY_SIZE(sysex_escape_prefix) &&
221 !memcmp(scs->buffer + 1, sysex_escape_prefix,
222 ARRAY_SIZE(sysex_escape_prefix))) {
223 scs->output_escaped = true;
224 scs->output_escape_high_nibble = true;
225 i = 0;
226 }
227 if (i >= HSS1394_MAX_PACKET_SIZE)
228 i = 1;
229 } else if (byte == 0xf7) {
230 if (scs->output_escaped) {
231 if (i >= 1 && scs->output_escape_high_nibble &&
232 scs->buffer[0] !=
233 HSS1394_TAG_CHANGE_ADDRESS)
234 break;
235 } else {
236 if (i > 1 && scs->output_status == 0xf0) {
237 scs->buffer[i++] = 0xf7;
238 break;
239 }
240 }
241 i = 1;
242 scs->output_escaped = false;
243 } else if (!is_invalid_cmd(byte) && byte < 0xf8) {
244 i = 1;
245 scs->buffer[0] = HSS1394_TAG_USER_DATA;
246 scs->buffer[i++] = byte;
247 scs->output_status = byte;
248 scs->output_escaped = false;
249 if (is_one_byte_cmd(byte))
250 break;
251 }
252 }
253 scs->output_bytes = 1;
254 scs->output_escaped = false;
255
256 scs->transaction_running = true;
257 generation = scs->fw_dev->generation;
258 smp_rmb(); /* node_id vs. generation */
259 fw_send_request(scs->fw_dev->card, &scs->transaction,
260 TCODE_WRITE_BLOCK_REQUEST, scs->fw_dev->node_id,
261 generation, scs->fw_dev->max_speed, HSS1394_ADDRESS,
262 scs->buffer, i, scs_write_callback, scs);
263}
264
265static int midi_capture_open(struct snd_rawmidi_substream *stream)
266{
267 return 0;
268}
269
270static int midi_capture_close(struct snd_rawmidi_substream *stream)
271{
272 return 0;
273}
274
275static void midi_capture_trigger(struct snd_rawmidi_substream *stream, int up)
276{
277 struct fw_scs1x *scs = stream->rmidi->private_data;
278
279 if (up) {
280 scs->input_escape_count = 0;
281 ACCESS_ONCE(scs->input) = stream;
282 } else {
283 ACCESS_ONCE(scs->input) = NULL;
284 }
285}
286
287static struct snd_rawmidi_ops midi_capture_ops = {
288 .open = midi_capture_open,
289 .close = midi_capture_close,
290 .trigger = midi_capture_trigger,
291};
292
293static int midi_playback_open(struct snd_rawmidi_substream *stream)
294{
295 return 0;
296}
297
298static int midi_playback_close(struct snd_rawmidi_substream *stream)
299{
300 return 0;
301}
302
303static void midi_playback_trigger(struct snd_rawmidi_substream *stream, int up)
304{
305 struct fw_scs1x *scs = stream->rmidi->private_data;
306
307 if (up) {
308 scs->output_status = 0;
309 scs->output_bytes = 1;
310 scs->output_escaped = false;
311 scs->output_idle = false;
312
313 ACCESS_ONCE(scs->output) = stream;
314 tasklet_schedule(&scs->tasklet);
315 } else {
316 ACCESS_ONCE(scs->output) = NULL;
317 }
318}
319static void midi_playback_drain(struct snd_rawmidi_substream *stream)
320{
321 struct fw_scs1x *scs = stream->rmidi->private_data;
322
323 wait_event(scs->idle_wait, scs->output_idle);
324}
325
326static struct snd_rawmidi_ops midi_playback_ops = {
327 .open = midi_playback_open,
328 .close = midi_playback_close,
329 .trigger = midi_playback_trigger,
330 .drain = midi_playback_drain,
331};
332static int register_address(struct snd_oxfw *oxfw)
333{
334 struct fw_scs1x *scs = oxfw->spec;
335 __be64 data;
336
337 data = cpu_to_be64(((u64)HSS1394_TAG_CHANGE_ADDRESS << 56) |
338 scs->hss_handler.offset);
339 return snd_fw_transaction(oxfw->unit, TCODE_WRITE_BLOCK_REQUEST,
340 HSS1394_ADDRESS, &data, sizeof(data), 0);
341}
342
343static void remove_scs1x(struct snd_rawmidi *rmidi)
344{
345 struct fw_scs1x *scs = rmidi->private_data;
346
347 fw_core_remove_address_handler(&scs->hss_handler);
348}
349
350void snd_oxfw_scs1x_update(struct snd_oxfw *oxfw)
351{
352 register_address(oxfw);
353}
354
355int snd_oxfw_scs1x_add(struct snd_oxfw *oxfw)
356{
357 struct snd_rawmidi *rmidi;
358 struct fw_scs1x *scs;
359 int err;
360
361 scs = kzalloc(sizeof(struct fw_scs1x), GFP_KERNEL);
362 if (scs == NULL)
363 return -ENOMEM;
364 scs->fw_dev = fw_parent_device(oxfw->unit);
365 oxfw->spec = scs;
366
367 /* Allocate own handler for imcoming asynchronous transaction. */
368 scs->hss_handler.length = HSS1394_MAX_PACKET_SIZE;
369 scs->hss_handler.address_callback = handle_hss;
370 scs->hss_handler.callback_data = scs;
371 err = fw_core_add_address_handler(&scs->hss_handler,
372 &fw_high_memory_region);
373 if (err < 0)
374 return err;
375
376 err = register_address(oxfw);
377 if (err < 0)
378 goto err_allocated;
379
380 /* Use unique name for backward compatibility to scs1x module. */
381 err = snd_rawmidi_new(oxfw->card, "SCS.1x", 0, 1, 1, &rmidi);
382 if (err < 0)
383 goto err_allocated;
384 rmidi->private_data = scs;
385 rmidi->private_free = remove_scs1x;
386
387 snprintf(rmidi->name, sizeof(rmidi->name),
388 "%s MIDI", oxfw->card->shortname);
389
390 rmidi->info_flags = SNDRV_RAWMIDI_INFO_INPUT |
391 SNDRV_RAWMIDI_INFO_OUTPUT |
392 SNDRV_RAWMIDI_INFO_DUPLEX;
393 snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_INPUT,
394 &midi_capture_ops);
395 snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT,
396 &midi_playback_ops);
397
398 tasklet_init(&scs->tasklet, scs_output_tasklet, (unsigned long)scs);
399 init_waitqueue_head(&scs->idle_wait);
400 scs->output_idle = true;
401
402 return 0;
403err_allocated:
404 fw_core_remove_address_handler(&scs->hss_handler);
405 return err;
406}
diff --git a/sound/firewire/oxfw/oxfw-control.c b/sound/firewire/oxfw/oxfw-spkr.c
index 02a1cb90f20d..cb905af0660d 100644
--- a/sound/firewire/oxfw/oxfw-control.c
+++ b/sound/firewire/oxfw/oxfw-spkr.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * oxfw_stream.c - a part of driver for OXFW970/971 based devices 2 * oxfw-spkr.c - a part of driver for OXFW970/971 based devices
3 * 3 *
4 * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 4 * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
5 * Licensed under the terms of the GNU General Public License, version 2. 5 * Licensed under the terms of the GNU General Public License, version 2.
@@ -7,6 +7,17 @@
7 7
8#include "oxfw.h" 8#include "oxfw.h"
9 9
10struct fw_spkr {
11 bool mute;
12 s16 volume[6];
13 s16 volume_min;
14 s16 volume_max;
15
16 unsigned int mixer_channels;
17 u8 mute_fb_id;
18 u8 volume_fb_id;
19};
20
10enum control_action { CTL_READ, CTL_WRITE }; 21enum control_action { CTL_READ, CTL_WRITE };
11enum control_attribute { 22enum control_attribute {
12 CTL_MIN = 0x02, 23 CTL_MIN = 0x02,
@@ -14,8 +25,8 @@ enum control_attribute {
14 CTL_CURRENT = 0x10, 25 CTL_CURRENT = 0x10,
15}; 26};
16 27
17static int oxfw_mute_command(struct snd_oxfw *oxfw, bool *value, 28static int avc_audio_feature_mute(struct fw_unit *unit, u8 fb_id, bool *value,
18 enum control_action action) 29 enum control_action action)
19{ 30{
20 u8 *buf; 31 u8 *buf;
21 u8 response_ok; 32 u8 response_ok;
@@ -35,7 +46,7 @@ static int oxfw_mute_command(struct snd_oxfw *oxfw, bool *value,
35 buf[1] = 0x08; /* audio unit 0 */ 46 buf[1] = 0x08; /* audio unit 0 */
36 buf[2] = 0xb8; /* FUNCTION BLOCK */ 47 buf[2] = 0xb8; /* FUNCTION BLOCK */
37 buf[3] = 0x81; /* function block type: feature */ 48 buf[3] = 0x81; /* function block type: feature */
38 buf[4] = oxfw->device_info->mute_fb_id; /* function block ID */ 49 buf[4] = fb_id; /* function block ID */
39 buf[5] = 0x10; /* control attribute: current */ 50 buf[5] = 0x10; /* control attribute: current */
40 buf[6] = 0x02; /* selector length */ 51 buf[6] = 0x02; /* selector length */
41 buf[7] = 0x00; /* audio channel number */ 52 buf[7] = 0x00; /* audio channel number */
@@ -46,16 +57,16 @@ static int oxfw_mute_command(struct snd_oxfw *oxfw, bool *value,
46 else 57 else
47 buf[10] = *value ? 0x70 : 0x60; 58 buf[10] = *value ? 0x70 : 0x60;
48 59
49 err = fcp_avc_transaction(oxfw->unit, buf, 11, buf, 11, 0x3fe); 60 err = fcp_avc_transaction(unit, buf, 11, buf, 11, 0x3fe);
50 if (err < 0) 61 if (err < 0)
51 goto error; 62 goto error;
52 if (err < 11) { 63 if (err < 11) {
53 dev_err(&oxfw->unit->device, "short FCP response\n"); 64 dev_err(&unit->device, "short FCP response\n");
54 err = -EIO; 65 err = -EIO;
55 goto error; 66 goto error;
56 } 67 }
57 if (buf[0] != response_ok) { 68 if (buf[0] != response_ok) {
58 dev_err(&oxfw->unit->device, "mute command failed\n"); 69 dev_err(&unit->device, "mute command failed\n");
59 err = -EIO; 70 err = -EIO;
60 goto error; 71 goto error;
61 } 72 }
@@ -70,10 +81,10 @@ error:
70 return err; 81 return err;
71} 82}
72 83
73static int oxfw_volume_command(struct snd_oxfw *oxfw, s16 *value, 84static int avc_audio_feature_volume(struct fw_unit *unit, u8 fb_id, s16 *value,
74 unsigned int channel, 85 unsigned int channel,
75 enum control_attribute attribute, 86 enum control_attribute attribute,
76 enum control_action action) 87 enum control_action action)
77{ 88{
78 u8 *buf; 89 u8 *buf;
79 u8 response_ok; 90 u8 response_ok;
@@ -93,7 +104,7 @@ static int oxfw_volume_command(struct snd_oxfw *oxfw, s16 *value,
93 buf[1] = 0x08; /* audio unit 0 */ 104 buf[1] = 0x08; /* audio unit 0 */
94 buf[2] = 0xb8; /* FUNCTION BLOCK */ 105 buf[2] = 0xb8; /* FUNCTION BLOCK */
95 buf[3] = 0x81; /* function block type: feature */ 106 buf[3] = 0x81; /* function block type: feature */
96 buf[4] = oxfw->device_info->volume_fb_id; /* function block ID */ 107 buf[4] = fb_id; /* function block ID */
97 buf[5] = attribute; /* control attribute */ 108 buf[5] = attribute; /* control attribute */
98 buf[6] = 0x02; /* selector length */ 109 buf[6] = 0x02; /* selector length */
99 buf[7] = channel; /* audio channel number */ 110 buf[7] = channel; /* audio channel number */
@@ -107,16 +118,16 @@ static int oxfw_volume_command(struct snd_oxfw *oxfw, s16 *value,
107 buf[11] = *value; 118 buf[11] = *value;
108 } 119 }
109 120
110 err = fcp_avc_transaction(oxfw->unit, buf, 12, buf, 12, 0x3fe); 121 err = fcp_avc_transaction(unit, buf, 12, buf, 12, 0x3fe);
111 if (err < 0) 122 if (err < 0)
112 goto error; 123 goto error;
113 if (err < 12) { 124 if (err < 12) {
114 dev_err(&oxfw->unit->device, "short FCP response\n"); 125 dev_err(&unit->device, "short FCP response\n");
115 err = -EIO; 126 err = -EIO;
116 goto error; 127 goto error;
117 } 128 }
118 if (buf[0] != response_ok) { 129 if (buf[0] != response_ok) {
119 dev_err(&oxfw->unit->device, "volume command failed\n"); 130 dev_err(&unit->device, "volume command failed\n");
120 err = -EIO; 131 err = -EIO;
121 goto error; 132 goto error;
122 } 133 }
@@ -131,75 +142,81 @@ error:
131 return err; 142 return err;
132} 143}
133 144
134static int oxfw_mute_get(struct snd_kcontrol *control, 145static int spkr_mute_get(struct snd_kcontrol *control,
135 struct snd_ctl_elem_value *value) 146 struct snd_ctl_elem_value *value)
136{ 147{
137 struct snd_oxfw *oxfw = control->private_data; 148 struct snd_oxfw *oxfw = control->private_data;
149 struct fw_spkr *spkr = oxfw->spec;
138 150
139 value->value.integer.value[0] = !oxfw->mute; 151 value->value.integer.value[0] = !spkr->mute;
140 152
141 return 0; 153 return 0;
142} 154}
143 155
144static int oxfw_mute_put(struct snd_kcontrol *control, 156static int spkr_mute_put(struct snd_kcontrol *control,
145 struct snd_ctl_elem_value *value) 157 struct snd_ctl_elem_value *value)
146{ 158{
147 struct snd_oxfw *oxfw = control->private_data; 159 struct snd_oxfw *oxfw = control->private_data;
160 struct fw_spkr *spkr = oxfw->spec;
148 bool mute; 161 bool mute;
149 int err; 162 int err;
150 163
151 mute = !value->value.integer.value[0]; 164 mute = !value->value.integer.value[0];
152 165
153 if (mute == oxfw->mute) 166 if (mute == spkr->mute)
154 return 0; 167 return 0;
155 168
156 err = oxfw_mute_command(oxfw, &mute, CTL_WRITE); 169 err = avc_audio_feature_mute(oxfw->unit, spkr->mute_fb_id, &mute,
170 CTL_WRITE);
157 if (err < 0) 171 if (err < 0)
158 return err; 172 return err;
159 oxfw->mute = mute; 173 spkr->mute = mute;
160 174
161 return 1; 175 return 1;
162} 176}
163 177
164static int oxfw_volume_info(struct snd_kcontrol *control, 178static int spkr_volume_info(struct snd_kcontrol *control,
165 struct snd_ctl_elem_info *info) 179 struct snd_ctl_elem_info *info)
166{ 180{
167 struct snd_oxfw *oxfw = control->private_data; 181 struct snd_oxfw *oxfw = control->private_data;
182 struct fw_spkr *spkr = oxfw->spec;
168 183
169 info->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 184 info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
170 info->count = oxfw->device_info->mixer_channels; 185 info->count = spkr->mixer_channels;
171 info->value.integer.min = oxfw->volume_min; 186 info->value.integer.min = spkr->volume_min;
172 info->value.integer.max = oxfw->volume_max; 187 info->value.integer.max = spkr->volume_max;
173 188
174 return 0; 189 return 0;
175} 190}
176 191
177static const u8 channel_map[6] = { 0, 1, 4, 5, 2, 3 }; 192static const u8 channel_map[6] = { 0, 1, 4, 5, 2, 3 };
178 193
179static int oxfw_volume_get(struct snd_kcontrol *control, 194static int spkr_volume_get(struct snd_kcontrol *control,
180 struct snd_ctl_elem_value *value) 195 struct snd_ctl_elem_value *value)
181{ 196{
182 struct snd_oxfw *oxfw = control->private_data; 197 struct snd_oxfw *oxfw = control->private_data;
198 struct fw_spkr *spkr = oxfw->spec;
183 unsigned int i; 199 unsigned int i;
184 200
185 for (i = 0; i < oxfw->device_info->mixer_channels; ++i) 201 for (i = 0; i < spkr->mixer_channels; ++i)
186 value->value.integer.value[channel_map[i]] = oxfw->volume[i]; 202 value->value.integer.value[channel_map[i]] = spkr->volume[i];
187 203
188 return 0; 204 return 0;
189} 205}
190 206
191static int oxfw_volume_put(struct snd_kcontrol *control, 207static int spkr_volume_put(struct snd_kcontrol *control,
192 struct snd_ctl_elem_value *value) 208 struct snd_ctl_elem_value *value)
193{ 209{
194 struct snd_oxfw *oxfw = control->private_data; 210 struct snd_oxfw *oxfw = control->private_data;
211 struct fw_spkr *spkr = oxfw->spec;
195 unsigned int i, changed_channels; 212 unsigned int i, changed_channels;
196 bool equal_values = true; 213 bool equal_values = true;
197 s16 volume; 214 s16 volume;
198 int err; 215 int err;
199 216
200 for (i = 0; i < oxfw->device_info->mixer_channels; ++i) { 217 for (i = 0; i < spkr->mixer_channels; ++i) {
201 if (value->value.integer.value[i] < oxfw->volume_min || 218 if (value->value.integer.value[i] < spkr->volume_min ||
202 value->value.integer.value[i] > oxfw->volume_max) 219 value->value.integer.value[i] > spkr->volume_max)
203 return -EINVAL; 220 return -EINVAL;
204 if (value->value.integer.value[i] != 221 if (value->value.integer.value[i] !=
205 value->value.integer.value[0]) 222 value->value.integer.value[0])
@@ -207,67 +224,86 @@ static int oxfw_volume_put(struct snd_kcontrol *control,
207 } 224 }
208 225
209 changed_channels = 0; 226 changed_channels = 0;
210 for (i = 0; i < oxfw->device_info->mixer_channels; ++i) 227 for (i = 0; i < spkr->mixer_channels; ++i)
211 if (value->value.integer.value[channel_map[i]] != 228 if (value->value.integer.value[channel_map[i]] !=
212 oxfw->volume[i]) 229 spkr->volume[i])
213 changed_channels |= 1 << (i + 1); 230 changed_channels |= 1 << (i + 1);
214 231
215 if (equal_values && changed_channels != 0) 232 if (equal_values && changed_channels != 0)
216 changed_channels = 1 << 0; 233 changed_channels = 1 << 0;
217 234
218 for (i = 0; i <= oxfw->device_info->mixer_channels; ++i) { 235 for (i = 0; i <= spkr->mixer_channels; ++i) {
219 volume = value->value.integer.value[channel_map[i ? i - 1 : 0]]; 236 volume = value->value.integer.value[channel_map[i ? i - 1 : 0]];
220 if (changed_channels & (1 << i)) { 237 if (changed_channels & (1 << i)) {
221 err = oxfw_volume_command(oxfw, &volume, i, 238 err = avc_audio_feature_volume(oxfw->unit,
222 CTL_CURRENT, CTL_WRITE); 239 spkr->volume_fb_id, &volume,
240 i, CTL_CURRENT, CTL_WRITE);
223 if (err < 0) 241 if (err < 0)
224 return err; 242 return err;
225 } 243 }
226 if (i > 0) 244 if (i > 0)
227 oxfw->volume[i - 1] = volume; 245 spkr->volume[i - 1] = volume;
228 } 246 }
229 247
230 return changed_channels != 0; 248 return changed_channels != 0;
231} 249}
232 250
233int snd_oxfw_create_mixer(struct snd_oxfw *oxfw) 251int snd_oxfw_add_spkr(struct snd_oxfw *oxfw, bool is_lacie)
234{ 252{
235 static const struct snd_kcontrol_new controls[] = { 253 static const struct snd_kcontrol_new controls[] = {
236 { 254 {
237 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 255 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
238 .name = "PCM Playback Switch", 256 .name = "PCM Playback Switch",
239 .info = snd_ctl_boolean_mono_info, 257 .info = snd_ctl_boolean_mono_info,
240 .get = oxfw_mute_get, 258 .get = spkr_mute_get,
241 .put = oxfw_mute_put, 259 .put = spkr_mute_put,
242 }, 260 },
243 { 261 {
244 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 262 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
245 .name = "PCM Playback Volume", 263 .name = "PCM Playback Volume",
246 .info = oxfw_volume_info, 264 .info = spkr_volume_info,
247 .get = oxfw_volume_get, 265 .get = spkr_volume_get,
248 .put = oxfw_volume_put, 266 .put = spkr_volume_put,
249 }, 267 },
250 }; 268 };
269 struct fw_spkr *spkr;
251 unsigned int i, first_ch; 270 unsigned int i, first_ch;
252 int err; 271 int err;
253 272
254 err = oxfw_volume_command(oxfw, &oxfw->volume_min, 273 spkr = kzalloc(sizeof(struct fw_spkr), GFP_KERNEL);
255 0, CTL_MIN, CTL_READ); 274 if (spkr == NULL)
275 return -ENOMEM;
276 oxfw->spec = spkr;
277
278 if (is_lacie) {
279 spkr->mixer_channels = 1;
280 spkr->mute_fb_id = 0x01;
281 spkr->volume_fb_id = 0x01;
282 } else {
283 spkr->mixer_channels = 6;
284 spkr->mute_fb_id = 0x01;
285 spkr->volume_fb_id = 0x02;
286 }
287
288 err = avc_audio_feature_volume(oxfw->unit, spkr->volume_fb_id,
289 &spkr->volume_min, 0, CTL_MIN, CTL_READ);
256 if (err < 0) 290 if (err < 0)
257 return err; 291 return err;
258 err = oxfw_volume_command(oxfw, &oxfw->volume_max, 292 err = avc_audio_feature_volume(oxfw->unit, spkr->volume_fb_id,
259 0, CTL_MAX, CTL_READ); 293 &spkr->volume_max, 0, CTL_MAX, CTL_READ);
260 if (err < 0) 294 if (err < 0)
261 return err; 295 return err;
262 296
263 err = oxfw_mute_command(oxfw, &oxfw->mute, CTL_READ); 297 err = avc_audio_feature_mute(oxfw->unit, spkr->mute_fb_id, &spkr->mute,
298 CTL_READ);
264 if (err < 0) 299 if (err < 0)
265 return err; 300 return err;
266 301
267 first_ch = oxfw->device_info->mixer_channels == 1 ? 0 : 1; 302 first_ch = spkr->mixer_channels == 1 ? 0 : 1;
268 for (i = 0; i < oxfw->device_info->mixer_channels; ++i) { 303 for (i = 0; i < spkr->mixer_channels; ++i) {
269 err = oxfw_volume_command(oxfw, &oxfw->volume[i], 304 err = avc_audio_feature_volume(oxfw->unit, spkr->volume_fb_id,
270 first_ch + i, CTL_CURRENT, CTL_READ); 305 &spkr->volume[i], first_ch + i,
306 CTL_CURRENT, CTL_READ);
271 if (err < 0) 307 if (err < 0)
272 return err; 308 return err;
273 } 309 }
diff --git a/sound/firewire/oxfw/oxfw.c b/sound/firewire/oxfw/oxfw.c
index 588b93f20c2e..abedc2207261 100644
--- a/sound/firewire/oxfw/oxfw.c
+++ b/sound/firewire/oxfw/oxfw.c
@@ -19,6 +19,7 @@
19#define VENDOR_BEHRINGER 0x001564 19#define VENDOR_BEHRINGER 0x001564
20#define VENDOR_LACIE 0x00d04b 20#define VENDOR_LACIE 0x00d04b
21#define VENDOR_TASCAM 0x00022e 21#define VENDOR_TASCAM 0x00022e
22#define OUI_STANTON 0x001260
22 23
23#define MODEL_SATELLITE 0x00200f 24#define MODEL_SATELLITE 0x00200f
24 25
@@ -29,6 +30,13 @@ MODULE_DESCRIPTION("Oxford Semiconductor FW970/971 driver");
29MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>"); 30MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
30MODULE_LICENSE("GPL v2"); 31MODULE_LICENSE("GPL v2");
31MODULE_ALIAS("snd-firewire-speakers"); 32MODULE_ALIAS("snd-firewire-speakers");
33MODULE_ALIAS("snd-scs1x");
34
35struct compat_info {
36 const char *driver_name;
37 const char *vendor_name;
38 const char *model_name;
39};
32 40
33static bool detect_loud_models(struct fw_unit *unit) 41static bool detect_loud_models(struct fw_unit *unit)
34{ 42{
@@ -59,6 +67,7 @@ static bool detect_loud_models(struct fw_unit *unit)
59static int name_card(struct snd_oxfw *oxfw) 67static int name_card(struct snd_oxfw *oxfw)
60{ 68{
61 struct fw_device *fw_dev = fw_parent_device(oxfw->unit); 69 struct fw_device *fw_dev = fw_parent_device(oxfw->unit);
70 const struct compat_info *info;
62 char vendor[24]; 71 char vendor[24];
63 char model[32]; 72 char model[32];
64 const char *d, *v, *m; 73 const char *d, *v, *m;
@@ -84,10 +93,12 @@ static int name_card(struct snd_oxfw *oxfw)
84 be32_to_cpus(&firmware); 93 be32_to_cpus(&firmware);
85 94
86 /* to apply card definitions */ 95 /* to apply card definitions */
87 if (oxfw->device_info) { 96 if (oxfw->entry->vendor_id == VENDOR_GRIFFIN ||
88 d = oxfw->device_info->driver_name; 97 oxfw->entry->vendor_id == VENDOR_LACIE) {
89 v = oxfw->device_info->vendor_name; 98 info = (const struct compat_info *)oxfw->entry->driver_data;
90 m = oxfw->device_info->model_name; 99 d = info->driver_name;
100 v = info->vendor_name;
101 m = info->model_name;
91 } else { 102 } else {
92 d = "OXFW"; 103 d = "OXFW";
93 v = vendor; 104 v = vendor;
@@ -129,16 +140,51 @@ static void oxfw_card_free(struct snd_card *card)
129 kfree(oxfw->rx_stream_formats[i]); 140 kfree(oxfw->rx_stream_formats[i]);
130 } 141 }
131 142
143 kfree(oxfw->spec);
132 mutex_destroy(&oxfw->mutex); 144 mutex_destroy(&oxfw->mutex);
133} 145}
134 146
135static void detect_quirks(struct snd_oxfw *oxfw) 147static int detect_quirks(struct snd_oxfw *oxfw)
136{ 148{
137 struct fw_device *fw_dev = fw_parent_device(oxfw->unit); 149 struct fw_device *fw_dev = fw_parent_device(oxfw->unit);
138 struct fw_csr_iterator it; 150 struct fw_csr_iterator it;
139 int key, val; 151 int key, val;
140 int vendor, model; 152 int vendor, model;
141 153
154 /*
155 * Add ALSA control elements for two models to keep compatibility to
156 * old firewire-speaker module.
157 */
158 if (oxfw->entry->vendor_id == VENDOR_GRIFFIN)
159 return snd_oxfw_add_spkr(oxfw, false);
160 if (oxfw->entry->vendor_id == VENDOR_LACIE)
161 return snd_oxfw_add_spkr(oxfw, true);
162
163 /*
164 * Stanton models supports asynchronous transactions for unique MIDI
165 * messages.
166 */
167 if (oxfw->entry->vendor_id == OUI_STANTON) {
168 /* No physical MIDI ports. */
169 oxfw->midi_input_ports = 0;
170 oxfw->midi_output_ports = 0;
171
172 /* Output stream exists but no data channels are useful. */
173 oxfw->has_output = false;
174
175 return snd_oxfw_scs1x_add(oxfw);
176 }
177
178 /*
179 * TASCAM FireOne has physical control and requires a pair of additional
180 * MIDI ports.
181 */
182 if (oxfw->entry->vendor_id == VENDOR_TASCAM) {
183 oxfw->midi_input_ports++;
184 oxfw->midi_output_ports++;
185 return 0;
186 }
187
142 /* Seek from Root Directory of Config ROM. */ 188 /* Seek from Root Directory of Config ROM. */
143 vendor = model = 0; 189 vendor = model = 0;
144 fw_csr_iterator_init(&it, fw_dev->config_rom + 5); 190 fw_csr_iterator_init(&it, fw_dev->config_rom + 5);
@@ -156,24 +202,17 @@ static void detect_quirks(struct snd_oxfw *oxfw)
156 if (vendor == VENDOR_LOUD && model == MODEL_SATELLITE) 202 if (vendor == VENDOR_LOUD && model == MODEL_SATELLITE)
157 oxfw->wrong_dbs = true; 203 oxfw->wrong_dbs = true;
158 204
159 /* 205 return 0;
160 * TASCAM FireOne has physical control and requires a pair of additional
161 * MIDI ports.
162 */
163 if (vendor == VENDOR_TASCAM) {
164 oxfw->midi_input_ports++;
165 oxfw->midi_output_ports++;
166 }
167} 206}
168 207
169static int oxfw_probe(struct fw_unit *unit, 208static int oxfw_probe(struct fw_unit *unit,
170 const struct ieee1394_device_id *id) 209 const struct ieee1394_device_id *entry)
171{ 210{
172 struct snd_card *card; 211 struct snd_card *card;
173 struct snd_oxfw *oxfw; 212 struct snd_oxfw *oxfw;
174 int err; 213 int err;
175 214
176 if ((id->vendor_id == VENDOR_LOUD) && !detect_loud_models(unit)) 215 if (entry->vendor_id == VENDOR_LOUD && !detect_loud_models(unit))
177 return -ENODEV; 216 return -ENODEV;
178 217
179 err = snd_card_new(&unit->device, -1, NULL, THIS_MODULE, 218 err = snd_card_new(&unit->device, -1, NULL, THIS_MODULE,
@@ -186,7 +225,7 @@ static int oxfw_probe(struct fw_unit *unit,
186 oxfw->card = card; 225 oxfw->card = card;
187 mutex_init(&oxfw->mutex); 226 mutex_init(&oxfw->mutex);
188 oxfw->unit = fw_unit_get(unit); 227 oxfw->unit = fw_unit_get(unit);
189 oxfw->device_info = (const struct device_info *)id->driver_data; 228 oxfw->entry = entry;
190 spin_lock_init(&oxfw->lock); 229 spin_lock_init(&oxfw->lock);
191 init_waitqueue_head(&oxfw->hwdep_wait); 230 init_waitqueue_head(&oxfw->hwdep_wait);
192 231
@@ -194,21 +233,17 @@ static int oxfw_probe(struct fw_unit *unit,
194 if (err < 0) 233 if (err < 0)
195 goto error; 234 goto error;
196 235
197 detect_quirks(oxfw);
198
199 err = name_card(oxfw); 236 err = name_card(oxfw);
200 if (err < 0) 237 if (err < 0)
201 goto error; 238 goto error;
202 239
203 err = snd_oxfw_create_pcm(oxfw); 240 err = detect_quirks(oxfw);
204 if (err < 0) 241 if (err < 0)
205 goto error; 242 goto error;
206 243
207 if (oxfw->device_info) { 244 err = snd_oxfw_create_pcm(oxfw);
208 err = snd_oxfw_create_mixer(oxfw); 245 if (err < 0)
209 if (err < 0) 246 goto error;
210 goto error;
211 }
212 247
213 snd_oxfw_proc_init(oxfw); 248 snd_oxfw_proc_init(oxfw);
214 249
@@ -257,6 +292,9 @@ static void oxfw_bus_reset(struct fw_unit *unit)
257 snd_oxfw_stream_update_simplex(oxfw, &oxfw->tx_stream); 292 snd_oxfw_stream_update_simplex(oxfw, &oxfw->tx_stream);
258 293
259 mutex_unlock(&oxfw->mutex); 294 mutex_unlock(&oxfw->mutex);
295
296 if (oxfw->entry->vendor_id == OUI_STANTON)
297 snd_oxfw_scs1x_update(oxfw);
260} 298}
261 299
262static void oxfw_remove(struct fw_unit *unit) 300static void oxfw_remove(struct fw_unit *unit)
@@ -267,22 +305,16 @@ static void oxfw_remove(struct fw_unit *unit)
267 snd_card_free_when_closed(oxfw->card); 305 snd_card_free_when_closed(oxfw->card);
268} 306}
269 307
270static const struct device_info griffin_firewave = { 308static const struct compat_info griffin_firewave = {
271 .driver_name = "FireWave", 309 .driver_name = "FireWave",
272 .vendor_name = "Griffin", 310 .vendor_name = "Griffin",
273 .model_name = "FireWave", 311 .model_name = "FireWave",
274 .mixer_channels = 6,
275 .mute_fb_id = 0x01,
276 .volume_fb_id = 0x02,
277}; 312};
278 313
279static const struct device_info lacie_speakers = { 314static const struct compat_info lacie_speakers = {
280 .driver_name = "FWSpeakers", 315 .driver_name = "FWSpeakers",
281 .vendor_name = "LaCie", 316 .vendor_name = "LaCie",
282 .model_name = "FireWire Speakers", 317 .model_name = "FireWire Speakers",
283 .mixer_channels = 1,
284 .mute_fb_id = 0x01,
285 .volume_fb_id = 0x01,
286}; 318};
287 319
288static const struct ieee1394_device_id oxfw_id_table[] = { 320static const struct ieee1394_device_id oxfw_id_table[] = {
@@ -340,6 +372,20 @@ static const struct ieee1394_device_id oxfw_id_table[] = {
340 .vendor_id = VENDOR_TASCAM, 372 .vendor_id = VENDOR_TASCAM,
341 .model_id = 0x800007, 373 .model_id = 0x800007,
342 }, 374 },
375 /* Stanton, Stanton Controllers & Systems 1 Mixer (SCS.1m) */
376 {
377 .match_flags = IEEE1394_MATCH_VENDOR_ID |
378 IEEE1394_MATCH_MODEL_ID,
379 .vendor_id = OUI_STANTON,
380 .model_id = 0x001000,
381 },
382 /* Stanton, Stanton Controllers & Systems 1 Deck (SCS.1d) */
383 {
384 .match_flags = IEEE1394_MATCH_VENDOR_ID |
385 IEEE1394_MATCH_MODEL_ID,
386 .vendor_id = OUI_STANTON,
387 .model_id = 0x002000,
388 },
343 { } 389 { }
344}; 390};
345MODULE_DEVICE_TABLE(ieee1394, oxfw_id_table); 391MODULE_DEVICE_TABLE(ieee1394, oxfw_id_table);
diff --git a/sound/firewire/oxfw/oxfw.h b/sound/firewire/oxfw/oxfw.h
index 8392c424ad1d..9beecc214767 100644
--- a/sound/firewire/oxfw/oxfw.h
+++ b/sound/firewire/oxfw/oxfw.h
@@ -31,15 +31,6 @@
31#include "../amdtp-am824.h" 31#include "../amdtp-am824.h"
32#include "../cmp.h" 32#include "../cmp.h"
33 33
34struct device_info {
35 const char *driver_name;
36 const char *vendor_name;
37 const char *model_name;
38 unsigned int mixer_channels;
39 u8 mute_fb_id;
40 u8 volume_fb_id;
41};
42
43/* This is an arbitrary number for convinience. */ 34/* This is an arbitrary number for convinience. */
44#define SND_OXFW_STREAM_FORMAT_ENTRIES 10 35#define SND_OXFW_STREAM_FORMAT_ENTRIES 10
45struct snd_oxfw { 36struct snd_oxfw {
@@ -64,14 +55,12 @@ struct snd_oxfw {
64 unsigned int midi_input_ports; 55 unsigned int midi_input_ports;
65 unsigned int midi_output_ports; 56 unsigned int midi_output_ports;
66 57
67 bool mute;
68 s16 volume[6];
69 s16 volume_min;
70 s16 volume_max;
71
72 int dev_lock_count; 58 int dev_lock_count;
73 bool dev_lock_changed; 59 bool dev_lock_changed;
74 wait_queue_head_t hwdep_wait; 60 wait_queue_head_t hwdep_wait;
61
62 const struct ieee1394_device_id *entry;
63 void *spec;
75}; 64};
76 65
77/* 66/*
@@ -138,10 +127,12 @@ void snd_oxfw_stream_lock_release(struct snd_oxfw *oxfw);
138 127
139int snd_oxfw_create_pcm(struct snd_oxfw *oxfw); 128int snd_oxfw_create_pcm(struct snd_oxfw *oxfw);
140 129
141int snd_oxfw_create_mixer(struct snd_oxfw *oxfw);
142
143void snd_oxfw_proc_init(struct snd_oxfw *oxfw); 130void snd_oxfw_proc_init(struct snd_oxfw *oxfw);
144 131
145int snd_oxfw_create_midi(struct snd_oxfw *oxfw); 132int snd_oxfw_create_midi(struct snd_oxfw *oxfw);
146 133
147int snd_oxfw_create_hwdep(struct snd_oxfw *oxfw); 134int snd_oxfw_create_hwdep(struct snd_oxfw *oxfw);
135
136int snd_oxfw_add_spkr(struct snd_oxfw *oxfw, bool is_lacie);
137int snd_oxfw_scs1x_add(struct snd_oxfw *oxfw);
138void snd_oxfw_scs1x_update(struct snd_oxfw *oxfw);
diff --git a/sound/firewire/scs1x.c b/sound/firewire/scs1x.c
deleted file mode 100644
index 2dba848a781f..000000000000
--- a/sound/firewire/scs1x.c
+++ /dev/null
@@ -1,530 +0,0 @@
1/*
2 * Stanton Control System 1 MIDI driver
3 *
4 * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
5 * Licensed under the terms of the GNU General Public License, version 2.
6 */
7
8#include <linux/device.h>
9#include <linux/firewire.h>
10#include <linux/firewire-constants.h>
11#include <linux/interrupt.h>
12#include <linux/module.h>
13#include <linux/mod_devicetable.h>
14#include <linux/slab.h>
15#include <linux/string.h>
16#include <linux/wait.h>
17#include <sound/core.h>
18#include <sound/initval.h>
19#include <sound/rawmidi.h>
20#include "lib.h"
21
22#define OUI_STANTON 0x001260
23#define MODEL_SCS_1M 0x001000
24#define MODEL_SCS_1D 0x002000
25
26#define HSS1394_ADDRESS 0xc007dedadadaULL
27#define HSS1394_MAX_PACKET_SIZE 64
28
29#define HSS1394_TAG_USER_DATA 0x00
30#define HSS1394_TAG_CHANGE_ADDRESS 0xf1
31
32struct scs {
33 struct snd_card *card;
34 struct fw_unit *unit;
35 struct fw_address_handler hss_handler;
36 struct fw_transaction transaction;
37 bool transaction_running;
38 bool output_idle;
39 u8 output_status;
40 u8 output_bytes;
41 bool output_escaped;
42 bool output_escape_high_nibble;
43 u8 input_escape_count;
44 struct snd_rawmidi_substream *output;
45 struct snd_rawmidi_substream *input;
46 struct tasklet_struct tasklet;
47 wait_queue_head_t idle_wait;
48 u8 *buffer;
49};
50
51static const u8 sysex_escape_prefix[] = {
52 0xf0, /* SysEx begin */
53 0x00, 0x01, 0x60, /* Stanton DJ */
54 0x48, 0x53, 0x53, /* "HSS" */
55};
56
57static int scs_output_open(struct snd_rawmidi_substream *stream)
58{
59 struct scs *scs = stream->rmidi->private_data;
60
61 scs->output_status = 0;
62 scs->output_bytes = 1;
63 scs->output_escaped = false;
64
65 return 0;
66}
67
68static int scs_output_close(struct snd_rawmidi_substream *stream)
69{
70 return 0;
71}
72
73static void scs_output_trigger(struct snd_rawmidi_substream *stream, int up)
74{
75 struct scs *scs = stream->rmidi->private_data;
76
77 ACCESS_ONCE(scs->output) = up ? stream : NULL;
78 if (up) {
79 scs->output_idle = false;
80 tasklet_schedule(&scs->tasklet);
81 }
82}
83
84static void scs_write_callback(struct fw_card *card, int rcode,
85 void *data, size_t length, void *callback_data)
86{
87 struct scs *scs = callback_data;
88
89 if (rcode == RCODE_GENERATION) {
90 /* TODO: retry this packet */
91 }
92
93 scs->transaction_running = false;
94 tasklet_schedule(&scs->tasklet);
95}
96
97static bool is_valid_running_status(u8 status)
98{
99 return status >= 0x80 && status <= 0xef;
100}
101
102static bool is_one_byte_cmd(u8 status)
103{
104 return status == 0xf6 ||
105 status >= 0xf8;
106}
107
108static bool is_two_bytes_cmd(u8 status)
109{
110 return (status >= 0xc0 && status <= 0xdf) ||
111 status == 0xf1 ||
112 status == 0xf3;
113}
114
115static bool is_three_bytes_cmd(u8 status)
116{
117 return (status >= 0x80 && status <= 0xbf) ||
118 (status >= 0xe0 && status <= 0xef) ||
119 status == 0xf2;
120}
121
122static bool is_invalid_cmd(u8 status)
123{
124 return status == 0xf4 ||
125 status == 0xf5 ||
126 status == 0xf9 ||
127 status == 0xfd;
128}
129
130static void scs_output_tasklet(unsigned long data)
131{
132 struct scs *scs = (void *)data;
133 struct snd_rawmidi_substream *stream;
134 unsigned int i;
135 u8 byte;
136 struct fw_device *dev;
137 int generation;
138
139 if (scs->transaction_running)
140 return;
141
142 stream = ACCESS_ONCE(scs->output);
143 if (!stream) {
144 scs->output_idle = true;
145 wake_up(&scs->idle_wait);
146 return;
147 }
148
149 i = scs->output_bytes;
150 for (;;) {
151 if (snd_rawmidi_transmit(stream, &byte, 1) != 1) {
152 scs->output_bytes = i;
153 scs->output_idle = true;
154 wake_up(&scs->idle_wait);
155 return;
156 }
157 /*
158 * Convert from real MIDI to what I think the device expects (no
159 * running status, one command per packet, unescaped SysExs).
160 */
161 if (scs->output_escaped && byte < 0x80) {
162 if (scs->output_escape_high_nibble) {
163 if (i < HSS1394_MAX_PACKET_SIZE) {
164 scs->buffer[i] = byte << 4;
165 scs->output_escape_high_nibble = false;
166 }
167 } else {
168 scs->buffer[i++] |= byte & 0x0f;
169 scs->output_escape_high_nibble = true;
170 }
171 } else if (byte < 0x80) {
172 if (i == 1) {
173 if (!is_valid_running_status(scs->output_status))
174 continue;
175 scs->buffer[0] = HSS1394_TAG_USER_DATA;
176 scs->buffer[i++] = scs->output_status;
177 }
178 scs->buffer[i++] = byte;
179 if ((i == 3 && is_two_bytes_cmd(scs->output_status)) ||
180 (i == 4 && is_three_bytes_cmd(scs->output_status)))
181 break;
182 if (i == 1 + ARRAY_SIZE(sysex_escape_prefix) &&
183 !memcmp(scs->buffer + 1, sysex_escape_prefix,
184 ARRAY_SIZE(sysex_escape_prefix))) {
185 scs->output_escaped = true;
186 scs->output_escape_high_nibble = true;
187 i = 0;
188 }
189 if (i >= HSS1394_MAX_PACKET_SIZE)
190 i = 1;
191 } else if (byte == 0xf7) {
192 if (scs->output_escaped) {
193 if (i >= 1 && scs->output_escape_high_nibble &&
194 scs->buffer[0] != HSS1394_TAG_CHANGE_ADDRESS)
195 break;
196 } else {
197 if (i > 1 && scs->output_status == 0xf0) {
198 scs->buffer[i++] = 0xf7;
199 break;
200 }
201 }
202 i = 1;
203 scs->output_escaped = false;
204 } else if (!is_invalid_cmd(byte) &&
205 byte < 0xf8) {
206 i = 1;
207 scs->buffer[0] = HSS1394_TAG_USER_DATA;
208 scs->buffer[i++] = byte;
209 scs->output_status = byte;
210 scs->output_escaped = false;
211 if (is_one_byte_cmd(byte))
212 break;
213 }
214 }
215 scs->output_bytes = 1;
216 scs->output_escaped = false;
217
218 scs->transaction_running = true;
219 dev = fw_parent_device(scs->unit);
220 generation = dev->generation;
221 smp_rmb(); /* node_id vs. generation */
222 fw_send_request(dev->card, &scs->transaction, TCODE_WRITE_BLOCK_REQUEST,
223 dev->node_id, generation, dev->max_speed,
224 HSS1394_ADDRESS, scs->buffer, i,
225 scs_write_callback, scs);
226}
227
228static void scs_output_drain(struct snd_rawmidi_substream *stream)
229{
230 struct scs *scs = stream->rmidi->private_data;
231
232 wait_event(scs->idle_wait, scs->output_idle);
233}
234
235static struct snd_rawmidi_ops output_ops = {
236 .open = scs_output_open,
237 .close = scs_output_close,
238 .trigger = scs_output_trigger,
239 .drain = scs_output_drain,
240};
241
242static int scs_input_open(struct snd_rawmidi_substream *stream)
243{
244 struct scs *scs = stream->rmidi->private_data;
245
246 scs->input_escape_count = 0;
247
248 return 0;
249}
250
251static int scs_input_close(struct snd_rawmidi_substream *stream)
252{
253 return 0;
254}
255
256static void scs_input_trigger(struct snd_rawmidi_substream *stream, int up)
257{
258 struct scs *scs = stream->rmidi->private_data;
259
260 ACCESS_ONCE(scs->input) = up ? stream : NULL;
261}
262
263static void scs_input_escaped_byte(struct snd_rawmidi_substream *stream,
264 u8 byte)
265{
266 u8 nibbles[2];
267
268 nibbles[0] = byte >> 4;
269 nibbles[1] = byte & 0x0f;
270 snd_rawmidi_receive(stream, nibbles, 2);
271}
272
273static void scs_input_midi_byte(struct scs *scs,
274 struct snd_rawmidi_substream *stream,
275 u8 byte)
276{
277 if (scs->input_escape_count > 0) {
278 scs_input_escaped_byte(stream, byte);
279 scs->input_escape_count--;
280 if (scs->input_escape_count == 0)
281 snd_rawmidi_receive(stream, (const u8[]) { 0xf7 }, 1);
282 } else if (byte == 0xf9) {
283 snd_rawmidi_receive(stream, sysex_escape_prefix,
284 ARRAY_SIZE(sysex_escape_prefix));
285 scs_input_escaped_byte(stream, 0x00);
286 scs_input_escaped_byte(stream, 0xf9);
287 scs->input_escape_count = 3;
288 } else {
289 snd_rawmidi_receive(stream, &byte, 1);
290 }
291}
292
293static void scs_input_packet(struct scs *scs,
294 struct snd_rawmidi_substream *stream,
295 const u8 *data, unsigned int bytes)
296{
297 unsigned int i;
298
299 if (data[0] == HSS1394_TAG_USER_DATA) {
300 for (i = 1; i < bytes; ++i)
301 scs_input_midi_byte(scs, stream, data[i]);
302 } else {
303 snd_rawmidi_receive(stream, sysex_escape_prefix,
304 ARRAY_SIZE(sysex_escape_prefix));
305 for (i = 0; i < bytes; ++i)
306 scs_input_escaped_byte(stream, data[i]);
307 snd_rawmidi_receive(stream, (const u8[]) { 0xf7 }, 1);
308 }
309}
310
311static struct snd_rawmidi_ops input_ops = {
312 .open = scs_input_open,
313 .close = scs_input_close,
314 .trigger = scs_input_trigger,
315};
316
317static int scs_create_midi(struct scs *scs)
318{
319 struct snd_rawmidi *rmidi;
320 int err;
321
322 err = snd_rawmidi_new(scs->card, "SCS.1x", 0, 1, 1, &rmidi);
323 if (err < 0)
324 return err;
325 snprintf(rmidi->name, sizeof(rmidi->name),
326 "%s MIDI", scs->card->shortname);
327 rmidi->info_flags = SNDRV_RAWMIDI_INFO_OUTPUT |
328 SNDRV_RAWMIDI_INFO_INPUT |
329 SNDRV_RAWMIDI_INFO_DUPLEX;
330 rmidi->private_data = scs;
331 snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, &output_ops);
332 snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_INPUT, &input_ops);
333
334 return 0;
335}
336
337static void handle_hss(struct fw_card *card, struct fw_request *request,
338 int tcode, int destination, int source, int generation,
339 unsigned long long offset, void *data, size_t length,
340 void *callback_data)
341{
342 struct scs *scs = callback_data;
343 struct snd_rawmidi_substream *stream;
344
345 if (offset != scs->hss_handler.offset) {
346 fw_send_response(card, request, RCODE_ADDRESS_ERROR);
347 return;
348 }
349 if (tcode != TCODE_WRITE_QUADLET_REQUEST &&
350 tcode != TCODE_WRITE_BLOCK_REQUEST) {
351 fw_send_response(card, request, RCODE_TYPE_ERROR);
352 return;
353 }
354
355 if (length >= 1) {
356 stream = ACCESS_ONCE(scs->input);
357 if (stream)
358 scs_input_packet(scs, stream, data, length);
359 }
360
361 fw_send_response(card, request, RCODE_COMPLETE);
362}
363
364static int scs_init_hss_address(struct scs *scs)
365{
366 __be64 data;
367 int err;
368
369 data = cpu_to_be64(((u64)HSS1394_TAG_CHANGE_ADDRESS << 56) |
370 scs->hss_handler.offset);
371 err = snd_fw_transaction(scs->unit, TCODE_WRITE_BLOCK_REQUEST,
372 HSS1394_ADDRESS, &data, 8, 0);
373 if (err < 0)
374 dev_err(&scs->unit->device, "HSS1394 communication failed\n");
375
376 return err;
377}
378
379static void scs_card_free(struct snd_card *card)
380{
381 struct scs *scs = card->private_data;
382
383 fw_core_remove_address_handler(&scs->hss_handler);
384 kfree(scs->buffer);
385}
386
387static int scs_probe(struct fw_unit *unit, const struct ieee1394_device_id *id)
388{
389 struct fw_device *fw_dev = fw_parent_device(unit);
390 struct snd_card *card;
391 struct scs *scs;
392 int err;
393
394 err = snd_card_new(&unit->device, -16, NULL, THIS_MODULE,
395 sizeof(*scs), &card);
396 if (err < 0)
397 return err;
398
399 scs = card->private_data;
400 scs->card = card;
401 scs->unit = unit;
402 tasklet_init(&scs->tasklet, scs_output_tasklet, (unsigned long)scs);
403 init_waitqueue_head(&scs->idle_wait);
404 scs->output_idle = true;
405
406 scs->buffer = kmalloc(HSS1394_MAX_PACKET_SIZE, GFP_KERNEL);
407 if (!scs->buffer) {
408 err = -ENOMEM;
409 goto err_card;
410 }
411
412 scs->hss_handler.length = HSS1394_MAX_PACKET_SIZE;
413 scs->hss_handler.address_callback = handle_hss;
414 scs->hss_handler.callback_data = scs;
415 err = fw_core_add_address_handler(&scs->hss_handler,
416 &fw_high_memory_region);
417 if (err < 0)
418 goto err_buffer;
419
420 card->private_free = scs_card_free;
421
422 strcpy(card->driver, "SCS.1x");
423 strcpy(card->shortname, "SCS.1x");
424 fw_csr_string(unit->directory, CSR_MODEL,
425 card->shortname, sizeof(card->shortname));
426 snprintf(card->longname, sizeof(card->longname),
427 "Stanton DJ %s (GUID %08x%08x) at %s, S%d",
428 card->shortname, fw_dev->config_rom[3], fw_dev->config_rom[4],
429 dev_name(&unit->device), 100 << fw_dev->max_speed);
430 strcpy(card->mixername, card->shortname);
431
432 err = scs_init_hss_address(scs);
433 if (err < 0)
434 goto err_card;
435
436 err = scs_create_midi(scs);
437 if (err < 0)
438 goto err_card;
439
440 err = snd_card_register(card);
441 if (err < 0)
442 goto err_card;
443
444 dev_set_drvdata(&unit->device, scs);
445
446 return 0;
447
448err_buffer:
449 kfree(scs->buffer);
450err_card:
451 snd_card_free(card);
452 return err;
453}
454
455static void scs_update(struct fw_unit *unit)
456{
457 struct scs *scs = dev_get_drvdata(&unit->device);
458 int generation;
459 __be64 data;
460
461 data = cpu_to_be64(((u64)HSS1394_TAG_CHANGE_ADDRESS << 56) |
462 scs->hss_handler.offset);
463 generation = fw_parent_device(unit)->generation;
464 smp_rmb(); /* node_id vs. generation */
465 snd_fw_transaction(scs->unit, TCODE_WRITE_BLOCK_REQUEST,
466 HSS1394_ADDRESS, &data, 8,
467 FW_FIXED_GENERATION | generation);
468}
469
470static void scs_remove(struct fw_unit *unit)
471{
472 struct scs *scs = dev_get_drvdata(&unit->device);
473
474 snd_card_disconnect(scs->card);
475
476 ACCESS_ONCE(scs->output) = NULL;
477 ACCESS_ONCE(scs->input) = NULL;
478
479 wait_event(scs->idle_wait, scs->output_idle);
480
481 tasklet_kill(&scs->tasklet);
482
483 snd_card_free_when_closed(scs->card);
484}
485
486static const struct ieee1394_device_id scs_id_table[] = {
487 {
488 .match_flags = IEEE1394_MATCH_VENDOR_ID |
489 IEEE1394_MATCH_MODEL_ID,
490 .vendor_id = OUI_STANTON,
491 .model_id = MODEL_SCS_1M,
492 },
493 {
494 .match_flags = IEEE1394_MATCH_VENDOR_ID |
495 IEEE1394_MATCH_MODEL_ID,
496 .vendor_id = OUI_STANTON,
497 .model_id = MODEL_SCS_1D,
498 },
499 {}
500};
501MODULE_DEVICE_TABLE(ieee1394, scs_id_table);
502
503MODULE_DESCRIPTION("SCS.1x MIDI driver");
504MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
505MODULE_LICENSE("GPL v2");
506
507static struct fw_driver scs_driver = {
508 .driver = {
509 .owner = THIS_MODULE,
510 .name = KBUILD_MODNAME,
511 .bus = &fw_bus_type,
512 },
513 .probe = scs_probe,
514 .update = scs_update,
515 .remove = scs_remove,
516 .id_table = scs_id_table,
517};
518
519static int __init alsa_scs1x_init(void)
520{
521 return driver_register(&scs_driver.driver);
522}
523
524static void __exit alsa_scs1x_exit(void)
525{
526 driver_unregister(&scs_driver.driver);
527}
528
529module_init(alsa_scs1x_init);
530module_exit(alsa_scs1x_exit);
diff --git a/sound/hda/ext/hdac_ext_controller.c b/sound/hda/ext/hdac_ext_controller.c
index 63215b17247c..548cc1e4114b 100644
--- a/sound/hda/ext/hdac_ext_controller.c
+++ b/sound/hda/ext/hdac_ext_controller.c
@@ -77,6 +77,12 @@ int snd_hdac_ext_bus_parse_capabilities(struct hdac_ext_bus *ebus)
77 ebus->spbcap = bus->remap_addr + offset; 77 ebus->spbcap = bus->remap_addr + offset;
78 break; 78 break;
79 79
80 case AZX_DRSM_CAP_ID:
81 /* DMA resume capability found, handler function */
82 dev_dbg(bus->dev, "Found DRSM capability\n");
83 ebus->drsmcap = bus->remap_addr + offset;
84 break;
85
80 default: 86 default:
81 dev_dbg(bus->dev, "Unknown capability %d\n", cur_cap); 87 dev_dbg(bus->dev, "Unknown capability %d\n", cur_cap);
82 break; 88 break;
@@ -240,7 +246,7 @@ static int check_hdac_link_power_active(struct hdac_ext_link *link, bool enable)
240 int mask = (1 << AZX_MLCTL_CPA); 246 int mask = (1 << AZX_MLCTL_CPA);
241 247
242 udelay(3); 248 udelay(3);
243 timeout = 50; 249 timeout = 150;
244 250
245 do { 251 do {
246 val = readl(link->ml_addr + AZX_REG_ML_LCTL); 252 val = readl(link->ml_addr + AZX_REG_ML_LCTL);
@@ -282,6 +288,27 @@ int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link)
282EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down); 288EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down);
283 289
284/** 290/**
291 * snd_hdac_ext_bus_link_power_up_all -power up all hda link
292 * @ebus: HD-audio extended bus
293 */
294int snd_hdac_ext_bus_link_power_up_all(struct hdac_ext_bus *ebus)
295{
296 struct hdac_ext_link *hlink = NULL;
297 int ret;
298
299 list_for_each_entry(hlink, &ebus->hlink_list, list) {
300 snd_hdac_updatel(hlink->ml_addr,
301 AZX_REG_ML_LCTL, 0, AZX_MLCTL_SPA);
302 ret = check_hdac_link_power_active(hlink, true);
303 if (ret < 0)
304 return ret;
305 }
306
307 return 0;
308}
309EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_up_all);
310
311/**
285 * snd_hdac_ext_bus_link_power_down_all -power down all hda link 312 * snd_hdac_ext_bus_link_power_down_all -power down all hda link
286 * @ebus: HD-audio extended bus 313 * @ebus: HD-audio extended bus
287 */ 314 */
diff --git a/sound/hda/ext/hdac_ext_stream.c b/sound/hda/ext/hdac_ext_stream.c
index cb89ec7c8147..023cc4cad5c1 100644
--- a/sound/hda/ext/hdac_ext_stream.c
+++ b/sound/hda/ext/hdac_ext_stream.c
@@ -59,6 +59,10 @@ void snd_hdac_ext_stream_init(struct hdac_ext_bus *ebus,
59 AZX_SPB_MAXFIFO; 59 AZX_SPB_MAXFIFO;
60 } 60 }
61 61
62 if (ebus->drsmcap)
63 stream->dpibr_addr = ebus->drsmcap + AZX_DRSM_BASE +
64 AZX_DRSM_INTERVAL * idx;
65
62 stream->decoupled = false; 66 stream->decoupled = false;
63 snd_hdac_stream_init(bus, &stream->hstream, idx, direction, tag); 67 snd_hdac_stream_init(bus, &stream->hstream, idx, direction, tag);
64} 68}
@@ -107,6 +111,7 @@ void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus)
107 while (!list_empty(&bus->stream_list)) { 111 while (!list_empty(&bus->stream_list)) {
108 s = list_first_entry(&bus->stream_list, struct hdac_stream, list); 112 s = list_first_entry(&bus->stream_list, struct hdac_stream, list);
109 stream = stream_to_hdac_ext_stream(s); 113 stream = stream_to_hdac_ext_stream(s);
114 snd_hdac_ext_stream_decouple(ebus, stream, false);
110 list_del(&s->list); 115 list_del(&s->list);
111 kfree(stream); 116 kfree(stream);
112 } 117 }
@@ -497,3 +502,70 @@ void snd_hdac_ext_stop_streams(struct hdac_ext_bus *ebus)
497 } 502 }
498} 503}
499EXPORT_SYMBOL_GPL(snd_hdac_ext_stop_streams); 504EXPORT_SYMBOL_GPL(snd_hdac_ext_stop_streams);
505
506/**
507 * snd_hdac_ext_stream_drsm_enable - enable DMA resume for a stream
508 * @ebus: HD-audio ext core bus
509 * @enable: flag to enable/disable DRSM
510 * @index: stream index for which DRSM need to be enabled
511 */
512void snd_hdac_ext_stream_drsm_enable(struct hdac_ext_bus *ebus,
513 bool enable, int index)
514{
515 u32 mask = 0;
516 u32 register_mask = 0;
517 struct hdac_bus *bus = &ebus->bus;
518
519 if (!ebus->drsmcap) {
520 dev_err(bus->dev, "Address of DRSM capability is NULL");
521 return;
522 }
523
524 mask |= (1 << index);
525
526 register_mask = readl(ebus->drsmcap + AZX_REG_SPB_SPBFCCTL);
527
528 mask |= register_mask;
529
530 if (enable)
531 snd_hdac_updatel(ebus->drsmcap, AZX_REG_DRSM_CTL, 0, mask);
532 else
533 snd_hdac_updatel(ebus->drsmcap, AZX_REG_DRSM_CTL, mask, 0);
534}
535EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_drsm_enable);
536
537/**
538 * snd_hdac_ext_stream_set_dpibr - sets the dpibr value of a stream
539 * @ebus: HD-audio ext core bus
540 * @stream: hdac_ext_stream
541 * @value: dpib value to set
542 */
543int snd_hdac_ext_stream_set_dpibr(struct hdac_ext_bus *ebus,
544 struct hdac_ext_stream *stream, u32 value)
545{
546 struct hdac_bus *bus = &ebus->bus;
547
548 if (!ebus->drsmcap) {
549 dev_err(bus->dev, "Address of DRSM capability is NULL");
550 return -EINVAL;
551 }
552
553 writel(value, stream->dpibr_addr);
554
555 return 0;
556}
557EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_set_dpibr);
558
559/**
560 * snd_hdac_ext_stream_set_lpib - sets the lpib value of a stream
561 * @ebus: HD-audio ext core bus
562 * @stream: hdac_ext_stream
563 * @value: lpib value to set
564 */
565int snd_hdac_ext_stream_set_lpib(struct hdac_ext_stream *stream, u32 value)
566{
567 snd_hdac_stream_writel(&stream->hstream, SD_LPIB, value);
568
569 return 0;
570}
571EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_set_lpib);
diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c
index 8fef1b8d1fd8..c50177fb469f 100644
--- a/sound/hda/hdac_i915.c
+++ b/sound/hda/hdac_i915.c
@@ -118,6 +118,72 @@ int snd_hdac_get_display_clk(struct hdac_bus *bus)
118} 118}
119EXPORT_SYMBOL_GPL(snd_hdac_get_display_clk); 119EXPORT_SYMBOL_GPL(snd_hdac_get_display_clk);
120 120
121/* There is a fixed mapping between audio pin node and display port
122 * on current Intel platforms:
123 * Pin Widget 5 - PORT B (port = 1 in i915 driver)
124 * Pin Widget 6 - PORT C (port = 2 in i915 driver)
125 * Pin Widget 7 - PORT D (port = 3 in i915 driver)
126 */
127static int pin2port(hda_nid_t pin_nid)
128{
129 return pin_nid - 4;
130}
131
132/**
133 * snd_hdac_sync_audio_rate - Set N/CTS based on the sample rate
134 * @bus: HDA core bus
135 * @nid: the pin widget NID
136 * @rate: the sample rate to set
137 *
138 * This function is supposed to be used only by a HD-audio controller
139 * driver that needs the interaction with i915 graphics.
140 *
141 * This function sets N/CTS value based on the given sample rate.
142 * Returns zero for success, or a negative error code.
143 */
144int snd_hdac_sync_audio_rate(struct hdac_bus *bus, hda_nid_t nid, int rate)
145{
146 struct i915_audio_component *acomp = bus->audio_component;
147
148 if (!acomp || !acomp->ops || !acomp->ops->sync_audio_rate)
149 return -ENODEV;
150 return acomp->ops->sync_audio_rate(acomp->dev, pin2port(nid), rate);
151}
152EXPORT_SYMBOL_GPL(snd_hdac_sync_audio_rate);
153
154/**
155 * snd_hdac_acomp_get_eld - Get the audio state and ELD via component
156 * @bus: HDA core bus
157 * @nid: the pin widget NID
158 * @audio_enabled: the pointer to store the current audio state
159 * @buffer: the buffer pointer to store ELD bytes
160 * @max_bytes: the max bytes to be stored on @buffer
161 *
162 * This function is supposed to be used only by a HD-audio controller
163 * driver that needs the interaction with i915 graphics.
164 *
165 * This function queries the current state of the audio on the given
166 * digital port and fetches the ELD bytes onto the given buffer.
167 * It returns the number of bytes for the total ELD data, zero for
168 * invalid ELD, or a negative error code.
169 *
170 * The return size is the total bytes required for the whole ELD bytes,
171 * thus it may be over @max_bytes. If it's over @max_bytes, it implies
172 * that only a part of ELD bytes have been fetched.
173 */
174int snd_hdac_acomp_get_eld(struct hdac_bus *bus, hda_nid_t nid,
175 bool *audio_enabled, char *buffer, int max_bytes)
176{
177 struct i915_audio_component *acomp = bus->audio_component;
178
179 if (!acomp || !acomp->ops || !acomp->ops->get_eld)
180 return -ENODEV;
181
182 return acomp->ops->get_eld(acomp->dev, pin2port(nid), audio_enabled,
183 buffer, max_bytes);
184}
185EXPORT_SYMBOL_GPL(snd_hdac_acomp_get_eld);
186
121static int hdac_component_master_bind(struct device *dev) 187static int hdac_component_master_bind(struct device *dev)
122{ 188{
123 struct i915_audio_component *acomp = hdac_acomp; 189 struct i915_audio_component *acomp = hdac_acomp;
diff --git a/sound/i2c/i2c.c b/sound/i2c/i2c.c
index 4677037f0c8e..ef2a9afe9e19 100644
--- a/sound/i2c/i2c.c
+++ b/sound/i2c/i2c.c
@@ -39,7 +39,7 @@ static int snd_i2c_bit_readbytes(struct snd_i2c_device *device,
39static int snd_i2c_bit_probeaddr(struct snd_i2c_bus *bus, 39static int snd_i2c_bit_probeaddr(struct snd_i2c_bus *bus,
40 unsigned short addr); 40 unsigned short addr);
41 41
42static struct snd_i2c_ops snd_i2c_bit_ops = { 42static const struct snd_i2c_ops snd_i2c_bit_ops = {
43 .sendbytes = snd_i2c_bit_sendbytes, 43 .sendbytes = snd_i2c_bit_sendbytes,
44 .readbytes = snd_i2c_bit_readbytes, 44 .readbytes = snd_i2c_bit_readbytes,
45 .probeaddr = snd_i2c_bit_probeaddr, 45 .probeaddr = snd_i2c_bit_probeaddr,
diff --git a/sound/oss/Kconfig b/sound/oss/Kconfig
index 48568fdf847f..4033fe58f0cf 100644
--- a/sound/oss/Kconfig
+++ b/sound/oss/Kconfig
@@ -240,7 +240,7 @@ config MSND_FIFOSIZE
240 240
241menuconfig SOUND_OSS 241menuconfig SOUND_OSS
242 tristate "OSS sound modules" 242 tristate "OSS sound modules"
243 depends on ISA_DMA_API && VIRT_TO_BUS 243 depends on ISA_DMA_API && (VIRT_TO_BUS || ARCH_RPC || ARCH_NETWINDER)
244 depends on !GENERIC_ISA_DMA_SUPPORT_BROKEN 244 depends on !GENERIC_ISA_DMA_SUPPORT_BROKEN
245 help 245 help
246 OSS is the Open Sound System suite of sound card drivers. They make 246 OSS is the Open Sound System suite of sound card drivers. They make
diff --git a/sound/pci/atiixp.c b/sound/pci/atiixp.c
index 1028fc8bdff5..2ce0022dbc46 100644
--- a/sound/pci/atiixp.c
+++ b/sound/pci/atiixp.c
@@ -1219,7 +1219,7 @@ static struct ac97_pcm atiixp_pcm_defs[] = {
1219 }, 1219 },
1220}; 1220};
1221 1221
1222static struct atiixp_dma_ops snd_atiixp_playback_dma_ops = { 1222static const struct atiixp_dma_ops snd_atiixp_playback_dma_ops = {
1223 .type = ATI_DMA_PLAYBACK, 1223 .type = ATI_DMA_PLAYBACK,
1224 .llp_offset = ATI_REG_OUT_DMA_LINKPTR, 1224 .llp_offset = ATI_REG_OUT_DMA_LINKPTR,
1225 .dt_cur = ATI_REG_OUT_DMA_DT_CUR, 1225 .dt_cur = ATI_REG_OUT_DMA_DT_CUR,
@@ -1228,7 +1228,7 @@ static struct atiixp_dma_ops snd_atiixp_playback_dma_ops = {
1228 .flush_dma = atiixp_out_flush_dma, 1228 .flush_dma = atiixp_out_flush_dma,
1229}; 1229};
1230 1230
1231static struct atiixp_dma_ops snd_atiixp_capture_dma_ops = { 1231static const struct atiixp_dma_ops snd_atiixp_capture_dma_ops = {
1232 .type = ATI_DMA_CAPTURE, 1232 .type = ATI_DMA_CAPTURE,
1233 .llp_offset = ATI_REG_IN_DMA_LINKPTR, 1233 .llp_offset = ATI_REG_IN_DMA_LINKPTR,
1234 .dt_cur = ATI_REG_IN_DMA_DT_CUR, 1234 .dt_cur = ATI_REG_IN_DMA_DT_CUR,
@@ -1237,7 +1237,7 @@ static struct atiixp_dma_ops snd_atiixp_capture_dma_ops = {
1237 .flush_dma = atiixp_in_flush_dma, 1237 .flush_dma = atiixp_in_flush_dma,
1238}; 1238};
1239 1239
1240static struct atiixp_dma_ops snd_atiixp_spdif_dma_ops = { 1240static const struct atiixp_dma_ops snd_atiixp_spdif_dma_ops = {
1241 .type = ATI_DMA_SPDIF, 1241 .type = ATI_DMA_SPDIF,
1242 .llp_offset = ATI_REG_SPDF_DMA_LINKPTR, 1242 .llp_offset = ATI_REG_SPDF_DMA_LINKPTR,
1243 .dt_cur = ATI_REG_SPDF_DMA_DT_CUR, 1243 .dt_cur = ATI_REG_SPDF_DMA_DT_CUR,
diff --git a/sound/pci/atiixp_modem.c b/sound/pci/atiixp_modem.c
index 27ed678a46df..c534552963e7 100644
--- a/sound/pci/atiixp_modem.c
+++ b/sound/pci/atiixp_modem.c
@@ -970,7 +970,7 @@ static struct snd_pcm_ops snd_atiixp_capture_ops = {
970 .pointer = snd_atiixp_pcm_pointer, 970 .pointer = snd_atiixp_pcm_pointer,
971}; 971};
972 972
973static struct atiixp_dma_ops snd_atiixp_playback_dma_ops = { 973static const struct atiixp_dma_ops snd_atiixp_playback_dma_ops = {
974 .type = ATI_DMA_PLAYBACK, 974 .type = ATI_DMA_PLAYBACK,
975 .llp_offset = ATI_REG_MODEM_OUT_DMA1_LINKPTR, 975 .llp_offset = ATI_REG_MODEM_OUT_DMA1_LINKPTR,
976 .dt_cur = ATI_REG_MODEM_OUT_DMA1_DT_CUR, 976 .dt_cur = ATI_REG_MODEM_OUT_DMA1_DT_CUR,
@@ -979,7 +979,7 @@ static struct atiixp_dma_ops snd_atiixp_playback_dma_ops = {
979 .flush_dma = atiixp_out_flush_dma, 979 .flush_dma = atiixp_out_flush_dma,
980}; 980};
981 981
982static struct atiixp_dma_ops snd_atiixp_capture_dma_ops = { 982static const struct atiixp_dma_ops snd_atiixp_capture_dma_ops = {
983 .type = ATI_DMA_CAPTURE, 983 .type = ATI_DMA_CAPTURE,
984 .llp_offset = ATI_REG_MODEM_IN_DMA_LINKPTR, 984 .llp_offset = ATI_REG_MODEM_IN_DMA_LINKPTR,
985 .dt_cur = ATI_REG_MODEM_IN_DMA_DT_CUR, 985 .dt_cur = ATI_REG_MODEM_IN_DMA_DT_CUR,
diff --git a/sound/pci/azt3328.c b/sound/pci/azt3328.c
index 07a4acc99541..5e2ef0bb7057 100644
--- a/sound/pci/azt3328.c
+++ b/sound/pci/azt3328.c
@@ -2294,8 +2294,6 @@ snd_azf3328_free(struct snd_azf3328 *chip)
2294 snd_azf3328_timer_stop(chip->timer); 2294 snd_azf3328_timer_stop(chip->timer);
2295 snd_azf3328_gameport_free(chip); 2295 snd_azf3328_gameport_free(chip);
2296 2296
2297 if (chip->irq >= 0)
2298 synchronize_irq(chip->irq);
2299__end_hw: 2297__end_hw:
2300 if (chip->irq >= 0) 2298 if (chip->irq >= 0)
2301 free_irq(chip->irq, chip); 2299 free_irq(chip->irq, chip);
diff --git a/sound/pci/cs5535audio/cs5535audio_pcm.c b/sound/pci/cs5535audio/cs5535audio_pcm.c
index 9c2dc911d8d7..27fa57da8dc4 100644
--- a/sound/pci/cs5535audio/cs5535audio_pcm.c
+++ b/sound/pci/cs5535audio/cs5535audio_pcm.c
@@ -402,7 +402,7 @@ static struct snd_pcm_ops snd_cs5535audio_capture_ops = {
402 .pointer = snd_cs5535audio_pcm_pointer, 402 .pointer = snd_cs5535audio_pcm_pointer,
403}; 403};
404 404
405static struct cs5535audio_dma_ops snd_cs5535audio_playback_dma_ops = { 405static const struct cs5535audio_dma_ops snd_cs5535audio_playback_dma_ops = {
406 .type = CS5535AUDIO_DMA_PLAYBACK, 406 .type = CS5535AUDIO_DMA_PLAYBACK,
407 .enable_dma = cs5535audio_playback_enable_dma, 407 .enable_dma = cs5535audio_playback_enable_dma,
408 .disable_dma = cs5535audio_playback_disable_dma, 408 .disable_dma = cs5535audio_playback_disable_dma,
@@ -412,7 +412,7 @@ static struct cs5535audio_dma_ops snd_cs5535audio_playback_dma_ops = {
412 .read_dma_pntr = cs5535audio_playback_read_dma_pntr, 412 .read_dma_pntr = cs5535audio_playback_read_dma_pntr,
413}; 413};
414 414
415static struct cs5535audio_dma_ops snd_cs5535audio_capture_dma_ops = { 415static const struct cs5535audio_dma_ops snd_cs5535audio_capture_dma_ops = {
416 .type = CS5535AUDIO_DMA_CAPTURE, 416 .type = CS5535AUDIO_DMA_CAPTURE,
417 .enable_dma = cs5535audio_capture_enable_dma, 417 .enable_dma = cs5535audio_capture_enable_dma,
418 .disable_dma = cs5535audio_capture_disable_dma, 418 .disable_dma = cs5535audio_capture_disable_dma,
diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c
index 759295aa8366..bade9b907b92 100644
--- a/sound/pci/fm801.c
+++ b/sound/pci/fm801.c
@@ -163,6 +163,7 @@ MODULE_PARM_DESC(radio_nr, "Radio device numbers");
163 * @cap_ctrl: capture control 163 * @cap_ctrl: capture control
164 */ 164 */
165struct fm801 { 165struct fm801 {
166 struct device *dev;
166 int irq; 167 int irq;
167 168
168 unsigned long port; 169 unsigned long port;
@@ -190,7 +191,6 @@ struct fm801 {
190 struct snd_ac97 *ac97; 191 struct snd_ac97 *ac97;
191 struct snd_ac97 *ac97_sec; 192 struct snd_ac97 *ac97_sec;
192 193
193 struct pci_dev *pci;
194 struct snd_card *card; 194 struct snd_card *card;
195 struct snd_pcm *pcm; 195 struct snd_pcm *pcm;
196 struct snd_rawmidi *rmidi; 196 struct snd_rawmidi *rmidi;
@@ -212,6 +212,20 @@ struct fm801 {
212#endif 212#endif
213}; 213};
214 214
215/*
216 * IO accessors
217 */
218
219static inline void fm801_iowrite16(struct fm801 *chip, unsigned short offset, u16 value)
220{
221 outw(value, chip->port + offset);
222}
223
224static inline u16 fm801_ioread16(struct fm801 *chip, unsigned short offset)
225{
226 return inw(chip->port + offset);
227}
228
215static const struct pci_device_id snd_fm801_ids[] = { 229static const struct pci_device_id snd_fm801_ids[] = {
216 { 0x1319, 0x0801, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0, }, /* FM801 */ 230 { 0x1319, 0x0801, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0, }, /* FM801 */
217 { 0x5213, 0x0510, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0, }, /* Gallant Odyssey Sound 4 */ 231 { 0x5213, 0x0510, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0, }, /* Gallant Odyssey Sound 4 */
@@ -256,11 +270,11 @@ static int snd_fm801_update_bits(struct fm801 *chip, unsigned short reg,
256 unsigned short old, new; 270 unsigned short old, new;
257 271
258 spin_lock_irqsave(&chip->reg_lock, flags); 272 spin_lock_irqsave(&chip->reg_lock, flags);
259 old = inw(chip->port + reg); 273 old = fm801_ioread16(chip, reg);
260 new = (old & ~mask) | value; 274 new = (old & ~mask) | value;
261 change = old != new; 275 change = old != new;
262 if (change) 276 if (change)
263 outw(new, chip->port + reg); 277 fm801_iowrite16(chip, reg, new);
264 spin_unlock_irqrestore(&chip->reg_lock, flags); 278 spin_unlock_irqrestore(&chip->reg_lock, flags);
265 return change; 279 return change;
266} 280}
@@ -578,8 +592,9 @@ static irqreturn_t snd_fm801_interrupt(int irq, void *dev_id)
578 } 592 }
579 if (chip->rmidi && (status & FM801_IRQ_MPU)) 593 if (chip->rmidi && (status & FM801_IRQ_MPU))
580 snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data); 594 snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
581 if (status & FM801_IRQ_VOLUME) 595 if (status & FM801_IRQ_VOLUME) {
582 ;/* TODO */ 596 /* TODO */
597 }
583 598
584 return IRQ_HANDLED; 599 return IRQ_HANDLED;
585} 600}
@@ -700,6 +715,7 @@ static struct snd_pcm_ops snd_fm801_capture_ops = {
700 715
701static int snd_fm801_pcm(struct fm801 *chip, int device) 716static int snd_fm801_pcm(struct fm801 *chip, int device)
702{ 717{
718 struct pci_dev *pdev = to_pci_dev(chip->dev);
703 struct snd_pcm *pcm; 719 struct snd_pcm *pcm;
704 int err; 720 int err;
705 721
@@ -715,7 +731,7 @@ static int snd_fm801_pcm(struct fm801 *chip, int device)
715 chip->pcm = pcm; 731 chip->pcm = pcm;
716 732
717 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, 733 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
718 snd_dma_pci_data(chip->pci), 734 snd_dma_pci_data(pdev),
719 chip->multichannel ? 128*1024 : 64*1024, 128*1024); 735 chip->multichannel ? 128*1024 : 64*1024, 128*1024);
720 736
721 return snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, 737 return snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
@@ -851,10 +867,11 @@ static int snd_fm801_get_single(struct snd_kcontrol *kcontrol,
851 int shift = (kcontrol->private_value >> 8) & 0xff; 867 int shift = (kcontrol->private_value >> 8) & 0xff;
852 int mask = (kcontrol->private_value >> 16) & 0xff; 868 int mask = (kcontrol->private_value >> 16) & 0xff;
853 int invert = (kcontrol->private_value >> 24) & 0xff; 869 int invert = (kcontrol->private_value >> 24) & 0xff;
870 long *value = ucontrol->value.integer.value;
854 871
855 ucontrol->value.integer.value[0] = (inw(chip->port + reg) >> shift) & mask; 872 value[0] = (fm801_ioread16(chip, reg) >> shift) & mask;
856 if (invert) 873 if (invert)
857 ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0]; 874 value[0] = mask - value[0];
858 return 0; 875 return 0;
859} 876}
860 877
@@ -907,14 +924,15 @@ static int snd_fm801_get_double(struct snd_kcontrol *kcontrol,
907 int shift_right = (kcontrol->private_value >> 12) & 0x0f; 924 int shift_right = (kcontrol->private_value >> 12) & 0x0f;
908 int mask = (kcontrol->private_value >> 16) & 0xff; 925 int mask = (kcontrol->private_value >> 16) & 0xff;
909 int invert = (kcontrol->private_value >> 24) & 0xff; 926 int invert = (kcontrol->private_value >> 24) & 0xff;
927 long *value = ucontrol->value.integer.value;
910 928
911 spin_lock_irq(&chip->reg_lock); 929 spin_lock_irq(&chip->reg_lock);
912 ucontrol->value.integer.value[0] = (inw(chip->port + reg) >> shift_left) & mask; 930 value[0] = (fm801_ioread16(chip, reg) >> shift_left) & mask;
913 ucontrol->value.integer.value[1] = (inw(chip->port + reg) >> shift_right) & mask; 931 value[1] = (fm801_ioread16(chip, reg) >> shift_right) & mask;
914 spin_unlock_irq(&chip->reg_lock); 932 spin_unlock_irq(&chip->reg_lock);
915 if (invert) { 933 if (invert) {
916 ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0]; 934 value[0] = mask - value[0];
917 ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1]; 935 value[1] = mask - value[1];
918 } 936 }
919 return 0; 937 return 0;
920} 938}
@@ -1080,26 +1098,20 @@ static int wait_for_codec(struct fm801 *chip, unsigned int codec_id,
1080 return -EIO; 1098 return -EIO;
1081} 1099}
1082 1100
1083static int snd_fm801_chip_init(struct fm801 *chip, int resume) 1101static int reset_codec(struct fm801 *chip)
1084{ 1102{
1085 unsigned short cmdw;
1086
1087 if (chip->tea575x_tuner & TUNER_ONLY)
1088 goto __ac97_ok;
1089
1090 /* codec cold reset + AC'97 warm reset */ 1103 /* codec cold reset + AC'97 warm reset */
1091 fm801_writew(chip, CODEC_CTRL, (1 << 5) | (1 << 6)); 1104 fm801_writew(chip, CODEC_CTRL, (1 << 5) | (1 << 6));
1092 fm801_readw(chip, CODEC_CTRL); /* flush posting data */ 1105 fm801_readw(chip, CODEC_CTRL); /* flush posting data */
1093 udelay(100); 1106 udelay(100);
1094 fm801_writew(chip, CODEC_CTRL, 0); 1107 fm801_writew(chip, CODEC_CTRL, 0);
1095 1108
1096 if (wait_for_codec(chip, 0, AC97_RESET, msecs_to_jiffies(750)) < 0) 1109 return wait_for_codec(chip, 0, AC97_RESET, msecs_to_jiffies(750));
1097 if (!resume) { 1110}
1098 dev_info(chip->card->dev, 1111
1099 "Primary AC'97 codec not found, assume SF64-PCR (tuner-only)\n"); 1112static void snd_fm801_chip_multichannel_init(struct fm801 *chip)
1100 chip->tea575x_tuner = 3 | TUNER_ONLY; 1113{
1101 goto __ac97_ok; 1114 unsigned short cmdw;
1102 }
1103 1115
1104 if (chip->multichannel) { 1116 if (chip->multichannel) {
1105 if (chip->secondary_addr) { 1117 if (chip->secondary_addr) {
@@ -1126,8 +1138,11 @@ static int snd_fm801_chip_init(struct fm801 *chip, int resume)
1126 /* cause timeout problems */ 1138 /* cause timeout problems */
1127 wait_for_codec(chip, 0, AC97_VENDOR_ID1, msecs_to_jiffies(750)); 1139 wait_for_codec(chip, 0, AC97_VENDOR_ID1, msecs_to_jiffies(750));
1128 } 1140 }
1141}
1129 1142
1130 __ac97_ok: 1143static void snd_fm801_chip_init(struct fm801 *chip)
1144{
1145 unsigned short cmdw;
1131 1146
1132 /* init volume */ 1147 /* init volume */
1133 fm801_writew(chip, PCM_VOL, 0x0808); 1148 fm801_writew(chip, PCM_VOL, 0x0808);
@@ -1148,11 +1163,8 @@ static int snd_fm801_chip_init(struct fm801 *chip, int resume)
1148 /* interrupt clear */ 1163 /* interrupt clear */
1149 fm801_writew(chip, IRQ_STATUS, 1164 fm801_writew(chip, IRQ_STATUS,
1150 FM801_IRQ_PLAYBACK | FM801_IRQ_CAPTURE | FM801_IRQ_MPU); 1165 FM801_IRQ_PLAYBACK | FM801_IRQ_CAPTURE | FM801_IRQ_MPU);
1151
1152 return 0;
1153} 1166}
1154 1167
1155
1156static int snd_fm801_free(struct fm801 *chip) 1168static int snd_fm801_free(struct fm801 *chip)
1157{ 1169{
1158 unsigned short cmdw; 1170 unsigned short cmdw;
@@ -1165,6 +1177,8 @@ static int snd_fm801_free(struct fm801 *chip)
1165 cmdw |= 0x00c3; 1177 cmdw |= 0x00c3;
1166 fm801_writew(chip, IRQ_MASK, cmdw); 1178 fm801_writew(chip, IRQ_MASK, cmdw);
1167 1179
1180 devm_free_irq(chip->dev, chip->irq, chip);
1181
1168 __end_hw: 1182 __end_hw:
1169#ifdef CONFIG_SND_FM801_TEA575X_BOOL 1183#ifdef CONFIG_SND_FM801_TEA575X_BOOL
1170 if (!(chip->tea575x_tuner & TUNER_DISABLED)) { 1184 if (!(chip->tea575x_tuner & TUNER_DISABLED)) {
@@ -1201,13 +1215,29 @@ static int snd_fm801_create(struct snd_card *card,
1201 return -ENOMEM; 1215 return -ENOMEM;
1202 spin_lock_init(&chip->reg_lock); 1216 spin_lock_init(&chip->reg_lock);
1203 chip->card = card; 1217 chip->card = card;
1204 chip->pci = pci; 1218 chip->dev = &pci->dev;
1205 chip->irq = -1; 1219 chip->irq = -1;
1206 chip->tea575x_tuner = tea575x_tuner; 1220 chip->tea575x_tuner = tea575x_tuner;
1207 if ((err = pci_request_regions(pci, "FM801")) < 0) 1221 if ((err = pci_request_regions(pci, "FM801")) < 0)
1208 return err; 1222 return err;
1209 chip->port = pci_resource_start(pci, 0); 1223 chip->port = pci_resource_start(pci, 0);
1210 if ((tea575x_tuner & TUNER_ONLY) == 0) { 1224
1225 if (pci->revision >= 0xb1) /* FM801-AU */
1226 chip->multichannel = 1;
1227
1228 if (!(chip->tea575x_tuner & TUNER_ONLY)) {
1229 if (reset_codec(chip) < 0) {
1230 dev_info(chip->card->dev,
1231 "Primary AC'97 codec not found, assume SF64-PCR (tuner-only)\n");
1232 chip->tea575x_tuner = 3 | TUNER_ONLY;
1233 } else {
1234 snd_fm801_chip_multichannel_init(chip);
1235 }
1236 }
1237
1238 snd_fm801_chip_init(chip);
1239
1240 if ((chip->tea575x_tuner & TUNER_ONLY) == 0) {
1211 if (devm_request_irq(&pci->dev, pci->irq, snd_fm801_interrupt, 1241 if (devm_request_irq(&pci->dev, pci->irq, snd_fm801_interrupt,
1212 IRQF_SHARED, KBUILD_MODNAME, chip)) { 1242 IRQF_SHARED, KBUILD_MODNAME, chip)) {
1213 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); 1243 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
@@ -1218,13 +1248,6 @@ static int snd_fm801_create(struct snd_card *card,
1218 pci_set_master(pci); 1248 pci_set_master(pci);
1219 } 1249 }
1220 1250
1221 if (pci->revision >= 0xb1) /* FM801-AU */
1222 chip->multichannel = 1;
1223
1224 snd_fm801_chip_init(chip, 0);
1225 /* init might set tuner access method */
1226 tea575x_tuner = chip->tea575x_tuner;
1227
1228 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { 1251 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
1229 snd_fm801_free(chip); 1252 snd_fm801_free(chip);
1230 return err; 1253 return err;
@@ -1241,14 +1264,16 @@ static int snd_fm801_create(struct snd_card *card,
1241 chip->tea.private_data = chip; 1264 chip->tea.private_data = chip;
1242 chip->tea.ops = &snd_fm801_tea_ops; 1265 chip->tea.ops = &snd_fm801_tea_ops;
1243 sprintf(chip->tea.bus_info, "PCI:%s", pci_name(pci)); 1266 sprintf(chip->tea.bus_info, "PCI:%s", pci_name(pci));
1244 if ((tea575x_tuner & TUNER_TYPE_MASK) > 0 && 1267 if ((chip->tea575x_tuner & TUNER_TYPE_MASK) > 0 &&
1245 (tea575x_tuner & TUNER_TYPE_MASK) < 4) { 1268 (chip->tea575x_tuner & TUNER_TYPE_MASK) < 4) {
1246 if (snd_tea575x_init(&chip->tea, THIS_MODULE)) { 1269 if (snd_tea575x_init(&chip->tea, THIS_MODULE)) {
1247 dev_err(card->dev, "TEA575x radio not found\n"); 1270 dev_err(card->dev, "TEA575x radio not found\n");
1248 snd_fm801_free(chip); 1271 snd_fm801_free(chip);
1249 return -ENODEV; 1272 return -ENODEV;
1250 } 1273 }
1251 } else if ((tea575x_tuner & TUNER_TYPE_MASK) == 0) { 1274 } else if ((chip->tea575x_tuner & TUNER_TYPE_MASK) == 0) {
1275 unsigned int tuner_only = chip->tea575x_tuner & TUNER_ONLY;
1276
1252 /* autodetect tuner connection */ 1277 /* autodetect tuner connection */
1253 for (tea575x_tuner = 1; tea575x_tuner <= 3; tea575x_tuner++) { 1278 for (tea575x_tuner = 1; tea575x_tuner <= 3; tea575x_tuner++) {
1254 chip->tea575x_tuner = tea575x_tuner; 1279 chip->tea575x_tuner = tea575x_tuner;
@@ -1263,6 +1288,8 @@ static int snd_fm801_create(struct snd_card *card,
1263 dev_err(card->dev, "TEA575x radio not found\n"); 1288 dev_err(card->dev, "TEA575x radio not found\n");
1264 chip->tea575x_tuner = TUNER_DISABLED; 1289 chip->tea575x_tuner = TUNER_DISABLED;
1265 } 1290 }
1291
1292 chip->tea575x_tuner |= tuner_only;
1266 } 1293 }
1267 if (!(chip->tea575x_tuner & TUNER_DISABLED)) { 1294 if (!(chip->tea575x_tuner & TUNER_DISABLED)) {
1268 strlcpy(chip->tea.card, get_tea575x_gpio(chip)->name, 1295 strlcpy(chip->tea.card, get_tea575x_gpio(chip)->name,
@@ -1366,12 +1393,18 @@ static int snd_fm801_suspend(struct device *dev)
1366 int i; 1393 int i;
1367 1394
1368 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); 1395 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
1369 snd_pcm_suspend_all(chip->pcm); 1396
1370 snd_ac97_suspend(chip->ac97);
1371 snd_ac97_suspend(chip->ac97_sec);
1372 for (i = 0; i < ARRAY_SIZE(saved_regs); i++) 1397 for (i = 0; i < ARRAY_SIZE(saved_regs); i++)
1373 chip->saved_regs[i] = inw(chip->port + saved_regs[i]); 1398 chip->saved_regs[i] = fm801_ioread16(chip, saved_regs[i]);
1374 /* FIXME: tea575x suspend */ 1399
1400 if (chip->tea575x_tuner & TUNER_ONLY) {
1401 /* FIXME: tea575x suspend */
1402 } else {
1403 snd_pcm_suspend_all(chip->pcm);
1404 snd_ac97_suspend(chip->ac97);
1405 snd_ac97_suspend(chip->ac97_sec);
1406 }
1407
1375 return 0; 1408 return 0;
1376} 1409}
1377 1410
@@ -1381,11 +1414,23 @@ static int snd_fm801_resume(struct device *dev)
1381 struct fm801 *chip = card->private_data; 1414 struct fm801 *chip = card->private_data;
1382 int i; 1415 int i;
1383 1416
1384 snd_fm801_chip_init(chip, 1); 1417 if (chip->tea575x_tuner & TUNER_ONLY) {
1385 snd_ac97_resume(chip->ac97); 1418 snd_fm801_chip_init(chip);
1386 snd_ac97_resume(chip->ac97_sec); 1419 } else {
1420 reset_codec(chip);
1421 snd_fm801_chip_multichannel_init(chip);
1422 snd_fm801_chip_init(chip);
1423 snd_ac97_resume(chip->ac97);
1424 snd_ac97_resume(chip->ac97_sec);
1425 }
1426
1387 for (i = 0; i < ARRAY_SIZE(saved_regs); i++) 1427 for (i = 0; i < ARRAY_SIZE(saved_regs); i++)
1388 outw(chip->saved_regs[i], chip->port + saved_regs[i]); 1428 fm801_iowrite16(chip, saved_regs[i], chip->saved_regs[i]);
1429
1430#ifdef CONFIG_SND_FM801_TEA575X_BOOL
1431 if (!(chip->tea575x_tuner & TUNER_DISABLED))
1432 snd_tea575x_set_freq(&chip->tea);
1433#endif
1389 1434
1390 snd_power_change_state(card, SNDRV_CTL_POWER_D0); 1435 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1391 return 0; 1436 return 0;
diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c
index 22dbfa563919..37cf9cee9835 100644
--- a/sound/pci/hda/hda_controller.c
+++ b/sound/pci/hda/hda_controller.c
@@ -956,7 +956,7 @@ irqreturn_t azx_interrupt(int irq, void *dev_id)
956 status = azx_readb(chip, RIRBSTS); 956 status = azx_readb(chip, RIRBSTS);
957 if (status & RIRB_INT_MASK) { 957 if (status & RIRB_INT_MASK) {
958 if (status & RIRB_INT_RESPONSE) { 958 if (status & RIRB_INT_RESPONSE) {
959 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY) 959 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
960 udelay(80); 960 udelay(80);
961 snd_hdac_bus_update_rirb(bus); 961 snd_hdac_bus_update_rirb(bus);
962 } 962 }
@@ -1050,16 +1050,10 @@ int azx_bus_init(struct azx *chip, const char *model,
1050 if (chip->get_position[0] != azx_get_pos_lpib || 1050 if (chip->get_position[0] != azx_get_pos_lpib ||
1051 chip->get_position[1] != azx_get_pos_lpib) 1051 chip->get_position[1] != azx_get_pos_lpib)
1052 bus->core.use_posbuf = true; 1052 bus->core.use_posbuf = true;
1053 if (chip->bdl_pos_adj) 1053 bus->core.bdl_pos_adj = chip->bdl_pos_adj;
1054 bus->core.bdl_pos_adj = chip->bdl_pos_adj[chip->dev_index];
1055 if (chip->driver_caps & AZX_DCAPS_CORBRP_SELF_CLEAR) 1054 if (chip->driver_caps & AZX_DCAPS_CORBRP_SELF_CLEAR)
1056 bus->core.corbrp_self_clear = true; 1055 bus->core.corbrp_self_clear = true;
1057 1056
1058 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
1059 dev_dbg(chip->card->dev, "Enable delay in RIRB handling\n");
1060 bus->needs_damn_long_delay = 1;
1061 }
1062
1063 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) 1057 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY)
1064 bus->core.align_bdle_4k = true; 1058 bus->core.align_bdle_4k = true;
1065 1059
diff --git a/sound/pci/hda/hda_controller.h b/sound/pci/hda/hda_controller.h
index 7b635d68cfe1..ec63bbf1ec6d 100644
--- a/sound/pci/hda/hda_controller.h
+++ b/sound/pci/hda/hda_controller.h
@@ -32,21 +32,25 @@
32#define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */ 32#define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */
33#define AZX_DCAPS_SNOOP_MASK (3 << 10) /* snoop type mask */ 33#define AZX_DCAPS_SNOOP_MASK (3 << 10) /* snoop type mask */
34#define AZX_DCAPS_SNOOP_OFF (1 << 12) /* snoop default off */ 34#define AZX_DCAPS_SNOOP_OFF (1 << 12) /* snoop default off */
35#define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */ 35/* 13 unused */
36#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */ 36/* 14 unused */
37#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */ 37#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */
38#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */ 38#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */
39#define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */ 39/* 17 unused */
40#define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */ 40#define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */
41#define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */ 41#define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */
42#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */ 42#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */
43#define AZX_DCAPS_NO_ALIGN_BUFSIZE (1 << 21) /* no buffer size alignment */ 43#define AZX_DCAPS_NO_ALIGN_BUFSIZE (1 << 21) /* no buffer size alignment */
44/* 22 unused */ 44/* 22 unused */
45#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */ 45#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
46#define AZX_DCAPS_REVERSE_ASSIGN (1 << 24) /* Assign devices in reverse order */ 46/* 24 unused */
47#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */ 47#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */
48#define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */ 48#define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */
49#ifdef CONFIG_SND_HDA_I915
49#define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */ 50#define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */
51#else
52#define AZX_DCAPS_I915_POWERWELL 0 /* NOP */
53#endif
50#define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */ 54#define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */
51#define AZX_DCAPS_NO_MSI64 (1 << 29) /* Stick to 32-bit MSIs */ 55#define AZX_DCAPS_NO_MSI64 (1 << 29) /* Stick to 32-bit MSIs */
52#define AZX_DCAPS_SEPARATE_STREAM_TAG (1 << 30) /* capture and playback use separate stream tag */ 56#define AZX_DCAPS_SEPARATE_STREAM_TAG (1 << 30) /* capture and playback use separate stream tag */
@@ -143,7 +147,7 @@ struct azx {
143#endif 147#endif
144 148
145 /* flags */ 149 /* flags */
146 const int *bdl_pos_adj; 150 int bdl_pos_adj;
147 int poll_count; 151 int poll_count;
148 unsigned int running:1; 152 unsigned int running:1;
149 unsigned int single_cmd:1; 153 unsigned int single_cmd:1;
diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c
index 563984dd2562..bc2e08257c2e 100644
--- a/sound/pci/hda/hda_eld.c
+++ b/sound/pci/hda/hda_eld.c
@@ -253,6 +253,7 @@ int snd_hdmi_parse_eld(struct hda_codec *codec, struct parsed_hdmi_eld *e,
253 int mnl; 253 int mnl;
254 int i; 254 int i;
255 255
256 memset(e, 0, sizeof(*e));
256 e->eld_ver = GRAB_BITS(buf, 0, 3, 5); 257 e->eld_ver = GRAB_BITS(buf, 0, 3, 5);
257 if (e->eld_ver != ELD_VER_CEA_861D && 258 if (e->eld_ver != ELD_VER_CEA_861D &&
258 e->eld_ver != ELD_VER_PARTIAL) { 259 e->eld_ver != ELD_VER_PARTIAL) {
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
index c6e8a651cea1..30c8efe0f80a 100644
--- a/sound/pci/hda/hda_generic.c
+++ b/sound/pci/hda/hda_generic.c
@@ -279,22 +279,6 @@ static struct nid_path *get_nid_path(struct hda_codec *codec,
279} 279}
280 280
281/** 281/**
282 * snd_hda_get_nid_path - get the path between the given NIDs
283 * @codec: the HDA codec
284 * @from_nid: the NID where the path start from
285 * @to_nid: the NID where the path ends at
286 *
287 * Return the found nid_path object or NULL for error.
288 * Passing 0 to either @from_nid or @to_nid behaves as a wildcard.
289 */
290struct nid_path *snd_hda_get_nid_path(struct hda_codec *codec,
291 hda_nid_t from_nid, hda_nid_t to_nid)
292{
293 return get_nid_path(codec, from_nid, to_nid, 0);
294}
295EXPORT_SYMBOL_GPL(snd_hda_get_nid_path);
296
297/**
298 * snd_hda_get_path_idx - get the index number corresponding to the path 282 * snd_hda_get_path_idx - get the index number corresponding to the path
299 * instance 283 * instance
300 * @codec: the HDA codec 284 * @codec: the HDA codec
@@ -451,7 +435,7 @@ static bool __parse_nid_path(struct hda_codec *codec,
451 return true; 435 return true;
452} 436}
453 437
454/** 438/*
455 * snd_hda_parse_nid_path - parse the widget path from the given nid to 439 * snd_hda_parse_nid_path - parse the widget path from the given nid to
456 * the target nid 440 * the target nid
457 * @codec: the HDA codec 441 * @codec: the HDA codec
@@ -470,7 +454,7 @@ static bool __parse_nid_path(struct hda_codec *codec,
470 * with the negative of given value are excluded, only other paths are chosen. 454 * with the negative of given value are excluded, only other paths are chosen.
471 * when @anchor_nid is zero, no special handling about path selection. 455 * when @anchor_nid is zero, no special handling about path selection.
472 */ 456 */
473bool snd_hda_parse_nid_path(struct hda_codec *codec, hda_nid_t from_nid, 457static bool snd_hda_parse_nid_path(struct hda_codec *codec, hda_nid_t from_nid,
474 hda_nid_t to_nid, int anchor_nid, 458 hda_nid_t to_nid, int anchor_nid,
475 struct nid_path *path) 459 struct nid_path *path)
476{ 460{
@@ -481,7 +465,6 @@ bool snd_hda_parse_nid_path(struct hda_codec *codec, hda_nid_t from_nid,
481 } 465 }
482 return false; 466 return false;
483} 467}
484EXPORT_SYMBOL_GPL(snd_hda_parse_nid_path);
485 468
486/** 469/**
487 * snd_hda_add_new_path - parse the path between the given NIDs and 470 * snd_hda_add_new_path - parse the path between the given NIDs and
@@ -771,9 +754,6 @@ static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir,
771 unsigned int caps; 754 unsigned int caps;
772 unsigned int mask, val; 755 unsigned int mask, val;
773 756
774 if (!enable && is_active_nid(codec, nid, dir, idx_to_check))
775 return;
776
777 caps = query_amp_caps(codec, nid, dir); 757 caps = query_amp_caps(codec, nid, dir);
778 val = get_amp_val_to_activate(codec, nid, dir, caps, enable); 758 val = get_amp_val_to_activate(codec, nid, dir, caps, enable);
779 mask = get_amp_mask_to_modify(codec, nid, dir, idx_to_check, caps); 759 mask = get_amp_mask_to_modify(codec, nid, dir, idx_to_check, caps);
@@ -784,12 +764,22 @@ static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir,
784 update_amp(codec, nid, dir, idx, mask, val); 764 update_amp(codec, nid, dir, idx, mask, val);
785} 765}
786 766
767static void check_and_activate_amp(struct hda_codec *codec, hda_nid_t nid,
768 int dir, int idx, int idx_to_check,
769 bool enable)
770{
771 /* check whether the given amp is still used by others */
772 if (!enable && is_active_nid(codec, nid, dir, idx_to_check))
773 return;
774 activate_amp(codec, nid, dir, idx, idx_to_check, enable);
775}
776
787static void activate_amp_out(struct hda_codec *codec, struct nid_path *path, 777static void activate_amp_out(struct hda_codec *codec, struct nid_path *path,
788 int i, bool enable) 778 int i, bool enable)
789{ 779{
790 hda_nid_t nid = path->path[i]; 780 hda_nid_t nid = path->path[i];
791 init_amp(codec, nid, HDA_OUTPUT, 0); 781 init_amp(codec, nid, HDA_OUTPUT, 0);
792 activate_amp(codec, nid, HDA_OUTPUT, 0, 0, enable); 782 check_and_activate_amp(codec, nid, HDA_OUTPUT, 0, 0, enable);
793} 783}
794 784
795static void activate_amp_in(struct hda_codec *codec, struct nid_path *path, 785static void activate_amp_in(struct hda_codec *codec, struct nid_path *path,
@@ -817,9 +807,16 @@ static void activate_amp_in(struct hda_codec *codec, struct nid_path *path,
817 * when aa-mixer is available, we need to enable the path as well 807 * when aa-mixer is available, we need to enable the path as well
818 */ 808 */
819 for (n = 0; n < nums; n++) { 809 for (n = 0; n < nums; n++) {
820 if (n != idx && (!add_aamix || conn[n] != spec->mixer_merge_nid)) 810 if (n != idx) {
821 continue; 811 if (conn[n] != spec->mixer_merge_nid)
822 activate_amp(codec, nid, HDA_INPUT, n, idx, enable); 812 continue;
813 /* when aamix is disabled, force to off */
814 if (!add_aamix) {
815 activate_amp(codec, nid, HDA_INPUT, n, n, false);
816 continue;
817 }
818 }
819 check_and_activate_amp(codec, nid, HDA_INPUT, n, idx, enable);
823 } 820 }
824} 821}
825 822
@@ -1580,6 +1577,12 @@ static bool map_singles(struct hda_codec *codec, int outs,
1580 return found; 1577 return found;
1581} 1578}
1582 1579
1580static inline bool has_aamix_out_paths(struct hda_gen_spec *spec)
1581{
1582 return spec->aamix_out_paths[0] || spec->aamix_out_paths[1] ||
1583 spec->aamix_out_paths[2];
1584}
1585
1583/* create a new path including aamix if available, and return its index */ 1586/* create a new path including aamix if available, and return its index */
1584static int check_aamix_out_path(struct hda_codec *codec, int path_idx) 1587static int check_aamix_out_path(struct hda_codec *codec, int path_idx)
1585{ 1588{
@@ -2422,25 +2425,51 @@ static void update_aamix_paths(struct hda_codec *codec, bool do_mix,
2422 } 2425 }
2423} 2426}
2424 2427
2428/* re-initialize the output paths; only called from loopback_mixing_put() */
2429static void update_output_paths(struct hda_codec *codec, int num_outs,
2430 const int *paths)
2431{
2432 struct hda_gen_spec *spec = codec->spec;
2433 struct nid_path *path;
2434 int i;
2435
2436 for (i = 0; i < num_outs; i++) {
2437 path = snd_hda_get_path_from_idx(codec, paths[i]);
2438 if (path)
2439 snd_hda_activate_path(codec, path, path->active,
2440 spec->aamix_mode);
2441 }
2442}
2443
2425static int loopback_mixing_put(struct snd_kcontrol *kcontrol, 2444static int loopback_mixing_put(struct snd_kcontrol *kcontrol,
2426 struct snd_ctl_elem_value *ucontrol) 2445 struct snd_ctl_elem_value *ucontrol)
2427{ 2446{
2428 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2447 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2429 struct hda_gen_spec *spec = codec->spec; 2448 struct hda_gen_spec *spec = codec->spec;
2449 const struct auto_pin_cfg *cfg = &spec->autocfg;
2430 unsigned int val = ucontrol->value.enumerated.item[0]; 2450 unsigned int val = ucontrol->value.enumerated.item[0];
2431 2451
2432 if (val == spec->aamix_mode) 2452 if (val == spec->aamix_mode)
2433 return 0; 2453 return 0;
2434 spec->aamix_mode = val; 2454 spec->aamix_mode = val;
2435 update_aamix_paths(codec, val, spec->out_paths[0], 2455 if (has_aamix_out_paths(spec)) {
2436 spec->aamix_out_paths[0], 2456 update_aamix_paths(codec, val, spec->out_paths[0],
2437 spec->autocfg.line_out_type); 2457 spec->aamix_out_paths[0],
2438 update_aamix_paths(codec, val, spec->hp_paths[0], 2458 cfg->line_out_type);
2439 spec->aamix_out_paths[1], 2459 update_aamix_paths(codec, val, spec->hp_paths[0],
2440 AUTO_PIN_HP_OUT); 2460 spec->aamix_out_paths[1],
2441 update_aamix_paths(codec, val, spec->speaker_paths[0], 2461 AUTO_PIN_HP_OUT);
2442 spec->aamix_out_paths[2], 2462 update_aamix_paths(codec, val, spec->speaker_paths[0],
2443 AUTO_PIN_SPEAKER_OUT); 2463 spec->aamix_out_paths[2],
2464 AUTO_PIN_SPEAKER_OUT);
2465 } else {
2466 update_output_paths(codec, cfg->line_outs, spec->out_paths);
2467 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
2468 update_output_paths(codec, cfg->hp_outs, spec->hp_paths);
2469 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
2470 update_output_paths(codec, cfg->speaker_outs,
2471 spec->speaker_paths);
2472 }
2444 return 1; 2473 return 1;
2445} 2474}
2446 2475
@@ -2458,12 +2487,13 @@ static int create_loopback_mixing_ctl(struct hda_codec *codec)
2458 2487
2459 if (!spec->mixer_nid) 2488 if (!spec->mixer_nid)
2460 return 0; 2489 return 0;
2461 if (!(spec->aamix_out_paths[0] || spec->aamix_out_paths[1] ||
2462 spec->aamix_out_paths[2]))
2463 return 0;
2464 if (!snd_hda_gen_add_kctl(spec, NULL, &loopback_mixing_enum)) 2490 if (!snd_hda_gen_add_kctl(spec, NULL, &loopback_mixing_enum))
2465 return -ENOMEM; 2491 return -ENOMEM;
2466 spec->have_aamix_ctl = 1; 2492 spec->have_aamix_ctl = 1;
2493 /* if no explicit aamix path is present (e.g. for Realtek codecs),
2494 * enable aamix as default -- just for compatibility
2495 */
2496 spec->aamix_mode = !has_aamix_out_paths(spec);
2467 return 0; 2497 return 0;
2468} 2498}
2469 2499
@@ -5664,6 +5694,8 @@ static void init_aamix_paths(struct hda_codec *codec)
5664 5694
5665 if (!spec->have_aamix_ctl) 5695 if (!spec->have_aamix_ctl)
5666 return; 5696 return;
5697 if (!has_aamix_out_paths(spec))
5698 return;
5667 update_aamix_paths(codec, spec->aamix_mode, spec->out_paths[0], 5699 update_aamix_paths(codec, spec->aamix_mode, spec->out_paths[0],
5668 spec->aamix_out_paths[0], 5700 spec->aamix_out_paths[0],
5669 spec->autocfg.line_out_type); 5701 spec->autocfg.line_out_type);
diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h
index 56e4139b9032..f66fc7e25e07 100644
--- a/sound/pci/hda/hda_generic.h
+++ b/sound/pci/hda/hda_generic.h
@@ -306,13 +306,8 @@ int snd_hda_gen_spec_init(struct hda_gen_spec *spec);
306int snd_hda_gen_init(struct hda_codec *codec); 306int snd_hda_gen_init(struct hda_codec *codec);
307void snd_hda_gen_free(struct hda_codec *codec); 307void snd_hda_gen_free(struct hda_codec *codec);
308 308
309struct nid_path *snd_hda_get_nid_path(struct hda_codec *codec,
310 hda_nid_t from_nid, hda_nid_t to_nid);
311int snd_hda_get_path_idx(struct hda_codec *codec, struct nid_path *path); 309int snd_hda_get_path_idx(struct hda_codec *codec, struct nid_path *path);
312struct nid_path *snd_hda_get_path_from_idx(struct hda_codec *codec, int idx); 310struct nid_path *snd_hda_get_path_from_idx(struct hda_codec *codec, int idx);
313bool snd_hda_parse_nid_path(struct hda_codec *codec, hda_nid_t from_nid,
314 hda_nid_t to_nid, int anchor_nid,
315 struct nid_path *path);
316struct nid_path * 311struct nid_path *
317snd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid, 312snd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid,
318 hda_nid_t to_nid, int anchor_nid); 313 hda_nid_t to_nid, int anchor_nid);
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 3b3658297070..c0bef11afa7e 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -284,13 +284,19 @@ enum {
284 (AZX_DCAPS_OLD_SSYNC | AZX_DCAPS_NO_ALIGN_BUFSIZE) 284 (AZX_DCAPS_OLD_SSYNC | AZX_DCAPS_NO_ALIGN_BUFSIZE)
285 285
286/* quirks for Intel PCH */ 286/* quirks for Intel PCH */
287#define AZX_DCAPS_INTEL_PCH_NOPM \ 287#define AZX_DCAPS_INTEL_PCH_BASE \
288 (AZX_DCAPS_NO_ALIGN_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY |\ 288 (AZX_DCAPS_NO_ALIGN_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY |\
289 AZX_DCAPS_REVERSE_ASSIGN | AZX_DCAPS_SNOOP_TYPE(SCH)) 289 AZX_DCAPS_SNOOP_TYPE(SCH))
290
291/* PCH up to IVB; no runtime PM */
292#define AZX_DCAPS_INTEL_PCH_NOPM \
293 (AZX_DCAPS_INTEL_PCH_BASE)
290 294
295/* PCH for HSW/BDW; with runtime PM */
291#define AZX_DCAPS_INTEL_PCH \ 296#define AZX_DCAPS_INTEL_PCH \
292 (AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME) 297 (AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME)
293 298
299/* HSW HDMI */
294#define AZX_DCAPS_INTEL_HASWELL \ 300#define AZX_DCAPS_INTEL_HASWELL \
295 (/*AZX_DCAPS_ALIGN_BUFSIZE |*/ AZX_DCAPS_COUNT_LPIB_DELAY |\ 301 (/*AZX_DCAPS_ALIGN_BUFSIZE |*/ AZX_DCAPS_COUNT_LPIB_DELAY |\
296 AZX_DCAPS_PM_RUNTIME | AZX_DCAPS_I915_POWERWELL |\ 302 AZX_DCAPS_PM_RUNTIME | AZX_DCAPS_I915_POWERWELL |\
@@ -332,7 +338,7 @@ enum {
332 338
333/* quirks for Nvidia */ 339/* quirks for Nvidia */
334#define AZX_DCAPS_PRESET_NVIDIA \ 340#define AZX_DCAPS_PRESET_NVIDIA \
335 (AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI | /*AZX_DCAPS_ALIGN_BUFSIZE |*/ \ 341 (AZX_DCAPS_NO_MSI | /*AZX_DCAPS_ALIGN_BUFSIZE |*/ \
336 AZX_DCAPS_NO_64BIT | AZX_DCAPS_CORBRP_SELF_CLEAR |\ 342 AZX_DCAPS_NO_64BIT | AZX_DCAPS_CORBRP_SELF_CLEAR |\
337 AZX_DCAPS_SNOOP_TYPE(NVIDIA)) 343 AZX_DCAPS_SNOOP_TYPE(NVIDIA))
338 344
@@ -649,7 +655,7 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
649 if (wallclk < (azx_dev->core.period_wallclk * 5) / 4 && 655 if (wallclk < (azx_dev->core.period_wallclk * 5) / 4 &&
650 pos % azx_dev->core.period_bytes > azx_dev->core.period_bytes / 2) 656 pos % azx_dev->core.period_bytes > azx_dev->core.period_bytes / 2)
651 /* NG - it's below the first next period boundary */ 657 /* NG - it's below the first next period boundary */
652 return chip->bdl_pos_adj[chip->dev_index] ? 0 : -1; 658 return chip->bdl_pos_adj ? 0 : -1;
653 azx_dev->core.start_wallclk += wallclk; 659 azx_dev->core.start_wallclk += wallclk;
654 return 1; /* OK, it's fine */ 660 return 1; /* OK, it's fine */
655} 661}
@@ -719,7 +725,7 @@ static int azx_acquire_irq(struct azx *chip, int do_disconnect)
719 725
720 if (request_irq(chip->pci->irq, azx_interrupt, 726 if (request_irq(chip->pci->irq, azx_interrupt,
721 chip->msi ? 0 : IRQF_SHARED, 727 chip->msi ? 0 : IRQF_SHARED,
722 KBUILD_MODNAME, chip)) { 728 chip->card->irq_descr, chip)) {
723 dev_err(chip->card->dev, 729 dev_err(chip->card->dev,
724 "unable to grab IRQ %d, disabling device\n", 730 "unable to grab IRQ %d, disabling device\n",
725 chip->pci->irq); 731 chip->pci->irq);
@@ -1376,7 +1382,7 @@ static int check_position_fix(struct azx *chip, int fix)
1376 } 1382 }
1377 1383
1378 /* Check VIA/ATI HD Audio Controller exist */ 1384 /* Check VIA/ATI HD Audio Controller exist */
1379 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) { 1385 if (chip->driver_type == AZX_DRIVER_VIA) {
1380 dev_dbg(chip->card->dev, "Using VIACOMBO position fix\n"); 1386 dev_dbg(chip->card->dev, "Using VIACOMBO position fix\n");
1381 return POS_FIX_VIACOMBO; 1387 return POS_FIX_VIACOMBO;
1382 } 1388 }
@@ -1539,6 +1545,26 @@ static void azx_probe_work(struct work_struct *work)
1539 azx_probe_continue(&hda->chip); 1545 azx_probe_continue(&hda->chip);
1540} 1546}
1541 1547
1548static int default_bdl_pos_adj(struct azx *chip)
1549{
1550 /* some exceptions: Atoms seem problematic with value 1 */
1551 if (chip->pci->vendor == PCI_VENDOR_ID_INTEL) {
1552 switch (chip->pci->device) {
1553 case 0x0f04: /* Baytrail */
1554 case 0x2284: /* Braswell */
1555 return 32;
1556 }
1557 }
1558
1559 switch (chip->driver_type) {
1560 case AZX_DRIVER_ICH:
1561 case AZX_DRIVER_PCH:
1562 return 1;
1563 default:
1564 return 32;
1565 }
1566}
1567
1542/* 1568/*
1543 * constructor 1569 * constructor
1544 */ 1570 */
@@ -1592,18 +1618,10 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci,
1592 chip->single_cmd = single_cmd; 1618 chip->single_cmd = single_cmd;
1593 azx_check_snoop_available(chip); 1619 azx_check_snoop_available(chip);
1594 1620
1595 if (bdl_pos_adj[dev] < 0) { 1621 if (bdl_pos_adj[dev] < 0)
1596 switch (chip->driver_type) { 1622 chip->bdl_pos_adj = default_bdl_pos_adj(chip);
1597 case AZX_DRIVER_ICH: 1623 else
1598 case AZX_DRIVER_PCH: 1624 chip->bdl_pos_adj = bdl_pos_adj[dev];
1599 bdl_pos_adj[dev] = 1;
1600 break;
1601 default:
1602 bdl_pos_adj[dev] = 32;
1603 break;
1604 }
1605 }
1606 chip->bdl_pos_adj = bdl_pos_adj;
1607 1625
1608 err = azx_bus_init(chip, model[dev], &pci_hda_io_ops); 1626 err = azx_bus_init(chip, model[dev], &pci_hda_io_ops);
1609 if (err < 0) { 1627 if (err < 0) {
@@ -1612,6 +1630,11 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci,
1612 return err; 1630 return err;
1613 } 1631 }
1614 1632
1633 if (chip->driver_type == AZX_DRIVER_NVIDIA) {
1634 dev_dbg(chip->card->dev, "Enable delay in RIRB handling\n");
1635 chip->bus.needs_damn_long_delay = 1;
1636 }
1637
1615 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); 1638 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
1616 if (err < 0) { 1639 if (err < 0) {
1617 dev_err(card->dev, "Error creating device [card]!\n"); 1640 dev_err(card->dev, "Error creating device [card]!\n");
@@ -2005,8 +2028,8 @@ static int azx_probe(struct pci_dev *pci,
2005#endif /* CONFIG_SND_HDA_PATCH_LOADER */ 2028#endif /* CONFIG_SND_HDA_PATCH_LOADER */
2006 2029
2007#ifndef CONFIG_SND_HDA_I915 2030#ifndef CONFIG_SND_HDA_I915
2008 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) 2031 if (CONTROLLER_IN_GPU(pci))
2009 dev_err(card->dev, "Haswell must build in CONFIG_SND_HDA_I915\n"); 2032 dev_err(card->dev, "Haswell/Broadwell HDMI/DP must build in CONFIG_SND_HDA_I915\n");
2010#endif 2033#endif
2011 2034
2012 if (schedule_probe) 2035 if (schedule_probe)
@@ -2203,10 +2226,10 @@ static const struct pci_device_id azx_ids[] = {
2203 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM }, 2226 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
2204 /* Poulsbo */ 2227 /* Poulsbo */
2205 { PCI_DEVICE(0x8086, 0x811b), 2228 { PCI_DEVICE(0x8086, 0x811b),
2206 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM }, 2229 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_BASE },
2207 /* Oaktrail */ 2230 /* Oaktrail */
2208 { PCI_DEVICE(0x8086, 0x080a), 2231 { PCI_DEVICE(0x8086, 0x080a),
2209 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM }, 2232 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_BASE },
2210 /* BayTrail */ 2233 /* BayTrail */
2211 { PCI_DEVICE(0x8086, 0x0f04), 2234 { PCI_DEVICE(0x8086, 0x0f04),
2212 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BAYTRAIL }, 2235 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BAYTRAIL },
@@ -2318,8 +2341,7 @@ static const struct pci_device_id azx_ids[] = {
2318 { PCI_DEVICE(0x1002, 0xaae8), 2341 { PCI_DEVICE(0x1002, 0xaae8),
2319 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, 2342 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
2320 /* VIA VT8251/VT8237A */ 2343 /* VIA VT8251/VT8237A */
2321 { PCI_DEVICE(0x1106, 0x3288), 2344 { PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA },
2322 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
2323 /* VIA GFX VT7122/VX900 */ 2345 /* VIA GFX VT7122/VX900 */
2324 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC }, 2346 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
2325 /* VIA GFX VT6122/VX11 */ 2347 /* VIA GFX VT6122/VX11 */
@@ -2353,14 +2375,12 @@ static const struct pci_device_id azx_ids[] = {
2353 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, 2375 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
2354 .class_mask = 0xffffff, 2376 .class_mask = 0xffffff,
2355 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | 2377 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
2356 AZX_DCAPS_NO_64BIT | 2378 AZX_DCAPS_NO_64BIT | AZX_DCAPS_POSFIX_LPIB },
2357 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
2358#else 2379#else
2359 /* this entry seems still valid -- i.e. without emu20kx chip */ 2380 /* this entry seems still valid -- i.e. without emu20kx chip */
2360 { PCI_DEVICE(0x1102, 0x0009), 2381 { PCI_DEVICE(0x1102, 0x0009),
2361 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | 2382 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
2362 AZX_DCAPS_NO_64BIT | 2383 AZX_DCAPS_NO_64BIT | AZX_DCAPS_POSFIX_LPIB },
2363 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
2364#endif 2384#endif
2365 /* CM8888 */ 2385 /* CM8888 */
2366 { PCI_DEVICE(0x13f6, 0x5011), 2386 { PCI_DEVICE(0x13f6, 0x5011),
diff --git a/sound/pci/hda/hda_tegra.c b/sound/pci/hda/hda_tegra.c
index 58c0aad37284..17fd81736d3d 100644
--- a/sound/pci/hda/hda_tegra.c
+++ b/sound/pci/hda/hda_tegra.c
@@ -464,6 +464,8 @@ static int hda_tegra_create(struct snd_card *card,
464 if (err < 0) 464 if (err < 0)
465 return err; 465 return err;
466 466
467 chip->bus.needs_damn_long_delay = 1;
468
467 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); 469 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
468 if (err < 0) { 470 if (err < 0) {
469 dev_err(card->dev, "Error creating device\n"); 471 dev_err(card->dev, "Error creating device\n");
@@ -481,8 +483,7 @@ MODULE_DEVICE_TABLE(of, hda_tegra_match);
481 483
482static int hda_tegra_probe(struct platform_device *pdev) 484static int hda_tegra_probe(struct platform_device *pdev)
483{ 485{
484 const unsigned int driver_flags = AZX_DCAPS_RIRB_DELAY | 486 const unsigned int driver_flags = AZX_DCAPS_CORBRP_SELF_CLEAR;
485 AZX_DCAPS_CORBRP_SELF_CLEAR;
486 struct snd_card *card; 487 struct snd_card *card;
487 struct azx *chip; 488 struct azx *chip;
488 struct hda_tegra *hda; 489 struct hda_tegra *hda;
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
index ef198903c0c3..6122b8ca872f 100644
--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -901,6 +901,9 @@ static int patch_conexant_auto(struct hda_codec *codec)
901 snd_hda_pick_fixup(codec, cxt5051_fixup_models, 901 snd_hda_pick_fixup(codec, cxt5051_fixup_models,
902 cxt5051_fixups, cxt_fixups); 902 cxt5051_fixups, cxt_fixups);
903 break; 903 break;
904 case 0x14f150f2:
905 codec->power_save_node = 1;
906 /* Fall through */
904 default: 907 default:
905 codec->pin_amp_workaround = 1; 908 codec->pin_amp_workaround = 1;
906 snd_hda_pick_fixup(codec, cxt5066_fixup_models, 909 snd_hda_pick_fixup(codec, cxt5066_fixup_models,
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index 4b6fb668c91c..426a29a1c19b 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -51,8 +51,10 @@ MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info");
51#define is_broadwell(codec) ((codec)->core.vendor_id == 0x80862808) 51#define is_broadwell(codec) ((codec)->core.vendor_id == 0x80862808)
52#define is_skylake(codec) ((codec)->core.vendor_id == 0x80862809) 52#define is_skylake(codec) ((codec)->core.vendor_id == 0x80862809)
53#define is_broxton(codec) ((codec)->core.vendor_id == 0x8086280a) 53#define is_broxton(codec) ((codec)->core.vendor_id == 0x8086280a)
54#define is_kabylake(codec) ((codec)->core.vendor_id == 0x8086280b)
54#define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \ 55#define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \
55 || is_skylake(codec) || is_broxton(codec)) 56 || is_skylake(codec) || is_broxton(codec) \
57 || is_kabylake(codec))
56 58
57#define is_valleyview(codec) ((codec)->core.vendor_id == 0x80862882) 59#define is_valleyview(codec) ((codec)->core.vendor_id == 0x80862882)
58#define is_cherryview(codec) ((codec)->core.vendor_id == 0x80862883) 60#define is_cherryview(codec) ((codec)->core.vendor_id == 0x80862883)
@@ -83,6 +85,7 @@ struct hdmi_spec_per_pin {
83 struct mutex lock; 85 struct mutex lock;
84 struct delayed_work work; 86 struct delayed_work work;
85 struct snd_kcontrol *eld_ctl; 87 struct snd_kcontrol *eld_ctl;
88 struct snd_jack *acomp_jack; /* jack via audio component */
86 int repoll_count; 89 int repoll_count;
87 bool setup; /* the stream has been set up by prepare callback */ 90 bool setup; /* the stream has been set up by prepare callback */
88 int channels; /* current number of channels */ 91 int channels; /* current number of channels */
@@ -150,8 +153,15 @@ struct hdmi_spec {
150 153
151 /* i915/powerwell (Haswell+/Valleyview+) specific */ 154 /* i915/powerwell (Haswell+/Valleyview+) specific */
152 struct i915_audio_component_audio_ops i915_audio_ops; 155 struct i915_audio_component_audio_ops i915_audio_ops;
156 bool i915_bound; /* was i915 bound in this driver? */
153}; 157};
154 158
159#ifdef CONFIG_SND_HDA_I915
160#define codec_has_acomp(codec) \
161 ((codec)->bus->core.audio_component != NULL)
162#else
163#define codec_has_acomp(codec) false
164#endif
155 165
156struct hdmi_audio_infoframe { 166struct hdmi_audio_infoframe {
157 u8 type; /* 0x84 */ 167 u8 type; /* 0x84 */
@@ -1530,7 +1540,59 @@ static int hdmi_read_pin_conn(struct hda_codec *codec, int pin_idx)
1530 return 0; 1540 return 0;
1531} 1541}
1532 1542
1533static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) 1543/* update per_pin ELD from the given new ELD;
1544 * setup info frame and notification accordingly
1545 */
1546static void update_eld(struct hda_codec *codec,
1547 struct hdmi_spec_per_pin *per_pin,
1548 struct hdmi_eld *eld)
1549{
1550 struct hdmi_eld *pin_eld = &per_pin->sink_eld;
1551 bool old_eld_valid = pin_eld->eld_valid;
1552 bool eld_changed;
1553
1554 if (eld->eld_valid)
1555 snd_hdmi_show_eld(codec, &eld->info);
1556
1557 eld_changed = (pin_eld->eld_valid != eld->eld_valid);
1558 if (eld->eld_valid && pin_eld->eld_valid)
1559 if (pin_eld->eld_size != eld->eld_size ||
1560 memcmp(pin_eld->eld_buffer, eld->eld_buffer,
1561 eld->eld_size) != 0)
1562 eld_changed = true;
1563
1564 pin_eld->eld_valid = eld->eld_valid;
1565 pin_eld->eld_size = eld->eld_size;
1566 if (eld->eld_valid)
1567 memcpy(pin_eld->eld_buffer, eld->eld_buffer, eld->eld_size);
1568 pin_eld->info = eld->info;
1569
1570 /*
1571 * Re-setup pin and infoframe. This is needed e.g. when
1572 * - sink is first plugged-in
1573 * - transcoder can change during stream playback on Haswell
1574 * and this can make HW reset converter selection on a pin.
1575 */
1576 if (eld->eld_valid && !old_eld_valid && per_pin->setup) {
1577 if (is_haswell_plus(codec) || is_valleyview_plus(codec)) {
1578 intel_verify_pin_cvt_connect(codec, per_pin);
1579 intel_not_share_assigned_cvt(codec, per_pin->pin_nid,
1580 per_pin->mux_idx);
1581 }
1582
1583 hdmi_setup_audio_infoframe(codec, per_pin, per_pin->non_pcm);
1584 }
1585
1586 if (eld_changed)
1587 snd_ctl_notify(codec->card,
1588 SNDRV_CTL_EVENT_MASK_VALUE |
1589 SNDRV_CTL_EVENT_MASK_INFO,
1590 &per_pin->eld_ctl->id);
1591}
1592
1593/* update ELD and jack state via HD-audio verbs */
1594static bool hdmi_present_sense_via_verbs(struct hdmi_spec_per_pin *per_pin,
1595 int repoll)
1534{ 1596{
1535 struct hda_jack_tbl *jack; 1597 struct hda_jack_tbl *jack;
1536 struct hda_codec *codec = per_pin->codec; 1598 struct hda_codec *codec = per_pin->codec;
@@ -1547,9 +1609,8 @@ static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)
1547 * the unsolicited response to avoid custom WARs. 1609 * the unsolicited response to avoid custom WARs.
1548 */ 1610 */
1549 int present; 1611 int present;
1550 bool update_eld = false;
1551 bool eld_changed = false;
1552 bool ret; 1612 bool ret;
1613 bool do_repoll = false;
1553 1614
1554 snd_hda_power_up_pm(codec); 1615 snd_hda_power_up_pm(codec);
1555 present = snd_hda_pin_sense(codec, pin_nid); 1616 present = snd_hda_pin_sense(codec, pin_nid);
@@ -1570,66 +1631,19 @@ static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)
1570 &eld->eld_size) < 0) 1631 &eld->eld_size) < 0)
1571 eld->eld_valid = false; 1632 eld->eld_valid = false;
1572 else { 1633 else {
1573 memset(&eld->info, 0, sizeof(struct parsed_hdmi_eld));
1574 if (snd_hdmi_parse_eld(codec, &eld->info, eld->eld_buffer, 1634 if (snd_hdmi_parse_eld(codec, &eld->info, eld->eld_buffer,
1575 eld->eld_size) < 0) 1635 eld->eld_size) < 0)
1576 eld->eld_valid = false; 1636 eld->eld_valid = false;
1577 } 1637 }
1578 1638 if (!eld->eld_valid && repoll)
1579 if (eld->eld_valid) { 1639 do_repoll = true;
1580 snd_hdmi_show_eld(codec, &eld->info);
1581 update_eld = true;
1582 }
1583 else if (repoll) {
1584 schedule_delayed_work(&per_pin->work,
1585 msecs_to_jiffies(300));
1586 goto unlock;
1587 }
1588 } 1640 }
1589 1641
1590 if (pin_eld->eld_valid != eld->eld_valid) 1642 if (do_repoll)
1591 eld_changed = true; 1643 schedule_delayed_work(&per_pin->work, msecs_to_jiffies(300));
1592 1644 else
1593 if (pin_eld->eld_valid && !eld->eld_valid) 1645 update_eld(codec, per_pin, eld);
1594 update_eld = true;
1595
1596 if (update_eld) {
1597 bool old_eld_valid = pin_eld->eld_valid;
1598 pin_eld->eld_valid = eld->eld_valid;
1599 if (pin_eld->eld_size != eld->eld_size ||
1600 memcmp(pin_eld->eld_buffer, eld->eld_buffer,
1601 eld->eld_size) != 0) {
1602 memcpy(pin_eld->eld_buffer, eld->eld_buffer,
1603 eld->eld_size);
1604 eld_changed = true;
1605 }
1606 pin_eld->eld_size = eld->eld_size;
1607 pin_eld->info = eld->info;
1608
1609 /*
1610 * Re-setup pin and infoframe. This is needed e.g. when
1611 * - sink is first plugged-in (infoframe is not set up if !monitor_present)
1612 * - transcoder can change during stream playback on Haswell
1613 * and this can make HW reset converter selection on a pin.
1614 */
1615 if (eld->eld_valid && !old_eld_valid && per_pin->setup) {
1616 if (is_haswell_plus(codec) ||
1617 is_valleyview_plus(codec)) {
1618 intel_verify_pin_cvt_connect(codec, per_pin);
1619 intel_not_share_assigned_cvt(codec, pin_nid,
1620 per_pin->mux_idx);
1621 }
1622
1623 hdmi_setup_audio_infoframe(codec, per_pin,
1624 per_pin->non_pcm);
1625 }
1626 }
1627 1646
1628 if (eld_changed)
1629 snd_ctl_notify(codec->card,
1630 SNDRV_CTL_EVENT_MASK_VALUE | SNDRV_CTL_EVENT_MASK_INFO,
1631 &per_pin->eld_ctl->id);
1632 unlock:
1633 ret = !repoll || !pin_eld->monitor_present || pin_eld->eld_valid; 1647 ret = !repoll || !pin_eld->monitor_present || pin_eld->eld_valid;
1634 1648
1635 jack = snd_hda_jack_tbl_get(codec, pin_nid); 1649 jack = snd_hda_jack_tbl_get(codec, pin_nid);
@@ -1641,6 +1655,54 @@ static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)
1641 return ret; 1655 return ret;
1642} 1656}
1643 1657
1658/* update ELD and jack state via audio component */
1659static void sync_eld_via_acomp(struct hda_codec *codec,
1660 struct hdmi_spec_per_pin *per_pin)
1661{
1662 struct hdmi_spec *spec = codec->spec;
1663 struct hdmi_eld *eld = &spec->temp_eld;
1664 int size;
1665
1666 mutex_lock(&per_pin->lock);
1667 size = snd_hdac_acomp_get_eld(&codec->bus->core, per_pin->pin_nid,
1668 &eld->monitor_present, eld->eld_buffer,
1669 ELD_MAX_SIZE);
1670 if (size < 0)
1671 goto unlock;
1672 if (size > 0) {
1673 size = min(size, ELD_MAX_SIZE);
1674 if (snd_hdmi_parse_eld(codec, &eld->info,
1675 eld->eld_buffer, size) < 0)
1676 size = -EINVAL;
1677 }
1678
1679 if (size > 0) {
1680 eld->eld_valid = true;
1681 eld->eld_size = size;
1682 } else {
1683 eld->eld_valid = false;
1684 eld->eld_size = 0;
1685 }
1686
1687 update_eld(codec, per_pin, eld);
1688 snd_jack_report(per_pin->acomp_jack,
1689 eld->monitor_present ? SND_JACK_AVOUT : 0);
1690 unlock:
1691 mutex_unlock(&per_pin->lock);
1692}
1693
1694static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)
1695{
1696 struct hda_codec *codec = per_pin->codec;
1697
1698 if (codec_has_acomp(codec)) {
1699 sync_eld_via_acomp(codec, per_pin);
1700 return false; /* don't call snd_hda_jack_report_sync() */
1701 } else {
1702 return hdmi_present_sense_via_verbs(per_pin, repoll);
1703 }
1704}
1705
1644static void hdmi_repoll_eld(struct work_struct *work) 1706static void hdmi_repoll_eld(struct work_struct *work)
1645{ 1707{
1646 struct hdmi_spec_per_pin *per_pin = 1708 struct hdmi_spec_per_pin *per_pin =
@@ -1776,17 +1838,6 @@ static bool check_non_pcm_per_cvt(struct hda_codec *codec, hda_nid_t cvt_nid)
1776 return non_pcm; 1838 return non_pcm;
1777} 1839}
1778 1840
1779/* There is a fixed mapping between audio pin node and display port
1780 * on current Intel platforms:
1781 * Pin Widget 5 - PORT B (port = 1 in i915 driver)
1782 * Pin Widget 6 - PORT C (port = 2 in i915 driver)
1783 * Pin Widget 7 - PORT D (port = 3 in i915 driver)
1784 */
1785static int intel_pin2port(hda_nid_t pin_nid)
1786{
1787 return pin_nid - 4;
1788}
1789
1790/* 1841/*
1791 * HDMI callbacks 1842 * HDMI callbacks
1792 */ 1843 */
@@ -1803,7 +1854,6 @@ static int generic_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1803 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 1854 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
1804 hda_nid_t pin_nid = per_pin->pin_nid; 1855 hda_nid_t pin_nid = per_pin->pin_nid;
1805 struct snd_pcm_runtime *runtime = substream->runtime; 1856 struct snd_pcm_runtime *runtime = substream->runtime;
1806 struct i915_audio_component *acomp = codec->bus->core.audio_component;
1807 bool non_pcm; 1857 bool non_pcm;
1808 int pinctl; 1858 int pinctl;
1809 1859
@@ -1822,10 +1872,7 @@ static int generic_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
1822 1872
1823 /* Call sync_audio_rate to set the N/CTS/M manually if necessary */ 1873 /* Call sync_audio_rate to set the N/CTS/M manually if necessary */
1824 /* Todo: add DP1.2 MST audio support later */ 1874 /* Todo: add DP1.2 MST audio support later */
1825 if (acomp && acomp->ops && acomp->ops->sync_audio_rate) 1875 snd_hdac_sync_audio_rate(&codec->bus->core, pin_nid, runtime->rate);
1826 acomp->ops->sync_audio_rate(acomp->dev,
1827 intel_pin2port(pin_nid),
1828 runtime->rate);
1829 1876
1830 non_pcm = check_non_pcm_per_cvt(codec, cvt_nid); 1877 non_pcm = check_non_pcm_per_cvt(codec, cvt_nid);
1831 mutex_lock(&per_pin->lock); 1878 mutex_lock(&per_pin->lock);
@@ -2091,6 +2138,30 @@ static int generic_hdmi_build_pcms(struct hda_codec *codec)
2091 return 0; 2138 return 0;
2092} 2139}
2093 2140
2141static void free_acomp_jack_priv(struct snd_jack *jack)
2142{
2143 struct hdmi_spec_per_pin *per_pin = jack->private_data;
2144
2145 per_pin->acomp_jack = NULL;
2146}
2147
2148static int add_acomp_jack_kctl(struct hda_codec *codec,
2149 struct hdmi_spec_per_pin *per_pin,
2150 const char *name)
2151{
2152 struct snd_jack *jack;
2153 int err;
2154
2155 err = snd_jack_new(codec->card, name, SND_JACK_AVOUT, &jack,
2156 true, false);
2157 if (err < 0)
2158 return err;
2159 per_pin->acomp_jack = jack;
2160 jack->private_data = per_pin;
2161 jack->private_free = free_acomp_jack_priv;
2162 return 0;
2163}
2164
2094static int generic_hdmi_build_jack(struct hda_codec *codec, int pin_idx) 2165static int generic_hdmi_build_jack(struct hda_codec *codec, int pin_idx)
2095{ 2166{
2096 char hdmi_str[32] = "HDMI/DP"; 2167 char hdmi_str[32] = "HDMI/DP";
@@ -2101,6 +2172,8 @@ static int generic_hdmi_build_jack(struct hda_codec *codec, int pin_idx)
2101 2172
2102 if (pcmdev > 0) 2173 if (pcmdev > 0)
2103 sprintf(hdmi_str + strlen(hdmi_str), ",pcm=%d", pcmdev); 2174 sprintf(hdmi_str + strlen(hdmi_str), ",pcm=%d", pcmdev);
2175 if (codec_has_acomp(codec))
2176 return add_acomp_jack_kctl(codec, per_pin, hdmi_str);
2104 phantom_jack = !is_jack_detectable(codec, per_pin->pin_nid); 2177 phantom_jack = !is_jack_detectable(codec, per_pin->pin_nid);
2105 if (phantom_jack) 2178 if (phantom_jack)
2106 strncat(hdmi_str, " Phantom", 2179 strncat(hdmi_str, " Phantom",
@@ -2196,8 +2269,10 @@ static int generic_hdmi_init(struct hda_codec *codec)
2196 hda_nid_t pin_nid = per_pin->pin_nid; 2269 hda_nid_t pin_nid = per_pin->pin_nid;
2197 2270
2198 hdmi_init_pin(codec, pin_nid); 2271 hdmi_init_pin(codec, pin_nid);
2199 snd_hda_jack_detect_enable_callback(codec, pin_nid, 2272 if (!codec_has_acomp(codec))
2200 codec->jackpoll_interval > 0 ? jack_callback : NULL); 2273 snd_hda_jack_detect_enable_callback(codec, pin_nid,
2274 codec->jackpoll_interval > 0 ?
2275 jack_callback : NULL);
2201 } 2276 }
2202 return 0; 2277 return 0;
2203} 2278}
@@ -2219,7 +2294,7 @@ static void generic_hdmi_free(struct hda_codec *codec)
2219 struct hdmi_spec *spec = codec->spec; 2294 struct hdmi_spec *spec = codec->spec;
2220 int pin_idx; 2295 int pin_idx;
2221 2296
2222 if (is_haswell_plus(codec) || is_valleyview_plus(codec)) 2297 if (codec_has_acomp(codec))
2223 snd_hdac_i915_register_notifier(NULL); 2298 snd_hdac_i915_register_notifier(NULL);
2224 2299
2225 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 2300 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
@@ -2227,8 +2302,12 @@ static void generic_hdmi_free(struct hda_codec *codec)
2227 2302
2228 cancel_delayed_work_sync(&per_pin->work); 2303 cancel_delayed_work_sync(&per_pin->work);
2229 eld_proc_free(per_pin); 2304 eld_proc_free(per_pin);
2305 if (per_pin->acomp_jack)
2306 snd_device_free(codec->card, per_pin->acomp_jack);
2230 } 2307 }
2231 2308
2309 if (spec->i915_bound)
2310 snd_hdac_i915_exit(&codec->bus->core);
2232 hdmi_array_free(spec); 2311 hdmi_array_free(spec);
2233 kfree(spec); 2312 kfree(spec);
2234} 2313}
@@ -2357,6 +2436,9 @@ static void intel_pin_eld_notify(void *audio_ptr, int port)
2357 */ 2436 */
2358 if (snd_power_get_state(codec->card) != SNDRV_CTL_POWER_D0) 2437 if (snd_power_get_state(codec->card) != SNDRV_CTL_POWER_D0)
2359 return; 2438 return;
2439 /* ditto during suspend/resume process itself */
2440 if (atomic_read(&(codec)->core.in_pm))
2441 return;
2360 2442
2361 check_presence_and_report(codec, pin_nid); 2443 check_presence_and_report(codec, pin_nid);
2362} 2444}
@@ -2373,6 +2455,12 @@ static int patch_generic_hdmi(struct hda_codec *codec)
2373 codec->spec = spec; 2455 codec->spec = spec;
2374 hdmi_array_init(spec, 4); 2456 hdmi_array_init(spec, 4);
2375 2457
2458 /* Try to bind with i915 for any Intel codecs (if not done yet) */
2459 if (!codec_has_acomp(codec) &&
2460 (codec->core.vendor_id >> 16) == 0x8086)
2461 if (!snd_hdac_i915_init(&codec->bus->core))
2462 spec->i915_bound = true;
2463
2376 if (is_haswell_plus(codec)) { 2464 if (is_haswell_plus(codec)) {
2377 intel_haswell_enable_all_pins(codec, true); 2465 intel_haswell_enable_all_pins(codec, true);
2378 intel_haswell_fixup_enable_dp12(codec); 2466 intel_haswell_fixup_enable_dp12(codec);
@@ -2388,7 +2476,7 @@ static int patch_generic_hdmi(struct hda_codec *codec)
2388 is_broxton(codec)) 2476 is_broxton(codec))
2389 codec->core.link_power_control = 1; 2477 codec->core.link_power_control = 1;
2390 2478
2391 if (is_haswell_plus(codec) || is_valleyview_plus(codec)) { 2479 if (codec_has_acomp(codec)) {
2392 codec->depop_delay = 0; 2480 codec->depop_delay = 0;
2393 spec->i915_audio_ops.audio_ptr = codec; 2481 spec->i915_audio_ops.audio_ptr = codec;
2394 spec->i915_audio_ops.pin_eld_notify = intel_pin_eld_notify; 2482 spec->i915_audio_ops.pin_eld_notify = intel_pin_eld_notify;
@@ -2396,6 +2484,8 @@ static int patch_generic_hdmi(struct hda_codec *codec)
2396 } 2484 }
2397 2485
2398 if (hdmi_parse_codec(codec) < 0) { 2486 if (hdmi_parse_codec(codec) < 0) {
2487 if (spec->i915_bound)
2488 snd_hdac_i915_exit(&codec->bus->core);
2399 codec->spec = NULL; 2489 codec->spec = NULL;
2400 kfree(spec); 2490 kfree(spec);
2401 return -EINVAL; 2491 return -EINVAL;
@@ -3579,6 +3669,7 @@ HDA_CODEC_ENTRY(0x80862807, "Haswell HDMI", patch_generic_hdmi),
3579HDA_CODEC_ENTRY(0x80862808, "Broadwell HDMI", patch_generic_hdmi), 3669HDA_CODEC_ENTRY(0x80862808, "Broadwell HDMI", patch_generic_hdmi),
3580HDA_CODEC_ENTRY(0x80862809, "Skylake HDMI", patch_generic_hdmi), 3670HDA_CODEC_ENTRY(0x80862809, "Skylake HDMI", patch_generic_hdmi),
3581HDA_CODEC_ENTRY(0x8086280a, "Broxton HDMI", patch_generic_hdmi), 3671HDA_CODEC_ENTRY(0x8086280a, "Broxton HDMI", patch_generic_hdmi),
3672HDA_CODEC_ENTRY(0x8086280b, "Kabylake HDMI", patch_generic_hdmi),
3582HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi), 3673HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi),
3583HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_generic_hdmi), 3674HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_generic_hdmi),
3584HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_generic_hdmi), 3675HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_generic_hdmi),
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 3a89d82f8057..8143c0e24a27 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -4666,6 +4666,7 @@ enum {
4666 ALC290_FIXUP_SUBWOOFER, 4666 ALC290_FIXUP_SUBWOOFER,
4667 ALC290_FIXUP_SUBWOOFER_HSJACK, 4667 ALC290_FIXUP_SUBWOOFER_HSJACK,
4668 ALC269_FIXUP_THINKPAD_ACPI, 4668 ALC269_FIXUP_THINKPAD_ACPI,
4669 ALC269_FIXUP_DMIC_THINKPAD_ACPI,
4669 ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 4670 ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
4670 ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, 4671 ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
4671 ALC255_FIXUP_HEADSET_MODE, 4672 ALC255_FIXUP_HEADSET_MODE,
@@ -5103,6 +5104,12 @@ static const struct hda_fixup alc269_fixups[] = {
5103 .type = HDA_FIXUP_FUNC, 5104 .type = HDA_FIXUP_FUNC,
5104 .v.func = hda_fixup_thinkpad_acpi, 5105 .v.func = hda_fixup_thinkpad_acpi,
5105 }, 5106 },
5107 [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
5108 .type = HDA_FIXUP_FUNC,
5109 .v.func = alc_fixup_inv_dmic,
5110 .chained = true,
5111 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
5112 },
5106 [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = { 5113 [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
5107 .type = HDA_FIXUP_PINS, 5114 .type = HDA_FIXUP_PINS,
5108 .v.pins = (const struct hda_pintbl[]) { 5115 .v.pins = (const struct hda_pintbl[]) {
@@ -5324,6 +5331,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
5324 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), 5331 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
5325 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS), 5332 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
5326 SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X), 5333 SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
5334 SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
5327 SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X), 5335 SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
5328 SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X), 5336 SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
5329 SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER), 5337 SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
@@ -5332,6 +5340,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
5332 SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), 5340 SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
5333 SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK), 5341 SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
5334 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK), 5342 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
5343 SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
5335 SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X), 5344 SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
5336 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK), 5345 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
5337 SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), 5346 SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
@@ -5457,6 +5466,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
5457 SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), 5466 SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
5458 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE), 5467 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
5459 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), 5468 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
5469 SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
5460 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), 5470 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
5461 SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), 5471 SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP),
5462 SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 5472 SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
@@ -5617,6 +5627,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
5617 {0x21, 0x02211040}), 5627 {0x21, 0x02211040}),
5618 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 5628 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
5619 {0x12, 0x90a60170}, 5629 {0x12, 0x90a60170},
5630 {0x14, 0x90171130},
5631 {0x21, 0x02211040}),
5632 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
5633 {0x12, 0x90a60170},
5620 {0x14, 0x90170140}, 5634 {0x14, 0x90170140},
5621 {0x21, 0x02211050}), 5635 {0x21, 0x02211050}),
5622 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, 5636 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
diff --git a/sound/pci/ice1712/delta.c b/sound/pci/ice1712/delta.c
index 496dbd0ad5db..3bfdc78cbc5f 100644
--- a/sound/pci/ice1712/delta.c
+++ b/sound/pci/ice1712/delta.c
@@ -174,7 +174,7 @@ static int ap_cs8427_probeaddr(struct snd_i2c_bus *bus, unsigned short addr)
174 return -ENOENT; 174 return -ENOENT;
175} 175}
176 176
177static struct snd_i2c_ops ap_cs8427_i2c_ops = { 177static const struct snd_i2c_ops ap_cs8427_i2c_ops = {
178 .sendbytes = ap_cs8427_sendbytes, 178 .sendbytes = ap_cs8427_sendbytes,
179 .readbytes = ap_cs8427_readbytes, 179 .readbytes = ap_cs8427_readbytes,
180 .probeaddr = ap_cs8427_probeaddr, 180 .probeaddr = ap_cs8427_probeaddr,
diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig
index 7ff7d88e46dd..7ea66ee3653f 100644
--- a/sound/soc/Kconfig
+++ b/sound/soc/Kconfig
@@ -38,6 +38,7 @@ config SND_SOC_TOPOLOGY
38 38
39# All the supported SoCs 39# All the supported SoCs
40source "sound/soc/adi/Kconfig" 40source "sound/soc/adi/Kconfig"
41source "sound/soc/amd/Kconfig"
41source "sound/soc/atmel/Kconfig" 42source "sound/soc/atmel/Kconfig"
42source "sound/soc/au1x/Kconfig" 43source "sound/soc/au1x/Kconfig"
43source "sound/soc/bcm/Kconfig" 44source "sound/soc/bcm/Kconfig"
@@ -50,6 +51,7 @@ source "sound/soc/jz4740/Kconfig"
50source "sound/soc/nuc900/Kconfig" 51source "sound/soc/nuc900/Kconfig"
51source "sound/soc/omap/Kconfig" 52source "sound/soc/omap/Kconfig"
52source "sound/soc/kirkwood/Kconfig" 53source "sound/soc/kirkwood/Kconfig"
54source "sound/soc/img/Kconfig"
53source "sound/soc/intel/Kconfig" 55source "sound/soc/intel/Kconfig"
54source "sound/soc/mediatek/Kconfig" 56source "sound/soc/mediatek/Kconfig"
55source "sound/soc/mxs/Kconfig" 57source "sound/soc/mxs/Kconfig"
diff --git a/sound/soc/Makefile b/sound/soc/Makefile
index 8eb06db32fa0..9a30f21d16ee 100644
--- a/sound/soc/Makefile
+++ b/sound/soc/Makefile
@@ -18,6 +18,7 @@ obj-$(CONFIG_SND_SOC) += snd-soc-core.o
18obj-$(CONFIG_SND_SOC) += codecs/ 18obj-$(CONFIG_SND_SOC) += codecs/
19obj-$(CONFIG_SND_SOC) += generic/ 19obj-$(CONFIG_SND_SOC) += generic/
20obj-$(CONFIG_SND_SOC) += adi/ 20obj-$(CONFIG_SND_SOC) += adi/
21obj-$(CONFIG_SND_SOC) += amd/
21obj-$(CONFIG_SND_SOC) += atmel/ 22obj-$(CONFIG_SND_SOC) += atmel/
22obj-$(CONFIG_SND_SOC) += au1x/ 23obj-$(CONFIG_SND_SOC) += au1x/
23obj-$(CONFIG_SND_SOC) += bcm/ 24obj-$(CONFIG_SND_SOC) += bcm/
@@ -27,6 +28,7 @@ obj-$(CONFIG_SND_SOC) += davinci/
27obj-$(CONFIG_SND_SOC) += dwc/ 28obj-$(CONFIG_SND_SOC) += dwc/
28obj-$(CONFIG_SND_SOC) += fsl/ 29obj-$(CONFIG_SND_SOC) += fsl/
29obj-$(CONFIG_SND_SOC) += jz4740/ 30obj-$(CONFIG_SND_SOC) += jz4740/
31obj-$(CONFIG_SND_SOC) += img/
30obj-$(CONFIG_SND_SOC) += intel/ 32obj-$(CONFIG_SND_SOC) += intel/
31obj-$(CONFIG_SND_SOC) += mediatek/ 33obj-$(CONFIG_SND_SOC) += mediatek/
32obj-$(CONFIG_SND_SOC) += mxs/ 34obj-$(CONFIG_SND_SOC) += mxs/
diff --git a/sound/soc/amd/Kconfig b/sound/soc/amd/Kconfig
new file mode 100644
index 000000000000..78187eb24f56
--- /dev/null
+++ b/sound/soc/amd/Kconfig
@@ -0,0 +1,4 @@
1config SND_SOC_AMD_ACP
2 tristate "AMD Audio Coprocessor support"
3 help
4 This option enables ACP DMA support on AMD platform.
diff --git a/sound/soc/amd/Makefile b/sound/soc/amd/Makefile
new file mode 100644
index 000000000000..1a66ec0366b2
--- /dev/null
+++ b/sound/soc/amd/Makefile
@@ -0,0 +1,3 @@
1snd-soc-acp-pcm-objs := acp-pcm-dma.o
2
3obj-$(CONFIG_SND_SOC_AMD_ACP) += snd-soc-acp-pcm.o
diff --git a/sound/soc/amd/acp-pcm-dma.c b/sound/soc/amd/acp-pcm-dma.c
new file mode 100644
index 000000000000..3191e0a7d273
--- /dev/null
+++ b/sound/soc/amd/acp-pcm-dma.c
@@ -0,0 +1,1043 @@
1/*
2 * AMD ALSA SoC PCM Driver for ACP 2.x
3 *
4 * Copyright 2014-2015 Advanced Micro Devices, Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 */
15
16#include <linux/module.h>
17#include <linux/delay.h>
18#include <linux/io.h>
19#include <linux/sizes.h>
20#include <linux/pm_runtime.h>
21
22#include <sound/soc.h>
23
24#include "acp.h"
25
26#define PLAYBACK_MIN_NUM_PERIODS 2
27#define PLAYBACK_MAX_NUM_PERIODS 2
28#define PLAYBACK_MAX_PERIOD_SIZE 16384
29#define PLAYBACK_MIN_PERIOD_SIZE 1024
30#define CAPTURE_MIN_NUM_PERIODS 2
31#define CAPTURE_MAX_NUM_PERIODS 2
32#define CAPTURE_MAX_PERIOD_SIZE 16384
33#define CAPTURE_MIN_PERIOD_SIZE 1024
34
35#define MAX_BUFFER (PLAYBACK_MAX_PERIOD_SIZE * PLAYBACK_MAX_NUM_PERIODS)
36#define MIN_BUFFER MAX_BUFFER
37
38static const struct snd_pcm_hardware acp_pcm_hardware_playback = {
39 .info = SNDRV_PCM_INFO_INTERLEAVED |
40 SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP |
41 SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_BATCH |
42 SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
43 .formats = SNDRV_PCM_FMTBIT_S16_LE |
44 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE,
45 .channels_min = 1,
46 .channels_max = 8,
47 .rates = SNDRV_PCM_RATE_8000_96000,
48 .rate_min = 8000,
49 .rate_max = 96000,
50 .buffer_bytes_max = PLAYBACK_MAX_NUM_PERIODS * PLAYBACK_MAX_PERIOD_SIZE,
51 .period_bytes_min = PLAYBACK_MIN_PERIOD_SIZE,
52 .period_bytes_max = PLAYBACK_MAX_PERIOD_SIZE,
53 .periods_min = PLAYBACK_MIN_NUM_PERIODS,
54 .periods_max = PLAYBACK_MAX_NUM_PERIODS,
55};
56
57static const struct snd_pcm_hardware acp_pcm_hardware_capture = {
58 .info = SNDRV_PCM_INFO_INTERLEAVED |
59 SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP |
60 SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_BATCH |
61 SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
62 .formats = SNDRV_PCM_FMTBIT_S16_LE |
63 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE,
64 .channels_min = 1,
65 .channels_max = 2,
66 .rates = SNDRV_PCM_RATE_8000_48000,
67 .rate_min = 8000,
68 .rate_max = 48000,
69 .buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS * CAPTURE_MAX_PERIOD_SIZE,
70 .period_bytes_min = CAPTURE_MIN_PERIOD_SIZE,
71 .period_bytes_max = CAPTURE_MAX_PERIOD_SIZE,
72 .periods_min = CAPTURE_MIN_NUM_PERIODS,
73 .periods_max = CAPTURE_MAX_NUM_PERIODS,
74};
75
76struct audio_drv_data {
77 struct snd_pcm_substream *play_stream;
78 struct snd_pcm_substream *capture_stream;
79 void __iomem *acp_mmio;
80};
81
82static u32 acp_reg_read(void __iomem *acp_mmio, u32 reg)
83{
84 return readl(acp_mmio + (reg * 4));
85}
86
87static void acp_reg_write(u32 val, void __iomem *acp_mmio, u32 reg)
88{
89 writel(val, acp_mmio + (reg * 4));
90}
91
92/* Configure a given dma channel parameters - enable/disble,
93 * number of descriptors, priority
94 */
95static void config_acp_dma_channel(void __iomem *acp_mmio, u8 ch_num,
96 u16 dscr_strt_idx, u16 num_dscrs,
97 enum acp_dma_priority_level priority_level)
98{
99 u32 dma_ctrl;
100
101 /* disable the channel run field */
102 dma_ctrl = acp_reg_read(acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
103 dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChRun_MASK;
104 acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
105
106 /* program a DMA channel with first descriptor to be processed. */
107 acp_reg_write((ACP_DMA_DSCR_STRT_IDX_0__DMAChDscrStrtIdx_MASK
108 & dscr_strt_idx),
109 acp_mmio, mmACP_DMA_DSCR_STRT_IDX_0 + ch_num);
110
111 /* program a DMA channel with the number of descriptors to be
112 * processed in the transfer
113 */
114 acp_reg_write(ACP_DMA_DSCR_CNT_0__DMAChDscrCnt_MASK & num_dscrs,
115 acp_mmio, mmACP_DMA_DSCR_CNT_0 + ch_num);
116
117 /* set DMA channel priority */
118 acp_reg_write(priority_level, acp_mmio, mmACP_DMA_PRIO_0 + ch_num);
119}
120
121/* Initialize a dma descriptor in SRAM based on descritor information passed */
122static void config_dma_descriptor_in_sram(void __iomem *acp_mmio,
123 u16 descr_idx,
124 acp_dma_dscr_transfer_t *descr_info)
125{
126 u32 sram_offset;
127
128 sram_offset = (descr_idx * sizeof(acp_dma_dscr_transfer_t));
129
130 /* program the source base address. */
131 acp_reg_write(sram_offset, acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
132 acp_reg_write(descr_info->src, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
133 /* program the destination base address. */
134 acp_reg_write(sram_offset + 4, acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
135 acp_reg_write(descr_info->dest, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
136
137 /* program the number of bytes to be transferred for this descriptor. */
138 acp_reg_write(sram_offset + 8, acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
139 acp_reg_write(descr_info->xfer_val, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
140}
141
142/* Initialize the DMA descriptor information for transfer between
143 * system memory <-> ACP SRAM
144 */
145static void set_acp_sysmem_dma_descriptors(void __iomem *acp_mmio,
146 u32 size, int direction,
147 u32 pte_offset)
148{
149 u16 i;
150 u16 dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH12;
151 acp_dma_dscr_transfer_t dmadscr[NUM_DSCRS_PER_CHANNEL];
152
153 for (i = 0; i < NUM_DSCRS_PER_CHANNEL; i++) {
154 dmadscr[i].xfer_val = 0;
155 if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
156 dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH12 + i;
157 dmadscr[i].dest = ACP_SHARED_RAM_BANK_1_ADDRESS +
158 (size / 2) - (i * (size/2));
159 dmadscr[i].src = ACP_INTERNAL_APERTURE_WINDOW_0_ADDRESS
160 + (pte_offset * SZ_4K) + (i * (size/2));
161 dmadscr[i].xfer_val |=
162 (ACP_DMA_ATTRIBUTES_DAGB_ONION_TO_SHAREDMEM << 16) |
163 (size / 2);
164 } else {
165 dma_dscr_idx = CAPTURE_START_DMA_DESCR_CH14 + i;
166 dmadscr[i].src = ACP_SHARED_RAM_BANK_5_ADDRESS +
167 (i * (size/2));
168 dmadscr[i].dest = ACP_INTERNAL_APERTURE_WINDOW_0_ADDRESS
169 + (pte_offset * SZ_4K) +
170 (i * (size/2));
171 dmadscr[i].xfer_val |=
172 BIT(22) |
173 (ACP_DMA_ATTRIBUTES_SHAREDMEM_TO_DAGB_ONION << 16) |
174 (size / 2);
175 }
176 config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx,
177 &dmadscr[i]);
178 }
179 if (direction == SNDRV_PCM_STREAM_PLAYBACK)
180 config_acp_dma_channel(acp_mmio, SYSRAM_TO_ACP_CH_NUM,
181 PLAYBACK_START_DMA_DESCR_CH12,
182 NUM_DSCRS_PER_CHANNEL,
183 ACP_DMA_PRIORITY_LEVEL_NORMAL);
184 else
185 config_acp_dma_channel(acp_mmio, ACP_TO_SYSRAM_CH_NUM,
186 CAPTURE_START_DMA_DESCR_CH14,
187 NUM_DSCRS_PER_CHANNEL,
188 ACP_DMA_PRIORITY_LEVEL_NORMAL);
189}
190
191/* Initialize the DMA descriptor information for transfer between
192 * ACP SRAM <-> I2S
193 */
194static void set_acp_to_i2s_dma_descriptors(void __iomem *acp_mmio,
195 u32 size, int direction)
196{
197
198 u16 i;
199 u16 dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH13;
200 acp_dma_dscr_transfer_t dmadscr[NUM_DSCRS_PER_CHANNEL];
201
202 for (i = 0; i < NUM_DSCRS_PER_CHANNEL; i++) {
203 dmadscr[i].xfer_val = 0;
204 if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
205 dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH13 + i;
206 dmadscr[i].src = ACP_SHARED_RAM_BANK_1_ADDRESS +
207 (i * (size/2));
208 /* dmadscr[i].dest is unused by hardware. */
209 dmadscr[i].dest = 0;
210 dmadscr[i].xfer_val |= BIT(22) | (TO_ACP_I2S_1 << 16) |
211 (size / 2);
212 } else {
213 dma_dscr_idx = CAPTURE_START_DMA_DESCR_CH15 + i;
214 /* dmadscr[i].src is unused by hardware. */
215 dmadscr[i].src = 0;
216 dmadscr[i].dest = ACP_SHARED_RAM_BANK_5_ADDRESS +
217 (i * (size / 2));
218 dmadscr[i].xfer_val |= BIT(22) |
219 (FROM_ACP_I2S_1 << 16) | (size / 2);
220 }
221 config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx,
222 &dmadscr[i]);
223 }
224 /* Configure the DMA channel with the above descriptore */
225 if (direction == SNDRV_PCM_STREAM_PLAYBACK)
226 config_acp_dma_channel(acp_mmio, ACP_TO_I2S_DMA_CH_NUM,
227 PLAYBACK_START_DMA_DESCR_CH13,
228 NUM_DSCRS_PER_CHANNEL,
229 ACP_DMA_PRIORITY_LEVEL_NORMAL);
230 else
231 config_acp_dma_channel(acp_mmio, I2S_TO_ACP_DMA_CH_NUM,
232 CAPTURE_START_DMA_DESCR_CH15,
233 NUM_DSCRS_PER_CHANNEL,
234 ACP_DMA_PRIORITY_LEVEL_NORMAL);
235}
236
237/* Create page table entries in ACP SRAM for the allocated memory */
238static void acp_pte_config(void __iomem *acp_mmio, struct page *pg,
239 u16 num_of_pages, u32 pte_offset)
240{
241 u16 page_idx;
242 u64 addr;
243 u32 low;
244 u32 high;
245 u32 offset;
246
247 offset = ACP_DAGB_GRP_SRBM_SRAM_BASE_OFFSET + (pte_offset * 8);
248 for (page_idx = 0; page_idx < (num_of_pages); page_idx++) {
249 /* Load the low address of page int ACP SRAM through SRBM */
250 acp_reg_write((offset + (page_idx * 8)),
251 acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
252 addr = page_to_phys(pg);
253
254 low = lower_32_bits(addr);
255 high = upper_32_bits(addr);
256
257 acp_reg_write(low, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
258
259 /* Load the High address of page int ACP SRAM through SRBM */
260 acp_reg_write((offset + (page_idx * 8) + 4),
261 acp_mmio, mmACP_SRBM_Targ_Idx_Addr);
262
263 /* page enable in ACP */
264 high |= BIT(31);
265 acp_reg_write(high, acp_mmio, mmACP_SRBM_Targ_Idx_Data);
266
267 /* Move to next physically contiguos page */
268 pg++;
269 }
270}
271
272static void config_acp_dma(void __iomem *acp_mmio,
273 struct audio_substream_data *audio_config)
274{
275 u32 pte_offset;
276
277 if (audio_config->direction == SNDRV_PCM_STREAM_PLAYBACK)
278 pte_offset = ACP_PLAYBACK_PTE_OFFSET;
279 else
280 pte_offset = ACP_CAPTURE_PTE_OFFSET;
281
282 acp_pte_config(acp_mmio, audio_config->pg, audio_config->num_of_pages,
283 pte_offset);
284
285 /* Configure System memory <-> ACP SRAM DMA descriptors */
286 set_acp_sysmem_dma_descriptors(acp_mmio, audio_config->size,
287 audio_config->direction, pte_offset);
288
289 /* Configure ACP SRAM <-> I2S DMA descriptors */
290 set_acp_to_i2s_dma_descriptors(acp_mmio, audio_config->size,
291 audio_config->direction);
292}
293
294/* Start a given DMA channel transfer */
295static void acp_dma_start(void __iomem *acp_mmio,
296 u16 ch_num, bool is_circular)
297{
298 u32 dma_ctrl;
299
300 /* read the dma control register and disable the channel run field */
301 dma_ctrl = acp_reg_read(acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
302
303 /* Invalidating the DAGB cache */
304 acp_reg_write(1, acp_mmio, mmACP_DAGB_ATU_CTRL);
305
306 /* configure the DMA channel and start the DMA transfer
307 * set dmachrun bit to start the transfer and enable the
308 * interrupt on completion of the dma transfer
309 */
310 dma_ctrl |= ACP_DMA_CNTL_0__DMAChRun_MASK;
311
312 switch (ch_num) {
313 case ACP_TO_I2S_DMA_CH_NUM:
314 case ACP_TO_SYSRAM_CH_NUM:
315 case I2S_TO_ACP_DMA_CH_NUM:
316 dma_ctrl |= ACP_DMA_CNTL_0__DMAChIOCEn_MASK;
317 break;
318 default:
319 dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChIOCEn_MASK;
320 break;
321 }
322
323 /* enable for ACP SRAM to/from I2S DMA channel */
324 if (is_circular == true)
325 dma_ctrl |= ACP_DMA_CNTL_0__Circular_DMA_En_MASK;
326 else
327 dma_ctrl &= ~ACP_DMA_CNTL_0__Circular_DMA_En_MASK;
328
329 acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
330}
331
332/* Stop a given DMA channel transfer */
333static int acp_dma_stop(void __iomem *acp_mmio, u8 ch_num)
334{
335 u32 dma_ctrl;
336 u32 dma_ch_sts;
337 u32 count = ACP_DMA_RESET_TIME;
338
339 dma_ctrl = acp_reg_read(acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
340
341 /* clear the dma control register fields before writing zero
342 * in reset bit
343 */
344 dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChRun_MASK;
345 dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChIOCEn_MASK;
346
347 acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
348 dma_ch_sts = acp_reg_read(acp_mmio, mmACP_DMA_CH_STS);
349
350 if (dma_ch_sts & BIT(ch_num)) {
351 /* set the reset bit for this channel to stop the dma
352 * transfer
353 */
354 dma_ctrl |= ACP_DMA_CNTL_0__DMAChRst_MASK;
355 acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0 + ch_num);
356 }
357
358 /* check the channel status bit for some time and return the status */
359 while (true) {
360 dma_ch_sts = acp_reg_read(acp_mmio, mmACP_DMA_CH_STS);
361 if (!(dma_ch_sts & BIT(ch_num))) {
362 /* clear the reset flag after successfully stopping
363 * the dma transfer and break from the loop
364 */
365 dma_ctrl &= ~ACP_DMA_CNTL_0__DMAChRst_MASK;
366
367 acp_reg_write(dma_ctrl, acp_mmio, mmACP_DMA_CNTL_0
368 + ch_num);
369 break;
370 }
371 if (--count == 0) {
372 pr_err("Failed to stop ACP DMA channel : %d\n", ch_num);
373 return -ETIMEDOUT;
374 }
375 udelay(100);
376 }
377 return 0;
378}
379
380static void acp_set_sram_bank_state(void __iomem *acp_mmio, u16 bank,
381 bool power_on)
382{
383 u32 val, req_reg, sts_reg, sts_reg_mask;
384 u32 loops = 1000;
385
386 if (bank < 32) {
387 req_reg = mmACP_MEM_SHUT_DOWN_REQ_LO;
388 sts_reg = mmACP_MEM_SHUT_DOWN_STS_LO;
389 sts_reg_mask = 0xFFFFFFFF;
390
391 } else {
392 bank -= 32;
393 req_reg = mmACP_MEM_SHUT_DOWN_REQ_HI;
394 sts_reg = mmACP_MEM_SHUT_DOWN_STS_HI;
395 sts_reg_mask = 0x0000FFFF;
396 }
397
398 val = acp_reg_read(acp_mmio, req_reg);
399 if (val & (1 << bank)) {
400 /* bank is in off state */
401 if (power_on == true)
402 /* request to on */
403 val &= ~(1 << bank);
404 else
405 /* request to off */
406 return;
407 } else {
408 /* bank is in on state */
409 if (power_on == false)
410 /* request to off */
411 val |= 1 << bank;
412 else
413 /* request to on */
414 return;
415 }
416 acp_reg_write(val, acp_mmio, req_reg);
417
418 while (acp_reg_read(acp_mmio, sts_reg) != sts_reg_mask) {
419 if (!loops--) {
420 pr_err("ACP SRAM bank %d state change failed\n", bank);
421 break;
422 }
423 cpu_relax();
424 }
425}
426
427/* Initialize and bring ACP hardware to default state. */
428static int acp_init(void __iomem *acp_mmio)
429{
430 u16 bank;
431 u32 val, count, sram_pte_offset;
432
433 /* Assert Soft reset of ACP */
434 val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
435
436 val |= ACP_SOFT_RESET__SoftResetAud_MASK;
437 acp_reg_write(val, acp_mmio, mmACP_SOFT_RESET);
438
439 count = ACP_SOFT_RESET_DONE_TIME_OUT_VALUE;
440 while (true) {
441 val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
442 if (ACP_SOFT_RESET__SoftResetAudDone_MASK ==
443 (val & ACP_SOFT_RESET__SoftResetAudDone_MASK))
444 break;
445 if (--count == 0) {
446 pr_err("Failed to reset ACP\n");
447 return -ETIMEDOUT;
448 }
449 udelay(100);
450 }
451
452 /* Enable clock to ACP and wait until the clock is enabled */
453 val = acp_reg_read(acp_mmio, mmACP_CONTROL);
454 val = val | ACP_CONTROL__ClkEn_MASK;
455 acp_reg_write(val, acp_mmio, mmACP_CONTROL);
456
457 count = ACP_CLOCK_EN_TIME_OUT_VALUE;
458
459 while (true) {
460 val = acp_reg_read(acp_mmio, mmACP_STATUS);
461 if (val & (u32) 0x1)
462 break;
463 if (--count == 0) {
464 pr_err("Failed to reset ACP\n");
465 return -ETIMEDOUT;
466 }
467 udelay(100);
468 }
469
470 /* Deassert the SOFT RESET flags */
471 val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
472 val &= ~ACP_SOFT_RESET__SoftResetAud_MASK;
473 acp_reg_write(val, acp_mmio, mmACP_SOFT_RESET);
474
475 /* initiailize Onion control DAGB register */
476 acp_reg_write(ACP_ONION_CNTL_DEFAULT, acp_mmio,
477 mmACP_AXI2DAGB_ONION_CNTL);
478
479 /* initiailize Garlic control DAGB registers */
480 acp_reg_write(ACP_GARLIC_CNTL_DEFAULT, acp_mmio,
481 mmACP_AXI2DAGB_GARLIC_CNTL);
482
483 sram_pte_offset = ACP_DAGB_GRP_SRAM_BASE_ADDRESS |
484 ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBSnoopSel_MASK |
485 ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBTargetMemSel_MASK |
486 ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBGrpEnable_MASK;
487 acp_reg_write(sram_pte_offset, acp_mmio, mmACP_DAGB_BASE_ADDR_GRP_1);
488 acp_reg_write(ACP_PAGE_SIZE_4K_ENABLE, acp_mmio,
489 mmACP_DAGB_PAGE_SIZE_GRP_1);
490
491 acp_reg_write(ACP_SRAM_BASE_ADDRESS, acp_mmio,
492 mmACP_DMA_DESC_BASE_ADDR);
493
494 /* Num of descriptiors in SRAM 0x4, means 256 descriptors;(64 * 4) */
495 acp_reg_write(0x4, acp_mmio, mmACP_DMA_DESC_MAX_NUM_DSCR);
496 acp_reg_write(ACP_EXTERNAL_INTR_CNTL__DMAIOCMask_MASK,
497 acp_mmio, mmACP_EXTERNAL_INTR_CNTL);
498
499 /* When ACP_TILE_P1 is turned on, all SRAM banks get turned on.
500 * Now, turn off all of them. This can't be done in 'poweron' of
501 * ACP pm domain, as this requires ACP to be initialized.
502 */
503 for (bank = 1; bank < 48; bank++)
504 acp_set_sram_bank_state(acp_mmio, bank, false);
505
506 return 0;
507}
508
509/* Deintialize ACP */
510static int acp_deinit(void __iomem *acp_mmio)
511{
512 u32 val;
513 u32 count;
514
515 /* Assert Soft reset of ACP */
516 val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
517
518 val |= ACP_SOFT_RESET__SoftResetAud_MASK;
519 acp_reg_write(val, acp_mmio, mmACP_SOFT_RESET);
520
521 count = ACP_SOFT_RESET_DONE_TIME_OUT_VALUE;
522 while (true) {
523 val = acp_reg_read(acp_mmio, mmACP_SOFT_RESET);
524 if (ACP_SOFT_RESET__SoftResetAudDone_MASK ==
525 (val & ACP_SOFT_RESET__SoftResetAudDone_MASK))
526 break;
527 if (--count == 0) {
528 pr_err("Failed to reset ACP\n");
529 return -ETIMEDOUT;
530 }
531 udelay(100);
532 }
533 /** Disable ACP clock */
534 val = acp_reg_read(acp_mmio, mmACP_CONTROL);
535 val &= ~ACP_CONTROL__ClkEn_MASK;
536 acp_reg_write(val, acp_mmio, mmACP_CONTROL);
537
538 count = ACP_CLOCK_EN_TIME_OUT_VALUE;
539
540 while (true) {
541 val = acp_reg_read(acp_mmio, mmACP_STATUS);
542 if (!(val & (u32) 0x1))
543 break;
544 if (--count == 0) {
545 pr_err("Failed to reset ACP\n");
546 return -ETIMEDOUT;
547 }
548 udelay(100);
549 }
550 return 0;
551}
552
553/* ACP DMA irq handler routine for playback, capture usecases */
554static irqreturn_t dma_irq_handler(int irq, void *arg)
555{
556 u16 dscr_idx;
557 u32 intr_flag, ext_intr_status;
558 struct audio_drv_data *irq_data;
559 void __iomem *acp_mmio;
560 struct device *dev = arg;
561 bool valid_irq = false;
562
563 irq_data = dev_get_drvdata(dev);
564 acp_mmio = irq_data->acp_mmio;
565
566 ext_intr_status = acp_reg_read(acp_mmio, mmACP_EXTERNAL_INTR_STAT);
567 intr_flag = (((ext_intr_status &
568 ACP_EXTERNAL_INTR_STAT__DMAIOCStat_MASK) >>
569 ACP_EXTERNAL_INTR_STAT__DMAIOCStat__SHIFT));
570
571 if ((intr_flag & BIT(ACP_TO_I2S_DMA_CH_NUM)) != 0) {
572 valid_irq = true;
573 if (acp_reg_read(acp_mmio, mmACP_DMA_CUR_DSCR_13) ==
574 PLAYBACK_START_DMA_DESCR_CH13)
575 dscr_idx = PLAYBACK_START_DMA_DESCR_CH12;
576 else
577 dscr_idx = PLAYBACK_END_DMA_DESCR_CH12;
578 config_acp_dma_channel(acp_mmio, SYSRAM_TO_ACP_CH_NUM, dscr_idx,
579 1, 0);
580 acp_dma_start(acp_mmio, SYSRAM_TO_ACP_CH_NUM, false);
581
582 snd_pcm_period_elapsed(irq_data->play_stream);
583
584 acp_reg_write((intr_flag & BIT(ACP_TO_I2S_DMA_CH_NUM)) << 16,
585 acp_mmio, mmACP_EXTERNAL_INTR_STAT);
586 }
587
588 if ((intr_flag & BIT(I2S_TO_ACP_DMA_CH_NUM)) != 0) {
589 valid_irq = true;
590 if (acp_reg_read(acp_mmio, mmACP_DMA_CUR_DSCR_15) ==
591 CAPTURE_START_DMA_DESCR_CH15)
592 dscr_idx = CAPTURE_END_DMA_DESCR_CH14;
593 else
594 dscr_idx = CAPTURE_START_DMA_DESCR_CH14;
595 config_acp_dma_channel(acp_mmio, ACP_TO_SYSRAM_CH_NUM, dscr_idx,
596 1, 0);
597 acp_dma_start(acp_mmio, ACP_TO_SYSRAM_CH_NUM, false);
598
599 acp_reg_write((intr_flag & BIT(I2S_TO_ACP_DMA_CH_NUM)) << 16,
600 acp_mmio, mmACP_EXTERNAL_INTR_STAT);
601 }
602
603 if ((intr_flag & BIT(ACP_TO_SYSRAM_CH_NUM)) != 0) {
604 valid_irq = true;
605 snd_pcm_period_elapsed(irq_data->capture_stream);
606 acp_reg_write((intr_flag & BIT(ACP_TO_SYSRAM_CH_NUM)) << 16,
607 acp_mmio, mmACP_EXTERNAL_INTR_STAT);
608 }
609
610 if (valid_irq)
611 return IRQ_HANDLED;
612 else
613 return IRQ_NONE;
614}
615
616static int acp_dma_open(struct snd_pcm_substream *substream)
617{
618 u16 bank;
619 int ret = 0;
620 struct snd_pcm_runtime *runtime = substream->runtime;
621 struct snd_soc_pcm_runtime *prtd = substream->private_data;
622 struct audio_drv_data *intr_data = dev_get_drvdata(prtd->platform->dev);
623
624 struct audio_substream_data *adata =
625 kzalloc(sizeof(struct audio_substream_data), GFP_KERNEL);
626 if (adata == NULL)
627 return -ENOMEM;
628
629 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
630 runtime->hw = acp_pcm_hardware_playback;
631 else
632 runtime->hw = acp_pcm_hardware_capture;
633
634 ret = snd_pcm_hw_constraint_integer(runtime,
635 SNDRV_PCM_HW_PARAM_PERIODS);
636 if (ret < 0) {
637 dev_err(prtd->platform->dev, "set integer constraint failed\n");
638 return ret;
639 }
640
641 adata->acp_mmio = intr_data->acp_mmio;
642 runtime->private_data = adata;
643
644 /* Enable ACP irq, when neither playback or capture streams are
645 * active by the time when a new stream is being opened.
646 * This enablement is not required for another stream, if current
647 * stream is not closed
648 */
649 if (!intr_data->play_stream && !intr_data->capture_stream)
650 acp_reg_write(1, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
651
652 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
653 intr_data->play_stream = substream;
654 for (bank = 1; bank <= 4; bank++)
655 acp_set_sram_bank_state(intr_data->acp_mmio, bank,
656 true);
657 } else {
658 intr_data->capture_stream = substream;
659 for (bank = 5; bank <= 8; bank++)
660 acp_set_sram_bank_state(intr_data->acp_mmio, bank,
661 true);
662 }
663
664 return 0;
665}
666
667static int acp_dma_hw_params(struct snd_pcm_substream *substream,
668 struct snd_pcm_hw_params *params)
669{
670 int status;
671 uint64_t size;
672 struct snd_dma_buffer *dma_buffer;
673 struct page *pg;
674 struct snd_pcm_runtime *runtime;
675 struct audio_substream_data *rtd;
676
677 dma_buffer = &substream->dma_buffer;
678
679 runtime = substream->runtime;
680 rtd = runtime->private_data;
681
682 if (WARN_ON(!rtd))
683 return -EINVAL;
684
685 size = params_buffer_bytes(params);
686 status = snd_pcm_lib_malloc_pages(substream, size);
687 if (status < 0)
688 return status;
689
690 memset(substream->runtime->dma_area, 0, params_buffer_bytes(params));
691 pg = virt_to_page(substream->dma_buffer.area);
692
693 if (pg != NULL) {
694 acp_set_sram_bank_state(rtd->acp_mmio, 0, true);
695 /* Save for runtime private data */
696 rtd->pg = pg;
697 rtd->order = get_order(size);
698
699 /* Fill the page table entries in ACP SRAM */
700 rtd->pg = pg;
701 rtd->size = size;
702 rtd->num_of_pages = PAGE_ALIGN(size) >> PAGE_SHIFT;
703 rtd->direction = substream->stream;
704
705 config_acp_dma(rtd->acp_mmio, rtd);
706 status = 0;
707 } else {
708 status = -ENOMEM;
709 }
710 return status;
711}
712
713static int acp_dma_hw_free(struct snd_pcm_substream *substream)
714{
715 return snd_pcm_lib_free_pages(substream);
716}
717
718static snd_pcm_uframes_t acp_dma_pointer(struct snd_pcm_substream *substream)
719{
720 u16 dscr;
721 u32 mul, dma_config, period_bytes;
722 u32 pos = 0;
723
724 struct snd_pcm_runtime *runtime = substream->runtime;
725 struct audio_substream_data *rtd = runtime->private_data;
726
727 period_bytes = frames_to_bytes(runtime, runtime->period_size);
728 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
729 dscr = acp_reg_read(rtd->acp_mmio, mmACP_DMA_CUR_DSCR_13);
730
731 if (dscr == PLAYBACK_START_DMA_DESCR_CH13)
732 mul = 0;
733 else
734 mul = 1;
735 pos = (mul * period_bytes);
736 } else {
737 dma_config = acp_reg_read(rtd->acp_mmio, mmACP_DMA_CNTL_14);
738 if (dma_config != 0) {
739 dscr = acp_reg_read(rtd->acp_mmio,
740 mmACP_DMA_CUR_DSCR_14);
741 if (dscr == CAPTURE_START_DMA_DESCR_CH14)
742 mul = 1;
743 else
744 mul = 2;
745 pos = (mul * period_bytes);
746 }
747
748 if (pos >= (2 * period_bytes))
749 pos = 0;
750
751 }
752 return bytes_to_frames(runtime, pos);
753}
754
755static int acp_dma_mmap(struct snd_pcm_substream *substream,
756 struct vm_area_struct *vma)
757{
758 return snd_pcm_lib_default_mmap(substream, vma);
759}
760
761static int acp_dma_prepare(struct snd_pcm_substream *substream)
762{
763 struct snd_pcm_runtime *runtime = substream->runtime;
764 struct audio_substream_data *rtd = runtime->private_data;
765
766 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
767 config_acp_dma_channel(rtd->acp_mmio, SYSRAM_TO_ACP_CH_NUM,
768 PLAYBACK_START_DMA_DESCR_CH12,
769 NUM_DSCRS_PER_CHANNEL, 0);
770 config_acp_dma_channel(rtd->acp_mmio, ACP_TO_I2S_DMA_CH_NUM,
771 PLAYBACK_START_DMA_DESCR_CH13,
772 NUM_DSCRS_PER_CHANNEL, 0);
773 /* Fill ACP SRAM (2 periods) with zeros from System RAM
774 * which is zero-ed in hw_params
775 */
776 acp_dma_start(rtd->acp_mmio, SYSRAM_TO_ACP_CH_NUM, false);
777
778 /* ACP SRAM (2 periods of buffer size) is intially filled with
779 * zeros. Before rendering starts, 2nd half of SRAM will be
780 * filled with valid audio data DMA'ed from first half of system
781 * RAM and 1st half of SRAM will be filled with Zeros. This is
782 * the initial scenario when redering starts from SRAM. Later
783 * on, 2nd half of system memory will be DMA'ed to 1st half of
784 * SRAM, 1st half of system memory will be DMA'ed to 2nd half of
785 * SRAM in ping-pong way till rendering stops.
786 */
787 config_acp_dma_channel(rtd->acp_mmio, SYSRAM_TO_ACP_CH_NUM,
788 PLAYBACK_START_DMA_DESCR_CH12,
789 1, 0);
790 } else {
791 config_acp_dma_channel(rtd->acp_mmio, ACP_TO_SYSRAM_CH_NUM,
792 CAPTURE_START_DMA_DESCR_CH14,
793 NUM_DSCRS_PER_CHANNEL, 0);
794 config_acp_dma_channel(rtd->acp_mmio, I2S_TO_ACP_DMA_CH_NUM,
795 CAPTURE_START_DMA_DESCR_CH15,
796 NUM_DSCRS_PER_CHANNEL, 0);
797 }
798 return 0;
799}
800
801static int acp_dma_trigger(struct snd_pcm_substream *substream, int cmd)
802{
803 int ret;
804 u32 loops = 1000;
805
806 struct snd_pcm_runtime *runtime = substream->runtime;
807 struct snd_soc_pcm_runtime *prtd = substream->private_data;
808 struct audio_substream_data *rtd = runtime->private_data;
809
810 if (!rtd)
811 return -EINVAL;
812 switch (cmd) {
813 case SNDRV_PCM_TRIGGER_START:
814 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
815 case SNDRV_PCM_TRIGGER_RESUME:
816 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
817 acp_dma_start(rtd->acp_mmio,
818 SYSRAM_TO_ACP_CH_NUM, false);
819 while (acp_reg_read(rtd->acp_mmio, mmACP_DMA_CH_STS) &
820 BIT(SYSRAM_TO_ACP_CH_NUM)) {
821 if (!loops--) {
822 dev_err(prtd->platform->dev,
823 "acp dma start timeout\n");
824 return -ETIMEDOUT;
825 }
826 cpu_relax();
827 }
828
829 acp_dma_start(rtd->acp_mmio,
830 ACP_TO_I2S_DMA_CH_NUM, true);
831
832 } else {
833 acp_dma_start(rtd->acp_mmio,
834 I2S_TO_ACP_DMA_CH_NUM, true);
835 }
836 ret = 0;
837 break;
838 case SNDRV_PCM_TRIGGER_STOP:
839 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
840 case SNDRV_PCM_TRIGGER_SUSPEND:
841 /* Need to stop only circular DMA channels :
842 * ACP_TO_I2S_DMA_CH_NUM / I2S_TO_ACP_DMA_CH_NUM. Non-circular
843 * channels will stopped automatically after its transfer
844 * completes : SYSRAM_TO_ACP_CH_NUM / ACP_TO_SYSRAM_CH_NUM
845 */
846 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
847 ret = acp_dma_stop(rtd->acp_mmio,
848 ACP_TO_I2S_DMA_CH_NUM);
849 else
850 ret = acp_dma_stop(rtd->acp_mmio,
851 I2S_TO_ACP_DMA_CH_NUM);
852 break;
853 default:
854 ret = -EINVAL;
855
856 }
857 return ret;
858}
859
860static int acp_dma_new(struct snd_soc_pcm_runtime *rtd)
861{
862 return snd_pcm_lib_preallocate_pages_for_all(rtd->pcm,
863 SNDRV_DMA_TYPE_DEV,
864 NULL, MIN_BUFFER,
865 MAX_BUFFER);
866}
867
868static int acp_dma_close(struct snd_pcm_substream *substream)
869{
870 u16 bank;
871 struct snd_pcm_runtime *runtime = substream->runtime;
872 struct audio_substream_data *rtd = runtime->private_data;
873 struct snd_soc_pcm_runtime *prtd = substream->private_data;
874 struct audio_drv_data *adata = dev_get_drvdata(prtd->platform->dev);
875
876 kfree(rtd);
877
878 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
879 adata->play_stream = NULL;
880 for (bank = 1; bank <= 4; bank++)
881 acp_set_sram_bank_state(adata->acp_mmio, bank,
882 false);
883 } else {
884 adata->capture_stream = NULL;
885 for (bank = 5; bank <= 8; bank++)
886 acp_set_sram_bank_state(adata->acp_mmio, bank,
887 false);
888 }
889
890 /* Disable ACP irq, when the current stream is being closed and
891 * another stream is also not active.
892 */
893 if (!adata->play_stream && !adata->capture_stream)
894 acp_reg_write(0, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
895
896 return 0;
897}
898
899static struct snd_pcm_ops acp_dma_ops = {
900 .open = acp_dma_open,
901 .close = acp_dma_close,
902 .ioctl = snd_pcm_lib_ioctl,
903 .hw_params = acp_dma_hw_params,
904 .hw_free = acp_dma_hw_free,
905 .trigger = acp_dma_trigger,
906 .pointer = acp_dma_pointer,
907 .mmap = acp_dma_mmap,
908 .prepare = acp_dma_prepare,
909};
910
911static struct snd_soc_platform_driver acp_asoc_platform = {
912 .ops = &acp_dma_ops,
913 .pcm_new = acp_dma_new,
914};
915
916static int acp_audio_probe(struct platform_device *pdev)
917{
918 int status;
919 struct audio_drv_data *audio_drv_data;
920 struct resource *res;
921
922 audio_drv_data = devm_kzalloc(&pdev->dev, sizeof(struct audio_drv_data),
923 GFP_KERNEL);
924 if (audio_drv_data == NULL)
925 return -ENOMEM;
926
927 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
928 audio_drv_data->acp_mmio = devm_ioremap_resource(&pdev->dev, res);
929
930 /* The following members gets populated in device 'open'
931 * function. Till then interrupts are disabled in 'acp_init'
932 * and device doesn't generate any interrupts.
933 */
934
935 audio_drv_data->play_stream = NULL;
936 audio_drv_data->capture_stream = NULL;
937
938 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
939 if (!res) {
940 dev_err(&pdev->dev, "IORESOURCE_IRQ FAILED\n");
941 return -ENODEV;
942 }
943
944 status = devm_request_irq(&pdev->dev, res->start, dma_irq_handler,
945 0, "ACP_IRQ", &pdev->dev);
946 if (status) {
947 dev_err(&pdev->dev, "ACP IRQ request failed\n");
948 return status;
949 }
950
951 dev_set_drvdata(&pdev->dev, audio_drv_data);
952
953 /* Initialize the ACP */
954 acp_init(audio_drv_data->acp_mmio);
955
956 status = snd_soc_register_platform(&pdev->dev, &acp_asoc_platform);
957 if (status != 0) {
958 dev_err(&pdev->dev, "Fail to register ALSA platform device\n");
959 return status;
960 }
961
962 pm_runtime_set_autosuspend_delay(&pdev->dev, 10000);
963 pm_runtime_use_autosuspend(&pdev->dev);
964 pm_runtime_enable(&pdev->dev);
965
966 return status;
967}
968
969static int acp_audio_remove(struct platform_device *pdev)
970{
971 struct audio_drv_data *adata = dev_get_drvdata(&pdev->dev);
972
973 acp_deinit(adata->acp_mmio);
974 snd_soc_unregister_platform(&pdev->dev);
975 pm_runtime_disable(&pdev->dev);
976
977 return 0;
978}
979
980static int acp_pcm_resume(struct device *dev)
981{
982 u16 bank;
983 struct audio_drv_data *adata = dev_get_drvdata(dev);
984
985 acp_init(adata->acp_mmio);
986
987 if (adata->play_stream && adata->play_stream->runtime) {
988 for (bank = 1; bank <= 4; bank++)
989 acp_set_sram_bank_state(adata->acp_mmio, bank,
990 true);
991 config_acp_dma(adata->acp_mmio,
992 adata->play_stream->runtime->private_data);
993 }
994 if (adata->capture_stream && adata->capture_stream->runtime) {
995 for (bank = 5; bank <= 8; bank++)
996 acp_set_sram_bank_state(adata->acp_mmio, bank,
997 true);
998 config_acp_dma(adata->acp_mmio,
999 adata->capture_stream->runtime->private_data);
1000 }
1001 acp_reg_write(1, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
1002 return 0;
1003}
1004
1005static int acp_pcm_runtime_suspend(struct device *dev)
1006{
1007 struct audio_drv_data *adata = dev_get_drvdata(dev);
1008
1009 acp_deinit(adata->acp_mmio);
1010 acp_reg_write(0, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
1011 return 0;
1012}
1013
1014static int acp_pcm_runtime_resume(struct device *dev)
1015{
1016 struct audio_drv_data *adata = dev_get_drvdata(dev);
1017
1018 acp_init(adata->acp_mmio);
1019 acp_reg_write(1, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB);
1020 return 0;
1021}
1022
1023static const struct dev_pm_ops acp_pm_ops = {
1024 .resume = acp_pcm_resume,
1025 .runtime_suspend = acp_pcm_runtime_suspend,
1026 .runtime_resume = acp_pcm_runtime_resume,
1027};
1028
1029static struct platform_driver acp_dma_driver = {
1030 .probe = acp_audio_probe,
1031 .remove = acp_audio_remove,
1032 .driver = {
1033 .name = "acp_audio_dma",
1034 .pm = &acp_pm_ops,
1035 },
1036};
1037
1038module_platform_driver(acp_dma_driver);
1039
1040MODULE_AUTHOR("Maruthi.Bayyavarapu@amd.com");
1041MODULE_DESCRIPTION("AMD ACP PCM Driver");
1042MODULE_LICENSE("GPL v2");
1043MODULE_ALIAS("platform:acp-dma-audio");
diff --git a/sound/soc/amd/acp.h b/sound/soc/amd/acp.h
new file mode 100644
index 000000000000..330832ef4e5e
--- /dev/null
+++ b/sound/soc/amd/acp.h
@@ -0,0 +1,118 @@
1#ifndef __ACP_HW_H
2#define __ACP_HW_H
3
4#include "include/acp_2_2_d.h"
5#include "include/acp_2_2_sh_mask.h"
6
7#define ACP_PAGE_SIZE_4K_ENABLE 0x02
8
9#define ACP_PLAYBACK_PTE_OFFSET 10
10#define ACP_CAPTURE_PTE_OFFSET 0
11
12#define ACP_GARLIC_CNTL_DEFAULT 0x00000FB4
13#define ACP_ONION_CNTL_DEFAULT 0x00000FB4
14
15#define ACP_PHYSICAL_BASE 0x14000
16
17/* Playback SRAM address (as a destination in dma descriptor) */
18#define ACP_SHARED_RAM_BANK_1_ADDRESS 0x4002000
19
20/* Capture SRAM address (as a source in dma descriptor) */
21#define ACP_SHARED_RAM_BANK_5_ADDRESS 0x400A000
22
23#define ACP_DMA_RESET_TIME 10000
24#define ACP_CLOCK_EN_TIME_OUT_VALUE 0x000000FF
25#define ACP_SOFT_RESET_DONE_TIME_OUT_VALUE 0x000000FF
26#define ACP_DMA_COMPLETE_TIME_OUT_VALUE 0x000000FF
27
28#define ACP_SRAM_BASE_ADDRESS 0x4000000
29#define ACP_DAGB_GRP_SRAM_BASE_ADDRESS 0x4001000
30#define ACP_DAGB_GRP_SRBM_SRAM_BASE_OFFSET 0x1000
31#define ACP_INTERNAL_APERTURE_WINDOW_0_ADDRESS 0x00000000
32#define ACP_INTERNAL_APERTURE_WINDOW_4_ADDRESS 0x01800000
33
34#define TO_ACP_I2S_1 0x2
35#define TO_ACP_I2S_2 0x4
36#define FROM_ACP_I2S_1 0xa
37#define FROM_ACP_I2S_2 0xb
38
39#define ACP_TILE_ON_MASK 0x03
40#define ACP_TILE_OFF_MASK 0x02
41#define ACP_TILE_ON_RETAIN_REG_MASK 0x1f
42#define ACP_TILE_OFF_RETAIN_REG_MASK 0x20
43
44#define ACP_TILE_P1_MASK 0x3e
45#define ACP_TILE_P2_MASK 0x3d
46#define ACP_TILE_DSP0_MASK 0x3b
47#define ACP_TILE_DSP1_MASK 0x37
48
49#define ACP_TILE_DSP2_MASK 0x2f
50/* Playback DMA channels */
51#define SYSRAM_TO_ACP_CH_NUM 12
52#define ACP_TO_I2S_DMA_CH_NUM 13
53
54/* Capture DMA channels */
55#define ACP_TO_SYSRAM_CH_NUM 14
56#define I2S_TO_ACP_DMA_CH_NUM 15
57
58#define NUM_DSCRS_PER_CHANNEL 2
59
60#define PLAYBACK_START_DMA_DESCR_CH12 0
61#define PLAYBACK_END_DMA_DESCR_CH12 1
62#define PLAYBACK_START_DMA_DESCR_CH13 2
63#define PLAYBACK_END_DMA_DESCR_CH13 3
64
65#define CAPTURE_START_DMA_DESCR_CH14 4
66#define CAPTURE_END_DMA_DESCR_CH14 5
67#define CAPTURE_START_DMA_DESCR_CH15 6
68#define CAPTURE_END_DMA_DESCR_CH15 7
69
70enum acp_dma_priority_level {
71 /* 0x0 Specifies the DMA channel is given normal priority */
72 ACP_DMA_PRIORITY_LEVEL_NORMAL = 0x0,
73 /* 0x1 Specifies the DMA channel is given high priority */
74 ACP_DMA_PRIORITY_LEVEL_HIGH = 0x1,
75 ACP_DMA_PRIORITY_LEVEL_FORCESIZE = 0xFF
76};
77
78struct audio_substream_data {
79 struct page *pg;
80 unsigned int order;
81 u16 num_of_pages;
82 u16 direction;
83 uint64_t size;
84 void __iomem *acp_mmio;
85};
86
87enum {
88 ACP_TILE_P1 = 0,
89 ACP_TILE_P2,
90 ACP_TILE_DSP0,
91 ACP_TILE_DSP1,
92 ACP_TILE_DSP2,
93};
94
95enum {
96 ACP_DMA_ATTRIBUTES_SHAREDMEM_TO_DAGB_ONION = 0x0,
97 ACP_DMA_ATTRIBUTES_SHARED_MEM_TO_DAGB_GARLIC = 0x1,
98 ACP_DMA_ATTRIBUTES_DAGB_ONION_TO_SHAREDMEM = 0x8,
99 ACP_DMA_ATTRIBUTES_DAGB_GARLIC_TO_SHAREDMEM = 0x9,
100 ACP_DMA_ATTRIBUTES_FORCE_SIZE = 0xF
101};
102
103typedef struct acp_dma_dscr_transfer {
104 /* Specifies the source memory location for the DMA data transfer. */
105 u32 src;
106 /* Specifies the destination memory location to where the data will
107 * be transferred.
108 */
109 u32 dest;
110 /* Specifies the number of bytes need to be transferred
111 * from source to destination memory.Transfer direction & IOC enable
112 */
113 u32 xfer_val;
114 /* Reserved for future use */
115 u32 reserved;
116} acp_dma_dscr_transfer_t;
117
118#endif /*__ACP_HW_H */
diff --git a/sound/soc/amd/include/acp_2_2_d.h b/sound/soc/amd/include/acp_2_2_d.h
new file mode 100644
index 000000000000..0118fe9e6a87
--- /dev/null
+++ b/sound/soc/amd/include/acp_2_2_d.h
@@ -0,0 +1,609 @@
1/*
2 * ACP_2_2 Register documentation
3 *
4 * Copyright (C) 2014 Advanced Micro Devices, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23
24#ifndef ACP_2_2_D_H
25#define ACP_2_2_D_H
26
27#define mmACP_DMA_CNTL_0 0x5000
28#define mmACP_DMA_CNTL_1 0x5001
29#define mmACP_DMA_CNTL_2 0x5002
30#define mmACP_DMA_CNTL_3 0x5003
31#define mmACP_DMA_CNTL_4 0x5004
32#define mmACP_DMA_CNTL_5 0x5005
33#define mmACP_DMA_CNTL_6 0x5006
34#define mmACP_DMA_CNTL_7 0x5007
35#define mmACP_DMA_CNTL_8 0x5008
36#define mmACP_DMA_CNTL_9 0x5009
37#define mmACP_DMA_CNTL_10 0x500a
38#define mmACP_DMA_CNTL_11 0x500b
39#define mmACP_DMA_CNTL_12 0x500c
40#define mmACP_DMA_CNTL_13 0x500d
41#define mmACP_DMA_CNTL_14 0x500e
42#define mmACP_DMA_CNTL_15 0x500f
43#define mmACP_DMA_DSCR_STRT_IDX_0 0x5010
44#define mmACP_DMA_DSCR_STRT_IDX_1 0x5011
45#define mmACP_DMA_DSCR_STRT_IDX_2 0x5012
46#define mmACP_DMA_DSCR_STRT_IDX_3 0x5013
47#define mmACP_DMA_DSCR_STRT_IDX_4 0x5014
48#define mmACP_DMA_DSCR_STRT_IDX_5 0x5015
49#define mmACP_DMA_DSCR_STRT_IDX_6 0x5016
50#define mmACP_DMA_DSCR_STRT_IDX_7 0x5017
51#define mmACP_DMA_DSCR_STRT_IDX_8 0x5018
52#define mmACP_DMA_DSCR_STRT_IDX_9 0x5019
53#define mmACP_DMA_DSCR_STRT_IDX_10 0x501a
54#define mmACP_DMA_DSCR_STRT_IDX_11 0x501b
55#define mmACP_DMA_DSCR_STRT_IDX_12 0x501c
56#define mmACP_DMA_DSCR_STRT_IDX_13 0x501d
57#define mmACP_DMA_DSCR_STRT_IDX_14 0x501e
58#define mmACP_DMA_DSCR_STRT_IDX_15 0x501f
59#define mmACP_DMA_DSCR_CNT_0 0x5020
60#define mmACP_DMA_DSCR_CNT_1 0x5021
61#define mmACP_DMA_DSCR_CNT_2 0x5022
62#define mmACP_DMA_DSCR_CNT_3 0x5023
63#define mmACP_DMA_DSCR_CNT_4 0x5024
64#define mmACP_DMA_DSCR_CNT_5 0x5025
65#define mmACP_DMA_DSCR_CNT_6 0x5026
66#define mmACP_DMA_DSCR_CNT_7 0x5027
67#define mmACP_DMA_DSCR_CNT_8 0x5028
68#define mmACP_DMA_DSCR_CNT_9 0x5029
69#define mmACP_DMA_DSCR_CNT_10 0x502a
70#define mmACP_DMA_DSCR_CNT_11 0x502b
71#define mmACP_DMA_DSCR_CNT_12 0x502c
72#define mmACP_DMA_DSCR_CNT_13 0x502d
73#define mmACP_DMA_DSCR_CNT_14 0x502e
74#define mmACP_DMA_DSCR_CNT_15 0x502f
75#define mmACP_DMA_PRIO_0 0x5030
76#define mmACP_DMA_PRIO_1 0x5031
77#define mmACP_DMA_PRIO_2 0x5032
78#define mmACP_DMA_PRIO_3 0x5033
79#define mmACP_DMA_PRIO_4 0x5034
80#define mmACP_DMA_PRIO_5 0x5035
81#define mmACP_DMA_PRIO_6 0x5036
82#define mmACP_DMA_PRIO_7 0x5037
83#define mmACP_DMA_PRIO_8 0x5038
84#define mmACP_DMA_PRIO_9 0x5039
85#define mmACP_DMA_PRIO_10 0x503a
86#define mmACP_DMA_PRIO_11 0x503b
87#define mmACP_DMA_PRIO_12 0x503c
88#define mmACP_DMA_PRIO_13 0x503d
89#define mmACP_DMA_PRIO_14 0x503e
90#define mmACP_DMA_PRIO_15 0x503f
91#define mmACP_DMA_CUR_DSCR_0 0x5040
92#define mmACP_DMA_CUR_DSCR_1 0x5041
93#define mmACP_DMA_CUR_DSCR_2 0x5042
94#define mmACP_DMA_CUR_DSCR_3 0x5043
95#define mmACP_DMA_CUR_DSCR_4 0x5044
96#define mmACP_DMA_CUR_DSCR_5 0x5045
97#define mmACP_DMA_CUR_DSCR_6 0x5046
98#define mmACP_DMA_CUR_DSCR_7 0x5047
99#define mmACP_DMA_CUR_DSCR_8 0x5048
100#define mmACP_DMA_CUR_DSCR_9 0x5049
101#define mmACP_DMA_CUR_DSCR_10 0x504a
102#define mmACP_DMA_CUR_DSCR_11 0x504b
103#define mmACP_DMA_CUR_DSCR_12 0x504c
104#define mmACP_DMA_CUR_DSCR_13 0x504d
105#define mmACP_DMA_CUR_DSCR_14 0x504e
106#define mmACP_DMA_CUR_DSCR_15 0x504f
107#define mmACP_DMA_CUR_TRANS_CNT_0 0x5050
108#define mmACP_DMA_CUR_TRANS_CNT_1 0x5051
109#define mmACP_DMA_CUR_TRANS_CNT_2 0x5052
110#define mmACP_DMA_CUR_TRANS_CNT_3 0x5053
111#define mmACP_DMA_CUR_TRANS_CNT_4 0x5054
112#define mmACP_DMA_CUR_TRANS_CNT_5 0x5055
113#define mmACP_DMA_CUR_TRANS_CNT_6 0x5056
114#define mmACP_DMA_CUR_TRANS_CNT_7 0x5057
115#define mmACP_DMA_CUR_TRANS_CNT_8 0x5058
116#define mmACP_DMA_CUR_TRANS_CNT_9 0x5059
117#define mmACP_DMA_CUR_TRANS_CNT_10 0x505a
118#define mmACP_DMA_CUR_TRANS_CNT_11 0x505b
119#define mmACP_DMA_CUR_TRANS_CNT_12 0x505c
120#define mmACP_DMA_CUR_TRANS_CNT_13 0x505d
121#define mmACP_DMA_CUR_TRANS_CNT_14 0x505e
122#define mmACP_DMA_CUR_TRANS_CNT_15 0x505f
123#define mmACP_DMA_ERR_STS_0 0x5060
124#define mmACP_DMA_ERR_STS_1 0x5061
125#define mmACP_DMA_ERR_STS_2 0x5062
126#define mmACP_DMA_ERR_STS_3 0x5063
127#define mmACP_DMA_ERR_STS_4 0x5064
128#define mmACP_DMA_ERR_STS_5 0x5065
129#define mmACP_DMA_ERR_STS_6 0x5066
130#define mmACP_DMA_ERR_STS_7 0x5067
131#define mmACP_DMA_ERR_STS_8 0x5068
132#define mmACP_DMA_ERR_STS_9 0x5069
133#define mmACP_DMA_ERR_STS_10 0x506a
134#define mmACP_DMA_ERR_STS_11 0x506b
135#define mmACP_DMA_ERR_STS_12 0x506c
136#define mmACP_DMA_ERR_STS_13 0x506d
137#define mmACP_DMA_ERR_STS_14 0x506e
138#define mmACP_DMA_ERR_STS_15 0x506f
139#define mmACP_DMA_DESC_BASE_ADDR 0x5070
140#define mmACP_DMA_DESC_MAX_NUM_DSCR 0x5071
141#define mmACP_DMA_CH_STS 0x5072
142#define mmACP_DMA_CH_GROUP 0x5073
143#define mmACP_DSP0_CACHE_OFFSET0 0x5078
144#define mmACP_DSP0_CACHE_SIZE0 0x5079
145#define mmACP_DSP0_CACHE_OFFSET1 0x507a
146#define mmACP_DSP0_CACHE_SIZE1 0x507b
147#define mmACP_DSP0_CACHE_OFFSET2 0x507c
148#define mmACP_DSP0_CACHE_SIZE2 0x507d
149#define mmACP_DSP0_CACHE_OFFSET3 0x507e
150#define mmACP_DSP0_CACHE_SIZE3 0x507f
151#define mmACP_DSP0_CACHE_OFFSET4 0x5080
152#define mmACP_DSP0_CACHE_SIZE4 0x5081
153#define mmACP_DSP0_CACHE_OFFSET5 0x5082
154#define mmACP_DSP0_CACHE_SIZE5 0x5083
155#define mmACP_DSP0_CACHE_OFFSET6 0x5084
156#define mmACP_DSP0_CACHE_SIZE6 0x5085
157#define mmACP_DSP0_CACHE_OFFSET7 0x5086
158#define mmACP_DSP0_CACHE_SIZE7 0x5087
159#define mmACP_DSP0_CACHE_OFFSET8 0x5088
160#define mmACP_DSP0_CACHE_SIZE8 0x5089
161#define mmACP_DSP0_NONCACHE_OFFSET0 0x508a
162#define mmACP_DSP0_NONCACHE_SIZE0 0x508b
163#define mmACP_DSP0_NONCACHE_OFFSET1 0x508c
164#define mmACP_DSP0_NONCACHE_SIZE1 0x508d
165#define mmACP_DSP0_DEBUG_PC 0x508e
166#define mmACP_DSP0_NMI_SEL 0x508f
167#define mmACP_DSP0_CLKRST_CNTL 0x5090
168#define mmACP_DSP0_RUNSTALL 0x5091
169#define mmACP_DSP0_OCD_HALT_ON_RST 0x5092
170#define mmACP_DSP0_WAIT_MODE 0x5093
171#define mmACP_DSP0_VECT_SEL 0x5094
172#define mmACP_DSP0_DEBUG_REG1 0x5095
173#define mmACP_DSP0_DEBUG_REG2 0x5096
174#define mmACP_DSP0_DEBUG_REG3 0x5097
175#define mmACP_DSP1_CACHE_OFFSET0 0x509d
176#define mmACP_DSP1_CACHE_SIZE0 0x509e
177#define mmACP_DSP1_CACHE_OFFSET1 0x509f
178#define mmACP_DSP1_CACHE_SIZE1 0x50a0
179#define mmACP_DSP1_CACHE_OFFSET2 0x50a1
180#define mmACP_DSP1_CACHE_SIZE2 0x50a2
181#define mmACP_DSP1_CACHE_OFFSET3 0x50a3
182#define mmACP_DSP1_CACHE_SIZE3 0x50a4
183#define mmACP_DSP1_CACHE_OFFSET4 0x50a5
184#define mmACP_DSP1_CACHE_SIZE4 0x50a6
185#define mmACP_DSP1_CACHE_OFFSET5 0x50a7
186#define mmACP_DSP1_CACHE_SIZE5 0x50a8
187#define mmACP_DSP1_CACHE_OFFSET6 0x50a9
188#define mmACP_DSP1_CACHE_SIZE6 0x50aa
189#define mmACP_DSP1_CACHE_OFFSET7 0x50ab
190#define mmACP_DSP1_CACHE_SIZE7 0x50ac
191#define mmACP_DSP1_CACHE_OFFSET8 0x50ad
192#define mmACP_DSP1_CACHE_SIZE8 0x50ae
193#define mmACP_DSP1_NONCACHE_OFFSET0 0x50af
194#define mmACP_DSP1_NONCACHE_SIZE0 0x50b0
195#define mmACP_DSP1_NONCACHE_OFFSET1 0x50b1
196#define mmACP_DSP1_NONCACHE_SIZE1 0x50b2
197#define mmACP_DSP1_DEBUG_PC 0x50b3
198#define mmACP_DSP1_NMI_SEL 0x50b4
199#define mmACP_DSP1_CLKRST_CNTL 0x50b5
200#define mmACP_DSP1_RUNSTALL 0x50b6
201#define mmACP_DSP1_OCD_HALT_ON_RST 0x50b7
202#define mmACP_DSP1_WAIT_MODE 0x50b8
203#define mmACP_DSP1_VECT_SEL 0x50b9
204#define mmACP_DSP1_DEBUG_REG1 0x50ba
205#define mmACP_DSP1_DEBUG_REG2 0x50bb
206#define mmACP_DSP1_DEBUG_REG3 0x50bc
207#define mmACP_DSP2_CACHE_OFFSET0 0x50c2
208#define mmACP_DSP2_CACHE_SIZE0 0x50c3
209#define mmACP_DSP2_CACHE_OFFSET1 0x50c4
210#define mmACP_DSP2_CACHE_SIZE1 0x50c5
211#define mmACP_DSP2_CACHE_OFFSET2 0x50c6
212#define mmACP_DSP2_CACHE_SIZE2 0x50c7
213#define mmACP_DSP2_CACHE_OFFSET3 0x50c8
214#define mmACP_DSP2_CACHE_SIZE3 0x50c9
215#define mmACP_DSP2_CACHE_OFFSET4 0x50ca
216#define mmACP_DSP2_CACHE_SIZE4 0x50cb
217#define mmACP_DSP2_CACHE_OFFSET5 0x50cc
218#define mmACP_DSP2_CACHE_SIZE5 0x50cd
219#define mmACP_DSP2_CACHE_OFFSET6 0x50ce
220#define mmACP_DSP2_CACHE_SIZE6 0x50cf
221#define mmACP_DSP2_CACHE_OFFSET7 0x50d0
222#define mmACP_DSP2_CACHE_SIZE7 0x50d1
223#define mmACP_DSP2_CACHE_OFFSET8 0x50d2
224#define mmACP_DSP2_CACHE_SIZE8 0x50d3
225#define mmACP_DSP2_NONCACHE_OFFSET0 0x50d4
226#define mmACP_DSP2_NONCACHE_SIZE0 0x50d5
227#define mmACP_DSP2_NONCACHE_OFFSET1 0x50d6
228#define mmACP_DSP2_NONCACHE_SIZE1 0x50d7
229#define mmACP_DSP2_DEBUG_PC 0x50d8
230#define mmACP_DSP2_NMI_SEL 0x50d9
231#define mmACP_DSP2_CLKRST_CNTL 0x50da
232#define mmACP_DSP2_RUNSTALL 0x50db
233#define mmACP_DSP2_OCD_HALT_ON_RST 0x50dc
234#define mmACP_DSP2_WAIT_MODE 0x50dd
235#define mmACP_DSP2_VECT_SEL 0x50de
236#define mmACP_DSP2_DEBUG_REG1 0x50df
237#define mmACP_DSP2_DEBUG_REG2 0x50e0
238#define mmACP_DSP2_DEBUG_REG3 0x50e1
239#define mmACP_AXI2DAGB_ONION_CNTL 0x50e7
240#define mmACP_AXI2DAGB_ONION_ERR_STATUS_WR 0x50e8
241#define mmACP_AXI2DAGB_ONION_ERR_STATUS_RD 0x50e9
242#define mmACP_DAGB_Onion_TransPerf_Counter_Control 0x50ea
243#define mmACP_DAGB_Onion_Wr_TransPerf_Counter_Current 0x50eb
244#define mmACP_DAGB_Onion_Wr_TransPerf_Counter_Peak 0x50ec
245#define mmACP_DAGB_Onion_Rd_TransPerf_Counter_Current 0x50ed
246#define mmACP_DAGB_Onion_Rd_TransPerf_Counter_Peak 0x50ee
247#define mmACP_AXI2DAGB_GARLIC_CNTL 0x50f3
248#define mmACP_AXI2DAGB_GARLIC_ERR_STATUS_WR 0x50f4
249#define mmACP_AXI2DAGB_GARLIC_ERR_STATUS_RD 0x50f5
250#define mmACP_DAGB_Garlic_TransPerf_Counter_Control 0x50f6
251#define mmACP_DAGB_Garlic_Wr_TransPerf_Counter_Current 0x50f7
252#define mmACP_DAGB_Garlic_Wr_TransPerf_Counter_Peak 0x50f8
253#define mmACP_DAGB_Garlic_Rd_TransPerf_Counter_Current 0x50f9
254#define mmACP_DAGB_Garlic_Rd_TransPerf_Counter_Peak 0x50fa
255#define mmACP_DAGB_PAGE_SIZE_GRP_1 0x50ff
256#define mmACP_DAGB_BASE_ADDR_GRP_1 0x5100
257#define mmACP_DAGB_PAGE_SIZE_GRP_2 0x5101
258#define mmACP_DAGB_BASE_ADDR_GRP_2 0x5102
259#define mmACP_DAGB_PAGE_SIZE_GRP_3 0x5103
260#define mmACP_DAGB_BASE_ADDR_GRP_3 0x5104
261#define mmACP_DAGB_PAGE_SIZE_GRP_4 0x5105
262#define mmACP_DAGB_BASE_ADDR_GRP_4 0x5106
263#define mmACP_DAGB_PAGE_SIZE_GRP_5 0x5107
264#define mmACP_DAGB_BASE_ADDR_GRP_5 0x5108
265#define mmACP_DAGB_PAGE_SIZE_GRP_6 0x5109
266#define mmACP_DAGB_BASE_ADDR_GRP_6 0x510a
267#define mmACP_DAGB_PAGE_SIZE_GRP_7 0x510b
268#define mmACP_DAGB_BASE_ADDR_GRP_7 0x510c
269#define mmACP_DAGB_PAGE_SIZE_GRP_8 0x510d
270#define mmACP_DAGB_BASE_ADDR_GRP_8 0x510e
271#define mmACP_DAGB_ATU_CTRL 0x510f
272#define mmACP_CONTROL 0x5131
273#define mmACP_STATUS 0x5133
274#define mmACP_SOFT_RESET 0x5134
275#define mmACP_PwrMgmt_CNTL 0x5135
276#define mmACP_CAC_INDICATOR_CONTROL 0x5136
277#define mmACP_SMU_MAILBOX 0x5137
278#define mmACP_FUTURE_REG_SCLK_0 0x5138
279#define mmACP_FUTURE_REG_SCLK_1 0x5139
280#define mmACP_FUTURE_REG_SCLK_2 0x513a
281#define mmACP_FUTURE_REG_SCLK_3 0x513b
282#define mmACP_FUTURE_REG_SCLK_4 0x513c
283#define mmACP_DAGB_DEBUG_CNT_ENABLE 0x513d
284#define mmACP_DAGBG_WR_ASK_CNT 0x513e
285#define mmACP_DAGBG_WR_GO_CNT 0x513f
286#define mmACP_DAGBG_WR_EXP_RESP_CNT 0x5140
287#define mmACP_DAGBG_WR_ACTUAL_RESP_CNT 0x5141
288#define mmACP_DAGBG_RD_ASK_CNT 0x5142
289#define mmACP_DAGBG_RD_GO_CNT 0x5143
290#define mmACP_DAGBG_RD_EXP_RESP_CNT 0x5144
291#define mmACP_DAGBG_RD_ACTUAL_RESP_CNT 0x5145
292#define mmACP_DAGBO_WR_ASK_CNT 0x5146
293#define mmACP_DAGBO_WR_GO_CNT 0x5147
294#define mmACP_DAGBO_WR_EXP_RESP_CNT 0x5148
295#define mmACP_DAGBO_WR_ACTUAL_RESP_CNT 0x5149
296#define mmACP_DAGBO_RD_ASK_CNT 0x514a
297#define mmACP_DAGBO_RD_GO_CNT 0x514b
298#define mmACP_DAGBO_RD_EXP_RESP_CNT 0x514c
299#define mmACP_DAGBO_RD_ACTUAL_RESP_CNT 0x514d
300#define mmACP_BRB_CONTROL 0x5156
301#define mmACP_EXTERNAL_INTR_ENB 0x5157
302#define mmACP_EXTERNAL_INTR_CNTL 0x5158
303#define mmACP_ERROR_SOURCE_STS 0x5159
304#define mmACP_DSP_SW_INTR_TRIG 0x515a
305#define mmACP_DSP_SW_INTR_CNTL 0x515b
306#define mmACP_DAGBG_TIMEOUT_CNTL 0x515c
307#define mmACP_DAGBO_TIMEOUT_CNTL 0x515d
308#define mmACP_EXTERNAL_INTR_STAT 0x515e
309#define mmACP_DSP_SW_INTR_STAT 0x515f
310#define mmACP_DSP0_INTR_CNTL 0x5160
311#define mmACP_DSP0_INTR_STAT 0x5161
312#define mmACP_DSP0_TIMEOUT_CNTL 0x5162
313#define mmACP_DSP1_INTR_CNTL 0x5163
314#define mmACP_DSP1_INTR_STAT 0x5164
315#define mmACP_DSP1_TIMEOUT_CNTL 0x5165
316#define mmACP_DSP2_INTR_CNTL 0x5166
317#define mmACP_DSP2_INTR_STAT 0x5167
318#define mmACP_DSP2_TIMEOUT_CNTL 0x5168
319#define mmACP_DSP0_EXT_TIMER_CNTL 0x5169
320#define mmACP_DSP1_EXT_TIMER_CNTL 0x516a
321#define mmACP_DSP2_EXT_TIMER_CNTL 0x516b
322#define mmACP_AXI2DAGB_SEM_0 0x516c
323#define mmACP_AXI2DAGB_SEM_1 0x516d
324#define mmACP_AXI2DAGB_SEM_2 0x516e
325#define mmACP_AXI2DAGB_SEM_3 0x516f
326#define mmACP_AXI2DAGB_SEM_4 0x5170
327#define mmACP_AXI2DAGB_SEM_5 0x5171
328#define mmACP_AXI2DAGB_SEM_6 0x5172
329#define mmACP_AXI2DAGB_SEM_7 0x5173
330#define mmACP_AXI2DAGB_SEM_8 0x5174
331#define mmACP_AXI2DAGB_SEM_9 0x5175
332#define mmACP_AXI2DAGB_SEM_10 0x5176
333#define mmACP_AXI2DAGB_SEM_11 0x5177
334#define mmACP_AXI2DAGB_SEM_12 0x5178
335#define mmACP_AXI2DAGB_SEM_13 0x5179
336#define mmACP_AXI2DAGB_SEM_14 0x517a
337#define mmACP_AXI2DAGB_SEM_15 0x517b
338#define mmACP_AXI2DAGB_SEM_16 0x517c
339#define mmACP_AXI2DAGB_SEM_17 0x517d
340#define mmACP_AXI2DAGB_SEM_18 0x517e
341#define mmACP_AXI2DAGB_SEM_19 0x517f
342#define mmACP_AXI2DAGB_SEM_20 0x5180
343#define mmACP_AXI2DAGB_SEM_21 0x5181
344#define mmACP_AXI2DAGB_SEM_22 0x5182
345#define mmACP_AXI2DAGB_SEM_23 0x5183
346#define mmACP_AXI2DAGB_SEM_24 0x5184
347#define mmACP_AXI2DAGB_SEM_25 0x5185
348#define mmACP_AXI2DAGB_SEM_26 0x5186
349#define mmACP_AXI2DAGB_SEM_27 0x5187
350#define mmACP_AXI2DAGB_SEM_28 0x5188
351#define mmACP_AXI2DAGB_SEM_29 0x5189
352#define mmACP_AXI2DAGB_SEM_30 0x518a
353#define mmACP_AXI2DAGB_SEM_31 0x518b
354#define mmACP_AXI2DAGB_SEM_32 0x518c
355#define mmACP_AXI2DAGB_SEM_33 0x518d
356#define mmACP_AXI2DAGB_SEM_34 0x518e
357#define mmACP_AXI2DAGB_SEM_35 0x518f
358#define mmACP_AXI2DAGB_SEM_36 0x5190
359#define mmACP_AXI2DAGB_SEM_37 0x5191
360#define mmACP_AXI2DAGB_SEM_38 0x5192
361#define mmACP_AXI2DAGB_SEM_39 0x5193
362#define mmACP_AXI2DAGB_SEM_40 0x5194
363#define mmACP_AXI2DAGB_SEM_41 0x5195
364#define mmACP_AXI2DAGB_SEM_42 0x5196
365#define mmACP_AXI2DAGB_SEM_43 0x5197
366#define mmACP_AXI2DAGB_SEM_44 0x5198
367#define mmACP_AXI2DAGB_SEM_45 0x5199
368#define mmACP_AXI2DAGB_SEM_46 0x519a
369#define mmACP_AXI2DAGB_SEM_47 0x519b
370#define mmACP_SRBM_Client_Base_Addr 0x519c
371#define mmACP_SRBM_Client_RDDATA 0x519d
372#define mmACP_SRBM_Cycle_Sts 0x519e
373#define mmACP_SRBM_Targ_Idx_Addr 0x519f
374#define mmACP_SRBM_Targ_Idx_Data 0x51a0
375#define mmACP_SEMA_ADDR_LOW 0x51a1
376#define mmACP_SEMA_ADDR_HIGH 0x51a2
377#define mmACP_SEMA_CMD 0x51a3
378#define mmACP_SEMA_STS 0x51a4
379#define mmACP_SEMA_REQ 0x51a5
380#define mmACP_FW_STATUS 0x51a6
381#define mmACP_FUTURE_REG_ACLK_0 0x51a7
382#define mmACP_FUTURE_REG_ACLK_1 0x51a8
383#define mmACP_FUTURE_REG_ACLK_2 0x51a9
384#define mmACP_FUTURE_REG_ACLK_3 0x51aa
385#define mmACP_FUTURE_REG_ACLK_4 0x51ab
386#define mmACP_TIMER 0x51ac
387#define mmACP_TIMER_CNTL 0x51ad
388#define mmACP_DSP0_TIMER 0x51ae
389#define mmACP_DSP1_TIMER 0x51af
390#define mmACP_DSP2_TIMER 0x51b0
391#define mmACP_I2S_TRANSMIT_BYTE_CNT_HIGH 0x51b1
392#define mmACP_I2S_TRANSMIT_BYTE_CNT_LOW 0x51b2
393#define mmACP_I2S_BT_TRANSMIT_BYTE_CNT_HIGH 0x51b3
394#define mmACP_I2S_BT_TRANSMIT_BYTE_CNT_LOW 0x51b4
395#define mmACP_I2S_BT_RECEIVE_BYTE_CNT_HIGH 0x51b5
396#define mmACP_I2S_BT_RECEIVE_BYTE_CNT_LOW 0x51b6
397#define mmACP_DSP0_CS_STATE 0x51b7
398#define mmACP_DSP1_CS_STATE 0x51b8
399#define mmACP_DSP2_CS_STATE 0x51b9
400#define mmACP_SCRATCH_REG_BASE_ADDR 0x51ba
401#define mmCC_ACP_EFUSE 0x51c8
402#define mmACP_PGFSM_RETAIN_REG 0x51c9
403#define mmACP_PGFSM_CONFIG_REG 0x51ca
404#define mmACP_PGFSM_WRITE_REG 0x51cb
405#define mmACP_PGFSM_READ_REG_0 0x51cc
406#define mmACP_PGFSM_READ_REG_1 0x51cd
407#define mmACP_PGFSM_READ_REG_2 0x51ce
408#define mmACP_PGFSM_READ_REG_3 0x51cf
409#define mmACP_PGFSM_READ_REG_4 0x51d0
410#define mmACP_PGFSM_READ_REG_5 0x51d1
411#define mmACP_IP_PGFSM_ENABLE 0x51d2
412#define mmACP_I2S_PIN_CONFIG 0x51d3
413#define mmACP_AZALIA_I2S_SELECT 0x51d4
414#define mmACP_CHIP_PKG_FOR_PAD_ISOLATION 0x51d5
415#define mmACP_AUDIO_PAD_PULLUP_PULLDOWN_CTRL 0x51d6
416#define mmACP_BT_UART_PAD_SEL 0x51d7
417#define mmACP_SCRATCH_REG_0 0x52c0
418#define mmACP_SCRATCH_REG_1 0x52c1
419#define mmACP_SCRATCH_REG_2 0x52c2
420#define mmACP_SCRATCH_REG_3 0x52c3
421#define mmACP_SCRATCH_REG_4 0x52c4
422#define mmACP_SCRATCH_REG_5 0x52c5
423#define mmACP_SCRATCH_REG_6 0x52c6
424#define mmACP_SCRATCH_REG_7 0x52c7
425#define mmACP_SCRATCH_REG_8 0x52c8
426#define mmACP_SCRATCH_REG_9 0x52c9
427#define mmACP_SCRATCH_REG_10 0x52ca
428#define mmACP_SCRATCH_REG_11 0x52cb
429#define mmACP_SCRATCH_REG_12 0x52cc
430#define mmACP_SCRATCH_REG_13 0x52cd
431#define mmACP_SCRATCH_REG_14 0x52ce
432#define mmACP_SCRATCH_REG_15 0x52cf
433#define mmACP_SCRATCH_REG_16 0x52d0
434#define mmACP_SCRATCH_REG_17 0x52d1
435#define mmACP_SCRATCH_REG_18 0x52d2
436#define mmACP_SCRATCH_REG_19 0x52d3
437#define mmACP_SCRATCH_REG_20 0x52d4
438#define mmACP_SCRATCH_REG_21 0x52d5
439#define mmACP_SCRATCH_REG_22 0x52d6
440#define mmACP_SCRATCH_REG_23 0x52d7
441#define mmACP_SCRATCH_REG_24 0x52d8
442#define mmACP_SCRATCH_REG_25 0x52d9
443#define mmACP_SCRATCH_REG_26 0x52da
444#define mmACP_SCRATCH_REG_27 0x52db
445#define mmACP_SCRATCH_REG_28 0x52dc
446#define mmACP_SCRATCH_REG_29 0x52dd
447#define mmACP_SCRATCH_REG_30 0x52de
448#define mmACP_SCRATCH_REG_31 0x52df
449#define mmACP_SCRATCH_REG_32 0x52e0
450#define mmACP_SCRATCH_REG_33 0x52e1
451#define mmACP_SCRATCH_REG_34 0x52e2
452#define mmACP_SCRATCH_REG_35 0x52e3
453#define mmACP_SCRATCH_REG_36 0x52e4
454#define mmACP_SCRATCH_REG_37 0x52e5
455#define mmACP_SCRATCH_REG_38 0x52e6
456#define mmACP_SCRATCH_REG_39 0x52e7
457#define mmACP_SCRATCH_REG_40 0x52e8
458#define mmACP_SCRATCH_REG_41 0x52e9
459#define mmACP_SCRATCH_REG_42 0x52ea
460#define mmACP_SCRATCH_REG_43 0x52eb
461#define mmACP_SCRATCH_REG_44 0x52ec
462#define mmACP_SCRATCH_REG_45 0x52ed
463#define mmACP_SCRATCH_REG_46 0x52ee
464#define mmACP_SCRATCH_REG_47 0x52ef
465#define mmACP_VOICE_WAKEUP_ENABLE 0x51e8
466#define mmACP_VOICE_WAKEUP_STATUS 0x51e9
467#define mmI2S_VOICE_WAKEUP_LOWER_THRESHOLD 0x51ea
468#define mmI2S_VOICE_WAKEUP_HIGHER_THRESHOLD 0x51eb
469#define mmI2S_VOICE_WAKEUP_NO_OF_SAMPLES 0x51ec
470#define mmI2S_VOICE_WAKEUP_NO_OF_PEAKS 0x51ed
471#define mmI2S_VOICE_WAKEUP_DURATION_OF_N_PEAKS 0x51ee
472#define mmI2S_VOICE_WAKEUP_BITCLK_TOGGLE_DETECTION 0x51ef
473#define mmI2S_VOICE_WAKEUP_DATA_PATH_SWITCH 0x51f0
474#define mmI2S_VOICE_WAKEUP_DATA_POINTER 0x51f1
475#define mmI2S_VOICE_WAKEUP_AUTH_MATCH 0x51f2
476#define mmI2S_VOICE_WAKEUP_8KB_WRAP 0x51f3
477#define mmACP_I2S_RECEIVED_BYTE_CNT_HIGH 0x51f4
478#define mmACP_I2S_RECEIVED_BYTE_CNT_LOW 0x51f5
479#define mmACP_I2S_MICSP_TRANSMIT_BYTE_CNT_HIGH 0x51f6
480#define mmACP_I2S_MICSP_TRANSMIT_BYTE_CNT_LOW 0x51f7
481#define mmACP_MEM_SHUT_DOWN_REQ_LO 0x51f8
482#define mmACP_MEM_SHUT_DOWN_REQ_HI 0x51f9
483#define mmACP_MEM_SHUT_DOWN_STS_LO 0x51fa
484#define mmACP_MEM_SHUT_DOWN_STS_HI 0x51fb
485#define mmACP_MEM_DEEP_SLEEP_REQ_LO 0x51fc
486#define mmACP_MEM_DEEP_SLEEP_REQ_HI 0x51fd
487#define mmACP_MEM_DEEP_SLEEP_STS_LO 0x51fe
488#define mmACP_MEM_DEEP_SLEEP_STS_HI 0x51ff
489#define mmACP_MEM_WAKEUP_FROM_SHUT_DOWN_LO 0x5200
490#define mmACP_MEM_WAKEUP_FROM_SHUT_DOWN_HI 0x5201
491#define mmACP_MEM_WAKEUP_FROM_SLEEP_LO 0x5202
492#define mmACP_MEM_WAKEUP_FROM_SLEEP_HI 0x5203
493#define mmACP_I2SSP_IER 0x5210
494#define mmACP_I2SSP_IRER 0x5211
495#define mmACP_I2SSP_ITER 0x5212
496#define mmACP_I2SSP_CER 0x5213
497#define mmACP_I2SSP_CCR 0x5214
498#define mmACP_I2SSP_RXFFR 0x5215
499#define mmACP_I2SSP_TXFFR 0x5216
500#define mmACP_I2SSP_LRBR0 0x5218
501#define mmACP_I2SSP_RRBR0 0x5219
502#define mmACP_I2SSP_RER0 0x521a
503#define mmACP_I2SSP_TER0 0x521b
504#define mmACP_I2SSP_RCR0 0x521c
505#define mmACP_I2SSP_TCR0 0x521d
506#define mmACP_I2SSP_ISR0 0x521e
507#define mmACP_I2SSP_IMR0 0x521f
508#define mmACP_I2SSP_ROR0 0x5220
509#define mmACP_I2SSP_TOR0 0x5221
510#define mmACP_I2SSP_RFCR0 0x5222
511#define mmACP_I2SSP_TFCR0 0x5223
512#define mmACP_I2SSP_RFF0 0x5224
513#define mmACP_I2SSP_TFF0 0x5225
514#define mmACP_I2SSP_RXDMA 0x5226
515#define mmACP_I2SSP_RRXDMA 0x5227
516#define mmACP_I2SSP_TXDMA 0x5228
517#define mmACP_I2SSP_RTXDMA 0x5229
518#define mmACP_I2SSP_COMP_PARAM_2 0x522a
519#define mmACP_I2SSP_COMP_PARAM_1 0x522b
520#define mmACP_I2SSP_COMP_VERSION 0x522c
521#define mmACP_I2SSP_COMP_TYPE 0x522d
522#define mmACP_I2SMICSP_IER 0x522e
523#define mmACP_I2SMICSP_IRER 0x522f
524#define mmACP_I2SMICSP_ITER 0x5230
525#define mmACP_I2SMICSP_CER 0x5231
526#define mmACP_I2SMICSP_CCR 0x5232
527#define mmACP_I2SMICSP_RXFFR 0x5233
528#define mmACP_I2SMICSP_TXFFR 0x5234
529#define mmACP_I2SMICSP_LRBR0 0x5236
530#define mmACP_I2SMICSP_RRBR0 0x5237
531#define mmACP_I2SMICSP_RER0 0x5238
532#define mmACP_I2SMICSP_TER0 0x5239
533#define mmACP_I2SMICSP_RCR0 0x523a
534#define mmACP_I2SMICSP_TCR0 0x523b
535#define mmACP_I2SMICSP_ISR0 0x523c
536#define mmACP_I2SMICSP_IMR0 0x523d
537#define mmACP_I2SMICSP_ROR0 0x523e
538#define mmACP_I2SMICSP_TOR0 0x523f
539#define mmACP_I2SMICSP_RFCR0 0x5240
540#define mmACP_I2SMICSP_TFCR0 0x5241
541#define mmACP_I2SMICSP_RFF0 0x5242
542#define mmACP_I2SMICSP_TFF0 0x5243
543#define mmACP_I2SMICSP_LRBR1 0x5246
544#define mmACP_I2SMICSP_RRBR1 0x5247
545#define mmACP_I2SMICSP_RER1 0x5248
546#define mmACP_I2SMICSP_TER1 0x5249
547#define mmACP_I2SMICSP_RCR1 0x524a
548#define mmACP_I2SMICSP_TCR1 0x524b
549#define mmACP_I2SMICSP_ISR1 0x524c
550#define mmACP_I2SMICSP_IMR1 0x524d
551#define mmACP_I2SMICSP_ROR1 0x524e
552#define mmACP_I2SMICSP_TOR1 0x524f
553#define mmACP_I2SMICSP_RFCR1 0x5250
554#define mmACP_I2SMICSP_TFCR1 0x5251
555#define mmACP_I2SMICSP_RFF1 0x5252
556#define mmACP_I2SMICSP_TFF1 0x5253
557#define mmACP_I2SMICSP_RXDMA 0x5254
558#define mmACP_I2SMICSP_RRXDMA 0x5255
559#define mmACP_I2SMICSP_TXDMA 0x5256
560#define mmACP_I2SMICSP_RTXDMA 0x5257
561#define mmACP_I2SMICSP_COMP_PARAM_2 0x5258
562#define mmACP_I2SMICSP_COMP_PARAM_1 0x5259
563#define mmACP_I2SMICSP_COMP_VERSION 0x525a
564#define mmACP_I2SMICSP_COMP_TYPE 0x525b
565#define mmACP_I2SBT_IER 0x525c
566#define mmACP_I2SBT_IRER 0x525d
567#define mmACP_I2SBT_ITER 0x525e
568#define mmACP_I2SBT_CER 0x525f
569#define mmACP_I2SBT_CCR 0x5260
570#define mmACP_I2SBT_RXFFR 0x5261
571#define mmACP_I2SBT_TXFFR 0x5262
572#define mmACP_I2SBT_LRBR0 0x5264
573#define mmACP_I2SBT_RRBR0 0x5265
574#define mmACP_I2SBT_RER0 0x5266
575#define mmACP_I2SBT_TER0 0x5267
576#define mmACP_I2SBT_RCR0 0x5268
577#define mmACP_I2SBT_TCR0 0x5269
578#define mmACP_I2SBT_ISR0 0x526a
579#define mmACP_I2SBT_IMR0 0x526b
580#define mmACP_I2SBT_ROR0 0x526c
581#define mmACP_I2SBT_TOR0 0x526d
582#define mmACP_I2SBT_RFCR0 0x526e
583#define mmACP_I2SBT_TFCR0 0x526f
584#define mmACP_I2SBT_RFF0 0x5270
585#define mmACP_I2SBT_TFF0 0x5271
586#define mmACP_I2SBT_LRBR1 0x5274
587#define mmACP_I2SBT_RRBR1 0x5275
588#define mmACP_I2SBT_RER1 0x5276
589#define mmACP_I2SBT_TER1 0x5277
590#define mmACP_I2SBT_RCR1 0x5278
591#define mmACP_I2SBT_TCR1 0x5279
592#define mmACP_I2SBT_ISR1 0x527a
593#define mmACP_I2SBT_IMR1 0x527b
594#define mmACP_I2SBT_ROR1 0x527c
595#define mmACP_I2SBT_TOR1 0x527d
596#define mmACP_I2SBT_RFCR1 0x527e
597#define mmACP_I2SBT_TFCR1 0x527f
598#define mmACP_I2SBT_RFF1 0x5280
599#define mmACP_I2SBT_TFF1 0x5281
600#define mmACP_I2SBT_RXDMA 0x5282
601#define mmACP_I2SBT_RRXDMA 0x5283
602#define mmACP_I2SBT_TXDMA 0x5284
603#define mmACP_I2SBT_RTXDMA 0x5285
604#define mmACP_I2SBT_COMP_PARAM_2 0x5286
605#define mmACP_I2SBT_COMP_PARAM_1 0x5287
606#define mmACP_I2SBT_COMP_VERSION 0x5288
607#define mmACP_I2SBT_COMP_TYPE 0x5289
608
609#endif /* ACP_2_2_D_H */
diff --git a/sound/soc/amd/include/acp_2_2_enum.h b/sound/soc/amd/include/acp_2_2_enum.h
new file mode 100644
index 000000000000..f3577c851086
--- /dev/null
+++ b/sound/soc/amd/include/acp_2_2_enum.h
@@ -0,0 +1,1068 @@
1/*
2 * ACP_2_2 Register documentation
3 *
4 * Copyright (C) 2014 Advanced Micro Devices, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23
24#ifndef ACP_2_2_ENUM_H
25#define ACP_2_2_ENUM_H
26
27typedef enum DebugBlockId {
28 DBG_BLOCK_ID_RESERVED = 0x0,
29 DBG_BLOCK_ID_DBG = 0x1,
30 DBG_BLOCK_ID_VMC = 0x2,
31 DBG_BLOCK_ID_PDMA = 0x3,
32 DBG_BLOCK_ID_CG = 0x4,
33 DBG_BLOCK_ID_SRBM = 0x5,
34 DBG_BLOCK_ID_GRBM = 0x6,
35 DBG_BLOCK_ID_RLC = 0x7,
36 DBG_BLOCK_ID_CSC = 0x8,
37 DBG_BLOCK_ID_SEM = 0x9,
38 DBG_BLOCK_ID_IH = 0xa,
39 DBG_BLOCK_ID_SC = 0xb,
40 DBG_BLOCK_ID_SQ = 0xc,
41 DBG_BLOCK_ID_UVDU = 0xd,
42 DBG_BLOCK_ID_SQA = 0xe,
43 DBG_BLOCK_ID_SDMA0 = 0xf,
44 DBG_BLOCK_ID_SDMA1 = 0x10,
45 DBG_BLOCK_ID_SPIM = 0x11,
46 DBG_BLOCK_ID_GDS = 0x12,
47 DBG_BLOCK_ID_VC0 = 0x13,
48 DBG_BLOCK_ID_VC1 = 0x14,
49 DBG_BLOCK_ID_PA0 = 0x15,
50 DBG_BLOCK_ID_PA1 = 0x16,
51 DBG_BLOCK_ID_CP0 = 0x17,
52 DBG_BLOCK_ID_CP1 = 0x18,
53 DBG_BLOCK_ID_CP2 = 0x19,
54 DBG_BLOCK_ID_XBR = 0x1a,
55 DBG_BLOCK_ID_UVDM = 0x1b,
56 DBG_BLOCK_ID_VGT0 = 0x1c,
57 DBG_BLOCK_ID_VGT1 = 0x1d,
58 DBG_BLOCK_ID_IA = 0x1e,
59 DBG_BLOCK_ID_SXM0 = 0x1f,
60 DBG_BLOCK_ID_SXM1 = 0x20,
61 DBG_BLOCK_ID_SCT0 = 0x21,
62 DBG_BLOCK_ID_SCT1 = 0x22,
63 DBG_BLOCK_ID_SPM0 = 0x23,
64 DBG_BLOCK_ID_SPM1 = 0x24,
65 DBG_BLOCK_ID_UNUSED0 = 0x25,
66 DBG_BLOCK_ID_UNUSED1 = 0x26,
67 DBG_BLOCK_ID_TCAA = 0x27,
68 DBG_BLOCK_ID_TCAB = 0x28,
69 DBG_BLOCK_ID_TCCA = 0x29,
70 DBG_BLOCK_ID_TCCB = 0x2a,
71 DBG_BLOCK_ID_MCC0 = 0x2b,
72 DBG_BLOCK_ID_MCC1 = 0x2c,
73 DBG_BLOCK_ID_MCC2 = 0x2d,
74 DBG_BLOCK_ID_MCC3 = 0x2e,
75 DBG_BLOCK_ID_SXS0 = 0x2f,
76 DBG_BLOCK_ID_SXS1 = 0x30,
77 DBG_BLOCK_ID_SXS2 = 0x31,
78 DBG_BLOCK_ID_SXS3 = 0x32,
79 DBG_BLOCK_ID_SXS4 = 0x33,
80 DBG_BLOCK_ID_SXS5 = 0x34,
81 DBG_BLOCK_ID_SXS6 = 0x35,
82 DBG_BLOCK_ID_SXS7 = 0x36,
83 DBG_BLOCK_ID_SXS8 = 0x37,
84 DBG_BLOCK_ID_SXS9 = 0x38,
85 DBG_BLOCK_ID_BCI0 = 0x39,
86 DBG_BLOCK_ID_BCI1 = 0x3a,
87 DBG_BLOCK_ID_BCI2 = 0x3b,
88 DBG_BLOCK_ID_BCI3 = 0x3c,
89 DBG_BLOCK_ID_MCB = 0x3d,
90 DBG_BLOCK_ID_UNUSED6 = 0x3e,
91 DBG_BLOCK_ID_SQA00 = 0x3f,
92 DBG_BLOCK_ID_SQA01 = 0x40,
93 DBG_BLOCK_ID_SQA02 = 0x41,
94 DBG_BLOCK_ID_SQA10 = 0x42,
95 DBG_BLOCK_ID_SQA11 = 0x43,
96 DBG_BLOCK_ID_SQA12 = 0x44,
97 DBG_BLOCK_ID_UNUSED7 = 0x45,
98 DBG_BLOCK_ID_UNUSED8 = 0x46,
99 DBG_BLOCK_ID_SQB00 = 0x47,
100 DBG_BLOCK_ID_SQB01 = 0x48,
101 DBG_BLOCK_ID_SQB10 = 0x49,
102 DBG_BLOCK_ID_SQB11 = 0x4a,
103 DBG_BLOCK_ID_SQ00 = 0x4b,
104 DBG_BLOCK_ID_SQ01 = 0x4c,
105 DBG_BLOCK_ID_SQ10 = 0x4d,
106 DBG_BLOCK_ID_SQ11 = 0x4e,
107 DBG_BLOCK_ID_CB00 = 0x4f,
108 DBG_BLOCK_ID_CB01 = 0x50,
109 DBG_BLOCK_ID_CB02 = 0x51,
110 DBG_BLOCK_ID_CB03 = 0x52,
111 DBG_BLOCK_ID_CB04 = 0x53,
112 DBG_BLOCK_ID_UNUSED9 = 0x54,
113 DBG_BLOCK_ID_UNUSED10 = 0x55,
114 DBG_BLOCK_ID_UNUSED11 = 0x56,
115 DBG_BLOCK_ID_CB10 = 0x57,
116 DBG_BLOCK_ID_CB11 = 0x58,
117 DBG_BLOCK_ID_CB12 = 0x59,
118 DBG_BLOCK_ID_CB13 = 0x5a,
119 DBG_BLOCK_ID_CB14 = 0x5b,
120 DBG_BLOCK_ID_UNUSED12 = 0x5c,
121 DBG_BLOCK_ID_UNUSED13 = 0x5d,
122 DBG_BLOCK_ID_UNUSED14 = 0x5e,
123 DBG_BLOCK_ID_TCP0 = 0x5f,
124 DBG_BLOCK_ID_TCP1 = 0x60,
125 DBG_BLOCK_ID_TCP2 = 0x61,
126 DBG_BLOCK_ID_TCP3 = 0x62,
127 DBG_BLOCK_ID_TCP4 = 0x63,
128 DBG_BLOCK_ID_TCP5 = 0x64,
129 DBG_BLOCK_ID_TCP6 = 0x65,
130 DBG_BLOCK_ID_TCP7 = 0x66,
131 DBG_BLOCK_ID_TCP8 = 0x67,
132 DBG_BLOCK_ID_TCP9 = 0x68,
133 DBG_BLOCK_ID_TCP10 = 0x69,
134 DBG_BLOCK_ID_TCP11 = 0x6a,
135 DBG_BLOCK_ID_TCP12 = 0x6b,
136 DBG_BLOCK_ID_TCP13 = 0x6c,
137 DBG_BLOCK_ID_TCP14 = 0x6d,
138 DBG_BLOCK_ID_TCP15 = 0x6e,
139 DBG_BLOCK_ID_TCP16 = 0x6f,
140 DBG_BLOCK_ID_TCP17 = 0x70,
141 DBG_BLOCK_ID_TCP18 = 0x71,
142 DBG_BLOCK_ID_TCP19 = 0x72,
143 DBG_BLOCK_ID_TCP20 = 0x73,
144 DBG_BLOCK_ID_TCP21 = 0x74,
145 DBG_BLOCK_ID_TCP22 = 0x75,
146 DBG_BLOCK_ID_TCP23 = 0x76,
147 DBG_BLOCK_ID_TCP_RESERVED0 = 0x77,
148 DBG_BLOCK_ID_TCP_RESERVED1 = 0x78,
149 DBG_BLOCK_ID_TCP_RESERVED2 = 0x79,
150 DBG_BLOCK_ID_TCP_RESERVED3 = 0x7a,
151 DBG_BLOCK_ID_TCP_RESERVED4 = 0x7b,
152 DBG_BLOCK_ID_TCP_RESERVED5 = 0x7c,
153 DBG_BLOCK_ID_TCP_RESERVED6 = 0x7d,
154 DBG_BLOCK_ID_TCP_RESERVED7 = 0x7e,
155 DBG_BLOCK_ID_DB00 = 0x7f,
156 DBG_BLOCK_ID_DB01 = 0x80,
157 DBG_BLOCK_ID_DB02 = 0x81,
158 DBG_BLOCK_ID_DB03 = 0x82,
159 DBG_BLOCK_ID_DB04 = 0x83,
160 DBG_BLOCK_ID_UNUSED15 = 0x84,
161 DBG_BLOCK_ID_UNUSED16 = 0x85,
162 DBG_BLOCK_ID_UNUSED17 = 0x86,
163 DBG_BLOCK_ID_DB10 = 0x87,
164 DBG_BLOCK_ID_DB11 = 0x88,
165 DBG_BLOCK_ID_DB12 = 0x89,
166 DBG_BLOCK_ID_DB13 = 0x8a,
167 DBG_BLOCK_ID_DB14 = 0x8b,
168 DBG_BLOCK_ID_UNUSED18 = 0x8c,
169 DBG_BLOCK_ID_UNUSED19 = 0x8d,
170 DBG_BLOCK_ID_UNUSED20 = 0x8e,
171 DBG_BLOCK_ID_TCC0 = 0x8f,
172 DBG_BLOCK_ID_TCC1 = 0x90,
173 DBG_BLOCK_ID_TCC2 = 0x91,
174 DBG_BLOCK_ID_TCC3 = 0x92,
175 DBG_BLOCK_ID_TCC4 = 0x93,
176 DBG_BLOCK_ID_TCC5 = 0x94,
177 DBG_BLOCK_ID_TCC6 = 0x95,
178 DBG_BLOCK_ID_TCC7 = 0x96,
179 DBG_BLOCK_ID_SPS00 = 0x97,
180 DBG_BLOCK_ID_SPS01 = 0x98,
181 DBG_BLOCK_ID_SPS02 = 0x99,
182 DBG_BLOCK_ID_SPS10 = 0x9a,
183 DBG_BLOCK_ID_SPS11 = 0x9b,
184 DBG_BLOCK_ID_SPS12 = 0x9c,
185 DBG_BLOCK_ID_UNUSED21 = 0x9d,
186 DBG_BLOCK_ID_UNUSED22 = 0x9e,
187 DBG_BLOCK_ID_TA00 = 0x9f,
188 DBG_BLOCK_ID_TA01 = 0xa0,
189 DBG_BLOCK_ID_TA02 = 0xa1,
190 DBG_BLOCK_ID_TA03 = 0xa2,
191 DBG_BLOCK_ID_TA04 = 0xa3,
192 DBG_BLOCK_ID_TA05 = 0xa4,
193 DBG_BLOCK_ID_TA06 = 0xa5,
194 DBG_BLOCK_ID_TA07 = 0xa6,
195 DBG_BLOCK_ID_TA08 = 0xa7,
196 DBG_BLOCK_ID_TA09 = 0xa8,
197 DBG_BLOCK_ID_TA0A = 0xa9,
198 DBG_BLOCK_ID_TA0B = 0xaa,
199 DBG_BLOCK_ID_UNUSED23 = 0xab,
200 DBG_BLOCK_ID_UNUSED24 = 0xac,
201 DBG_BLOCK_ID_UNUSED25 = 0xad,
202 DBG_BLOCK_ID_UNUSED26 = 0xae,
203 DBG_BLOCK_ID_TA10 = 0xaf,
204 DBG_BLOCK_ID_TA11 = 0xb0,
205 DBG_BLOCK_ID_TA12 = 0xb1,
206 DBG_BLOCK_ID_TA13 = 0xb2,
207 DBG_BLOCK_ID_TA14 = 0xb3,
208 DBG_BLOCK_ID_TA15 = 0xb4,
209 DBG_BLOCK_ID_TA16 = 0xb5,
210 DBG_BLOCK_ID_TA17 = 0xb6,
211 DBG_BLOCK_ID_TA18 = 0xb7,
212 DBG_BLOCK_ID_TA19 = 0xb8,
213 DBG_BLOCK_ID_TA1A = 0xb9,
214 DBG_BLOCK_ID_TA1B = 0xba,
215 DBG_BLOCK_ID_UNUSED27 = 0xbb,
216 DBG_BLOCK_ID_UNUSED28 = 0xbc,
217 DBG_BLOCK_ID_UNUSED29 = 0xbd,
218 DBG_BLOCK_ID_UNUSED30 = 0xbe,
219 DBG_BLOCK_ID_TD00 = 0xbf,
220 DBG_BLOCK_ID_TD01 = 0xc0,
221 DBG_BLOCK_ID_TD02 = 0xc1,
222 DBG_BLOCK_ID_TD03 = 0xc2,
223 DBG_BLOCK_ID_TD04 = 0xc3,
224 DBG_BLOCK_ID_TD05 = 0xc4,
225 DBG_BLOCK_ID_TD06 = 0xc5,
226 DBG_BLOCK_ID_TD07 = 0xc6,
227 DBG_BLOCK_ID_TD08 = 0xc7,
228 DBG_BLOCK_ID_TD09 = 0xc8,
229 DBG_BLOCK_ID_TD0A = 0xc9,
230 DBG_BLOCK_ID_TD0B = 0xca,
231 DBG_BLOCK_ID_UNUSED31 = 0xcb,
232 DBG_BLOCK_ID_UNUSED32 = 0xcc,
233 DBG_BLOCK_ID_UNUSED33 = 0xcd,
234 DBG_BLOCK_ID_UNUSED34 = 0xce,
235 DBG_BLOCK_ID_TD10 = 0xcf,
236 DBG_BLOCK_ID_TD11 = 0xd0,
237 DBG_BLOCK_ID_TD12 = 0xd1,
238 DBG_BLOCK_ID_TD13 = 0xd2,
239 DBG_BLOCK_ID_TD14 = 0xd3,
240 DBG_BLOCK_ID_TD15 = 0xd4,
241 DBG_BLOCK_ID_TD16 = 0xd5,
242 DBG_BLOCK_ID_TD17 = 0xd6,
243 DBG_BLOCK_ID_TD18 = 0xd7,
244 DBG_BLOCK_ID_TD19 = 0xd8,
245 DBG_BLOCK_ID_TD1A = 0xd9,
246 DBG_BLOCK_ID_TD1B = 0xda,
247 DBG_BLOCK_ID_UNUSED35 = 0xdb,
248 DBG_BLOCK_ID_UNUSED36 = 0xdc,
249 DBG_BLOCK_ID_UNUSED37 = 0xdd,
250 DBG_BLOCK_ID_UNUSED38 = 0xde,
251 DBG_BLOCK_ID_LDS00 = 0xdf,
252 DBG_BLOCK_ID_LDS01 = 0xe0,
253 DBG_BLOCK_ID_LDS02 = 0xe1,
254 DBG_BLOCK_ID_LDS03 = 0xe2,
255 DBG_BLOCK_ID_LDS04 = 0xe3,
256 DBG_BLOCK_ID_LDS05 = 0xe4,
257 DBG_BLOCK_ID_LDS06 = 0xe5,
258 DBG_BLOCK_ID_LDS07 = 0xe6,
259 DBG_BLOCK_ID_LDS08 = 0xe7,
260 DBG_BLOCK_ID_LDS09 = 0xe8,
261 DBG_BLOCK_ID_LDS0A = 0xe9,
262 DBG_BLOCK_ID_LDS0B = 0xea,
263 DBG_BLOCK_ID_UNUSED39 = 0xeb,
264 DBG_BLOCK_ID_UNUSED40 = 0xec,
265 DBG_BLOCK_ID_UNUSED41 = 0xed,
266 DBG_BLOCK_ID_UNUSED42 = 0xee,
267 DBG_BLOCK_ID_LDS10 = 0xef,
268 DBG_BLOCK_ID_LDS11 = 0xf0,
269 DBG_BLOCK_ID_LDS12 = 0xf1,
270 DBG_BLOCK_ID_LDS13 = 0xf2,
271 DBG_BLOCK_ID_LDS14 = 0xf3,
272 DBG_BLOCK_ID_LDS15 = 0xf4,
273 DBG_BLOCK_ID_LDS16 = 0xf5,
274 DBG_BLOCK_ID_LDS17 = 0xf6,
275 DBG_BLOCK_ID_LDS18 = 0xf7,
276 DBG_BLOCK_ID_LDS19 = 0xf8,
277 DBG_BLOCK_ID_LDS1A = 0xf9,
278 DBG_BLOCK_ID_LDS1B = 0xfa,
279 DBG_BLOCK_ID_UNUSED43 = 0xfb,
280 DBG_BLOCK_ID_UNUSED44 = 0xfc,
281 DBG_BLOCK_ID_UNUSED45 = 0xfd,
282 DBG_BLOCK_ID_UNUSED46 = 0xfe,
283} DebugBlockId;
284typedef enum DebugBlockId_BY2 {
285 DBG_BLOCK_ID_RESERVED_BY2 = 0x0,
286 DBG_BLOCK_ID_VMC_BY2 = 0x1,
287 DBG_BLOCK_ID_UNUSED0_BY2 = 0x2,
288 DBG_BLOCK_ID_GRBM_BY2 = 0x3,
289 DBG_BLOCK_ID_CSC_BY2 = 0x4,
290 DBG_BLOCK_ID_IH_BY2 = 0x5,
291 DBG_BLOCK_ID_SQ_BY2 = 0x6,
292 DBG_BLOCK_ID_UVD_BY2 = 0x7,
293 DBG_BLOCK_ID_SDMA0_BY2 = 0x8,
294 DBG_BLOCK_ID_SPIM_BY2 = 0x9,
295 DBG_BLOCK_ID_VC0_BY2 = 0xa,
296 DBG_BLOCK_ID_PA_BY2 = 0xb,
297 DBG_BLOCK_ID_CP0_BY2 = 0xc,
298 DBG_BLOCK_ID_CP2_BY2 = 0xd,
299 DBG_BLOCK_ID_PC0_BY2 = 0xe,
300 DBG_BLOCK_ID_BCI0_BY2 = 0xf,
301 DBG_BLOCK_ID_SXM0_BY2 = 0x10,
302 DBG_BLOCK_ID_SCT0_BY2 = 0x11,
303 DBG_BLOCK_ID_SPM0_BY2 = 0x12,
304 DBG_BLOCK_ID_BCI2_BY2 = 0x13,
305 DBG_BLOCK_ID_TCA_BY2 = 0x14,
306 DBG_BLOCK_ID_TCCA_BY2 = 0x15,
307 DBG_BLOCK_ID_MCC_BY2 = 0x16,
308 DBG_BLOCK_ID_MCC2_BY2 = 0x17,
309 DBG_BLOCK_ID_MCD_BY2 = 0x18,
310 DBG_BLOCK_ID_MCD2_BY2 = 0x19,
311 DBG_BLOCK_ID_MCD4_BY2 = 0x1a,
312 DBG_BLOCK_ID_MCB_BY2 = 0x1b,
313 DBG_BLOCK_ID_SQA_BY2 = 0x1c,
314 DBG_BLOCK_ID_SQA02_BY2 = 0x1d,
315 DBG_BLOCK_ID_SQA11_BY2 = 0x1e,
316 DBG_BLOCK_ID_UNUSED8_BY2 = 0x1f,
317 DBG_BLOCK_ID_SQB_BY2 = 0x20,
318 DBG_BLOCK_ID_SQB10_BY2 = 0x21,
319 DBG_BLOCK_ID_UNUSED10_BY2 = 0x22,
320 DBG_BLOCK_ID_UNUSED12_BY2 = 0x23,
321 DBG_BLOCK_ID_CB_BY2 = 0x24,
322 DBG_BLOCK_ID_CB02_BY2 = 0x25,
323 DBG_BLOCK_ID_CB10_BY2 = 0x26,
324 DBG_BLOCK_ID_CB12_BY2 = 0x27,
325 DBG_BLOCK_ID_SXS_BY2 = 0x28,
326 DBG_BLOCK_ID_SXS2_BY2 = 0x29,
327 DBG_BLOCK_ID_SXS4_BY2 = 0x2a,
328 DBG_BLOCK_ID_SXS6_BY2 = 0x2b,
329 DBG_BLOCK_ID_DB_BY2 = 0x2c,
330 DBG_BLOCK_ID_DB02_BY2 = 0x2d,
331 DBG_BLOCK_ID_DB10_BY2 = 0x2e,
332 DBG_BLOCK_ID_DB12_BY2 = 0x2f,
333 DBG_BLOCK_ID_TCP_BY2 = 0x30,
334 DBG_BLOCK_ID_TCP2_BY2 = 0x31,
335 DBG_BLOCK_ID_TCP4_BY2 = 0x32,
336 DBG_BLOCK_ID_TCP6_BY2 = 0x33,
337 DBG_BLOCK_ID_TCP8_BY2 = 0x34,
338 DBG_BLOCK_ID_TCP10_BY2 = 0x35,
339 DBG_BLOCK_ID_TCP12_BY2 = 0x36,
340 DBG_BLOCK_ID_TCP14_BY2 = 0x37,
341 DBG_BLOCK_ID_TCP16_BY2 = 0x38,
342 DBG_BLOCK_ID_TCP18_BY2 = 0x39,
343 DBG_BLOCK_ID_TCP20_BY2 = 0x3a,
344 DBG_BLOCK_ID_TCP22_BY2 = 0x3b,
345 DBG_BLOCK_ID_TCP_RESERVED0_BY2 = 0x3c,
346 DBG_BLOCK_ID_TCP_RESERVED2_BY2 = 0x3d,
347 DBG_BLOCK_ID_TCP_RESERVED4_BY2 = 0x3e,
348 DBG_BLOCK_ID_TCP_RESERVED6_BY2 = 0x3f,
349 DBG_BLOCK_ID_TCC_BY2 = 0x40,
350 DBG_BLOCK_ID_TCC2_BY2 = 0x41,
351 DBG_BLOCK_ID_TCC4_BY2 = 0x42,
352 DBG_BLOCK_ID_TCC6_BY2 = 0x43,
353 DBG_BLOCK_ID_SPS_BY2 = 0x44,
354 DBG_BLOCK_ID_SPS02_BY2 = 0x45,
355 DBG_BLOCK_ID_SPS11_BY2 = 0x46,
356 DBG_BLOCK_ID_UNUSED14_BY2 = 0x47,
357 DBG_BLOCK_ID_TA_BY2 = 0x48,
358 DBG_BLOCK_ID_TA02_BY2 = 0x49,
359 DBG_BLOCK_ID_TA04_BY2 = 0x4a,
360 DBG_BLOCK_ID_TA06_BY2 = 0x4b,
361 DBG_BLOCK_ID_TA08_BY2 = 0x4c,
362 DBG_BLOCK_ID_TA0A_BY2 = 0x4d,
363 DBG_BLOCK_ID_UNUSED20_BY2 = 0x4e,
364 DBG_BLOCK_ID_UNUSED22_BY2 = 0x4f,
365 DBG_BLOCK_ID_TA10_BY2 = 0x50,
366 DBG_BLOCK_ID_TA12_BY2 = 0x51,
367 DBG_BLOCK_ID_TA14_BY2 = 0x52,
368 DBG_BLOCK_ID_TA16_BY2 = 0x53,
369 DBG_BLOCK_ID_TA18_BY2 = 0x54,
370 DBG_BLOCK_ID_TA1A_BY2 = 0x55,
371 DBG_BLOCK_ID_UNUSED24_BY2 = 0x56,
372 DBG_BLOCK_ID_UNUSED26_BY2 = 0x57,
373 DBG_BLOCK_ID_TD_BY2 = 0x58,
374 DBG_BLOCK_ID_TD02_BY2 = 0x59,
375 DBG_BLOCK_ID_TD04_BY2 = 0x5a,
376 DBG_BLOCK_ID_TD06_BY2 = 0x5b,
377 DBG_BLOCK_ID_TD08_BY2 = 0x5c,
378 DBG_BLOCK_ID_TD0A_BY2 = 0x5d,
379 DBG_BLOCK_ID_UNUSED28_BY2 = 0x5e,
380 DBG_BLOCK_ID_UNUSED30_BY2 = 0x5f,
381 DBG_BLOCK_ID_TD10_BY2 = 0x60,
382 DBG_BLOCK_ID_TD12_BY2 = 0x61,
383 DBG_BLOCK_ID_TD14_BY2 = 0x62,
384 DBG_BLOCK_ID_TD16_BY2 = 0x63,
385 DBG_BLOCK_ID_TD18_BY2 = 0x64,
386 DBG_BLOCK_ID_TD1A_BY2 = 0x65,
387 DBG_BLOCK_ID_UNUSED32_BY2 = 0x66,
388 DBG_BLOCK_ID_UNUSED34_BY2 = 0x67,
389 DBG_BLOCK_ID_LDS_BY2 = 0x68,
390 DBG_BLOCK_ID_LDS02_BY2 = 0x69,
391 DBG_BLOCK_ID_LDS04_BY2 = 0x6a,
392 DBG_BLOCK_ID_LDS06_BY2 = 0x6b,
393 DBG_BLOCK_ID_LDS08_BY2 = 0x6c,
394 DBG_BLOCK_ID_LDS0A_BY2 = 0x6d,
395 DBG_BLOCK_ID_UNUSED36_BY2 = 0x6e,
396 DBG_BLOCK_ID_UNUSED38_BY2 = 0x6f,
397 DBG_BLOCK_ID_LDS10_BY2 = 0x70,
398 DBG_BLOCK_ID_LDS12_BY2 = 0x71,
399 DBG_BLOCK_ID_LDS14_BY2 = 0x72,
400 DBG_BLOCK_ID_LDS16_BY2 = 0x73,
401 DBG_BLOCK_ID_LDS18_BY2 = 0x74,
402 DBG_BLOCK_ID_LDS1A_BY2 = 0x75,
403 DBG_BLOCK_ID_UNUSED40_BY2 = 0x76,
404 DBG_BLOCK_ID_UNUSED42_BY2 = 0x77,
405} DebugBlockId_BY2;
406typedef enum DebugBlockId_BY4 {
407 DBG_BLOCK_ID_RESERVED_BY4 = 0x0,
408 DBG_BLOCK_ID_UNUSED0_BY4 = 0x1,
409 DBG_BLOCK_ID_CSC_BY4 = 0x2,
410 DBG_BLOCK_ID_SQ_BY4 = 0x3,
411 DBG_BLOCK_ID_SDMA0_BY4 = 0x4,
412 DBG_BLOCK_ID_VC0_BY4 = 0x5,
413 DBG_BLOCK_ID_CP0_BY4 = 0x6,
414 DBG_BLOCK_ID_UNUSED1_BY4 = 0x7,
415 DBG_BLOCK_ID_SXM0_BY4 = 0x8,
416 DBG_BLOCK_ID_SPM0_BY4 = 0x9,
417 DBG_BLOCK_ID_TCAA_BY4 = 0xa,
418 DBG_BLOCK_ID_MCC_BY4 = 0xb,
419 DBG_BLOCK_ID_MCD_BY4 = 0xc,
420 DBG_BLOCK_ID_MCD4_BY4 = 0xd,
421 DBG_BLOCK_ID_SQA_BY4 = 0xe,
422 DBG_BLOCK_ID_SQA11_BY4 = 0xf,
423 DBG_BLOCK_ID_SQB_BY4 = 0x10,
424 DBG_BLOCK_ID_UNUSED10_BY4 = 0x11,
425 DBG_BLOCK_ID_CB_BY4 = 0x12,
426 DBG_BLOCK_ID_CB10_BY4 = 0x13,
427 DBG_BLOCK_ID_SXS_BY4 = 0x14,
428 DBG_BLOCK_ID_SXS4_BY4 = 0x15,
429 DBG_BLOCK_ID_DB_BY4 = 0x16,
430 DBG_BLOCK_ID_DB10_BY4 = 0x17,
431 DBG_BLOCK_ID_TCP_BY4 = 0x18,
432 DBG_BLOCK_ID_TCP4_BY4 = 0x19,
433 DBG_BLOCK_ID_TCP8_BY4 = 0x1a,
434 DBG_BLOCK_ID_TCP12_BY4 = 0x1b,
435 DBG_BLOCK_ID_TCP16_BY4 = 0x1c,
436 DBG_BLOCK_ID_TCP20_BY4 = 0x1d,
437 DBG_BLOCK_ID_TCP_RESERVED0_BY4 = 0x1e,
438 DBG_BLOCK_ID_TCP_RESERVED4_BY4 = 0x1f,
439 DBG_BLOCK_ID_TCC_BY4 = 0x20,
440 DBG_BLOCK_ID_TCC4_BY4 = 0x21,
441 DBG_BLOCK_ID_SPS_BY4 = 0x22,
442 DBG_BLOCK_ID_SPS11_BY4 = 0x23,
443 DBG_BLOCK_ID_TA_BY4 = 0x24,
444 DBG_BLOCK_ID_TA04_BY4 = 0x25,
445 DBG_BLOCK_ID_TA08_BY4 = 0x26,
446 DBG_BLOCK_ID_UNUSED20_BY4 = 0x27,
447 DBG_BLOCK_ID_TA10_BY4 = 0x28,
448 DBG_BLOCK_ID_TA14_BY4 = 0x29,
449 DBG_BLOCK_ID_TA18_BY4 = 0x2a,
450 DBG_BLOCK_ID_UNUSED24_BY4 = 0x2b,
451 DBG_BLOCK_ID_TD_BY4 = 0x2c,
452 DBG_BLOCK_ID_TD04_BY4 = 0x2d,
453 DBG_BLOCK_ID_TD08_BY4 = 0x2e,
454 DBG_BLOCK_ID_UNUSED28_BY4 = 0x2f,
455 DBG_BLOCK_ID_TD10_BY4 = 0x30,
456 DBG_BLOCK_ID_TD14_BY4 = 0x31,
457 DBG_BLOCK_ID_TD18_BY4 = 0x32,
458 DBG_BLOCK_ID_UNUSED32_BY4 = 0x33,
459 DBG_BLOCK_ID_LDS_BY4 = 0x34,
460 DBG_BLOCK_ID_LDS04_BY4 = 0x35,
461 DBG_BLOCK_ID_LDS08_BY4 = 0x36,
462 DBG_BLOCK_ID_UNUSED36_BY4 = 0x37,
463 DBG_BLOCK_ID_LDS10_BY4 = 0x38,
464 DBG_BLOCK_ID_LDS14_BY4 = 0x39,
465 DBG_BLOCK_ID_LDS18_BY4 = 0x3a,
466 DBG_BLOCK_ID_UNUSED40_BY4 = 0x3b,
467} DebugBlockId_BY4;
468typedef enum DebugBlockId_BY8 {
469 DBG_BLOCK_ID_RESERVED_BY8 = 0x0,
470 DBG_BLOCK_ID_CSC_BY8 = 0x1,
471 DBG_BLOCK_ID_SDMA0_BY8 = 0x2,
472 DBG_BLOCK_ID_CP0_BY8 = 0x3,
473 DBG_BLOCK_ID_SXM0_BY8 = 0x4,
474 DBG_BLOCK_ID_TCA_BY8 = 0x5,
475 DBG_BLOCK_ID_MCD_BY8 = 0x6,
476 DBG_BLOCK_ID_SQA_BY8 = 0x7,
477 DBG_BLOCK_ID_SQB_BY8 = 0x8,
478 DBG_BLOCK_ID_CB_BY8 = 0x9,
479 DBG_BLOCK_ID_SXS_BY8 = 0xa,
480 DBG_BLOCK_ID_DB_BY8 = 0xb,
481 DBG_BLOCK_ID_TCP_BY8 = 0xc,
482 DBG_BLOCK_ID_TCP8_BY8 = 0xd,
483 DBG_BLOCK_ID_TCP16_BY8 = 0xe,
484 DBG_BLOCK_ID_TCP_RESERVED0_BY8 = 0xf,
485 DBG_BLOCK_ID_TCC_BY8 = 0x10,
486 DBG_BLOCK_ID_SPS_BY8 = 0x11,
487 DBG_BLOCK_ID_TA_BY8 = 0x12,
488 DBG_BLOCK_ID_TA08_BY8 = 0x13,
489 DBG_BLOCK_ID_TA10_BY8 = 0x14,
490 DBG_BLOCK_ID_TA18_BY8 = 0x15,
491 DBG_BLOCK_ID_TD_BY8 = 0x16,
492 DBG_BLOCK_ID_TD08_BY8 = 0x17,
493 DBG_BLOCK_ID_TD10_BY8 = 0x18,
494 DBG_BLOCK_ID_TD18_BY8 = 0x19,
495 DBG_BLOCK_ID_LDS_BY8 = 0x1a,
496 DBG_BLOCK_ID_LDS08_BY8 = 0x1b,
497 DBG_BLOCK_ID_LDS10_BY8 = 0x1c,
498 DBG_BLOCK_ID_LDS18_BY8 = 0x1d,
499} DebugBlockId_BY8;
500typedef enum DebugBlockId_BY16 {
501 DBG_BLOCK_ID_RESERVED_BY16 = 0x0,
502 DBG_BLOCK_ID_SDMA0_BY16 = 0x1,
503 DBG_BLOCK_ID_SXM_BY16 = 0x2,
504 DBG_BLOCK_ID_MCD_BY16 = 0x3,
505 DBG_BLOCK_ID_SQB_BY16 = 0x4,
506 DBG_BLOCK_ID_SXS_BY16 = 0x5,
507 DBG_BLOCK_ID_TCP_BY16 = 0x6,
508 DBG_BLOCK_ID_TCP16_BY16 = 0x7,
509 DBG_BLOCK_ID_TCC_BY16 = 0x8,
510 DBG_BLOCK_ID_TA_BY16 = 0x9,
511 DBG_BLOCK_ID_TA10_BY16 = 0xa,
512 DBG_BLOCK_ID_TD_BY16 = 0xb,
513 DBG_BLOCK_ID_TD10_BY16 = 0xc,
514 DBG_BLOCK_ID_LDS_BY16 = 0xd,
515 DBG_BLOCK_ID_LDS10_BY16 = 0xe,
516} DebugBlockId_BY16;
517typedef enum SurfaceEndian {
518 ENDIAN_NONE = 0x0,
519 ENDIAN_8IN16 = 0x1,
520 ENDIAN_8IN32 = 0x2,
521 ENDIAN_8IN64 = 0x3,
522} SurfaceEndian;
523typedef enum ArrayMode {
524 ARRAY_LINEAR_GENERAL = 0x0,
525 ARRAY_LINEAR_ALIGNED = 0x1,
526 ARRAY_1D_TILED_THIN1 = 0x2,
527 ARRAY_1D_TILED_THICK = 0x3,
528 ARRAY_2D_TILED_THIN1 = 0x4,
529 ARRAY_PRT_TILED_THIN1 = 0x5,
530 ARRAY_PRT_2D_TILED_THIN1 = 0x6,
531 ARRAY_2D_TILED_THICK = 0x7,
532 ARRAY_2D_TILED_XTHICK = 0x8,
533 ARRAY_PRT_TILED_THICK = 0x9,
534 ARRAY_PRT_2D_TILED_THICK = 0xa,
535 ARRAY_PRT_3D_TILED_THIN1 = 0xb,
536 ARRAY_3D_TILED_THIN1 = 0xc,
537 ARRAY_3D_TILED_THICK = 0xd,
538 ARRAY_3D_TILED_XTHICK = 0xe,
539 ARRAY_PRT_3D_TILED_THICK = 0xf,
540} ArrayMode;
541typedef enum PipeTiling {
542 CONFIG_1_PIPE = 0x0,
543 CONFIG_2_PIPE = 0x1,
544 CONFIG_4_PIPE = 0x2,
545 CONFIG_8_PIPE = 0x3,
546} PipeTiling;
547typedef enum BankTiling {
548 CONFIG_4_BANK = 0x0,
549 CONFIG_8_BANK = 0x1,
550} BankTiling;
551typedef enum GroupInterleave {
552 CONFIG_256B_GROUP = 0x0,
553 CONFIG_512B_GROUP = 0x1,
554} GroupInterleave;
555typedef enum RowTiling {
556 CONFIG_1KB_ROW = 0x0,
557 CONFIG_2KB_ROW = 0x1,
558 CONFIG_4KB_ROW = 0x2,
559 CONFIG_8KB_ROW = 0x3,
560 CONFIG_1KB_ROW_OPT = 0x4,
561 CONFIG_2KB_ROW_OPT = 0x5,
562 CONFIG_4KB_ROW_OPT = 0x6,
563 CONFIG_8KB_ROW_OPT = 0x7,
564} RowTiling;
565typedef enum BankSwapBytes {
566 CONFIG_128B_SWAPS = 0x0,
567 CONFIG_256B_SWAPS = 0x1,
568 CONFIG_512B_SWAPS = 0x2,
569 CONFIG_1KB_SWAPS = 0x3,
570} BankSwapBytes;
571typedef enum SampleSplitBytes {
572 CONFIG_1KB_SPLIT = 0x0,
573 CONFIG_2KB_SPLIT = 0x1,
574 CONFIG_4KB_SPLIT = 0x2,
575 CONFIG_8KB_SPLIT = 0x3,
576} SampleSplitBytes;
577typedef enum NumPipes {
578 ADDR_CONFIG_1_PIPE = 0x0,
579 ADDR_CONFIG_2_PIPE = 0x1,
580 ADDR_CONFIG_4_PIPE = 0x2,
581 ADDR_CONFIG_8_PIPE = 0x3,
582} NumPipes;
583typedef enum PipeInterleaveSize {
584 ADDR_CONFIG_PIPE_INTERLEAVE_256B = 0x0,
585 ADDR_CONFIG_PIPE_INTERLEAVE_512B = 0x1,
586} PipeInterleaveSize;
587typedef enum BankInterleaveSize {
588 ADDR_CONFIG_BANK_INTERLEAVE_1 = 0x0,
589 ADDR_CONFIG_BANK_INTERLEAVE_2 = 0x1,
590 ADDR_CONFIG_BANK_INTERLEAVE_4 = 0x2,
591 ADDR_CONFIG_BANK_INTERLEAVE_8 = 0x3,
592} BankInterleaveSize;
593typedef enum NumShaderEngines {
594 ADDR_CONFIG_1_SHADER_ENGINE = 0x0,
595 ADDR_CONFIG_2_SHADER_ENGINE = 0x1,
596} NumShaderEngines;
597typedef enum ShaderEngineTileSize {
598 ADDR_CONFIG_SE_TILE_16 = 0x0,
599 ADDR_CONFIG_SE_TILE_32 = 0x1,
600} ShaderEngineTileSize;
601typedef enum NumGPUs {
602 ADDR_CONFIG_1_GPU = 0x0,
603 ADDR_CONFIG_2_GPU = 0x1,
604 ADDR_CONFIG_4_GPU = 0x2,
605} NumGPUs;
606typedef enum MultiGPUTileSize {
607 ADDR_CONFIG_GPU_TILE_16 = 0x0,
608 ADDR_CONFIG_GPU_TILE_32 = 0x1,
609 ADDR_CONFIG_GPU_TILE_64 = 0x2,
610 ADDR_CONFIG_GPU_TILE_128 = 0x3,
611} MultiGPUTileSize;
612typedef enum RowSize {
613 ADDR_CONFIG_1KB_ROW = 0x0,
614 ADDR_CONFIG_2KB_ROW = 0x1,
615 ADDR_CONFIG_4KB_ROW = 0x2,
616} RowSize;
617typedef enum NumLowerPipes {
618 ADDR_CONFIG_1_LOWER_PIPES = 0x0,
619 ADDR_CONFIG_2_LOWER_PIPES = 0x1,
620} NumLowerPipes;
621typedef enum ColorTransform {
622 DCC_CT_AUTO = 0x0,
623 DCC_CT_NONE = 0x1,
624 ABGR_TO_A_BG_G_RB = 0x2,
625 BGRA_TO_BG_G_RB_A = 0x3,
626} ColorTransform;
627typedef enum CompareRef {
628 REF_NEVER = 0x0,
629 REF_LESS = 0x1,
630 REF_EQUAL = 0x2,
631 REF_LEQUAL = 0x3,
632 REF_GREATER = 0x4,
633 REF_NOTEQUAL = 0x5,
634 REF_GEQUAL = 0x6,
635 REF_ALWAYS = 0x7,
636} CompareRef;
637typedef enum ReadSize {
638 READ_256_BITS = 0x0,
639 READ_512_BITS = 0x1,
640} ReadSize;
641typedef enum DepthFormat {
642 DEPTH_INVALID = 0x0,
643 DEPTH_16 = 0x1,
644 DEPTH_X8_24 = 0x2,
645 DEPTH_8_24 = 0x3,
646 DEPTH_X8_24_FLOAT = 0x4,
647 DEPTH_8_24_FLOAT = 0x5,
648 DEPTH_32_FLOAT = 0x6,
649 DEPTH_X24_8_32_FLOAT = 0x7,
650} DepthFormat;
651typedef enum ZFormat {
652 Z_INVALID = 0x0,
653 Z_16 = 0x1,
654 Z_24 = 0x2,
655 Z_32_FLOAT = 0x3,
656} ZFormat;
657typedef enum StencilFormat {
658 STENCIL_INVALID = 0x0,
659 STENCIL_8 = 0x1,
660} StencilFormat;
661typedef enum CmaskMode {
662 CMASK_CLEAR_NONE = 0x0,
663 CMASK_CLEAR_ONE = 0x1,
664 CMASK_CLEAR_ALL = 0x2,
665 CMASK_ANY_EXPANDED = 0x3,
666 CMASK_ALPHA0_FRAG1 = 0x4,
667 CMASK_ALPHA0_FRAG2 = 0x5,
668 CMASK_ALPHA0_FRAG4 = 0x6,
669 CMASK_ALPHA0_FRAGS = 0x7,
670 CMASK_ALPHA1_FRAG1 = 0x8,
671 CMASK_ALPHA1_FRAG2 = 0x9,
672 CMASK_ALPHA1_FRAG4 = 0xa,
673 CMASK_ALPHA1_FRAGS = 0xb,
674 CMASK_ALPHAX_FRAG1 = 0xc,
675 CMASK_ALPHAX_FRAG2 = 0xd,
676 CMASK_ALPHAX_FRAG4 = 0xe,
677 CMASK_ALPHAX_FRAGS = 0xf,
678} CmaskMode;
679typedef enum QuadExportFormat {
680 EXPORT_UNUSED = 0x0,
681 EXPORT_32_R = 0x1,
682 EXPORT_32_GR = 0x2,
683 EXPORT_32_AR = 0x3,
684 EXPORT_FP16_ABGR = 0x4,
685 EXPORT_UNSIGNED16_ABGR = 0x5,
686 EXPORT_SIGNED16_ABGR = 0x6,
687 EXPORT_32_ABGR = 0x7,
688} QuadExportFormat;
689typedef enum QuadExportFormatOld {
690 EXPORT_4P_32BPC_ABGR = 0x0,
691 EXPORT_4P_16BPC_ABGR = 0x1,
692 EXPORT_4P_32BPC_GR = 0x2,
693 EXPORT_4P_32BPC_AR = 0x3,
694 EXPORT_2P_32BPC_ABGR = 0x4,
695 EXPORT_8P_32BPC_R = 0x5,
696} QuadExportFormatOld;
697typedef enum ColorFormat {
698 COLOR_INVALID = 0x0,
699 COLOR_8 = 0x1,
700 COLOR_16 = 0x2,
701 COLOR_8_8 = 0x3,
702 COLOR_32 = 0x4,
703 COLOR_16_16 = 0x5,
704 COLOR_10_11_11 = 0x6,
705 COLOR_11_11_10 = 0x7,
706 COLOR_10_10_10_2 = 0x8,
707 COLOR_2_10_10_10 = 0x9,
708 COLOR_8_8_8_8 = 0xa,
709 COLOR_32_32 = 0xb,
710 COLOR_16_16_16_16 = 0xc,
711 COLOR_RESERVED_13 = 0xd,
712 COLOR_32_32_32_32 = 0xe,
713 COLOR_RESERVED_15 = 0xf,
714 COLOR_5_6_5 = 0x10,
715 COLOR_1_5_5_5 = 0x11,
716 COLOR_5_5_5_1 = 0x12,
717 COLOR_4_4_4_4 = 0x13,
718 COLOR_8_24 = 0x14,
719 COLOR_24_8 = 0x15,
720 COLOR_X24_8_32_FLOAT = 0x16,
721 COLOR_RESERVED_23 = 0x17,
722} ColorFormat;
723typedef enum SurfaceFormat {
724 FMT_INVALID = 0x0,
725 FMT_8 = 0x1,
726 FMT_16 = 0x2,
727 FMT_8_8 = 0x3,
728 FMT_32 = 0x4,
729 FMT_16_16 = 0x5,
730 FMT_10_11_11 = 0x6,
731 FMT_11_11_10 = 0x7,
732 FMT_10_10_10_2 = 0x8,
733 FMT_2_10_10_10 = 0x9,
734 FMT_8_8_8_8 = 0xa,
735 FMT_32_32 = 0xb,
736 FMT_16_16_16_16 = 0xc,
737 FMT_32_32_32 = 0xd,
738 FMT_32_32_32_32 = 0xe,
739 FMT_RESERVED_4 = 0xf,
740 FMT_5_6_5 = 0x10,
741 FMT_1_5_5_5 = 0x11,
742 FMT_5_5_5_1 = 0x12,
743 FMT_4_4_4_4 = 0x13,
744 FMT_8_24 = 0x14,
745 FMT_24_8 = 0x15,
746 FMT_X24_8_32_FLOAT = 0x16,
747 FMT_RESERVED_33 = 0x17,
748 FMT_11_11_10_FLOAT = 0x18,
749 FMT_16_FLOAT = 0x19,
750 FMT_32_FLOAT = 0x1a,
751 FMT_16_16_FLOAT = 0x1b,
752 FMT_8_24_FLOAT = 0x1c,
753 FMT_24_8_FLOAT = 0x1d,
754 FMT_32_32_FLOAT = 0x1e,
755 FMT_10_11_11_FLOAT = 0x1f,
756 FMT_16_16_16_16_FLOAT = 0x20,
757 FMT_3_3_2 = 0x21,
758 FMT_6_5_5 = 0x22,
759 FMT_32_32_32_32_FLOAT = 0x23,
760 FMT_RESERVED_36 = 0x24,
761 FMT_1 = 0x25,
762 FMT_1_REVERSED = 0x26,
763 FMT_GB_GR = 0x27,
764 FMT_BG_RG = 0x28,
765 FMT_32_AS_8 = 0x29,
766 FMT_32_AS_8_8 = 0x2a,
767 FMT_5_9_9_9_SHAREDEXP = 0x2b,
768 FMT_8_8_8 = 0x2c,
769 FMT_16_16_16 = 0x2d,
770 FMT_16_16_16_FLOAT = 0x2e,
771 FMT_4_4 = 0x2f,
772 FMT_32_32_32_FLOAT = 0x30,
773 FMT_BC1 = 0x31,
774 FMT_BC2 = 0x32,
775 FMT_BC3 = 0x33,
776 FMT_BC4 = 0x34,
777 FMT_BC5 = 0x35,
778 FMT_BC6 = 0x36,
779 FMT_BC7 = 0x37,
780 FMT_32_AS_32_32_32_32 = 0x38,
781 FMT_APC3 = 0x39,
782 FMT_APC4 = 0x3a,
783 FMT_APC5 = 0x3b,
784 FMT_APC6 = 0x3c,
785 FMT_APC7 = 0x3d,
786 FMT_CTX1 = 0x3e,
787 FMT_RESERVED_63 = 0x3f,
788} SurfaceFormat;
789typedef enum BUF_DATA_FORMAT {
790 BUF_DATA_FORMAT_INVALID = 0x0,
791 BUF_DATA_FORMAT_8 = 0x1,
792 BUF_DATA_FORMAT_16 = 0x2,
793 BUF_DATA_FORMAT_8_8 = 0x3,
794 BUF_DATA_FORMAT_32 = 0x4,
795 BUF_DATA_FORMAT_16_16 = 0x5,
796 BUF_DATA_FORMAT_10_11_11 = 0x6,
797 BUF_DATA_FORMAT_11_11_10 = 0x7,
798 BUF_DATA_FORMAT_10_10_10_2 = 0x8,
799 BUF_DATA_FORMAT_2_10_10_10 = 0x9,
800 BUF_DATA_FORMAT_8_8_8_8 = 0xa,
801 BUF_DATA_FORMAT_32_32 = 0xb,
802 BUF_DATA_FORMAT_16_16_16_16 = 0xc,
803 BUF_DATA_FORMAT_32_32_32 = 0xd,
804 BUF_DATA_FORMAT_32_32_32_32 = 0xe,
805 BUF_DATA_FORMAT_RESERVED_15 = 0xf,
806} BUF_DATA_FORMAT;
807typedef enum IMG_DATA_FORMAT {
808 IMG_DATA_FORMAT_INVALID = 0x0,
809 IMG_DATA_FORMAT_8 = 0x1,
810 IMG_DATA_FORMAT_16 = 0x2,
811 IMG_DATA_FORMAT_8_8 = 0x3,
812 IMG_DATA_FORMAT_32 = 0x4,
813 IMG_DATA_FORMAT_16_16 = 0x5,
814 IMG_DATA_FORMAT_10_11_11 = 0x6,
815 IMG_DATA_FORMAT_11_11_10 = 0x7,
816 IMG_DATA_FORMAT_10_10_10_2 = 0x8,
817 IMG_DATA_FORMAT_2_10_10_10 = 0x9,
818 IMG_DATA_FORMAT_8_8_8_8 = 0xa,
819 IMG_DATA_FORMAT_32_32 = 0xb,
820 IMG_DATA_FORMAT_16_16_16_16 = 0xc,
821 IMG_DATA_FORMAT_32_32_32 = 0xd,
822 IMG_DATA_FORMAT_32_32_32_32 = 0xe,
823 IMG_DATA_FORMAT_RESERVED_15 = 0xf,
824 IMG_DATA_FORMAT_5_6_5 = 0x10,
825 IMG_DATA_FORMAT_1_5_5_5 = 0x11,
826 IMG_DATA_FORMAT_5_5_5_1 = 0x12,
827 IMG_DATA_FORMAT_4_4_4_4 = 0x13,
828 IMG_DATA_FORMAT_8_24 = 0x14,
829 IMG_DATA_FORMAT_24_8 = 0x15,
830 IMG_DATA_FORMAT_X24_8_32 = 0x16,
831 IMG_DATA_FORMAT_RESERVED_23 = 0x17,
832 IMG_DATA_FORMAT_RESERVED_24 = 0x18,
833 IMG_DATA_FORMAT_RESERVED_25 = 0x19,
834 IMG_DATA_FORMAT_RESERVED_26 = 0x1a,
835 IMG_DATA_FORMAT_RESERVED_27 = 0x1b,
836 IMG_DATA_FORMAT_RESERVED_28 = 0x1c,
837 IMG_DATA_FORMAT_RESERVED_29 = 0x1d,
838 IMG_DATA_FORMAT_RESERVED_30 = 0x1e,
839 IMG_DATA_FORMAT_RESERVED_31 = 0x1f,
840 IMG_DATA_FORMAT_GB_GR = 0x20,
841 IMG_DATA_FORMAT_BG_RG = 0x21,
842 IMG_DATA_FORMAT_5_9_9_9 = 0x22,
843 IMG_DATA_FORMAT_BC1 = 0x23,
844 IMG_DATA_FORMAT_BC2 = 0x24,
845 IMG_DATA_FORMAT_BC3 = 0x25,
846 IMG_DATA_FORMAT_BC4 = 0x26,
847 IMG_DATA_FORMAT_BC5 = 0x27,
848 IMG_DATA_FORMAT_BC6 = 0x28,
849 IMG_DATA_FORMAT_BC7 = 0x29,
850 IMG_DATA_FORMAT_RESERVED_42 = 0x2a,
851 IMG_DATA_FORMAT_RESERVED_43 = 0x2b,
852 IMG_DATA_FORMAT_FMASK8_S2_F1 = 0x2c,
853 IMG_DATA_FORMAT_FMASK8_S4_F1 = 0x2d,
854 IMG_DATA_FORMAT_FMASK8_S8_F1 = 0x2e,
855 IMG_DATA_FORMAT_FMASK8_S2_F2 = 0x2f,
856 IMG_DATA_FORMAT_FMASK8_S4_F2 = 0x30,
857 IMG_DATA_FORMAT_FMASK8_S4_F4 = 0x31,
858 IMG_DATA_FORMAT_FMASK16_S16_F1 = 0x32,
859 IMG_DATA_FORMAT_FMASK16_S8_F2 = 0x33,
860 IMG_DATA_FORMAT_FMASK32_S16_F2 = 0x34,
861 IMG_DATA_FORMAT_FMASK32_S8_F4 = 0x35,
862 IMG_DATA_FORMAT_FMASK32_S8_F8 = 0x36,
863 IMG_DATA_FORMAT_FMASK64_S16_F4 = 0x37,
864 IMG_DATA_FORMAT_FMASK64_S16_F8 = 0x38,
865 IMG_DATA_FORMAT_4_4 = 0x39,
866 IMG_DATA_FORMAT_6_5_5 = 0x3a,
867 IMG_DATA_FORMAT_1 = 0x3b,
868 IMG_DATA_FORMAT_1_REVERSED = 0x3c,
869 IMG_DATA_FORMAT_32_AS_8 = 0x3d,
870 IMG_DATA_FORMAT_32_AS_8_8 = 0x3e,
871 IMG_DATA_FORMAT_32_AS_32_32_32_32 = 0x3f,
872} IMG_DATA_FORMAT;
873typedef enum BUF_NUM_FORMAT {
874 BUF_NUM_FORMAT_UNORM = 0x0,
875 BUF_NUM_FORMAT_SNORM = 0x1,
876 BUF_NUM_FORMAT_USCALED = 0x2,
877 BUF_NUM_FORMAT_SSCALED = 0x3,
878 BUF_NUM_FORMAT_UINT = 0x4,
879 BUF_NUM_FORMAT_SINT = 0x5,
880 BUF_NUM_FORMAT_RESERVED_6 = 0x6,
881 BUF_NUM_FORMAT_FLOAT = 0x7,
882} BUF_NUM_FORMAT;
883typedef enum IMG_NUM_FORMAT {
884 IMG_NUM_FORMAT_UNORM = 0x0,
885 IMG_NUM_FORMAT_SNORM = 0x1,
886 IMG_NUM_FORMAT_USCALED = 0x2,
887 IMG_NUM_FORMAT_SSCALED = 0x3,
888 IMG_NUM_FORMAT_UINT = 0x4,
889 IMG_NUM_FORMAT_SINT = 0x5,
890 IMG_NUM_FORMAT_RESERVED_6 = 0x6,
891 IMG_NUM_FORMAT_FLOAT = 0x7,
892 IMG_NUM_FORMAT_RESERVED_8 = 0x8,
893 IMG_NUM_FORMAT_SRGB = 0x9,
894 IMG_NUM_FORMAT_RESERVED_10 = 0xa,
895 IMG_NUM_FORMAT_RESERVED_11 = 0xb,
896 IMG_NUM_FORMAT_RESERVED_12 = 0xc,
897 IMG_NUM_FORMAT_RESERVED_13 = 0xd,
898 IMG_NUM_FORMAT_RESERVED_14 = 0xe,
899 IMG_NUM_FORMAT_RESERVED_15 = 0xf,
900} IMG_NUM_FORMAT;
901typedef enum TileType {
902 ARRAY_COLOR_TILE = 0x0,
903 ARRAY_DEPTH_TILE = 0x1,
904} TileType;
905typedef enum NonDispTilingOrder {
906 ADDR_SURF_MICRO_TILING_DISPLAY = 0x0,
907 ADDR_SURF_MICRO_TILING_NON_DISPLAY = 0x1,
908} NonDispTilingOrder;
909typedef enum MicroTileMode {
910 ADDR_SURF_DISPLAY_MICRO_TILING = 0x0,
911 ADDR_SURF_THIN_MICRO_TILING = 0x1,
912 ADDR_SURF_DEPTH_MICRO_TILING = 0x2,
913 ADDR_SURF_ROTATED_MICRO_TILING = 0x3,
914 ADDR_SURF_THICK_MICRO_TILING = 0x4,
915} MicroTileMode;
916typedef enum TileSplit {
917 ADDR_SURF_TILE_SPLIT_64B = 0x0,
918 ADDR_SURF_TILE_SPLIT_128B = 0x1,
919 ADDR_SURF_TILE_SPLIT_256B = 0x2,
920 ADDR_SURF_TILE_SPLIT_512B = 0x3,
921 ADDR_SURF_TILE_SPLIT_1KB = 0x4,
922 ADDR_SURF_TILE_SPLIT_2KB = 0x5,
923 ADDR_SURF_TILE_SPLIT_4KB = 0x6,
924} TileSplit;
925typedef enum SampleSplit {
926 ADDR_SURF_SAMPLE_SPLIT_1 = 0x0,
927 ADDR_SURF_SAMPLE_SPLIT_2 = 0x1,
928 ADDR_SURF_SAMPLE_SPLIT_4 = 0x2,
929 ADDR_SURF_SAMPLE_SPLIT_8 = 0x3,
930} SampleSplit;
931typedef enum PipeConfig {
932 ADDR_SURF_P2 = 0x0,
933 ADDR_SURF_P2_RESERVED0 = 0x1,
934 ADDR_SURF_P2_RESERVED1 = 0x2,
935 ADDR_SURF_P2_RESERVED2 = 0x3,
936 ADDR_SURF_P4_8x16 = 0x4,
937 ADDR_SURF_P4_16x16 = 0x5,
938 ADDR_SURF_P4_16x32 = 0x6,
939 ADDR_SURF_P4_32x32 = 0x7,
940 ADDR_SURF_P8_16x16_8x16 = 0x8,
941 ADDR_SURF_P8_16x32_8x16 = 0x9,
942 ADDR_SURF_P8_32x32_8x16 = 0xa,
943 ADDR_SURF_P8_16x32_16x16 = 0xb,
944 ADDR_SURF_P8_32x32_16x16 = 0xc,
945 ADDR_SURF_P8_32x32_16x32 = 0xd,
946 ADDR_SURF_P8_32x64_32x32 = 0xe,
947 ADDR_SURF_P8_RESERVED0 = 0xf,
948 ADDR_SURF_P16_32x32_8x16 = 0x10,
949 ADDR_SURF_P16_32x32_16x16 = 0x11,
950} PipeConfig;
951typedef enum NumBanks {
952 ADDR_SURF_2_BANK = 0x0,
953 ADDR_SURF_4_BANK = 0x1,
954 ADDR_SURF_8_BANK = 0x2,
955 ADDR_SURF_16_BANK = 0x3,
956} NumBanks;
957typedef enum BankWidth {
958 ADDR_SURF_BANK_WIDTH_1 = 0x0,
959 ADDR_SURF_BANK_WIDTH_2 = 0x1,
960 ADDR_SURF_BANK_WIDTH_4 = 0x2,
961 ADDR_SURF_BANK_WIDTH_8 = 0x3,
962} BankWidth;
963typedef enum BankHeight {
964 ADDR_SURF_BANK_HEIGHT_1 = 0x0,
965 ADDR_SURF_BANK_HEIGHT_2 = 0x1,
966 ADDR_SURF_BANK_HEIGHT_4 = 0x2,
967 ADDR_SURF_BANK_HEIGHT_8 = 0x3,
968} BankHeight;
969typedef enum BankWidthHeight {
970 ADDR_SURF_BANK_WH_1 = 0x0,
971 ADDR_SURF_BANK_WH_2 = 0x1,
972 ADDR_SURF_BANK_WH_4 = 0x2,
973 ADDR_SURF_BANK_WH_8 = 0x3,
974} BankWidthHeight;
975typedef enum MacroTileAspect {
976 ADDR_SURF_MACRO_ASPECT_1 = 0x0,
977 ADDR_SURF_MACRO_ASPECT_2 = 0x1,
978 ADDR_SURF_MACRO_ASPECT_4 = 0x2,
979 ADDR_SURF_MACRO_ASPECT_8 = 0x3,
980} MacroTileAspect;
981typedef enum GATCL1RequestType {
982 GATCL1_TYPE_NORMAL = 0x0,
983 GATCL1_TYPE_SHOOTDOWN = 0x1,
984 GATCL1_TYPE_BYPASS = 0x2,
985} GATCL1RequestType;
986typedef enum TCC_CACHE_POLICIES {
987 TCC_CACHE_POLICY_LRU = 0x0,
988 TCC_CACHE_POLICY_STREAM = 0x1,
989} TCC_CACHE_POLICIES;
990typedef enum MTYPE {
991 MTYPE_NC_NV = 0x0,
992 MTYPE_NC = 0x1,
993 MTYPE_CC = 0x2,
994 MTYPE_UC = 0x3,
995} MTYPE;
996typedef enum PERFMON_COUNTER_MODE {
997 PERFMON_COUNTER_MODE_ACCUM = 0x0,
998 PERFMON_COUNTER_MODE_ACTIVE_CYCLES = 0x1,
999 PERFMON_COUNTER_MODE_MAX = 0x2,
1000 PERFMON_COUNTER_MODE_DIRTY = 0x3,
1001 PERFMON_COUNTER_MODE_SAMPLE = 0x4,
1002 PERFMON_COUNTER_MODE_CYCLES_SINCE_FIRST_EVENT = 0x5,
1003 PERFMON_COUNTER_MODE_CYCLES_SINCE_LAST_EVENT = 0x6,
1004 PERFMON_COUNTER_MODE_CYCLES_GE_HI = 0x7,
1005 PERFMON_COUNTER_MODE_CYCLES_EQ_HI = 0x8,
1006 PERFMON_COUNTER_MODE_INACTIVE_CYCLES = 0x9,
1007 PERFMON_COUNTER_MODE_RESERVED = 0xf,
1008} PERFMON_COUNTER_MODE;
1009typedef enum PERFMON_SPM_MODE {
1010 PERFMON_SPM_MODE_OFF = 0x0,
1011 PERFMON_SPM_MODE_16BIT_CLAMP = 0x1,
1012 PERFMON_SPM_MODE_16BIT_NO_CLAMP = 0x2,
1013 PERFMON_SPM_MODE_32BIT_CLAMP = 0x3,
1014 PERFMON_SPM_MODE_32BIT_NO_CLAMP = 0x4,
1015 PERFMON_SPM_MODE_RESERVED_5 = 0x5,
1016 PERFMON_SPM_MODE_RESERVED_6 = 0x6,
1017 PERFMON_SPM_MODE_RESERVED_7 = 0x7,
1018 PERFMON_SPM_MODE_TEST_MODE_0 = 0x8,
1019 PERFMON_SPM_MODE_TEST_MODE_1 = 0x9,
1020 PERFMON_SPM_MODE_TEST_MODE_2 = 0xa,
1021} PERFMON_SPM_MODE;
1022typedef enum SurfaceTiling {
1023 ARRAY_LINEAR = 0x0,
1024 ARRAY_TILED = 0x1,
1025} SurfaceTiling;
1026typedef enum SurfaceArray {
1027 ARRAY_1D = 0x0,
1028 ARRAY_2D = 0x1,
1029 ARRAY_3D = 0x2,
1030 ARRAY_3D_SLICE = 0x3,
1031} SurfaceArray;
1032typedef enum ColorArray {
1033 ARRAY_2D_ALT_COLOR = 0x0,
1034 ARRAY_2D_COLOR = 0x1,
1035 ARRAY_3D_SLICE_COLOR = 0x3,
1036} ColorArray;
1037typedef enum DepthArray {
1038 ARRAY_2D_ALT_DEPTH = 0x0,
1039 ARRAY_2D_DEPTH = 0x1,
1040} DepthArray;
1041typedef enum ENUM_NUM_SIMD_PER_CU {
1042 NUM_SIMD_PER_CU = 0x4,
1043} ENUM_NUM_SIMD_PER_CU;
1044typedef enum MEM_PWR_FORCE_CTRL {
1045 NO_FORCE_REQUEST = 0x0,
1046 FORCE_LIGHT_SLEEP_REQUEST = 0x1,
1047 FORCE_DEEP_SLEEP_REQUEST = 0x2,
1048 FORCE_SHUT_DOWN_REQUEST = 0x3,
1049} MEM_PWR_FORCE_CTRL;
1050typedef enum MEM_PWR_FORCE_CTRL2 {
1051 NO_FORCE_REQ = 0x0,
1052 FORCE_LIGHT_SLEEP_REQ = 0x1,
1053} MEM_PWR_FORCE_CTRL2;
1054typedef enum MEM_PWR_DIS_CTRL {
1055 ENABLE_MEM_PWR_CTRL = 0x0,
1056 DISABLE_MEM_PWR_CTRL = 0x1,
1057} MEM_PWR_DIS_CTRL;
1058typedef enum MEM_PWR_SEL_CTRL {
1059 DYNAMIC_SHUT_DOWN_ENABLE = 0x0,
1060 DYNAMIC_DEEP_SLEEP_ENABLE = 0x1,
1061 DYNAMIC_LIGHT_SLEEP_ENABLE = 0x2,
1062} MEM_PWR_SEL_CTRL;
1063typedef enum MEM_PWR_SEL_CTRL2 {
1064 DYNAMIC_DEEP_SLEEP_EN = 0x0,
1065 DYNAMIC_LIGHT_SLEEP_EN = 0x1,
1066} MEM_PWR_SEL_CTRL2;
1067
1068#endif /* ACP_2_2_ENUM_H */
diff --git a/sound/soc/amd/include/acp_2_2_sh_mask.h b/sound/soc/amd/include/acp_2_2_sh_mask.h
new file mode 100644
index 000000000000..32d2d4104309
--- /dev/null
+++ b/sound/soc/amd/include/acp_2_2_sh_mask.h
@@ -0,0 +1,2292 @@
1/*
2 * ACP_2_2 Register documentation
3 *
4 * Copyright (C) 2014 Advanced Micro Devices, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23
24#ifndef ACP_2_2_SH_MASK_H
25#define ACP_2_2_SH_MASK_H
26
27#define ACP_DMA_CNTL_0__DMAChRst_MASK 0x1
28#define ACP_DMA_CNTL_0__DMAChRst__SHIFT 0x0
29#define ACP_DMA_CNTL_0__DMAChRun_MASK 0x2
30#define ACP_DMA_CNTL_0__DMAChRun__SHIFT 0x1
31#define ACP_DMA_CNTL_0__DMAChIOCEn_MASK 0x4
32#define ACP_DMA_CNTL_0__DMAChIOCEn__SHIFT 0x2
33#define ACP_DMA_CNTL_0__Circular_DMA_En_MASK 0x8
34#define ACP_DMA_CNTL_0__Circular_DMA_En__SHIFT 0x3
35#define ACP_DMA_CNTL_0__DMAChGracefulRstEn_MASK 0x10
36#define ACP_DMA_CNTL_0__DMAChGracefulRstEn__SHIFT 0x4
37#define ACP_DMA_CNTL_1__DMAChRst_MASK 0x1
38#define ACP_DMA_CNTL_1__DMAChRst__SHIFT 0x0
39#define ACP_DMA_CNTL_1__DMAChRun_MASK 0x2
40#define ACP_DMA_CNTL_1__DMAChRun__SHIFT 0x1
41#define ACP_DMA_CNTL_1__DMAChIOCEn_MASK 0x4
42#define ACP_DMA_CNTL_1__DMAChIOCEn__SHIFT 0x2
43#define ACP_DMA_CNTL_1__Circular_DMA_En_MASK 0x8
44#define ACP_DMA_CNTL_1__Circular_DMA_En__SHIFT 0x3
45#define ACP_DMA_CNTL_1__DMAChGracefulRstEn_MASK 0x10
46#define ACP_DMA_CNTL_1__DMAChGracefulRstEn__SHIFT 0x4
47#define ACP_DMA_CNTL_2__DMAChRst_MASK 0x1
48#define ACP_DMA_CNTL_2__DMAChRst__SHIFT 0x0
49#define ACP_DMA_CNTL_2__DMAChRun_MASK 0x2
50#define ACP_DMA_CNTL_2__DMAChRun__SHIFT 0x1
51#define ACP_DMA_CNTL_2__DMAChIOCEn_MASK 0x4
52#define ACP_DMA_CNTL_2__DMAChIOCEn__SHIFT 0x2
53#define ACP_DMA_CNTL_2__Circular_DMA_En_MASK 0x8
54#define ACP_DMA_CNTL_2__Circular_DMA_En__SHIFT 0x3
55#define ACP_DMA_CNTL_2__DMAChGracefulRstEn_MASK 0x10
56#define ACP_DMA_CNTL_2__DMAChGracefulRstEn__SHIFT 0x4
57#define ACP_DMA_CNTL_3__DMAChRst_MASK 0x1
58#define ACP_DMA_CNTL_3__DMAChRst__SHIFT 0x0
59#define ACP_DMA_CNTL_3__DMAChRun_MASK 0x2
60#define ACP_DMA_CNTL_3__DMAChRun__SHIFT 0x1
61#define ACP_DMA_CNTL_3__DMAChIOCEn_MASK 0x4
62#define ACP_DMA_CNTL_3__DMAChIOCEn__SHIFT 0x2
63#define ACP_DMA_CNTL_3__Circular_DMA_En_MASK 0x8
64#define ACP_DMA_CNTL_3__Circular_DMA_En__SHIFT 0x3
65#define ACP_DMA_CNTL_3__DMAChGracefulRstEn_MASK 0x10
66#define ACP_DMA_CNTL_3__DMAChGracefulRstEn__SHIFT 0x4
67#define ACP_DMA_CNTL_4__DMAChRst_MASK 0x1
68#define ACP_DMA_CNTL_4__DMAChRst__SHIFT 0x0
69#define ACP_DMA_CNTL_4__DMAChRun_MASK 0x2
70#define ACP_DMA_CNTL_4__DMAChRun__SHIFT 0x1
71#define ACP_DMA_CNTL_4__DMAChIOCEn_MASK 0x4
72#define ACP_DMA_CNTL_4__DMAChIOCEn__SHIFT 0x2
73#define ACP_DMA_CNTL_4__Circular_DMA_En_MASK 0x8
74#define ACP_DMA_CNTL_4__Circular_DMA_En__SHIFT 0x3
75#define ACP_DMA_CNTL_4__DMAChGracefulRstEn_MASK 0x10
76#define ACP_DMA_CNTL_4__DMAChGracefulRstEn__SHIFT 0x4
77#define ACP_DMA_CNTL_5__DMAChRst_MASK 0x1
78#define ACP_DMA_CNTL_5__DMAChRst__SHIFT 0x0
79#define ACP_DMA_CNTL_5__DMAChRun_MASK 0x2
80#define ACP_DMA_CNTL_5__DMAChRun__SHIFT 0x1
81#define ACP_DMA_CNTL_5__DMAChIOCEn_MASK 0x4
82#define ACP_DMA_CNTL_5__DMAChIOCEn__SHIFT 0x2
83#define ACP_DMA_CNTL_5__Circular_DMA_En_MASK 0x8
84#define ACP_DMA_CNTL_5__Circular_DMA_En__SHIFT 0x3
85#define ACP_DMA_CNTL_5__DMAChGracefulRstEn_MASK 0x10
86#define ACP_DMA_CNTL_5__DMAChGracefulRstEn__SHIFT 0x4
87#define ACP_DMA_CNTL_6__DMAChRst_MASK 0x1
88#define ACP_DMA_CNTL_6__DMAChRst__SHIFT 0x0
89#define ACP_DMA_CNTL_6__DMAChRun_MASK 0x2
90#define ACP_DMA_CNTL_6__DMAChRun__SHIFT 0x1
91#define ACP_DMA_CNTL_6__DMAChIOCEn_MASK 0x4
92#define ACP_DMA_CNTL_6__DMAChIOCEn__SHIFT 0x2
93#define ACP_DMA_CNTL_6__Circular_DMA_En_MASK 0x8
94#define ACP_DMA_CNTL_6__Circular_DMA_En__SHIFT 0x3
95#define ACP_DMA_CNTL_6__DMAChGracefulRstEn_MASK 0x10
96#define ACP_DMA_CNTL_6__DMAChGracefulRstEn__SHIFT 0x4
97#define ACP_DMA_CNTL_7__DMAChRst_MASK 0x1
98#define ACP_DMA_CNTL_7__DMAChRst__SHIFT 0x0
99#define ACP_DMA_CNTL_7__DMAChRun_MASK 0x2
100#define ACP_DMA_CNTL_7__DMAChRun__SHIFT 0x1
101#define ACP_DMA_CNTL_7__DMAChIOCEn_MASK 0x4
102#define ACP_DMA_CNTL_7__DMAChIOCEn__SHIFT 0x2
103#define ACP_DMA_CNTL_7__Circular_DMA_En_MASK 0x8
104#define ACP_DMA_CNTL_7__Circular_DMA_En__SHIFT 0x3
105#define ACP_DMA_CNTL_7__DMAChGracefulRstEn_MASK 0x10
106#define ACP_DMA_CNTL_7__DMAChGracefulRstEn__SHIFT 0x4
107#define ACP_DMA_CNTL_8__DMAChRst_MASK 0x1
108#define ACP_DMA_CNTL_8__DMAChRst__SHIFT 0x0
109#define ACP_DMA_CNTL_8__DMAChRun_MASK 0x2
110#define ACP_DMA_CNTL_8__DMAChRun__SHIFT 0x1
111#define ACP_DMA_CNTL_8__DMAChIOCEn_MASK 0x4
112#define ACP_DMA_CNTL_8__DMAChIOCEn__SHIFT 0x2
113#define ACP_DMA_CNTL_8__Circular_DMA_En_MASK 0x8
114#define ACP_DMA_CNTL_8__Circular_DMA_En__SHIFT 0x3
115#define ACP_DMA_CNTL_8__DMAChGracefulRstEn_MASK 0x10
116#define ACP_DMA_CNTL_8__DMAChGracefulRstEn__SHIFT 0x4
117#define ACP_DMA_CNTL_9__DMAChRst_MASK 0x1
118#define ACP_DMA_CNTL_9__DMAChRst__SHIFT 0x0
119#define ACP_DMA_CNTL_9__DMAChRun_MASK 0x2
120#define ACP_DMA_CNTL_9__DMAChRun__SHIFT 0x1
121#define ACP_DMA_CNTL_9__DMAChIOCEn_MASK 0x4
122#define ACP_DMA_CNTL_9__DMAChIOCEn__SHIFT 0x2
123#define ACP_DMA_CNTL_9__Circular_DMA_En_MASK 0x8
124#define ACP_DMA_CNTL_9__Circular_DMA_En__SHIFT 0x3
125#define ACP_DMA_CNTL_9__DMAChGracefulRstEn_MASK 0x10
126#define ACP_DMA_CNTL_9__DMAChGracefulRstEn__SHIFT 0x4
127#define ACP_DMA_CNTL_10__DMAChRst_MASK 0x1
128#define ACP_DMA_CNTL_10__DMAChRst__SHIFT 0x0
129#define ACP_DMA_CNTL_10__DMAChRun_MASK 0x2
130#define ACP_DMA_CNTL_10__DMAChRun__SHIFT 0x1
131#define ACP_DMA_CNTL_10__DMAChIOCEn_MASK 0x4
132#define ACP_DMA_CNTL_10__DMAChIOCEn__SHIFT 0x2
133#define ACP_DMA_CNTL_10__Circular_DMA_En_MASK 0x8
134#define ACP_DMA_CNTL_10__Circular_DMA_En__SHIFT 0x3
135#define ACP_DMA_CNTL_10__DMAChGracefulRstEn_MASK 0x10
136#define ACP_DMA_CNTL_10__DMAChGracefulRstEn__SHIFT 0x4
137#define ACP_DMA_CNTL_11__DMAChRst_MASK 0x1
138#define ACP_DMA_CNTL_11__DMAChRst__SHIFT 0x0
139#define ACP_DMA_CNTL_11__DMAChRun_MASK 0x2
140#define ACP_DMA_CNTL_11__DMAChRun__SHIFT 0x1
141#define ACP_DMA_CNTL_11__DMAChIOCEn_MASK 0x4
142#define ACP_DMA_CNTL_11__DMAChIOCEn__SHIFT 0x2
143#define ACP_DMA_CNTL_11__Circular_DMA_En_MASK 0x8
144#define ACP_DMA_CNTL_11__Circular_DMA_En__SHIFT 0x3
145#define ACP_DMA_CNTL_11__DMAChGracefulRstEn_MASK 0x10
146#define ACP_DMA_CNTL_11__DMAChGracefulRstEn__SHIFT 0x4
147#define ACP_DMA_CNTL_12__DMAChRst_MASK 0x1
148#define ACP_DMA_CNTL_12__DMAChRst__SHIFT 0x0
149#define ACP_DMA_CNTL_12__DMAChRun_MASK 0x2
150#define ACP_DMA_CNTL_12__DMAChRun__SHIFT 0x1
151#define ACP_DMA_CNTL_12__DMAChIOCEn_MASK 0x4
152#define ACP_DMA_CNTL_12__DMAChIOCEn__SHIFT 0x2
153#define ACP_DMA_CNTL_12__Circular_DMA_En_MASK 0x8
154#define ACP_DMA_CNTL_12__Circular_DMA_En__SHIFT 0x3
155#define ACP_DMA_CNTL_12__DMAChGracefulRstEn_MASK 0x10
156#define ACP_DMA_CNTL_12__DMAChGracefulRstEn__SHIFT 0x4
157#define ACP_DMA_CNTL_13__DMAChRst_MASK 0x1
158#define ACP_DMA_CNTL_13__DMAChRst__SHIFT 0x0
159#define ACP_DMA_CNTL_13__DMAChRun_MASK 0x2
160#define ACP_DMA_CNTL_13__DMAChRun__SHIFT 0x1
161#define ACP_DMA_CNTL_13__DMAChIOCEn_MASK 0x4
162#define ACP_DMA_CNTL_13__DMAChIOCEn__SHIFT 0x2
163#define ACP_DMA_CNTL_13__Circular_DMA_En_MASK 0x8
164#define ACP_DMA_CNTL_13__Circular_DMA_En__SHIFT 0x3
165#define ACP_DMA_CNTL_13__DMAChGracefulRstEn_MASK 0x10
166#define ACP_DMA_CNTL_13__DMAChGracefulRstEn__SHIFT 0x4
167#define ACP_DMA_CNTL_14__DMAChRst_MASK 0x1
168#define ACP_DMA_CNTL_14__DMAChRst__SHIFT 0x0
169#define ACP_DMA_CNTL_14__DMAChRun_MASK 0x2
170#define ACP_DMA_CNTL_14__DMAChRun__SHIFT 0x1
171#define ACP_DMA_CNTL_14__DMAChIOCEn_MASK 0x4
172#define ACP_DMA_CNTL_14__DMAChIOCEn__SHIFT 0x2
173#define ACP_DMA_CNTL_14__Circular_DMA_En_MASK 0x8
174#define ACP_DMA_CNTL_14__Circular_DMA_En__SHIFT 0x3
175#define ACP_DMA_CNTL_14__DMAChGracefulRstEn_MASK 0x10
176#define ACP_DMA_CNTL_14__DMAChGracefulRstEn__SHIFT 0x4
177#define ACP_DMA_CNTL_15__DMAChRst_MASK 0x1
178#define ACP_DMA_CNTL_15__DMAChRst__SHIFT 0x0
179#define ACP_DMA_CNTL_15__DMAChRun_MASK 0x2
180#define ACP_DMA_CNTL_15__DMAChRun__SHIFT 0x1
181#define ACP_DMA_CNTL_15__DMAChIOCEn_MASK 0x4
182#define ACP_DMA_CNTL_15__DMAChIOCEn__SHIFT 0x2
183#define ACP_DMA_CNTL_15__Circular_DMA_En_MASK 0x8
184#define ACP_DMA_CNTL_15__Circular_DMA_En__SHIFT 0x3
185#define ACP_DMA_CNTL_15__DMAChGracefulRstEn_MASK 0x10
186#define ACP_DMA_CNTL_15__DMAChGracefulRstEn__SHIFT 0x4
187#define ACP_DMA_DSCR_STRT_IDX_0__DMAChDscrStrtIdx_MASK 0x3ff
188#define ACP_DMA_DSCR_STRT_IDX_0__DMAChDscrStrtIdx__SHIFT 0x0
189#define ACP_DMA_DSCR_STRT_IDX_1__DMAChDscrStrtIdx_MASK 0x3ff
190#define ACP_DMA_DSCR_STRT_IDX_1__DMAChDscrStrtIdx__SHIFT 0x0
191#define ACP_DMA_DSCR_STRT_IDX_2__DMAChDscrStrtIdx_MASK 0x3ff
192#define ACP_DMA_DSCR_STRT_IDX_2__DMAChDscrStrtIdx__SHIFT 0x0
193#define ACP_DMA_DSCR_STRT_IDX_3__DMAChDscrStrtIdx_MASK 0x3ff
194#define ACP_DMA_DSCR_STRT_IDX_3__DMAChDscrStrtIdx__SHIFT 0x0
195#define ACP_DMA_DSCR_STRT_IDX_4__DMAChDscrStrtIdx_MASK 0x3ff
196#define ACP_DMA_DSCR_STRT_IDX_4__DMAChDscrStrtIdx__SHIFT 0x0
197#define ACP_DMA_DSCR_STRT_IDX_5__DMAChDscrStrtIdx_MASK 0x3ff
198#define ACP_DMA_DSCR_STRT_IDX_5__DMAChDscrStrtIdx__SHIFT 0x0
199#define ACP_DMA_DSCR_STRT_IDX_6__DMAChDscrStrtIdx_MASK 0x3ff
200#define ACP_DMA_DSCR_STRT_IDX_6__DMAChDscrStrtIdx__SHIFT 0x0
201#define ACP_DMA_DSCR_STRT_IDX_7__DMAChDscrStrtIdx_MASK 0x3ff
202#define ACP_DMA_DSCR_STRT_IDX_7__DMAChDscrStrtIdx__SHIFT 0x0
203#define ACP_DMA_DSCR_STRT_IDX_8__DMAChDscrStrtIdx_MASK 0x3ff
204#define ACP_DMA_DSCR_STRT_IDX_8__DMAChDscrStrtIdx__SHIFT 0x0
205#define ACP_DMA_DSCR_STRT_IDX_9__DMAChDscrStrtIdx_MASK 0x3ff
206#define ACP_DMA_DSCR_STRT_IDX_9__DMAChDscrStrtIdx__SHIFT 0x0
207#define ACP_DMA_DSCR_STRT_IDX_10__DMAChDscrStrtIdx_MASK 0x3ff
208#define ACP_DMA_DSCR_STRT_IDX_10__DMAChDscrStrtIdx__SHIFT 0x0
209#define ACP_DMA_DSCR_STRT_IDX_11__DMAChDscrStrtIdx_MASK 0x3ff
210#define ACP_DMA_DSCR_STRT_IDX_11__DMAChDscrStrtIdx__SHIFT 0x0
211#define ACP_DMA_DSCR_STRT_IDX_12__DMAChDscrStrtIdx_MASK 0x3ff
212#define ACP_DMA_DSCR_STRT_IDX_12__DMAChDscrStrtIdx__SHIFT 0x0
213#define ACP_DMA_DSCR_STRT_IDX_13__DMAChDscrStrtIdx_MASK 0x3ff
214#define ACP_DMA_DSCR_STRT_IDX_13__DMAChDscrStrtIdx__SHIFT 0x0
215#define ACP_DMA_DSCR_STRT_IDX_14__DMAChDscrStrtIdx_MASK 0x3ff
216#define ACP_DMA_DSCR_STRT_IDX_14__DMAChDscrStrtIdx__SHIFT 0x0
217#define ACP_DMA_DSCR_STRT_IDX_15__DMAChDscrStrtIdx_MASK 0x3ff
218#define ACP_DMA_DSCR_STRT_IDX_15__DMAChDscrStrtIdx__SHIFT 0x0
219#define ACP_DMA_DSCR_CNT_0__DMAChDscrCnt_MASK 0x3ff
220#define ACP_DMA_DSCR_CNT_0__DMAChDscrCnt__SHIFT 0x0
221#define ACP_DMA_DSCR_CNT_1__DMAChDscrCnt_MASK 0x3ff
222#define ACP_DMA_DSCR_CNT_1__DMAChDscrCnt__SHIFT 0x0
223#define ACP_DMA_DSCR_CNT_2__DMAChDscrCnt_MASK 0x3ff
224#define ACP_DMA_DSCR_CNT_2__DMAChDscrCnt__SHIFT 0x0
225#define ACP_DMA_DSCR_CNT_3__DMAChDscrCnt_MASK 0x3ff
226#define ACP_DMA_DSCR_CNT_3__DMAChDscrCnt__SHIFT 0x0
227#define ACP_DMA_DSCR_CNT_4__DMAChDscrCnt_MASK 0x3ff
228#define ACP_DMA_DSCR_CNT_4__DMAChDscrCnt__SHIFT 0x0
229#define ACP_DMA_DSCR_CNT_5__DMAChDscrCnt_MASK 0x3ff
230#define ACP_DMA_DSCR_CNT_5__DMAChDscrCnt__SHIFT 0x0
231#define ACP_DMA_DSCR_CNT_6__DMAChDscrCnt_MASK 0x3ff
232#define ACP_DMA_DSCR_CNT_6__DMAChDscrCnt__SHIFT 0x0
233#define ACP_DMA_DSCR_CNT_7__DMAChDscrCnt_MASK 0x3ff
234#define ACP_DMA_DSCR_CNT_7__DMAChDscrCnt__SHIFT 0x0
235#define ACP_DMA_DSCR_CNT_8__DMAChDscrCnt_MASK 0x3ff
236#define ACP_DMA_DSCR_CNT_8__DMAChDscrCnt__SHIFT 0x0
237#define ACP_DMA_DSCR_CNT_9__DMAChDscrCnt_MASK 0x3ff
238#define ACP_DMA_DSCR_CNT_9__DMAChDscrCnt__SHIFT 0x0
239#define ACP_DMA_DSCR_CNT_10__DMAChDscrCnt_MASK 0x3ff
240#define ACP_DMA_DSCR_CNT_10__DMAChDscrCnt__SHIFT 0x0
241#define ACP_DMA_DSCR_CNT_11__DMAChDscrCnt_MASK 0x3ff
242#define ACP_DMA_DSCR_CNT_11__DMAChDscrCnt__SHIFT 0x0
243#define ACP_DMA_DSCR_CNT_12__DMAChDscrCnt_MASK 0x3ff
244#define ACP_DMA_DSCR_CNT_12__DMAChDscrCnt__SHIFT 0x0
245#define ACP_DMA_DSCR_CNT_13__DMAChDscrCnt_MASK 0x3ff
246#define ACP_DMA_DSCR_CNT_13__DMAChDscrCnt__SHIFT 0x0
247#define ACP_DMA_DSCR_CNT_14__DMAChDscrCnt_MASK 0x3ff
248#define ACP_DMA_DSCR_CNT_14__DMAChDscrCnt__SHIFT 0x0
249#define ACP_DMA_DSCR_CNT_15__DMAChDscrCnt_MASK 0x3ff
250#define ACP_DMA_DSCR_CNT_15__DMAChDscrCnt__SHIFT 0x0
251#define ACP_DMA_PRIO_0__DMAChPrioLvl_MASK 0x1
252#define ACP_DMA_PRIO_0__DMAChPrioLvl__SHIFT 0x0
253#define ACP_DMA_PRIO_1__DMAChPrioLvl_MASK 0x1
254#define ACP_DMA_PRIO_1__DMAChPrioLvl__SHIFT 0x0
255#define ACP_DMA_PRIO_2__DMAChPrioLvl_MASK 0x1
256#define ACP_DMA_PRIO_2__DMAChPrioLvl__SHIFT 0x0
257#define ACP_DMA_PRIO_3__DMAChPrioLvl_MASK 0x1
258#define ACP_DMA_PRIO_3__DMAChPrioLvl__SHIFT 0x0
259#define ACP_DMA_PRIO_4__DMAChPrioLvl_MASK 0x1
260#define ACP_DMA_PRIO_4__DMAChPrioLvl__SHIFT 0x0
261#define ACP_DMA_PRIO_5__DMAChPrioLvl_MASK 0x1
262#define ACP_DMA_PRIO_5__DMAChPrioLvl__SHIFT 0x0
263#define ACP_DMA_PRIO_6__DMAChPrioLvl_MASK 0x1
264#define ACP_DMA_PRIO_6__DMAChPrioLvl__SHIFT 0x0
265#define ACP_DMA_PRIO_7__DMAChPrioLvl_MASK 0x1
266#define ACP_DMA_PRIO_7__DMAChPrioLvl__SHIFT 0x0
267#define ACP_DMA_PRIO_8__DMAChPrioLvl_MASK 0x1
268#define ACP_DMA_PRIO_8__DMAChPrioLvl__SHIFT 0x0
269#define ACP_DMA_PRIO_9__DMAChPrioLvl_MASK 0x1
270#define ACP_DMA_PRIO_9__DMAChPrioLvl__SHIFT 0x0
271#define ACP_DMA_PRIO_10__DMAChPrioLvl_MASK 0x1
272#define ACP_DMA_PRIO_10__DMAChPrioLvl__SHIFT 0x0
273#define ACP_DMA_PRIO_11__DMAChPrioLvl_MASK 0x1
274#define ACP_DMA_PRIO_11__DMAChPrioLvl__SHIFT 0x0
275#define ACP_DMA_PRIO_12__DMAChPrioLvl_MASK 0x1
276#define ACP_DMA_PRIO_12__DMAChPrioLvl__SHIFT 0x0
277#define ACP_DMA_PRIO_13__DMAChPrioLvl_MASK 0x1
278#define ACP_DMA_PRIO_13__DMAChPrioLvl__SHIFT 0x0
279#define ACP_DMA_PRIO_14__DMAChPrioLvl_MASK 0x1
280#define ACP_DMA_PRIO_14__DMAChPrioLvl__SHIFT 0x0
281#define ACP_DMA_PRIO_15__DMAChPrioLvl_MASK 0x1
282#define ACP_DMA_PRIO_15__DMAChPrioLvl__SHIFT 0x0
283#define ACP_DMA_CUR_DSCR_0__DMAChCurDscrIdx_MASK 0x3ff
284#define ACP_DMA_CUR_DSCR_0__DMAChCurDscrIdx__SHIFT 0x0
285#define ACP_DMA_CUR_DSCR_1__DMAChCurDscrIdx_MASK 0x3ff
286#define ACP_DMA_CUR_DSCR_1__DMAChCurDscrIdx__SHIFT 0x0
287#define ACP_DMA_CUR_DSCR_2__DMAChCurDscrIdx_MASK 0x3ff
288#define ACP_DMA_CUR_DSCR_2__DMAChCurDscrIdx__SHIFT 0x0
289#define ACP_DMA_CUR_DSCR_3__DMAChCurDscrIdx_MASK 0x3ff
290#define ACP_DMA_CUR_DSCR_3__DMAChCurDscrIdx__SHIFT 0x0
291#define ACP_DMA_CUR_DSCR_4__DMAChCurDscrIdx_MASK 0x3ff
292#define ACP_DMA_CUR_DSCR_4__DMAChCurDscrIdx__SHIFT 0x0
293#define ACP_DMA_CUR_DSCR_5__DMAChCurDscrIdx_MASK 0x3ff
294#define ACP_DMA_CUR_DSCR_5__DMAChCurDscrIdx__SHIFT 0x0
295#define ACP_DMA_CUR_DSCR_6__DMAChCurDscrIdx_MASK 0x3ff
296#define ACP_DMA_CUR_DSCR_6__DMAChCurDscrIdx__SHIFT 0x0
297#define ACP_DMA_CUR_DSCR_7__DMAChCurDscrIdx_MASK 0x3ff
298#define ACP_DMA_CUR_DSCR_7__DMAChCurDscrIdx__SHIFT 0x0
299#define ACP_DMA_CUR_DSCR_8__DMAChCurDscrIdx_MASK 0x3ff
300#define ACP_DMA_CUR_DSCR_8__DMAChCurDscrIdx__SHIFT 0x0
301#define ACP_DMA_CUR_DSCR_9__DMAChCurDscrIdx_MASK 0x3ff
302#define ACP_DMA_CUR_DSCR_9__DMAChCurDscrIdx__SHIFT 0x0
303#define ACP_DMA_CUR_DSCR_10__DMAChCurDscrIdx_MASK 0x3ff
304#define ACP_DMA_CUR_DSCR_10__DMAChCurDscrIdx__SHIFT 0x0
305#define ACP_DMA_CUR_DSCR_11__DMAChCurDscrIdx_MASK 0x3ff
306#define ACP_DMA_CUR_DSCR_11__DMAChCurDscrIdx__SHIFT 0x0
307#define ACP_DMA_CUR_DSCR_12__DMAChCurDscrIdx_MASK 0x3ff
308#define ACP_DMA_CUR_DSCR_12__DMAChCurDscrIdx__SHIFT 0x0
309#define ACP_DMA_CUR_DSCR_13__DMAChCurDscrIdx_MASK 0x3ff
310#define ACP_DMA_CUR_DSCR_13__DMAChCurDscrIdx__SHIFT 0x0
311#define ACP_DMA_CUR_DSCR_14__DMAChCurDscrIdx_MASK 0x3ff
312#define ACP_DMA_CUR_DSCR_14__DMAChCurDscrIdx__SHIFT 0x0
313#define ACP_DMA_CUR_DSCR_15__DMAChCurDscrIdx_MASK 0x3ff
314#define ACP_DMA_CUR_DSCR_15__DMAChCurDscrIdx__SHIFT 0x0
315#define ACP_DMA_CUR_TRANS_CNT_0__DMAChCurTransCnt_MASK 0x1ffff
316#define ACP_DMA_CUR_TRANS_CNT_0__DMAChCurTransCnt__SHIFT 0x0
317#define ACP_DMA_CUR_TRANS_CNT_1__DMAChCurTransCnt_MASK 0x1ffff
318#define ACP_DMA_CUR_TRANS_CNT_1__DMAChCurTransCnt__SHIFT 0x0
319#define ACP_DMA_CUR_TRANS_CNT_2__DMAChCurTransCnt_MASK 0x1ffff
320#define ACP_DMA_CUR_TRANS_CNT_2__DMAChCurTransCnt__SHIFT 0x0
321#define ACP_DMA_CUR_TRANS_CNT_3__DMAChCurTransCnt_MASK 0x1ffff
322#define ACP_DMA_CUR_TRANS_CNT_3__DMAChCurTransCnt__SHIFT 0x0
323#define ACP_DMA_CUR_TRANS_CNT_4__DMAChCurTransCnt_MASK 0x1ffff
324#define ACP_DMA_CUR_TRANS_CNT_4__DMAChCurTransCnt__SHIFT 0x0
325#define ACP_DMA_CUR_TRANS_CNT_5__DMAChCurTransCnt_MASK 0x1ffff
326#define ACP_DMA_CUR_TRANS_CNT_5__DMAChCurTransCnt__SHIFT 0x0
327#define ACP_DMA_CUR_TRANS_CNT_6__DMAChCurTransCnt_MASK 0x1ffff
328#define ACP_DMA_CUR_TRANS_CNT_6__DMAChCurTransCnt__SHIFT 0x0
329#define ACP_DMA_CUR_TRANS_CNT_7__DMAChCurTransCnt_MASK 0x1ffff
330#define ACP_DMA_CUR_TRANS_CNT_7__DMAChCurTransCnt__SHIFT 0x0
331#define ACP_DMA_CUR_TRANS_CNT_8__DMAChCurTransCnt_MASK 0x1ffff
332#define ACP_DMA_CUR_TRANS_CNT_8__DMAChCurTransCnt__SHIFT 0x0
333#define ACP_DMA_CUR_TRANS_CNT_9__DMAChCurTransCnt_MASK 0x1ffff
334#define ACP_DMA_CUR_TRANS_CNT_9__DMAChCurTransCnt__SHIFT 0x0
335#define ACP_DMA_CUR_TRANS_CNT_10__DMAChCurTransCnt_MASK 0x1ffff
336#define ACP_DMA_CUR_TRANS_CNT_10__DMAChCurTransCnt__SHIFT 0x0
337#define ACP_DMA_CUR_TRANS_CNT_11__DMAChCurTransCnt_MASK 0x1ffff
338#define ACP_DMA_CUR_TRANS_CNT_11__DMAChCurTransCnt__SHIFT 0x0
339#define ACP_DMA_CUR_TRANS_CNT_12__DMAChCurTransCnt_MASK 0x1ffff
340#define ACP_DMA_CUR_TRANS_CNT_12__DMAChCurTransCnt__SHIFT 0x0
341#define ACP_DMA_CUR_TRANS_CNT_13__DMAChCurTransCnt_MASK 0x1ffff
342#define ACP_DMA_CUR_TRANS_CNT_13__DMAChCurTransCnt__SHIFT 0x0
343#define ACP_DMA_CUR_TRANS_CNT_14__DMAChCurTransCnt_MASK 0x1ffff
344#define ACP_DMA_CUR_TRANS_CNT_14__DMAChCurTransCnt__SHIFT 0x0
345#define ACP_DMA_CUR_TRANS_CNT_15__DMAChCurTransCnt_MASK 0x1ffff
346#define ACP_DMA_CUR_TRANS_CNT_15__DMAChCurTransCnt__SHIFT 0x0
347#define ACP_DMA_ERR_STS_0__DMAChTermErr_MASK 0x1
348#define ACP_DMA_ERR_STS_0__DMAChTermErr__SHIFT 0x0
349#define ACP_DMA_ERR_STS_0__DMAChErrCode_MASK 0x1e
350#define ACP_DMA_ERR_STS_0__DMAChErrCode__SHIFT 0x1
351#define ACP_DMA_ERR_STS_1__DMAChTermErr_MASK 0x1
352#define ACP_DMA_ERR_STS_1__DMAChTermErr__SHIFT 0x0
353#define ACP_DMA_ERR_STS_1__DMAChErrCode_MASK 0x1e
354#define ACP_DMA_ERR_STS_1__DMAChErrCode__SHIFT 0x1
355#define ACP_DMA_ERR_STS_2__DMAChTermErr_MASK 0x1
356#define ACP_DMA_ERR_STS_2__DMAChTermErr__SHIFT 0x0
357#define ACP_DMA_ERR_STS_2__DMAChErrCode_MASK 0x1e
358#define ACP_DMA_ERR_STS_2__DMAChErrCode__SHIFT 0x1
359#define ACP_DMA_ERR_STS_3__DMAChTermErr_MASK 0x1
360#define ACP_DMA_ERR_STS_3__DMAChTermErr__SHIFT 0x0
361#define ACP_DMA_ERR_STS_3__DMAChErrCode_MASK 0x1e
362#define ACP_DMA_ERR_STS_3__DMAChErrCode__SHIFT 0x1
363#define ACP_DMA_ERR_STS_4__DMAChTermErr_MASK 0x1
364#define ACP_DMA_ERR_STS_4__DMAChTermErr__SHIFT 0x0
365#define ACP_DMA_ERR_STS_4__DMAChErrCode_MASK 0x1e
366#define ACP_DMA_ERR_STS_4__DMAChErrCode__SHIFT 0x1
367#define ACP_DMA_ERR_STS_5__DMAChTermErr_MASK 0x1
368#define ACP_DMA_ERR_STS_5__DMAChTermErr__SHIFT 0x0
369#define ACP_DMA_ERR_STS_5__DMAChErrCode_MASK 0x1e
370#define ACP_DMA_ERR_STS_5__DMAChErrCode__SHIFT 0x1
371#define ACP_DMA_ERR_STS_6__DMAChTermErr_MASK 0x1
372#define ACP_DMA_ERR_STS_6__DMAChTermErr__SHIFT 0x0
373#define ACP_DMA_ERR_STS_6__DMAChErrCode_MASK 0x1e
374#define ACP_DMA_ERR_STS_6__DMAChErrCode__SHIFT 0x1
375#define ACP_DMA_ERR_STS_7__DMAChTermErr_MASK 0x1
376#define ACP_DMA_ERR_STS_7__DMAChTermErr__SHIFT 0x0
377#define ACP_DMA_ERR_STS_7__DMAChErrCode_MASK 0x1e
378#define ACP_DMA_ERR_STS_7__DMAChErrCode__SHIFT 0x1
379#define ACP_DMA_ERR_STS_8__DMAChTermErr_MASK 0x1
380#define ACP_DMA_ERR_STS_8__DMAChTermErr__SHIFT 0x0
381#define ACP_DMA_ERR_STS_8__DMAChErrCode_MASK 0x1e
382#define ACP_DMA_ERR_STS_8__DMAChErrCode__SHIFT 0x1
383#define ACP_DMA_ERR_STS_9__DMAChTermErr_MASK 0x1
384#define ACP_DMA_ERR_STS_9__DMAChTermErr__SHIFT 0x0
385#define ACP_DMA_ERR_STS_9__DMAChErrCode_MASK 0x1e
386#define ACP_DMA_ERR_STS_9__DMAChErrCode__SHIFT 0x1
387#define ACP_DMA_ERR_STS_10__DMAChTermErr_MASK 0x1
388#define ACP_DMA_ERR_STS_10__DMAChTermErr__SHIFT 0x0
389#define ACP_DMA_ERR_STS_10__DMAChErrCode_MASK 0x1e
390#define ACP_DMA_ERR_STS_10__DMAChErrCode__SHIFT 0x1
391#define ACP_DMA_ERR_STS_11__DMAChTermErr_MASK 0x1
392#define ACP_DMA_ERR_STS_11__DMAChTermErr__SHIFT 0x0
393#define ACP_DMA_ERR_STS_11__DMAChErrCode_MASK 0x1e
394#define ACP_DMA_ERR_STS_11__DMAChErrCode__SHIFT 0x1
395#define ACP_DMA_ERR_STS_12__DMAChTermErr_MASK 0x1
396#define ACP_DMA_ERR_STS_12__DMAChTermErr__SHIFT 0x0
397#define ACP_DMA_ERR_STS_12__DMAChErrCode_MASK 0x1e
398#define ACP_DMA_ERR_STS_12__DMAChErrCode__SHIFT 0x1
399#define ACP_DMA_ERR_STS_13__DMAChTermErr_MASK 0x1
400#define ACP_DMA_ERR_STS_13__DMAChTermErr__SHIFT 0x0
401#define ACP_DMA_ERR_STS_13__DMAChErrCode_MASK 0x1e
402#define ACP_DMA_ERR_STS_13__DMAChErrCode__SHIFT 0x1
403#define ACP_DMA_ERR_STS_14__DMAChTermErr_MASK 0x1
404#define ACP_DMA_ERR_STS_14__DMAChTermErr__SHIFT 0x0
405#define ACP_DMA_ERR_STS_14__DMAChErrCode_MASK 0x1e
406#define ACP_DMA_ERR_STS_14__DMAChErrCode__SHIFT 0x1
407#define ACP_DMA_ERR_STS_15__DMAChTermErr_MASK 0x1
408#define ACP_DMA_ERR_STS_15__DMAChTermErr__SHIFT 0x0
409#define ACP_DMA_ERR_STS_15__DMAChErrCode_MASK 0x1e
410#define ACP_DMA_ERR_STS_15__DMAChErrCode__SHIFT 0x1
411#define ACP_DMA_DESC_BASE_ADDR__DescriptorBaseAddr_MASK 0xffffffff
412#define ACP_DMA_DESC_BASE_ADDR__DescriptorBaseAddr__SHIFT 0x0
413#define ACP_DMA_DESC_MAX_NUM_DSCR__MaximumNumberDescr_MASK 0xf
414#define ACP_DMA_DESC_MAX_NUM_DSCR__MaximumNumberDescr__SHIFT 0x0
415#define ACP_DMA_CH_STS__DMAChSts_MASK 0xffff
416#define ACP_DMA_CH_STS__DMAChSts__SHIFT 0x0
417#define ACP_DMA_CH_GROUP__DMAChanelGrouping_MASK 0x1
418#define ACP_DMA_CH_GROUP__DMAChanelGrouping__SHIFT 0x0
419#define ACP_DSP0_CACHE_OFFSET0__Offset_MASK 0xfffffff
420#define ACP_DSP0_CACHE_OFFSET0__Offset__SHIFT 0x0
421#define ACP_DSP0_CACHE_OFFSET0__OnionGarlicSel_MASK 0x80000000
422#define ACP_DSP0_CACHE_OFFSET0__OnionGarlicSel__SHIFT 0x1f
423#define ACP_DSP0_CACHE_SIZE0__Size_MASK 0xffffff
424#define ACP_DSP0_CACHE_SIZE0__Size__SHIFT 0x0
425#define ACP_DSP0_CACHE_SIZE0__PageEnable_MASK 0x80000000
426#define ACP_DSP0_CACHE_SIZE0__PageEnable__SHIFT 0x1f
427#define ACP_DSP0_CACHE_OFFSET1__Offset_MASK 0xfffffff
428#define ACP_DSP0_CACHE_OFFSET1__Offset__SHIFT 0x0
429#define ACP_DSP0_CACHE_OFFSET1__OnionGarlicSel_MASK 0x80000000
430#define ACP_DSP0_CACHE_OFFSET1__OnionGarlicSel__SHIFT 0x1f
431#define ACP_DSP0_CACHE_SIZE1__Size_MASK 0xffffff
432#define ACP_DSP0_CACHE_SIZE1__Size__SHIFT 0x0
433#define ACP_DSP0_CACHE_SIZE1__PageEnable_MASK 0x80000000
434#define ACP_DSP0_CACHE_SIZE1__PageEnable__SHIFT 0x1f
435#define ACP_DSP0_CACHE_OFFSET2__Offset_MASK 0xfffffff
436#define ACP_DSP0_CACHE_OFFSET2__Offset__SHIFT 0x0
437#define ACP_DSP0_CACHE_OFFSET2__OnionGarlicSel_MASK 0x80000000
438#define ACP_DSP0_CACHE_OFFSET2__OnionGarlicSel__SHIFT 0x1f
439#define ACP_DSP0_CACHE_SIZE2__Size_MASK 0xffffff
440#define ACP_DSP0_CACHE_SIZE2__Size__SHIFT 0x0
441#define ACP_DSP0_CACHE_SIZE2__PageEnable_MASK 0x80000000
442#define ACP_DSP0_CACHE_SIZE2__PageEnable__SHIFT 0x1f
443#define ACP_DSP0_CACHE_OFFSET3__Offset_MASK 0xfffffff
444#define ACP_DSP0_CACHE_OFFSET3__Offset__SHIFT 0x0
445#define ACP_DSP0_CACHE_OFFSET3__OnionGarlicSel_MASK 0x80000000
446#define ACP_DSP0_CACHE_OFFSET3__OnionGarlicSel__SHIFT 0x1f
447#define ACP_DSP0_CACHE_SIZE3__Size_MASK 0xffffff
448#define ACP_DSP0_CACHE_SIZE3__Size__SHIFT 0x0
449#define ACP_DSP0_CACHE_SIZE3__PageEnable_MASK 0x80000000
450#define ACP_DSP0_CACHE_SIZE3__PageEnable__SHIFT 0x1f
451#define ACP_DSP0_CACHE_OFFSET4__Offset_MASK 0xfffffff
452#define ACP_DSP0_CACHE_OFFSET4__Offset__SHIFT 0x0
453#define ACP_DSP0_CACHE_OFFSET4__OnionGarlicSel_MASK 0x80000000
454#define ACP_DSP0_CACHE_OFFSET4__OnionGarlicSel__SHIFT 0x1f
455#define ACP_DSP0_CACHE_SIZE4__Size_MASK 0xffffff
456#define ACP_DSP0_CACHE_SIZE4__Size__SHIFT 0x0
457#define ACP_DSP0_CACHE_SIZE4__PageEnable_MASK 0x80000000
458#define ACP_DSP0_CACHE_SIZE4__PageEnable__SHIFT 0x1f
459#define ACP_DSP0_CACHE_OFFSET5__Offset_MASK 0xfffffff
460#define ACP_DSP0_CACHE_OFFSET5__Offset__SHIFT 0x0
461#define ACP_DSP0_CACHE_OFFSET5__OnionGarlicSel_MASK 0x80000000
462#define ACP_DSP0_CACHE_OFFSET5__OnionGarlicSel__SHIFT 0x1f
463#define ACP_DSP0_CACHE_SIZE5__Size_MASK 0xffffff
464#define ACP_DSP0_CACHE_SIZE5__Size__SHIFT 0x0
465#define ACP_DSP0_CACHE_SIZE5__PageEnable_MASK 0x80000000
466#define ACP_DSP0_CACHE_SIZE5__PageEnable__SHIFT 0x1f
467#define ACP_DSP0_CACHE_OFFSET6__Offset_MASK 0xfffffff
468#define ACP_DSP0_CACHE_OFFSET6__Offset__SHIFT 0x0
469#define ACP_DSP0_CACHE_OFFSET6__OnionGarlicSel_MASK 0x80000000
470#define ACP_DSP0_CACHE_OFFSET6__OnionGarlicSel__SHIFT 0x1f
471#define ACP_DSP0_CACHE_SIZE6__Size_MASK 0xffffff
472#define ACP_DSP0_CACHE_SIZE6__Size__SHIFT 0x0
473#define ACP_DSP0_CACHE_SIZE6__PageEnable_MASK 0x80000000
474#define ACP_DSP0_CACHE_SIZE6__PageEnable__SHIFT 0x1f
475#define ACP_DSP0_CACHE_OFFSET7__Offset_MASK 0xfffffff
476#define ACP_DSP0_CACHE_OFFSET7__Offset__SHIFT 0x0
477#define ACP_DSP0_CACHE_OFFSET7__OnionGarlicSel_MASK 0x80000000
478#define ACP_DSP0_CACHE_OFFSET7__OnionGarlicSel__SHIFT 0x1f
479#define ACP_DSP0_CACHE_SIZE7__Size_MASK 0xffffff
480#define ACP_DSP0_CACHE_SIZE7__Size__SHIFT 0x0
481#define ACP_DSP0_CACHE_SIZE7__PageEnable_MASK 0x80000000
482#define ACP_DSP0_CACHE_SIZE7__PageEnable__SHIFT 0x1f
483#define ACP_DSP0_CACHE_OFFSET8__Offset_MASK 0xfffffff
484#define ACP_DSP0_CACHE_OFFSET8__Offset__SHIFT 0x0
485#define ACP_DSP0_CACHE_OFFSET8__OnionGarlicSel_MASK 0x80000000
486#define ACP_DSP0_CACHE_OFFSET8__OnionGarlicSel__SHIFT 0x1f
487#define ACP_DSP0_CACHE_SIZE8__Size_MASK 0xffffff
488#define ACP_DSP0_CACHE_SIZE8__Size__SHIFT 0x0
489#define ACP_DSP0_CACHE_SIZE8__PageEnable_MASK 0x80000000
490#define ACP_DSP0_CACHE_SIZE8__PageEnable__SHIFT 0x1f
491#define ACP_DSP0_NONCACHE_OFFSET0__Offset_MASK 0xfffffff
492#define ACP_DSP0_NONCACHE_OFFSET0__Offset__SHIFT 0x0
493#define ACP_DSP0_NONCACHE_OFFSET0__OnionGarlicSel_MASK 0x80000000
494#define ACP_DSP0_NONCACHE_OFFSET0__OnionGarlicSel__SHIFT 0x1f
495#define ACP_DSP0_NONCACHE_SIZE0__Size_MASK 0xffffff
496#define ACP_DSP0_NONCACHE_SIZE0__Size__SHIFT 0x0
497#define ACP_DSP0_NONCACHE_SIZE0__PageEnable_MASK 0x80000000
498#define ACP_DSP0_NONCACHE_SIZE0__PageEnable__SHIFT 0x1f
499#define ACP_DSP0_NONCACHE_OFFSET1__Offset_MASK 0xfffffff
500#define ACP_DSP0_NONCACHE_OFFSET1__Offset__SHIFT 0x0
501#define ACP_DSP0_NONCACHE_OFFSET1__OnionGarlicSel_MASK 0x80000000
502#define ACP_DSP0_NONCACHE_OFFSET1__OnionGarlicSel__SHIFT 0x1f
503#define ACP_DSP0_NONCACHE_SIZE1__Size_MASK 0xffffff
504#define ACP_DSP0_NONCACHE_SIZE1__Size__SHIFT 0x0
505#define ACP_DSP0_NONCACHE_SIZE1__PageEnable_MASK 0x80000000
506#define ACP_DSP0_NONCACHE_SIZE1__PageEnable__SHIFT 0x1f
507#define ACP_DSP0_DEBUG_PC__DebugPC_MASK 0xffffffff
508#define ACP_DSP0_DEBUG_PC__DebugPC__SHIFT 0x0
509#define ACP_DSP0_NMI_SEL__NMISel_MASK 0x1
510#define ACP_DSP0_NMI_SEL__NMISel__SHIFT 0x0
511#define ACP_DSP0_CLKRST_CNTL__ClkEn_MASK 0x1
512#define ACP_DSP0_CLKRST_CNTL__ClkEn__SHIFT 0x0
513#define ACP_DSP0_CLKRST_CNTL__SoftResetDSP_MASK 0x2
514#define ACP_DSP0_CLKRST_CNTL__SoftResetDSP__SHIFT 0x1
515#define ACP_DSP0_CLKRST_CNTL__InternalSoftResetMode_MASK 0x4
516#define ACP_DSP0_CLKRST_CNTL__InternalSoftResetMode__SHIFT 0x2
517#define ACP_DSP0_CLKRST_CNTL__ExternalSoftResetMode_MASK 0x8
518#define ACP_DSP0_CLKRST_CNTL__ExternalSoftResetMode__SHIFT 0x3
519#define ACP_DSP0_CLKRST_CNTL__SoftResetDSPDone_MASK 0x10
520#define ACP_DSP0_CLKRST_CNTL__SoftResetDSPDone__SHIFT 0x4
521#define ACP_DSP0_CLKRST_CNTL__Clk_ON_Status_MASK 0x20
522#define ACP_DSP0_CLKRST_CNTL__Clk_ON_Status__SHIFT 0x5
523#define ACP_DSP0_RUNSTALL__RunStallCntl_MASK 0x1
524#define ACP_DSP0_RUNSTALL__RunStallCntl__SHIFT 0x0
525#define ACP_DSP0_OCD_HALT_ON_RST__OCD_HALT_ON_RST_MASK 0x1
526#define ACP_DSP0_OCD_HALT_ON_RST__OCD_HALT_ON_RST__SHIFT 0x0
527#define ACP_DSP0_WAIT_MODE__WaitMode_MASK 0x1
528#define ACP_DSP0_WAIT_MODE__WaitMode__SHIFT 0x0
529#define ACP_DSP0_VECT_SEL__StaticVectorSel_MASK 0x1
530#define ACP_DSP0_VECT_SEL__StaticVectorSel__SHIFT 0x0
531#define ACP_DSP0_DEBUG_REG1__ACP_DSP_DEBUG_REG1_MASK 0xffffffff
532#define ACP_DSP0_DEBUG_REG1__ACP_DSP_DEBUG_REG1__SHIFT 0x0
533#define ACP_DSP0_DEBUG_REG2__ACP_DSP_DEBUG_REG2_MASK 0xffffffff
534#define ACP_DSP0_DEBUG_REG2__ACP_DSP_DEBUG_REG2__SHIFT 0x0
535#define ACP_DSP0_DEBUG_REG3__ACP_DSP_DEBUG_REG3_MASK 0xffffffff
536#define ACP_DSP0_DEBUG_REG3__ACP_DSP_DEBUG_REG3__SHIFT 0x0
537#define ACP_DSP1_CACHE_OFFSET0__Offset_MASK 0xfffffff
538#define ACP_DSP1_CACHE_OFFSET0__Offset__SHIFT 0x0
539#define ACP_DSP1_CACHE_OFFSET0__OnionGarlicSel_MASK 0x80000000
540#define ACP_DSP1_CACHE_OFFSET0__OnionGarlicSel__SHIFT 0x1f
541#define ACP_DSP1_CACHE_SIZE0__Size_MASK 0xffffff
542#define ACP_DSP1_CACHE_SIZE0__Size__SHIFT 0x0
543#define ACP_DSP1_CACHE_SIZE0__PageEnable_MASK 0x80000000
544#define ACP_DSP1_CACHE_SIZE0__PageEnable__SHIFT 0x1f
545#define ACP_DSP1_CACHE_OFFSET1__Offset_MASK 0xfffffff
546#define ACP_DSP1_CACHE_OFFSET1__Offset__SHIFT 0x0
547#define ACP_DSP1_CACHE_OFFSET1__OnionGarlicSel_MASK 0x80000000
548#define ACP_DSP1_CACHE_OFFSET1__OnionGarlicSel__SHIFT 0x1f
549#define ACP_DSP1_CACHE_SIZE1__Size_MASK 0xffffff
550#define ACP_DSP1_CACHE_SIZE1__Size__SHIFT 0x0
551#define ACP_DSP1_CACHE_SIZE1__PageEnable_MASK 0x80000000
552#define ACP_DSP1_CACHE_SIZE1__PageEnable__SHIFT 0x1f
553#define ACP_DSP1_CACHE_OFFSET2__Offset_MASK 0xfffffff
554#define ACP_DSP1_CACHE_OFFSET2__Offset__SHIFT 0x0
555#define ACP_DSP1_CACHE_OFFSET2__OnionGarlicSel_MASK 0x80000000
556#define ACP_DSP1_CACHE_OFFSET2__OnionGarlicSel__SHIFT 0x1f
557#define ACP_DSP1_CACHE_SIZE2__Size_MASK 0xffffff
558#define ACP_DSP1_CACHE_SIZE2__Size__SHIFT 0x0
559#define ACP_DSP1_CACHE_SIZE2__PageEnable_MASK 0x80000000
560#define ACP_DSP1_CACHE_SIZE2__PageEnable__SHIFT 0x1f
561#define ACP_DSP1_CACHE_OFFSET3__Offset_MASK 0xfffffff
562#define ACP_DSP1_CACHE_OFFSET3__Offset__SHIFT 0x0
563#define ACP_DSP1_CACHE_OFFSET3__OnionGarlicSel_MASK 0x80000000
564#define ACP_DSP1_CACHE_OFFSET3__OnionGarlicSel__SHIFT 0x1f
565#define ACP_DSP1_CACHE_SIZE3__Size_MASK 0xffffff
566#define ACP_DSP1_CACHE_SIZE3__Size__SHIFT 0x0
567#define ACP_DSP1_CACHE_SIZE3__PageEnable_MASK 0x80000000
568#define ACP_DSP1_CACHE_SIZE3__PageEnable__SHIFT 0x1f
569#define ACP_DSP1_CACHE_OFFSET4__Offset_MASK 0xfffffff
570#define ACP_DSP1_CACHE_OFFSET4__Offset__SHIFT 0x0
571#define ACP_DSP1_CACHE_OFFSET4__OnionGarlicSel_MASK 0x80000000
572#define ACP_DSP1_CACHE_OFFSET4__OnionGarlicSel__SHIFT 0x1f
573#define ACP_DSP1_CACHE_SIZE4__Size_MASK 0xffffff
574#define ACP_DSP1_CACHE_SIZE4__Size__SHIFT 0x0
575#define ACP_DSP1_CACHE_SIZE4__PageEnable_MASK 0x80000000
576#define ACP_DSP1_CACHE_SIZE4__PageEnable__SHIFT 0x1f
577#define ACP_DSP1_CACHE_OFFSET5__Offset_MASK 0xfffffff
578#define ACP_DSP1_CACHE_OFFSET5__Offset__SHIFT 0x0
579#define ACP_DSP1_CACHE_OFFSET5__OnionGarlicSel_MASK 0x80000000
580#define ACP_DSP1_CACHE_OFFSET5__OnionGarlicSel__SHIFT 0x1f
581#define ACP_DSP1_CACHE_SIZE5__Size_MASK 0xffffff
582#define ACP_DSP1_CACHE_SIZE5__Size__SHIFT 0x0
583#define ACP_DSP1_CACHE_SIZE5__PageEnable_MASK 0x80000000
584#define ACP_DSP1_CACHE_SIZE5__PageEnable__SHIFT 0x1f
585#define ACP_DSP1_CACHE_OFFSET6__Offset_MASK 0xfffffff
586#define ACP_DSP1_CACHE_OFFSET6__Offset__SHIFT 0x0
587#define ACP_DSP1_CACHE_OFFSET6__OnionGarlicSel_MASK 0x80000000
588#define ACP_DSP1_CACHE_OFFSET6__OnionGarlicSel__SHIFT 0x1f
589#define ACP_DSP1_CACHE_SIZE6__Size_MASK 0xffffff
590#define ACP_DSP1_CACHE_SIZE6__Size__SHIFT 0x0
591#define ACP_DSP1_CACHE_SIZE6__PageEnable_MASK 0x80000000
592#define ACP_DSP1_CACHE_SIZE6__PageEnable__SHIFT 0x1f
593#define ACP_DSP1_CACHE_OFFSET7__Offset_MASK 0xfffffff
594#define ACP_DSP1_CACHE_OFFSET7__Offset__SHIFT 0x0
595#define ACP_DSP1_CACHE_OFFSET7__OnionGarlicSel_MASK 0x80000000
596#define ACP_DSP1_CACHE_OFFSET7__OnionGarlicSel__SHIFT 0x1f
597#define ACP_DSP1_CACHE_SIZE7__Size_MASK 0xffffff
598#define ACP_DSP1_CACHE_SIZE7__Size__SHIFT 0x0
599#define ACP_DSP1_CACHE_SIZE7__PageEnable_MASK 0x80000000
600#define ACP_DSP1_CACHE_SIZE7__PageEnable__SHIFT 0x1f
601#define ACP_DSP1_CACHE_OFFSET8__Offset_MASK 0xfffffff
602#define ACP_DSP1_CACHE_OFFSET8__Offset__SHIFT 0x0
603#define ACP_DSP1_CACHE_OFFSET8__OnionGarlicSel_MASK 0x80000000
604#define ACP_DSP1_CACHE_OFFSET8__OnionGarlicSel__SHIFT 0x1f
605#define ACP_DSP1_CACHE_SIZE8__Size_MASK 0xffffff
606#define ACP_DSP1_CACHE_SIZE8__Size__SHIFT 0x0
607#define ACP_DSP1_CACHE_SIZE8__PageEnable_MASK 0x80000000
608#define ACP_DSP1_CACHE_SIZE8__PageEnable__SHIFT 0x1f
609#define ACP_DSP1_NONCACHE_OFFSET0__Offset_MASK 0xfffffff
610#define ACP_DSP1_NONCACHE_OFFSET0__Offset__SHIFT 0x0
611#define ACP_DSP1_NONCACHE_OFFSET0__OnionGarlicSel_MASK 0x80000000
612#define ACP_DSP1_NONCACHE_OFFSET0__OnionGarlicSel__SHIFT 0x1f
613#define ACP_DSP1_NONCACHE_SIZE0__Size_MASK 0xffffff
614#define ACP_DSP1_NONCACHE_SIZE0__Size__SHIFT 0x0
615#define ACP_DSP1_NONCACHE_SIZE0__PageEnable_MASK 0x80000000
616#define ACP_DSP1_NONCACHE_SIZE0__PageEnable__SHIFT 0x1f
617#define ACP_DSP1_NONCACHE_OFFSET1__Offset_MASK 0xfffffff
618#define ACP_DSP1_NONCACHE_OFFSET1__Offset__SHIFT 0x0
619#define ACP_DSP1_NONCACHE_OFFSET1__OnionGarlicSel_MASK 0x80000000
620#define ACP_DSP1_NONCACHE_OFFSET1__OnionGarlicSel__SHIFT 0x1f
621#define ACP_DSP1_NONCACHE_SIZE1__Size_MASK 0xffffff
622#define ACP_DSP1_NONCACHE_SIZE1__Size__SHIFT 0x0
623#define ACP_DSP1_NONCACHE_SIZE1__PageEnable_MASK 0x80000000
624#define ACP_DSP1_NONCACHE_SIZE1__PageEnable__SHIFT 0x1f
625#define ACP_DSP1_DEBUG_PC__DebugPC_MASK 0xffffffff
626#define ACP_DSP1_DEBUG_PC__DebugPC__SHIFT 0x0
627#define ACP_DSP1_NMI_SEL__NMISel_MASK 0x1
628#define ACP_DSP1_NMI_SEL__NMISel__SHIFT 0x0
629#define ACP_DSP1_CLKRST_CNTL__ClkEn_MASK 0x1
630#define ACP_DSP1_CLKRST_CNTL__ClkEn__SHIFT 0x0
631#define ACP_DSP1_CLKRST_CNTL__SoftResetDSP_MASK 0x2
632#define ACP_DSP1_CLKRST_CNTL__SoftResetDSP__SHIFT 0x1
633#define ACP_DSP1_CLKRST_CNTL__InternalSoftResetMode_MASK 0x4
634#define ACP_DSP1_CLKRST_CNTL__InternalSoftResetMode__SHIFT 0x2
635#define ACP_DSP1_CLKRST_CNTL__ExternalSoftResetMode_MASK 0x8
636#define ACP_DSP1_CLKRST_CNTL__ExternalSoftResetMode__SHIFT 0x3
637#define ACP_DSP1_CLKRST_CNTL__SoftResetDSPDone_MASK 0x10
638#define ACP_DSP1_CLKRST_CNTL__SoftResetDSPDone__SHIFT 0x4
639#define ACP_DSP1_CLKRST_CNTL__Clk_ON_Status_MASK 0x20
640#define ACP_DSP1_CLKRST_CNTL__Clk_ON_Status__SHIFT 0x5
641#define ACP_DSP1_RUNSTALL__RunStallCntl_MASK 0x1
642#define ACP_DSP1_RUNSTALL__RunStallCntl__SHIFT 0x0
643#define ACP_DSP1_OCD_HALT_ON_RST__OCD_HALT_ON_RST_MASK 0x1
644#define ACP_DSP1_OCD_HALT_ON_RST__OCD_HALT_ON_RST__SHIFT 0x0
645#define ACP_DSP1_WAIT_MODE__WaitMode_MASK 0x1
646#define ACP_DSP1_WAIT_MODE__WaitMode__SHIFT 0x0
647#define ACP_DSP1_VECT_SEL__StaticVectorSel_MASK 0x1
648#define ACP_DSP1_VECT_SEL__StaticVectorSel__SHIFT 0x0
649#define ACP_DSP1_DEBUG_REG1__ACP_DSP_DEBUG_REG1_MASK 0xffffffff
650#define ACP_DSP1_DEBUG_REG1__ACP_DSP_DEBUG_REG1__SHIFT 0x0
651#define ACP_DSP1_DEBUG_REG2__ACP_DSP_DEBUG_REG2_MASK 0xffffffff
652#define ACP_DSP1_DEBUG_REG2__ACP_DSP_DEBUG_REG2__SHIFT 0x0
653#define ACP_DSP1_DEBUG_REG3__ACP_DSP_DEBUG_REG3_MASK 0xffffffff
654#define ACP_DSP1_DEBUG_REG3__ACP_DSP_DEBUG_REG3__SHIFT 0x0
655#define ACP_DSP2_CACHE_OFFSET0__Offset_MASK 0xfffffff
656#define ACP_DSP2_CACHE_OFFSET0__Offset__SHIFT 0x0
657#define ACP_DSP2_CACHE_OFFSET0__OnionGarlicSel_MASK 0x80000000
658#define ACP_DSP2_CACHE_OFFSET0__OnionGarlicSel__SHIFT 0x1f
659#define ACP_DSP2_CACHE_SIZE0__Size_MASK 0xffffff
660#define ACP_DSP2_CACHE_SIZE0__Size__SHIFT 0x0
661#define ACP_DSP2_CACHE_SIZE0__PageEnable_MASK 0x80000000
662#define ACP_DSP2_CACHE_SIZE0__PageEnable__SHIFT 0x1f
663#define ACP_DSP2_CACHE_OFFSET1__Offset_MASK 0xfffffff
664#define ACP_DSP2_CACHE_OFFSET1__Offset__SHIFT 0x0
665#define ACP_DSP2_CACHE_OFFSET1__OnionGarlicSel_MASK 0x80000000
666#define ACP_DSP2_CACHE_OFFSET1__OnionGarlicSel__SHIFT 0x1f
667#define ACP_DSP2_CACHE_SIZE1__Size_MASK 0xffffff
668#define ACP_DSP2_CACHE_SIZE1__Size__SHIFT 0x0
669#define ACP_DSP2_CACHE_SIZE1__PageEnable_MASK 0x80000000
670#define ACP_DSP2_CACHE_SIZE1__PageEnable__SHIFT 0x1f
671#define ACP_DSP2_CACHE_OFFSET2__Offset_MASK 0xfffffff
672#define ACP_DSP2_CACHE_OFFSET2__Offset__SHIFT 0x0
673#define ACP_DSP2_CACHE_OFFSET2__OnionGarlicSel_MASK 0x80000000
674#define ACP_DSP2_CACHE_OFFSET2__OnionGarlicSel__SHIFT 0x1f
675#define ACP_DSP2_CACHE_SIZE2__Size_MASK 0xffffff
676#define ACP_DSP2_CACHE_SIZE2__Size__SHIFT 0x0
677#define ACP_DSP2_CACHE_SIZE2__PageEnable_MASK 0x80000000
678#define ACP_DSP2_CACHE_SIZE2__PageEnable__SHIFT 0x1f
679#define ACP_DSP2_CACHE_OFFSET3__Offset_MASK 0xfffffff
680#define ACP_DSP2_CACHE_OFFSET3__Offset__SHIFT 0x0
681#define ACP_DSP2_CACHE_OFFSET3__OnionGarlicSel_MASK 0x80000000
682#define ACP_DSP2_CACHE_OFFSET3__OnionGarlicSel__SHIFT 0x1f
683#define ACP_DSP2_CACHE_SIZE3__Size_MASK 0xffffff
684#define ACP_DSP2_CACHE_SIZE3__Size__SHIFT 0x0
685#define ACP_DSP2_CACHE_SIZE3__PageEnable_MASK 0x80000000
686#define ACP_DSP2_CACHE_SIZE3__PageEnable__SHIFT 0x1f
687#define ACP_DSP2_CACHE_OFFSET4__Offset_MASK 0xfffffff
688#define ACP_DSP2_CACHE_OFFSET4__Offset__SHIFT 0x0
689#define ACP_DSP2_CACHE_OFFSET4__OnionGarlicSel_MASK 0x80000000
690#define ACP_DSP2_CACHE_OFFSET4__OnionGarlicSel__SHIFT 0x1f
691#define ACP_DSP2_CACHE_SIZE4__Size_MASK 0xffffff
692#define ACP_DSP2_CACHE_SIZE4__Size__SHIFT 0x0
693#define ACP_DSP2_CACHE_SIZE4__PageEnable_MASK 0x80000000
694#define ACP_DSP2_CACHE_SIZE4__PageEnable__SHIFT 0x1f
695#define ACP_DSP2_CACHE_OFFSET5__Offset_MASK 0xfffffff
696#define ACP_DSP2_CACHE_OFFSET5__Offset__SHIFT 0x0
697#define ACP_DSP2_CACHE_OFFSET5__OnionGarlicSel_MASK 0x80000000
698#define ACP_DSP2_CACHE_OFFSET5__OnionGarlicSel__SHIFT 0x1f
699#define ACP_DSP2_CACHE_SIZE5__Size_MASK 0xffffff
700#define ACP_DSP2_CACHE_SIZE5__Size__SHIFT 0x0
701#define ACP_DSP2_CACHE_SIZE5__PageEnable_MASK 0x80000000
702#define ACP_DSP2_CACHE_SIZE5__PageEnable__SHIFT 0x1f
703#define ACP_DSP2_CACHE_OFFSET6__Offset_MASK 0xfffffff
704#define ACP_DSP2_CACHE_OFFSET6__Offset__SHIFT 0x0
705#define ACP_DSP2_CACHE_OFFSET6__OnionGarlicSel_MASK 0x80000000
706#define ACP_DSP2_CACHE_OFFSET6__OnionGarlicSel__SHIFT 0x1f
707#define ACP_DSP2_CACHE_SIZE6__Size_MASK 0xffffff
708#define ACP_DSP2_CACHE_SIZE6__Size__SHIFT 0x0
709#define ACP_DSP2_CACHE_SIZE6__PageEnable_MASK 0x80000000
710#define ACP_DSP2_CACHE_SIZE6__PageEnable__SHIFT 0x1f
711#define ACP_DSP2_CACHE_OFFSET7__Offset_MASK 0xfffffff
712#define ACP_DSP2_CACHE_OFFSET7__Offset__SHIFT 0x0
713#define ACP_DSP2_CACHE_OFFSET7__OnionGarlicSel_MASK 0x80000000
714#define ACP_DSP2_CACHE_OFFSET7__OnionGarlicSel__SHIFT 0x1f
715#define ACP_DSP2_CACHE_SIZE7__Size_MASK 0xffffff
716#define ACP_DSP2_CACHE_SIZE7__Size__SHIFT 0x0
717#define ACP_DSP2_CACHE_SIZE7__PageEnable_MASK 0x80000000
718#define ACP_DSP2_CACHE_SIZE7__PageEnable__SHIFT 0x1f
719#define ACP_DSP2_CACHE_OFFSET8__Offset_MASK 0xfffffff
720#define ACP_DSP2_CACHE_OFFSET8__Offset__SHIFT 0x0
721#define ACP_DSP2_CACHE_OFFSET8__OnionGarlicSel_MASK 0x80000000
722#define ACP_DSP2_CACHE_OFFSET8__OnionGarlicSel__SHIFT 0x1f
723#define ACP_DSP2_CACHE_SIZE8__Size_MASK 0xffffff
724#define ACP_DSP2_CACHE_SIZE8__Size__SHIFT 0x0
725#define ACP_DSP2_CACHE_SIZE8__PageEnable_MASK 0x80000000
726#define ACP_DSP2_CACHE_SIZE8__PageEnable__SHIFT 0x1f
727#define ACP_DSP2_NONCACHE_OFFSET0__Offset_MASK 0xfffffff
728#define ACP_DSP2_NONCACHE_OFFSET0__Offset__SHIFT 0x0
729#define ACP_DSP2_NONCACHE_OFFSET0__OnionGarlicSel_MASK 0x80000000
730#define ACP_DSP2_NONCACHE_OFFSET0__OnionGarlicSel__SHIFT 0x1f
731#define ACP_DSP2_NONCACHE_SIZE0__Size_MASK 0xffffff
732#define ACP_DSP2_NONCACHE_SIZE0__Size__SHIFT 0x0
733#define ACP_DSP2_NONCACHE_SIZE0__PageEnable_MASK 0x80000000
734#define ACP_DSP2_NONCACHE_SIZE0__PageEnable__SHIFT 0x1f
735#define ACP_DSP2_NONCACHE_OFFSET1__Offset_MASK 0xfffffff
736#define ACP_DSP2_NONCACHE_OFFSET1__Offset__SHIFT 0x0
737#define ACP_DSP2_NONCACHE_OFFSET1__OnionGarlicSel_MASK 0x80000000
738#define ACP_DSP2_NONCACHE_OFFSET1__OnionGarlicSel__SHIFT 0x1f
739#define ACP_DSP2_NONCACHE_SIZE1__Size_MASK 0xffffff
740#define ACP_DSP2_NONCACHE_SIZE1__Size__SHIFT 0x0
741#define ACP_DSP2_NONCACHE_SIZE1__PageEnable_MASK 0x80000000
742#define ACP_DSP2_NONCACHE_SIZE1__PageEnable__SHIFT 0x1f
743#define ACP_DSP2_DEBUG_PC__DebugPC_MASK 0xffffffff
744#define ACP_DSP2_DEBUG_PC__DebugPC__SHIFT 0x0
745#define ACP_DSP2_NMI_SEL__NMISel_MASK 0x1
746#define ACP_DSP2_NMI_SEL__NMISel__SHIFT 0x0
747#define ACP_DSP2_CLKRST_CNTL__ClkEn_MASK 0x1
748#define ACP_DSP2_CLKRST_CNTL__ClkEn__SHIFT 0x0
749#define ACP_DSP2_CLKRST_CNTL__SoftResetDSP_MASK 0x2
750#define ACP_DSP2_CLKRST_CNTL__SoftResetDSP__SHIFT 0x1
751#define ACP_DSP2_CLKRST_CNTL__InternalSoftResetMode_MASK 0x4
752#define ACP_DSP2_CLKRST_CNTL__InternalSoftResetMode__SHIFT 0x2
753#define ACP_DSP2_CLKRST_CNTL__ExternalSoftResetMode_MASK 0x8
754#define ACP_DSP2_CLKRST_CNTL__ExternalSoftResetMode__SHIFT 0x3
755#define ACP_DSP2_CLKRST_CNTL__SoftResetDSPDone_MASK 0x10
756#define ACP_DSP2_CLKRST_CNTL__SoftResetDSPDone__SHIFT 0x4
757#define ACP_DSP2_CLKRST_CNTL__Clk_ON_Status_MASK 0x20
758#define ACP_DSP2_CLKRST_CNTL__Clk_ON_Status__SHIFT 0x5
759#define ACP_DSP2_RUNSTALL__RunStallCntl_MASK 0x1
760#define ACP_DSP2_RUNSTALL__RunStallCntl__SHIFT 0x0
761#define ACP_DSP2_OCD_HALT_ON_RST__OCD_HALT_ON_RST_MASK 0x1
762#define ACP_DSP2_OCD_HALT_ON_RST__OCD_HALT_ON_RST__SHIFT 0x0
763#define ACP_DSP2_WAIT_MODE__WaitMode_MASK 0x1
764#define ACP_DSP2_WAIT_MODE__WaitMode__SHIFT 0x0
765#define ACP_DSP2_VECT_SEL__StaticVectorSel_MASK 0x1
766#define ACP_DSP2_VECT_SEL__StaticVectorSel__SHIFT 0x0
767#define ACP_DSP2_DEBUG_REG1__ACP_DSP_DEBUG_REG1_MASK 0xffffffff
768#define ACP_DSP2_DEBUG_REG1__ACP_DSP_DEBUG_REG1__SHIFT 0x0
769#define ACP_DSP2_DEBUG_REG2__ACP_DSP_DEBUG_REG2_MASK 0xffffffff
770#define ACP_DSP2_DEBUG_REG2__ACP_DSP_DEBUG_REG2__SHIFT 0x0
771#define ACP_DSP2_DEBUG_REG3__ACP_DSP_DEBUG_REG3_MASK 0xffffffff
772#define ACP_DSP2_DEBUG_REG3__ACP_DSP_DEBUG_REG3__SHIFT 0x0
773#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBDataSwap_MASK 0x3
774#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBDataSwap__SHIFT 0x0
775#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBEnbMultRdReq_MASK 0x4
776#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBEnbMultRdReq__SHIFT 0x2
777#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBEnbMultWrReq_MASK 0x18
778#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBEnbMultWrReq__SHIFT 0x3
779#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBMaxReadBurst_MASK 0x60
780#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBMaxReadBurst__SHIFT 0x5
781#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBStallEnb_MASK 0x80
782#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBStallEnb__SHIFT 0x7
783#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBNackChkEnb_MASK 0x100
784#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBNackChkEnb__SHIFT 0x8
785#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBAdrWinViolChkEnb_MASK 0x200
786#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBAdrWinViolChkEnb__SHIFT 0x9
787#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBUrgEnb_MASK 0x400
788#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBUrgEnb__SHIFT 0xa
789#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBUrgCntMult_MASK 0x1800
790#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBUrgCntMult__SHIFT 0xb
791#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBStallMode_MASK 0x2000
792#define ACP_AXI2DAGB_ONION_CNTL__AXI2DAGBStallMode__SHIFT 0xd
793#define ACP_AXI2DAGB_ONION_ERR_STATUS_WR__AXI2DAGBAdrWinViolOver_MASK 0x2000000
794#define ACP_AXI2DAGB_ONION_ERR_STATUS_WR__AXI2DAGBAdrWinViolOver__SHIFT 0x19
795#define ACP_AXI2DAGB_ONION_ERR_STATUS_WR__AXI2DAGBAdrWinViolSource_MASK 0x1c000000
796#define ACP_AXI2DAGB_ONION_ERR_STATUS_WR__AXI2DAGBAdrWinViolSource__SHIFT 0x1a
797#define ACP_AXI2DAGB_ONION_ERR_STATUS_WR__AXI2DAGBAdrWinViol_MASK 0x20000000
798#define ACP_AXI2DAGB_ONION_ERR_STATUS_WR__AXI2DAGBAdrWinViol__SHIFT 0x1d
799#define ACP_AXI2DAGB_ONION_ERR_STATUS_WR__AXI2DAGBNackOver_MASK 0x40000000
800#define ACP_AXI2DAGB_ONION_ERR_STATUS_WR__AXI2DAGBNackOver__SHIFT 0x1e
801#define ACP_AXI2DAGB_ONION_ERR_STATUS_WR__AXI2DAGBNackVal_MASK 0x80000000
802#define ACP_AXI2DAGB_ONION_ERR_STATUS_WR__AXI2DAGBNackVal__SHIFT 0x1f
803#define ACP_AXI2DAGB_ONION_ERR_STATUS_RD__AXI2DAGBAdrWinViolOver_MASK 0x2000000
804#define ACP_AXI2DAGB_ONION_ERR_STATUS_RD__AXI2DAGBAdrWinViolOver__SHIFT 0x19
805#define ACP_AXI2DAGB_ONION_ERR_STATUS_RD__AXI2DAGBAdrWinViolSource_MASK 0x1c000000
806#define ACP_AXI2DAGB_ONION_ERR_STATUS_RD__AXI2DAGBAdrWinViolSource__SHIFT 0x1a
807#define ACP_AXI2DAGB_ONION_ERR_STATUS_RD__AXI2DAGBAdrWinViol_MASK 0x20000000
808#define ACP_AXI2DAGB_ONION_ERR_STATUS_RD__AXI2DAGBAdrWinViol__SHIFT 0x1d
809#define ACP_AXI2DAGB_ONION_ERR_STATUS_RD__AXI2DAGBNackOver_MASK 0x40000000
810#define ACP_AXI2DAGB_ONION_ERR_STATUS_RD__AXI2DAGBNackOver__SHIFT 0x1e
811#define ACP_AXI2DAGB_ONION_ERR_STATUS_RD__AXI2DAGBNackVal_MASK 0x80000000
812#define ACP_AXI2DAGB_ONION_ERR_STATUS_RD__AXI2DAGBNackVal__SHIFT 0x1f
813#define ACP_DAGB_Onion_TransPerf_Counter_Control__EnbDAGBTransPerfCntr_MASK 0x1
814#define ACP_DAGB_Onion_TransPerf_Counter_Control__EnbDAGBTransPerfCntr__SHIFT 0x0
815#define ACP_DAGB_Onion_Wr_TransPerf_Counter_Current__CurDAGBTransPerfCntrTime_MASK 0x1ffff
816#define ACP_DAGB_Onion_Wr_TransPerf_Counter_Current__CurDAGBTransPerfCntrTime__SHIFT 0x0
817#define ACP_DAGB_Onion_Wr_TransPerf_Counter_Current__ClrCurDAGBTransPerfCntr_MASK 0x80000000
818#define ACP_DAGB_Onion_Wr_TransPerf_Counter_Current__ClrCurDAGBTransPerfCntr__SHIFT 0x1f
819#define ACP_DAGB_Onion_Wr_TransPerf_Counter_Peak__PeakDAGBTransPerfCntrTime_MASK 0x1ffff
820#define ACP_DAGB_Onion_Wr_TransPerf_Counter_Peak__PeakDAGBTransPerfCntrTime__SHIFT 0x0
821#define ACP_DAGB_Onion_Wr_TransPerf_Counter_Peak__ClrPeakDAGBTransPerfCntr_MASK 0x80000000
822#define ACP_DAGB_Onion_Wr_TransPerf_Counter_Peak__ClrPeakDAGBTransPerfCntr__SHIFT 0x1f
823#define ACP_DAGB_Onion_Rd_TransPerf_Counter_Current__CurDAGBTransPerfCntrTime_MASK 0x1ffff
824#define ACP_DAGB_Onion_Rd_TransPerf_Counter_Current__CurDAGBTransPerfCntrTime__SHIFT 0x0
825#define ACP_DAGB_Onion_Rd_TransPerf_Counter_Current__ClrCurDAGBTransPerfCntr_MASK 0x80000000
826#define ACP_DAGB_Onion_Rd_TransPerf_Counter_Current__ClrCurDAGBTransPerfCntr__SHIFT 0x1f
827#define ACP_DAGB_Onion_Rd_TransPerf_Counter_Peak__PeakDAGBTransPerfCntrTime_MASK 0x1ffff
828#define ACP_DAGB_Onion_Rd_TransPerf_Counter_Peak__PeakDAGBTransPerfCntrTime__SHIFT 0x0
829#define ACP_DAGB_Onion_Rd_TransPerf_Counter_Peak__ClrPeakDAGBTransPerfCntr_MASK 0x80000000
830#define ACP_DAGB_Onion_Rd_TransPerf_Counter_Peak__ClrPeakDAGBTransPerfCntr__SHIFT 0x1f
831#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBDataSwap_MASK 0x3
832#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBDataSwap__SHIFT 0x0
833#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBEnbMultRdReq_MASK 0x4
834#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBEnbMultRdReq__SHIFT 0x2
835#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBEnbMultWrReq_MASK 0x18
836#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBEnbMultWrReq__SHIFT 0x3
837#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBMaxReadBurst_MASK 0x60
838#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBMaxReadBurst__SHIFT 0x5
839#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBStallEnb_MASK 0x80
840#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBStallEnb__SHIFT 0x7
841#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBNackChkEnb_MASK 0x100
842#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBNackChkEnb__SHIFT 0x8
843#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBAdrWinViolChkEnb_MASK 0x200
844#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBAdrWinViolChkEnb__SHIFT 0x9
845#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBUrgEnb_MASK 0x400
846#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBUrgEnb__SHIFT 0xa
847#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBUrgCntMult_MASK 0x1800
848#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBUrgCntMult__SHIFT 0xb
849#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBStallMode_MASK 0x2000
850#define ACP_AXI2DAGB_GARLIC_CNTL__AXI2DAGBStallMode__SHIFT 0xd
851#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_WR__AXI2DAGBAdrWinViolOver_MASK 0x2000000
852#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_WR__AXI2DAGBAdrWinViolOver__SHIFT 0x19
853#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_WR__AXI2DAGBAdrWinViolSource_MASK 0x1c000000
854#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_WR__AXI2DAGBAdrWinViolSource__SHIFT 0x1a
855#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_WR__AXI2DAGBAdrWinViol_MASK 0x20000000
856#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_WR__AXI2DAGBAdrWinViol__SHIFT 0x1d
857#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_WR__AXI2DAGBNackOver_MASK 0x40000000
858#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_WR__AXI2DAGBNackOver__SHIFT 0x1e
859#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_WR__AXI2DAGBNackVal_MASK 0x80000000
860#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_WR__AXI2DAGBNackVal__SHIFT 0x1f
861#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_RD__AXI2DAGBAdrWinViolOver_MASK 0x2000000
862#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_RD__AXI2DAGBAdrWinViolOver__SHIFT 0x19
863#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_RD__AXI2DAGBAdrWinViolSource_MASK 0x1c000000
864#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_RD__AXI2DAGBAdrWinViolSource__SHIFT 0x1a
865#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_RD__AXI2DAGBAdrWinViol_MASK 0x20000000
866#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_RD__AXI2DAGBAdrWinViol__SHIFT 0x1d
867#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_RD__AXI2DAGBNackOver_MASK 0x40000000
868#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_RD__AXI2DAGBNackOver__SHIFT 0x1e
869#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_RD__AXI2DAGBNackVal_MASK 0x80000000
870#define ACP_AXI2DAGB_GARLIC_ERR_STATUS_RD__AXI2DAGBNackVal__SHIFT 0x1f
871#define ACP_DAGB_Garlic_TransPerf_Counter_Control__EnbDAGBTransPerfCntr_MASK 0x1
872#define ACP_DAGB_Garlic_TransPerf_Counter_Control__EnbDAGBTransPerfCntr__SHIFT 0x0
873#define ACP_DAGB_Garlic_Wr_TransPerf_Counter_Current__CurDAGBTransPerfCntrTime_MASK 0x1ffff
874#define ACP_DAGB_Garlic_Wr_TransPerf_Counter_Current__CurDAGBTransPerfCntrTime__SHIFT 0x0
875#define ACP_DAGB_Garlic_Wr_TransPerf_Counter_Current__ClrCurDAGBTransPerfCntr_MASK 0x80000000
876#define ACP_DAGB_Garlic_Wr_TransPerf_Counter_Current__ClrCurDAGBTransPerfCntr__SHIFT 0x1f
877#define ACP_DAGB_Garlic_Wr_TransPerf_Counter_Peak__PeakDAGBTransPerfCntrTime_MASK 0x1ffff
878#define ACP_DAGB_Garlic_Wr_TransPerf_Counter_Peak__PeakDAGBTransPerfCntrTime__SHIFT 0x0
879#define ACP_DAGB_Garlic_Wr_TransPerf_Counter_Peak__ClrPeakDAGBTransPerfCntr_MASK 0x80000000
880#define ACP_DAGB_Garlic_Wr_TransPerf_Counter_Peak__ClrPeakDAGBTransPerfCntr__SHIFT 0x1f
881#define ACP_DAGB_Garlic_Rd_TransPerf_Counter_Current__CurDAGBTransPerfCntrTime_MASK 0x1ffff
882#define ACP_DAGB_Garlic_Rd_TransPerf_Counter_Current__CurDAGBTransPerfCntrTime__SHIFT 0x0
883#define ACP_DAGB_Garlic_Rd_TransPerf_Counter_Current__ClrCurDAGBTransPerfCntr_MASK 0x80000000
884#define ACP_DAGB_Garlic_Rd_TransPerf_Counter_Current__ClrCurDAGBTransPerfCntr__SHIFT 0x1f
885#define ACP_DAGB_Garlic_Rd_TransPerf_Counter_Peak__PeakDAGBTransPerfCntrTime_MASK 0x1ffff
886#define ACP_DAGB_Garlic_Rd_TransPerf_Counter_Peak__PeakDAGBTransPerfCntrTime__SHIFT 0x0
887#define ACP_DAGB_Garlic_Rd_TransPerf_Counter_Peak__ClrPeakDAGBTransPerfCntr_MASK 0x80000000
888#define ACP_DAGB_Garlic_Rd_TransPerf_Counter_Peak__ClrPeakDAGBTransPerfCntr__SHIFT 0x1f
889#define ACP_DAGB_PAGE_SIZE_GRP_1__AXI2DAGBPageSize_MASK 0x3
890#define ACP_DAGB_PAGE_SIZE_GRP_1__AXI2DAGBPageSize__SHIFT 0x0
891#define ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBBaseAddr_MASK 0xfffffff
892#define ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBBaseAddr__SHIFT 0x0
893#define ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBSnoopSel_MASK 0x20000000
894#define ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBSnoopSel__SHIFT 0x1d
895#define ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBTargetMemSel_MASK 0x40000000
896#define ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBTargetMemSel__SHIFT 0x1e
897#define ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBGrpEnable_MASK 0x80000000
898#define ACP_DAGB_BASE_ADDR_GRP_1__AXI2DAGBGrpEnable__SHIFT 0x1f
899#define ACP_DAGB_PAGE_SIZE_GRP_2__AXI2DAGBPageSize_MASK 0x3
900#define ACP_DAGB_PAGE_SIZE_GRP_2__AXI2DAGBPageSize__SHIFT 0x0
901#define ACP_DAGB_BASE_ADDR_GRP_2__AXI2DAGBBaseAddr_MASK 0xfffffff
902#define ACP_DAGB_BASE_ADDR_GRP_2__AXI2DAGBBaseAddr__SHIFT 0x0
903#define ACP_DAGB_BASE_ADDR_GRP_2__AXI2DAGBSnoopSel_MASK 0x20000000
904#define ACP_DAGB_BASE_ADDR_GRP_2__AXI2DAGBSnoopSel__SHIFT 0x1d
905#define ACP_DAGB_BASE_ADDR_GRP_2__AXI2DAGBTargetMemSel_MASK 0x40000000
906#define ACP_DAGB_BASE_ADDR_GRP_2__AXI2DAGBTargetMemSel__SHIFT 0x1e
907#define ACP_DAGB_BASE_ADDR_GRP_2__AXI2DAGBGrpEnable_MASK 0x80000000
908#define ACP_DAGB_BASE_ADDR_GRP_2__AXI2DAGBGrpEnable__SHIFT 0x1f
909#define ACP_DAGB_PAGE_SIZE_GRP_3__AXI2DAGBPageSize_MASK 0x3
910#define ACP_DAGB_PAGE_SIZE_GRP_3__AXI2DAGBPageSize__SHIFT 0x0
911#define ACP_DAGB_BASE_ADDR_GRP_3__AXI2DAGBBaseAddr_MASK 0xfffffff
912#define ACP_DAGB_BASE_ADDR_GRP_3__AXI2DAGBBaseAddr__SHIFT 0x0
913#define ACP_DAGB_BASE_ADDR_GRP_3__AXI2DAGBSnoopSel_MASK 0x20000000
914#define ACP_DAGB_BASE_ADDR_GRP_3__AXI2DAGBSnoopSel__SHIFT 0x1d
915#define ACP_DAGB_BASE_ADDR_GRP_3__AXI2DAGBTargetMemSel_MASK 0x40000000
916#define ACP_DAGB_BASE_ADDR_GRP_3__AXI2DAGBTargetMemSel__SHIFT 0x1e
917#define ACP_DAGB_BASE_ADDR_GRP_3__AXI2DAGBGrpEnable_MASK 0x80000000
918#define ACP_DAGB_BASE_ADDR_GRP_3__AXI2DAGBGrpEnable__SHIFT 0x1f
919#define ACP_DAGB_PAGE_SIZE_GRP_4__AXI2DAGBPageSize_MASK 0x3
920#define ACP_DAGB_PAGE_SIZE_GRP_4__AXI2DAGBPageSize__SHIFT 0x0
921#define ACP_DAGB_BASE_ADDR_GRP_4__AXI2DAGBBaseAddr_MASK 0xfffffff
922#define ACP_DAGB_BASE_ADDR_GRP_4__AXI2DAGBBaseAddr__SHIFT 0x0
923#define ACP_DAGB_BASE_ADDR_GRP_4__AXI2DAGBSnoopSel_MASK 0x20000000
924#define ACP_DAGB_BASE_ADDR_GRP_4__AXI2DAGBSnoopSel__SHIFT 0x1d
925#define ACP_DAGB_BASE_ADDR_GRP_4__AXI2DAGBTargetMemSel_MASK 0x40000000
926#define ACP_DAGB_BASE_ADDR_GRP_4__AXI2DAGBTargetMemSel__SHIFT 0x1e
927#define ACP_DAGB_BASE_ADDR_GRP_4__AXI2DAGBGrpEnable_MASK 0x80000000
928#define ACP_DAGB_BASE_ADDR_GRP_4__AXI2DAGBGrpEnable__SHIFT 0x1f
929#define ACP_DAGB_PAGE_SIZE_GRP_5__AXI2DAGBPageSize_MASK 0x3
930#define ACP_DAGB_PAGE_SIZE_GRP_5__AXI2DAGBPageSize__SHIFT 0x0
931#define ACP_DAGB_BASE_ADDR_GRP_5__AXI2DAGBBaseAddr_MASK 0xfffffff
932#define ACP_DAGB_BASE_ADDR_GRP_5__AXI2DAGBBaseAddr__SHIFT 0x0
933#define ACP_DAGB_BASE_ADDR_GRP_5__AXI2DAGBSnoopSel_MASK 0x20000000
934#define ACP_DAGB_BASE_ADDR_GRP_5__AXI2DAGBSnoopSel__SHIFT 0x1d
935#define ACP_DAGB_BASE_ADDR_GRP_5__AXI2DAGBTargetMemSel_MASK 0x40000000
936#define ACP_DAGB_BASE_ADDR_GRP_5__AXI2DAGBTargetMemSel__SHIFT 0x1e
937#define ACP_DAGB_BASE_ADDR_GRP_5__AXI2DAGBGrpEnable_MASK 0x80000000
938#define ACP_DAGB_BASE_ADDR_GRP_5__AXI2DAGBGrpEnable__SHIFT 0x1f
939#define ACP_DAGB_PAGE_SIZE_GRP_6__AXI2DAGBPageSize_MASK 0x3
940#define ACP_DAGB_PAGE_SIZE_GRP_6__AXI2DAGBPageSize__SHIFT 0x0
941#define ACP_DAGB_BASE_ADDR_GRP_6__AXI2DAGBBaseAddr_MASK 0xfffffff
942#define ACP_DAGB_BASE_ADDR_GRP_6__AXI2DAGBBaseAddr__SHIFT 0x0
943#define ACP_DAGB_BASE_ADDR_GRP_6__AXI2DAGBSnoopSel_MASK 0x20000000
944#define ACP_DAGB_BASE_ADDR_GRP_6__AXI2DAGBSnoopSel__SHIFT 0x1d
945#define ACP_DAGB_BASE_ADDR_GRP_6__AXI2DAGBTargetMemSel_MASK 0x40000000
946#define ACP_DAGB_BASE_ADDR_GRP_6__AXI2DAGBTargetMemSel__SHIFT 0x1e
947#define ACP_DAGB_BASE_ADDR_GRP_6__AXI2DAGBGrpEnable_MASK 0x80000000
948#define ACP_DAGB_BASE_ADDR_GRP_6__AXI2DAGBGrpEnable__SHIFT 0x1f
949#define ACP_DAGB_PAGE_SIZE_GRP_7__AXI2DAGBPageSize_MASK 0x3
950#define ACP_DAGB_PAGE_SIZE_GRP_7__AXI2DAGBPageSize__SHIFT 0x0
951#define ACP_DAGB_BASE_ADDR_GRP_7__AXI2DAGBBaseAddr_MASK 0xfffffff
952#define ACP_DAGB_BASE_ADDR_GRP_7__AXI2DAGBBaseAddr__SHIFT 0x0
953#define ACP_DAGB_BASE_ADDR_GRP_7__AXI2DAGBSnoopSel_MASK 0x20000000
954#define ACP_DAGB_BASE_ADDR_GRP_7__AXI2DAGBSnoopSel__SHIFT 0x1d
955#define ACP_DAGB_BASE_ADDR_GRP_7__AXI2DAGBTargetMemSel_MASK 0x40000000
956#define ACP_DAGB_BASE_ADDR_GRP_7__AXI2DAGBTargetMemSel__SHIFT 0x1e
957#define ACP_DAGB_BASE_ADDR_GRP_7__AXI2DAGBGrpEnable_MASK 0x80000000
958#define ACP_DAGB_BASE_ADDR_GRP_7__AXI2DAGBGrpEnable__SHIFT 0x1f
959#define ACP_DAGB_PAGE_SIZE_GRP_8__AXI2DAGBPageSize_MASK 0x3
960#define ACP_DAGB_PAGE_SIZE_GRP_8__AXI2DAGBPageSize__SHIFT 0x0
961#define ACP_DAGB_BASE_ADDR_GRP_8__AXI2DAGBBaseAddr_MASK 0xfffffff
962#define ACP_DAGB_BASE_ADDR_GRP_8__AXI2DAGBBaseAddr__SHIFT 0x0
963#define ACP_DAGB_BASE_ADDR_GRP_8__AXI2DAGBSnoopSel_MASK 0x20000000
964#define ACP_DAGB_BASE_ADDR_GRP_8__AXI2DAGBSnoopSel__SHIFT 0x1d
965#define ACP_DAGB_BASE_ADDR_GRP_8__AXI2DAGBTargetMemSel_MASK 0x40000000
966#define ACP_DAGB_BASE_ADDR_GRP_8__AXI2DAGBTargetMemSel__SHIFT 0x1e
967#define ACP_DAGB_BASE_ADDR_GRP_8__AXI2DAGBGrpEnable_MASK 0x80000000
968#define ACP_DAGB_BASE_ADDR_GRP_8__AXI2DAGBGrpEnable__SHIFT 0x1f
969#define ACP_DAGB_ATU_CTRL__AXI2DAGBCacheInvalidate_MASK 0x1
970#define ACP_DAGB_ATU_CTRL__AXI2DAGBCacheInvalidate__SHIFT 0x0
971#define ACP_CONTROL__ClkEn_MASK 0x1
972#define ACP_CONTROL__ClkEn__SHIFT 0x0
973#define ACP_CONTROL__JtagEn_MASK 0x400
974#define ACP_CONTROL__JtagEn__SHIFT 0xa
975#define ACP_STATUS__ClkOn_MASK 0x1
976#define ACP_STATUS__ClkOn__SHIFT 0x0
977#define ACP_STATUS__ACPRefClkSpd_MASK 0x2
978#define ACP_STATUS__ACPRefClkSpd__SHIFT 0x1
979#define ACP_STATUS__SMUStutterLastEdge_MASK 0x4
980#define ACP_STATUS__SMUStutterLastEdge__SHIFT 0x2
981#define ACP_STATUS__MCStutterLastEdge_MASK 0x8
982#define ACP_STATUS__MCStutterLastEdge__SHIFT 0x3
983#define ACP_SOFT_RESET__SoftResetAud_MASK 0x100
984#define ACP_SOFT_RESET__SoftResetAud__SHIFT 0x8
985#define ACP_SOFT_RESET__SoftResetDMA_MASK 0x200
986#define ACP_SOFT_RESET__SoftResetDMA__SHIFT 0x9
987#define ACP_SOFT_RESET__InternalSoftResetMode_MASK 0x4000
988#define ACP_SOFT_RESET__InternalSoftResetMode__SHIFT 0xe
989#define ACP_SOFT_RESET__ExternalSoftResetMode_MASK 0x8000
990#define ACP_SOFT_RESET__ExternalSoftResetMode__SHIFT 0xf
991#define ACP_SOFT_RESET__SoftResetAudDone_MASK 0x1000000
992#define ACP_SOFT_RESET__SoftResetAudDone__SHIFT 0x18
993#define ACP_SOFT_RESET__SoftResetDMADone_MASK 0x2000000
994#define ACP_SOFT_RESET__SoftResetDMADone__SHIFT 0x19
995#define ACP_PwrMgmt_CNTL__SCLKSleepCntl_MASK 0x3
996#define ACP_PwrMgmt_CNTL__SCLKSleepCntl__SHIFT 0x0
997#define ACP_CAC_INDICATOR_CONTROL__ACP_Cac_Indicator_Counter_MASK 0xffff
998#define ACP_CAC_INDICATOR_CONTROL__ACP_Cac_Indicator_Counter__SHIFT 0x0
999#define ACP_SMU_MAILBOX__ACP_SMU_Mailbox_MASK 0xffffffff
1000#define ACP_SMU_MAILBOX__ACP_SMU_Mailbox__SHIFT 0x0
1001#define ACP_FUTURE_REG_SCLK_0__ACPFutureReg_MASK 0xffffffff
1002#define ACP_FUTURE_REG_SCLK_0__ACPFutureReg__SHIFT 0x0
1003#define ACP_FUTURE_REG_SCLK_1__ACPFutureReg_MASK 0xffffffff
1004#define ACP_FUTURE_REG_SCLK_1__ACPFutureReg__SHIFT 0x0
1005#define ACP_FUTURE_REG_SCLK_2__ACPFutureReg_MASK 0xffffffff
1006#define ACP_FUTURE_REG_SCLK_2__ACPFutureReg__SHIFT 0x0
1007#define ACP_FUTURE_REG_SCLK_3__ACPFutureReg_MASK 0xffffffff
1008#define ACP_FUTURE_REG_SCLK_3__ACPFutureReg__SHIFT 0x0
1009#define ACP_FUTURE_REG_SCLK_4__ACPFutureReg_MASK 0xffffffff
1010#define ACP_FUTURE_REG_SCLK_4__ACPFutureReg__SHIFT 0x0
1011#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_wr_ask_cnt_enable_MASK 0x1
1012#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_wr_ask_cnt_enable__SHIFT 0x0
1013#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_wr_go_cnt_enable_MASK 0x2
1014#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_wr_go_cnt_enable__SHIFT 0x1
1015#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_wr_exp_respcnt_enable_MASK 0x4
1016#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_wr_exp_respcnt_enable__SHIFT 0x2
1017#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_wr_actual_respcnt_enable_MASK 0x8
1018#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_wr_actual_respcnt_enable__SHIFT 0x3
1019#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_rd_ask_cnt_enable_MASK 0x10
1020#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_rd_ask_cnt_enable__SHIFT 0x4
1021#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_rd_go_cnt_enable_MASK 0x20
1022#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_rd_go_cnt_enable__SHIFT 0x5
1023#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_rd_exp_respcnt_enable_MASK 0x40
1024#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_rd_exp_respcnt_enable__SHIFT 0x6
1025#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_rd_actual_respcnt_enable_MASK 0x80
1026#define ACP_DAGB_DEBUG_CNT_ENABLE__garlic_rd_actual_respcnt_enable__SHIFT 0x7
1027#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_wr_ask_cnt_enable_MASK 0x100
1028#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_wr_ask_cnt_enable__SHIFT 0x8
1029#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_wr_go_cnt_enable_MASK 0x200
1030#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_wr_go_cnt_enable__SHIFT 0x9
1031#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_wr_exp_respcnt_enable_MASK 0x400
1032#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_wr_exp_respcnt_enable__SHIFT 0xa
1033#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_wr_actual_respcnt_enable_MASK 0x800
1034#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_wr_actual_respcnt_enable__SHIFT 0xb
1035#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_rd_ask_cnt_enable_MASK 0x1000
1036#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_rd_ask_cnt_enable__SHIFT 0xc
1037#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_rd_go_cnt_enable_MASK 0x2000
1038#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_rd_go_cnt_enable__SHIFT 0xd
1039#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_rd_exp_respcnt_enable_MASK 0x4000
1040#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_rd_exp_respcnt_enable__SHIFT 0xe
1041#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_rd_actual_respcnt_enable_MASK 0x8000
1042#define ACP_DAGB_DEBUG_CNT_ENABLE__onion_rd_actual_respcnt_enable__SHIFT 0xf
1043#define ACP_DAGBG_WR_ASK_CNT__garlic_wr_only_ask_cnt_MASK 0xffff
1044#define ACP_DAGBG_WR_ASK_CNT__garlic_wr_only_ask_cnt__SHIFT 0x0
1045#define ACP_DAGBG_WR_GO_CNT__garlic_wr_only_go_cnt_MASK 0xffff
1046#define ACP_DAGBG_WR_GO_CNT__garlic_wr_only_go_cnt__SHIFT 0x0
1047#define ACP_DAGBG_WR_EXP_RESP_CNT__garlic_wr_exp_resp_cnt_MASK 0xffff
1048#define ACP_DAGBG_WR_EXP_RESP_CNT__garlic_wr_exp_resp_cnt__SHIFT 0x0
1049#define ACP_DAGBG_WR_ACTUAL_RESP_CNT__garlic_wr_actual_resp_cnt_MASK 0xffff
1050#define ACP_DAGBG_WR_ACTUAL_RESP_CNT__garlic_wr_actual_resp_cnt__SHIFT 0x0
1051#define ACP_DAGBG_RD_ASK_CNT__garlic_rd_only_ask_cnt_MASK 0xffff
1052#define ACP_DAGBG_RD_ASK_CNT__garlic_rd_only_ask_cnt__SHIFT 0x0
1053#define ACP_DAGBG_RD_GO_CNT__garlic_rd_only_go_cnt_MASK 0xffff
1054#define ACP_DAGBG_RD_GO_CNT__garlic_rd_only_go_cnt__SHIFT 0x0
1055#define ACP_DAGBG_RD_EXP_RESP_CNT__garlic_rd_exp_resp_cnt_MASK 0xffff
1056#define ACP_DAGBG_RD_EXP_RESP_CNT__garlic_rd_exp_resp_cnt__SHIFT 0x0
1057#define ACP_DAGBG_RD_ACTUAL_RESP_CNT__garlic_rd_actual_resp_cnt_MASK 0xffff
1058#define ACP_DAGBG_RD_ACTUAL_RESP_CNT__garlic_rd_actual_resp_cnt__SHIFT 0x0
1059#define ACP_DAGBO_WR_ASK_CNT__onion_wr_only_ask_cnt_MASK 0xffff
1060#define ACP_DAGBO_WR_ASK_CNT__onion_wr_only_ask_cnt__SHIFT 0x0
1061#define ACP_DAGBO_WR_GO_CNT__onion_wr_only_go_cnt_MASK 0xffff
1062#define ACP_DAGBO_WR_GO_CNT__onion_wr_only_go_cnt__SHIFT 0x0
1063#define ACP_DAGBO_WR_EXP_RESP_CNT__onion_wr_exp_resp_cnt_MASK 0xffff
1064#define ACP_DAGBO_WR_EXP_RESP_CNT__onion_wr_exp_resp_cnt__SHIFT 0x0
1065#define ACP_DAGBO_WR_ACTUAL_RESP_CNT__onion_wr_actual_resp_cnt_MASK 0xffff
1066#define ACP_DAGBO_WR_ACTUAL_RESP_CNT__onion_wr_actual_resp_cnt__SHIFT 0x0
1067#define ACP_DAGBO_RD_ASK_CNT__onion_rd_only_ask_cnt_MASK 0xffff
1068#define ACP_DAGBO_RD_ASK_CNT__onion_rd_only_ask_cnt__SHIFT 0x0
1069#define ACP_DAGBO_RD_GO_CNT__onion_rd_only_go_cnt_MASK 0xffff
1070#define ACP_DAGBO_RD_GO_CNT__onion_rd_only_go_cnt__SHIFT 0x0
1071#define ACP_DAGBO_RD_EXP_RESP_CNT__onion_rd_exp_resp_cnt_MASK 0xffff
1072#define ACP_DAGBO_RD_EXP_RESP_CNT__onion_rd_exp_resp_cnt__SHIFT 0x0
1073#define ACP_DAGBO_RD_ACTUAL_RESP_CNT__onion_rd_actual_resp_cnt_MASK 0xffff
1074#define ACP_DAGBO_RD_ACTUAL_RESP_CNT__onion_rd_actual_resp_cnt__SHIFT 0x0
1075#define ACP_BRB_CONTROL__BRB_BlockSharedRAMArbCntrl_MASK 0xf
1076#define ACP_BRB_CONTROL__BRB_BlockSharedRAMArbCntrl__SHIFT 0x0
1077#define ACP_EXTERNAL_INTR_ENB__ACPExtIntrEnb_MASK 0x1
1078#define ACP_EXTERNAL_INTR_ENB__ACPExtIntrEnb__SHIFT 0x0
1079#define ACP_EXTERNAL_INTR_CNTL__ACPErrMask_MASK 0x1
1080#define ACP_EXTERNAL_INTR_CNTL__ACPErrMask__SHIFT 0x0
1081#define ACP_EXTERNAL_INTR_CNTL__I2SMicDataAvMask_MASK 0x2
1082#define ACP_EXTERNAL_INTR_CNTL__I2SMicDataAvMask__SHIFT 0x1
1083#define ACP_EXTERNAL_INTR_CNTL__I2SSpkr0DataEmptyMask_MASK 0x4
1084#define ACP_EXTERNAL_INTR_CNTL__I2SSpkr0DataEmptyMask__SHIFT 0x2
1085#define ACP_EXTERNAL_INTR_CNTL__I2SSpkr1DataEmptyMask_MASK 0x8
1086#define ACP_EXTERNAL_INTR_CNTL__I2SSpkr1DataEmptyMask__SHIFT 0x3
1087#define ACP_EXTERNAL_INTR_CNTL__I2SBTDataAvMask_MASK 0x10
1088#define ACP_EXTERNAL_INTR_CNTL__I2SBTDataAvMask__SHIFT 0x4
1089#define ACP_EXTERNAL_INTR_CNTL__AzaliaIntrMask_MASK 0x40
1090#define ACP_EXTERNAL_INTR_CNTL__AzaliaIntrMask__SHIFT 0x6
1091#define ACP_EXTERNAL_INTR_CNTL__DSP0TimeoutMask_MASK 0x100
1092#define ACP_EXTERNAL_INTR_CNTL__DSP0TimeoutMask__SHIFT 0x8
1093#define ACP_EXTERNAL_INTR_CNTL__DSP1TimeoutMask_MASK 0x200
1094#define ACP_EXTERNAL_INTR_CNTL__DSP1TimeoutMask__SHIFT 0x9
1095#define ACP_EXTERNAL_INTR_CNTL__DSP2TimeoutMask_MASK 0x400
1096#define ACP_EXTERNAL_INTR_CNTL__DSP2TimeoutMask__SHIFT 0xa
1097#define ACP_EXTERNAL_INTR_CNTL__I2SBTDataEmptyMask_MASK 0x800
1098#define ACP_EXTERNAL_INTR_CNTL__I2SBTDataEmptyMask__SHIFT 0xb
1099#define ACP_EXTERNAL_INTR_CNTL__DMAIOCMask_MASK 0xffff0000
1100#define ACP_EXTERNAL_INTR_CNTL__DMAIOCMask__SHIFT 0x10
1101#define ACP_ERROR_SOURCE_STS__ACPRegUdefADDRErr_MASK 0x1
1102#define ACP_ERROR_SOURCE_STS__ACPRegUdefADDRErr__SHIFT 0x0
1103#define ACP_ERROR_SOURCE_STS__ACPRegUdefADDRErrSource_MASK 0xe
1104#define ACP_ERROR_SOURCE_STS__ACPRegUdefADDRErrSource__SHIFT 0x1
1105#define ACP_ERROR_SOURCE_STS__ACPRegUdefADDRErrSourceOver_MASK 0x10
1106#define ACP_ERROR_SOURCE_STS__ACPRegUdefADDRErrSourceOver__SHIFT 0x4
1107#define ACP_ERROR_SOURCE_STS__BRBAddrErr_MASK 0x20
1108#define ACP_ERROR_SOURCE_STS__BRBAddrErr__SHIFT 0x5
1109#define ACP_ERROR_SOURCE_STS__BRBAddrErrSource_MASK 0x3c0
1110#define ACP_ERROR_SOURCE_STS__BRBAddrErrSource__SHIFT 0x6
1111#define ACP_ERROR_SOURCE_STS__BRBAddrErrSourceOver_MASK 0x400
1112#define ACP_ERROR_SOURCE_STS__BRBAddrErrSourceOver__SHIFT 0xa
1113#define ACP_ERROR_SOURCE_STS__I2SMicOverFlowErr_MASK 0x800
1114#define ACP_ERROR_SOURCE_STS__I2SMicOverFlowErr__SHIFT 0xb
1115#define ACP_ERROR_SOURCE_STS__I2SSpeaker0OverFlowErr_MASK 0x1000
1116#define ACP_ERROR_SOURCE_STS__I2SSpeaker0OverFlowErr__SHIFT 0xc
1117#define ACP_ERROR_SOURCE_STS__I2SSpeaker1OverFlowErr_MASK 0x2000
1118#define ACP_ERROR_SOURCE_STS__I2SSpeaker1OverFlowErr__SHIFT 0xd
1119#define ACP_ERROR_SOURCE_STS__I2SBTRxFifoOverFlowErr_MASK 0x4000
1120#define ACP_ERROR_SOURCE_STS__I2SBTRxFifoOverFlowErr__SHIFT 0xe
1121#define ACP_ERROR_SOURCE_STS__DSPAdrTransRangeErr_MASK 0x8000
1122#define ACP_ERROR_SOURCE_STS__DSPAdrTransRangeErr__SHIFT 0xf
1123#define ACP_ERROR_SOURCE_STS__DSPAdrTransRangeErrSource_MASK 0x70000
1124#define ACP_ERROR_SOURCE_STS__DSPAdrTransRangeErrSource__SHIFT 0x10
1125#define ACP_ERROR_SOURCE_STS__DSPAdrTransRangeErrSourceOver_MASK 0x80000
1126#define ACP_ERROR_SOURCE_STS__DSPAdrTransRangeErrSourceOver__SHIFT 0x13
1127#define ACP_ERROR_SOURCE_STS__DAGBErr_MASK 0x100000
1128#define ACP_ERROR_SOURCE_STS__DAGBErr__SHIFT 0x14
1129#define ACP_ERROR_SOURCE_STS__DAGBErrSource_MASK 0x1e00000
1130#define ACP_ERROR_SOURCE_STS__DAGBErrSource__SHIFT 0x15
1131#define ACP_ERROR_SOURCE_STS__DAGBErrSourceOver_MASK 0x2000000
1132#define ACP_ERROR_SOURCE_STS__DAGBErrSourceOver__SHIFT 0x19
1133#define ACP_ERROR_SOURCE_STS__DMATermOnErr_MASK 0x4000000
1134#define ACP_ERROR_SOURCE_STS__DMATermOnErr__SHIFT 0x1a
1135#define ACP_ERROR_SOURCE_STS__I2SBTTxFifoOverFlowErr_MASK 0x10000000
1136#define ACP_ERROR_SOURCE_STS__I2SBTTxFifoOverFlowErr__SHIFT 0x1c
1137#define ACP_DSP_SW_INTR_TRIG__TrigSWIntHostDSP0_MASK 0x1
1138#define ACP_DSP_SW_INTR_TRIG__TrigSWIntHostDSP0__SHIFT 0x0
1139#define ACP_DSP_SW_INTR_TRIG__TrigSWIntHostDSP1_MASK 0x2
1140#define ACP_DSP_SW_INTR_TRIG__TrigSWIntHostDSP1__SHIFT 0x1
1141#define ACP_DSP_SW_INTR_TRIG__TrigSWIntHostDSP2_MASK 0x4
1142#define ACP_DSP_SW_INTR_TRIG__TrigSWIntHostDSP2__SHIFT 0x2
1143#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSPnDSP0_MASK 0x100
1144#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSPnDSP0__SHIFT 0x8
1145#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSPnDSP1_MASK 0x200
1146#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSPnDSP1__SHIFT 0x9
1147#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSPnDSP2_MASK 0x400
1148#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSPnDSP2__SHIFT 0xa
1149#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSP0Host_MASK 0x10000
1150#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSP0Host__SHIFT 0x10
1151#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSP1Host_MASK 0x20000
1152#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSP1Host__SHIFT 0x11
1153#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSP2Host_MASK 0x40000
1154#define ACP_DSP_SW_INTR_TRIG__TrigSWIntDSP2Host__SHIFT 0x12
1155#define ACP_DSP_SW_INTR_CNTL__EnbSWIntHostDSP0_MASK 0x1
1156#define ACP_DSP_SW_INTR_CNTL__EnbSWIntHostDSP0__SHIFT 0x0
1157#define ACP_DSP_SW_INTR_CNTL__EnbSWIntHostDSP1_MASK 0x2
1158#define ACP_DSP_SW_INTR_CNTL__EnbSWIntHostDSP1__SHIFT 0x1
1159#define ACP_DSP_SW_INTR_CNTL__EnbSWIntHostDSP2_MASK 0x4
1160#define ACP_DSP_SW_INTR_CNTL__EnbSWIntHostDSP2__SHIFT 0x2
1161#define ACP_DSP_SW_INTR_CNTL__EnbSWIntDSPnDSP0_MASK 0x100
1162#define ACP_DSP_SW_INTR_CNTL__EnbSWIntDSPnDSP0__SHIFT 0x8
1163#define ACP_DSP_SW_INTR_CNTL__EnbSWIntDSPnDSP1_MASK 0x200
1164#define ACP_DSP_SW_INTR_CNTL__EnbSWIntDSPnDSP1__SHIFT 0x9
1165#define ACP_DSP_SW_INTR_CNTL__EnbSWIntDSPnDSP2_MASK 0x400
1166#define ACP_DSP_SW_INTR_CNTL__EnbSWIntDSPnDSP2__SHIFT 0xa
1167#define ACP_DSP_SW_INTR_CNTL__EnbKernelIntrDSP0Mask_MASK 0x10000
1168#define ACP_DSP_SW_INTR_CNTL__EnbKernelIntrDSP0Mask__SHIFT 0x10
1169#define ACP_DSP_SW_INTR_CNTL__EmbKernelIntrDSP1Mask_MASK 0x20000
1170#define ACP_DSP_SW_INTR_CNTL__EmbKernelIntrDSP1Mask__SHIFT 0x11
1171#define ACP_DSP_SW_INTR_CNTL__EmbKernelIntrDSP2Mask_MASK 0x40000
1172#define ACP_DSP_SW_INTR_CNTL__EmbKernelIntrDSP2Mask__SHIFT 0x12
1173#define ACP_DAGBG_TIMEOUT_CNTL__DAGBGTimeoutValue_MASK 0x3ffff
1174#define ACP_DAGBG_TIMEOUT_CNTL__DAGBGTimeoutValue__SHIFT 0x0
1175#define ACP_DAGBG_TIMEOUT_CNTL__CntEn_MASK 0x80000000
1176#define ACP_DAGBG_TIMEOUT_CNTL__CntEn__SHIFT 0x1f
1177#define ACP_DAGBO_TIMEOUT_CNTL__DAGBOTimeoutValue_MASK 0x3ffff
1178#define ACP_DAGBO_TIMEOUT_CNTL__DAGBOTimeoutValue__SHIFT 0x0
1179#define ACP_DAGBO_TIMEOUT_CNTL__CntEn_MASK 0x80000000
1180#define ACP_DAGBO_TIMEOUT_CNTL__CntEn__SHIFT 0x1f
1181#define ACP_EXTERNAL_INTR_STAT__ACPErrStat_MASK 0x1
1182#define ACP_EXTERNAL_INTR_STAT__ACPErrStat__SHIFT 0x0
1183#define ACP_EXTERNAL_INTR_STAT__ACPErrAck_MASK 0x1
1184#define ACP_EXTERNAL_INTR_STAT__ACPErrAck__SHIFT 0x0
1185#define ACP_EXTERNAL_INTR_STAT__I2SMicDataAvStat_MASK 0x2
1186#define ACP_EXTERNAL_INTR_STAT__I2SMicDataAvStat__SHIFT 0x1
1187#define ACP_EXTERNAL_INTR_STAT__I2SMicDataAvAck_MASK 0x2
1188#define ACP_EXTERNAL_INTR_STAT__I2SMicDataAvAck__SHIFT 0x1
1189#define ACP_EXTERNAL_INTR_STAT__I2SSpkr0DataEmptyStat_MASK 0x4
1190#define ACP_EXTERNAL_INTR_STAT__I2SSpkr0DataEmptyStat__SHIFT 0x2
1191#define ACP_EXTERNAL_INTR_STAT__I2SSpkr0DataEmptyAck_MASK 0x4
1192#define ACP_EXTERNAL_INTR_STAT__I2SSpkr0DataEmptyAck__SHIFT 0x2
1193#define ACP_EXTERNAL_INTR_STAT__I2SSpkr1DataEmptyStat_MASK 0x8
1194#define ACP_EXTERNAL_INTR_STAT__I2SSpkr1DataEmptyStat__SHIFT 0x3
1195#define ACP_EXTERNAL_INTR_STAT__I2SSpkr1DataEmptyAck_MASK 0x8
1196#define ACP_EXTERNAL_INTR_STAT__I2SSpkr1DataEmptyAck__SHIFT 0x3
1197#define ACP_EXTERNAL_INTR_STAT__I2SBTDataAvStat_MASK 0x10
1198#define ACP_EXTERNAL_INTR_STAT__I2SBTDataAvStat__SHIFT 0x4
1199#define ACP_EXTERNAL_INTR_STAT__I2SBTDataAvAck_MASK 0x10
1200#define ACP_EXTERNAL_INTR_STAT__I2SBTDataAvAck__SHIFT 0x4
1201#define ACP_EXTERNAL_INTR_STAT__AzaliaIntrStat_MASK 0x40
1202#define ACP_EXTERNAL_INTR_STAT__AzaliaIntrStat__SHIFT 0x6
1203#define ACP_EXTERNAL_INTR_STAT__AzaliaIntrAck_MASK 0x40
1204#define ACP_EXTERNAL_INTR_STAT__AzaliaIntrAck__SHIFT 0x6
1205#define ACP_EXTERNAL_INTR_STAT__DSP0TimeoutStat_MASK 0x100
1206#define ACP_EXTERNAL_INTR_STAT__DSP0TimeoutStat__SHIFT 0x8
1207#define ACP_EXTERNAL_INTR_STAT__DSP0TimeoutAck_MASK 0x100
1208#define ACP_EXTERNAL_INTR_STAT__DSP0TimeoutAck__SHIFT 0x8
1209#define ACP_EXTERNAL_INTR_STAT__DSP1TimeoutStat_MASK 0x200
1210#define ACP_EXTERNAL_INTR_STAT__DSP1TimeoutStat__SHIFT 0x9
1211#define ACP_EXTERNAL_INTR_STAT__DSP1TimeoutAck_MASK 0x200
1212#define ACP_EXTERNAL_INTR_STAT__DSP1TimeoutAck__SHIFT 0x9
1213#define ACP_EXTERNAL_INTR_STAT__DSP2TimeoutStat_MASK 0x400
1214#define ACP_EXTERNAL_INTR_STAT__DSP2TimeoutStat__SHIFT 0xa
1215#define ACP_EXTERNAL_INTR_STAT__DSP2TimeoutAck_MASK 0x400
1216#define ACP_EXTERNAL_INTR_STAT__DSP2TimeoutAck__SHIFT 0xa
1217#define ACP_EXTERNAL_INTR_STAT__I2SBTDataEmptyStat_MASK 0x800
1218#define ACP_EXTERNAL_INTR_STAT__I2SBTDataEmptyStat__SHIFT 0xb
1219#define ACP_EXTERNAL_INTR_STAT__I2SBTDataEmptyAck_MASK 0x800
1220#define ACP_EXTERNAL_INTR_STAT__I2SBTDataEmptyAck__SHIFT 0xb
1221#define ACP_EXTERNAL_INTR_STAT__DMAIOCStat_MASK 0xffff0000
1222#define ACP_EXTERNAL_INTR_STAT__DMAIOCStat__SHIFT 0x10
1223#define ACP_EXTERNAL_INTR_STAT__DMAIOCAck_MASK 0xffff0000
1224#define ACP_EXTERNAL_INTR_STAT__DMAIOCAck__SHIFT 0x10
1225#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP0Stat_MASK 0x1
1226#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP0Stat__SHIFT 0x0
1227#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP0Ack_MASK 0x1
1228#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP0Ack__SHIFT 0x0
1229#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP1Stat_MASK 0x2
1230#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP1Stat__SHIFT 0x1
1231#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP1Ack_MASK 0x2
1232#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP1Ack__SHIFT 0x1
1233#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP2Stat_MASK 0x4
1234#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP2Stat__SHIFT 0x2
1235#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP2Ack_MASK 0x4
1236#define ACP_DSP_SW_INTR_STAT__SWIntHostDSP2Ack__SHIFT 0x2
1237#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP0Stat_MASK 0x100
1238#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP0Stat__SHIFT 0x8
1239#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP0Ack_MASK 0x100
1240#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP0Ack__SHIFT 0x8
1241#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP1Stat_MASK 0x200
1242#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP1Stat__SHIFT 0x9
1243#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP1Ack_MASK 0x200
1244#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP1Ack__SHIFT 0x9
1245#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP2Stat_MASK 0x400
1246#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP2Stat__SHIFT 0xa
1247#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP2Ack_MASK 0x400
1248#define ACP_DSP_SW_INTR_STAT__SWIntDSPnDSP2Ack__SHIFT 0xa
1249#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP0Stat_MASK 0x10000
1250#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP0Stat__SHIFT 0x10
1251#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP0Ack_MASK 0x10000
1252#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP0Ack__SHIFT 0x10
1253#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP1Stat_MASK 0x20000
1254#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP1Stat__SHIFT 0x11
1255#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP1Ack_MASK 0x20000
1256#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP1Ack__SHIFT 0x11
1257#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP2Stat_MASK 0x40000
1258#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP2Stat__SHIFT 0x12
1259#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP2Ack_MASK 0x40000
1260#define ACP_DSP_SW_INTR_STAT__SWKernelIntrDSP2Ack__SHIFT 0x12
1261#define ACP_DSP0_INTR_CNTL__ACPErrMask_MASK 0x1
1262#define ACP_DSP0_INTR_CNTL__ACPErrMask__SHIFT 0x0
1263#define ACP_DSP0_INTR_CNTL__I2SMicDataAvMask_MASK 0x2
1264#define ACP_DSP0_INTR_CNTL__I2SMicDataAvMask__SHIFT 0x1
1265#define ACP_DSP0_INTR_CNTL__I2SSpkr0DataEmptyMask_MASK 0x4
1266#define ACP_DSP0_INTR_CNTL__I2SSpkr0DataEmptyMask__SHIFT 0x2
1267#define ACP_DSP0_INTR_CNTL__I2SSpkr1DataEmptyMask_MASK 0x8
1268#define ACP_DSP0_INTR_CNTL__I2SSpkr1DataEmptyMask__SHIFT 0x3
1269#define ACP_DSP0_INTR_CNTL__I2SBTDataAvMask_MASK 0x10
1270#define ACP_DSP0_INTR_CNTL__I2SBTDataAvMask__SHIFT 0x4
1271#define ACP_DSP0_INTR_CNTL__AzaliaIntrMask_MASK 0x40
1272#define ACP_DSP0_INTR_CNTL__AzaliaIntrMask__SHIFT 0x6
1273#define ACP_DSP0_INTR_CNTL__SMUMailboxWriteMask_MASK 0x100
1274#define ACP_DSP0_INTR_CNTL__SMUMailboxWriteMask__SHIFT 0x8
1275#define ACP_DSP0_INTR_CNTL__SMUStutterStatusMask_MASK 0x200
1276#define ACP_DSP0_INTR_CNTL__SMUStutterStatusMask__SHIFT 0x9
1277#define ACP_DSP0_INTR_CNTL__MCStutterStatusMask_MASK 0x400
1278#define ACP_DSP0_INTR_CNTL__MCStutterStatusMask__SHIFT 0xa
1279#define ACP_DSP0_INTR_CNTL__DSPExtTimerMask_MASK 0x800
1280#define ACP_DSP0_INTR_CNTL__DSPExtTimerMask__SHIFT 0xb
1281#define ACP_DSP0_INTR_CNTL__DSPSemRespMask_MASK 0x1000
1282#define ACP_DSP0_INTR_CNTL__DSPSemRespMask__SHIFT 0xc
1283#define ACP_DSP0_INTR_CNTL__I2SBTDataEmptyMask_MASK 0x2000
1284#define ACP_DSP0_INTR_CNTL__I2SBTDataEmptyMask__SHIFT 0xd
1285#define ACP_DSP0_INTR_CNTL__DMAIOCMask_MASK 0xffff0000
1286#define ACP_DSP0_INTR_CNTL__DMAIOCMask__SHIFT 0x10
1287#define ACP_DSP0_INTR_STAT__ACPErrStat_MASK 0x1
1288#define ACP_DSP0_INTR_STAT__ACPErrStat__SHIFT 0x0
1289#define ACP_DSP0_INTR_STAT__ACPErrAck_MASK 0x1
1290#define ACP_DSP0_INTR_STAT__ACPErrAck__SHIFT 0x0
1291#define ACP_DSP0_INTR_STAT__I2SMicDataAvStat_MASK 0x2
1292#define ACP_DSP0_INTR_STAT__I2SMicDataAvStat__SHIFT 0x1
1293#define ACP_DSP0_INTR_STAT__I2SMicDataAvAck_MASK 0x2
1294#define ACP_DSP0_INTR_STAT__I2SMicDataAvAck__SHIFT 0x1
1295#define ACP_DSP0_INTR_STAT__I2SSpkr0DataEmptyStat_MASK 0x4
1296#define ACP_DSP0_INTR_STAT__I2SSpkr0DataEmptyStat__SHIFT 0x2
1297#define ACP_DSP0_INTR_STAT__I2SSpkr0DataEmptyAck_MASK 0x4
1298#define ACP_DSP0_INTR_STAT__I2SSpkr0DataEmptyAck__SHIFT 0x2
1299#define ACP_DSP0_INTR_STAT__I2SSpkr1DataEmptyStat_MASK 0x8
1300#define ACP_DSP0_INTR_STAT__I2SSpkr1DataEmptyStat__SHIFT 0x3
1301#define ACP_DSP0_INTR_STAT__I2SSpkr1DataEmptyAck_MASK 0x8
1302#define ACP_DSP0_INTR_STAT__I2SSpkr1DataEmptyAck__SHIFT 0x3
1303#define ACP_DSP0_INTR_STAT__I2SBTDataAvStat_MASK 0x10
1304#define ACP_DSP0_INTR_STAT__I2SBTDataAvStat__SHIFT 0x4
1305#define ACP_DSP0_INTR_STAT__I2SBTDataAvAck_MASK 0x10
1306#define ACP_DSP0_INTR_STAT__I2SBTDataAvAck__SHIFT 0x4
1307#define ACP_DSP0_INTR_STAT__AzaliaIntrStat_MASK 0x40
1308#define ACP_DSP0_INTR_STAT__AzaliaIntrStat__SHIFT 0x6
1309#define ACP_DSP0_INTR_STAT__AzaliaIntrAck_MASK 0x40
1310#define ACP_DSP0_INTR_STAT__AzaliaIntrAck__SHIFT 0x6
1311#define ACP_DSP0_INTR_STAT__SMUMailboxWriteStat_MASK 0x100
1312#define ACP_DSP0_INTR_STAT__SMUMailboxWriteStat__SHIFT 0x8
1313#define ACP_DSP0_INTR_STAT__SMUMailboxWriteAck_MASK 0x100
1314#define ACP_DSP0_INTR_STAT__SMUMailboxWriteAck__SHIFT 0x8
1315#define ACP_DSP0_INTR_STAT__SMUStutterStatusStat_MASK 0x200
1316#define ACP_DSP0_INTR_STAT__SMUStutterStatusStat__SHIFT 0x9
1317#define ACP_DSP0_INTR_STAT__SMUStutterStatusAck_MASK 0x200
1318#define ACP_DSP0_INTR_STAT__SMUStutterStatusAck__SHIFT 0x9
1319#define ACP_DSP0_INTR_STAT__MCStutterStatusStat_MASK 0x400
1320#define ACP_DSP0_INTR_STAT__MCStutterStatusStat__SHIFT 0xa
1321#define ACP_DSP0_INTR_STAT__MCStutterStatusAck_MASK 0x400
1322#define ACP_DSP0_INTR_STAT__MCStutterStatusAck__SHIFT 0xa
1323#define ACP_DSP0_INTR_STAT__DSPExtTimerStat_MASK 0x800
1324#define ACP_DSP0_INTR_STAT__DSPExtTimerStat__SHIFT 0xb
1325#define ACP_DSP0_INTR_STAT__DSPExtTimerAck_MASK 0x800
1326#define ACP_DSP0_INTR_STAT__DSPExtTimerAck__SHIFT 0xb
1327#define ACP_DSP0_INTR_STAT__DSPSemRespStat_MASK 0x1000
1328#define ACP_DSP0_INTR_STAT__DSPSemRespStat__SHIFT 0xc
1329#define ACP_DSP0_INTR_STAT__DSPSemRespAck_MASK 0x1000
1330#define ACP_DSP0_INTR_STAT__DSPSemRespAck__SHIFT 0xc
1331#define ACP_DSP0_INTR_STAT__I2SBTDataEmptyStat_MASK 0x2000
1332#define ACP_DSP0_INTR_STAT__I2SBTDataEmptyStat__SHIFT 0xd
1333#define ACP_DSP0_INTR_STAT__I2SBTDataEmptyAck_MASK 0x2000
1334#define ACP_DSP0_INTR_STAT__I2SBTDataEmptyAck__SHIFT 0xd
1335#define ACP_DSP0_INTR_STAT__DMAIOCStat_MASK 0xffff0000
1336#define ACP_DSP0_INTR_STAT__DMAIOCStat__SHIFT 0x10
1337#define ACP_DSP0_INTR_STAT__DMAIOCAck_MASK 0xffff0000
1338#define ACP_DSP0_INTR_STAT__DMAIOCAck__SHIFT 0x10
1339#define ACP_DSP0_TIMEOUT_CNTL__DSP0TimeoutValue_MASK 0x3ffff
1340#define ACP_DSP0_TIMEOUT_CNTL__DSP0TimeoutValue__SHIFT 0x0
1341#define ACP_DSP0_TIMEOUT_CNTL__CntEn_MASK 0x80000000
1342#define ACP_DSP0_TIMEOUT_CNTL__CntEn__SHIFT 0x1f
1343#define ACP_DSP1_INTR_CNTL__ACPErrMask_MASK 0x1
1344#define ACP_DSP1_INTR_CNTL__ACPErrMask__SHIFT 0x0
1345#define ACP_DSP1_INTR_CNTL__I2SMicDataAvMask_MASK 0x2
1346#define ACP_DSP1_INTR_CNTL__I2SMicDataAvMask__SHIFT 0x1
1347#define ACP_DSP1_INTR_CNTL__I2SSpkr0DataEmptyMask_MASK 0x4
1348#define ACP_DSP1_INTR_CNTL__I2SSpkr0DataEmptyMask__SHIFT 0x2
1349#define ACP_DSP1_INTR_CNTL__I2SSpkr1DataEmptyMask_MASK 0x8
1350#define ACP_DSP1_INTR_CNTL__I2SSpkr1DataEmptyMask__SHIFT 0x3
1351#define ACP_DSP1_INTR_CNTL__I2SBTDataAvMask_MASK 0x10
1352#define ACP_DSP1_INTR_CNTL__I2SBTDataAvMask__SHIFT 0x4
1353#define ACP_DSP1_INTR_CNTL__AzaliaIntrMask_MASK 0x40
1354#define ACP_DSP1_INTR_CNTL__AzaliaIntrMask__SHIFT 0x6
1355#define ACP_DSP1_INTR_CNTL__SMUMailboxWriteMask_MASK 0x100
1356#define ACP_DSP1_INTR_CNTL__SMUMailboxWriteMask__SHIFT 0x8
1357#define ACP_DSP1_INTR_CNTL__SMUStutterStatusMask_MASK 0x200
1358#define ACP_DSP1_INTR_CNTL__SMUStutterStatusMask__SHIFT 0x9
1359#define ACP_DSP1_INTR_CNTL__MCStutterStatusMask_MASK 0x400
1360#define ACP_DSP1_INTR_CNTL__MCStutterStatusMask__SHIFT 0xa
1361#define ACP_DSP1_INTR_CNTL__DSPExtTimerMask_MASK 0x800
1362#define ACP_DSP1_INTR_CNTL__DSPExtTimerMask__SHIFT 0xb
1363#define ACP_DSP1_INTR_CNTL__DSPSemRespMask_MASK 0x1000
1364#define ACP_DSP1_INTR_CNTL__DSPSemRespMask__SHIFT 0xc
1365#define ACP_DSP1_INTR_CNTL__I2SBTDataEmptyMask_MASK 0x2000
1366#define ACP_DSP1_INTR_CNTL__I2SBTDataEmptyMask__SHIFT 0xd
1367#define ACP_DSP1_INTR_CNTL__DMAIOCMask_MASK 0xffff0000
1368#define ACP_DSP1_INTR_CNTL__DMAIOCMask__SHIFT 0x10
1369#define ACP_DSP1_INTR_STAT__ACPErrStat_MASK 0x1
1370#define ACP_DSP1_INTR_STAT__ACPErrStat__SHIFT 0x0
1371#define ACP_DSP1_INTR_STAT__ACPErrAck_MASK 0x1
1372#define ACP_DSP1_INTR_STAT__ACPErrAck__SHIFT 0x0
1373#define ACP_DSP1_INTR_STAT__I2SMicDataAvStat_MASK 0x2
1374#define ACP_DSP1_INTR_STAT__I2SMicDataAvStat__SHIFT 0x1
1375#define ACP_DSP1_INTR_STAT__I2SMicDataAvAck_MASK 0x2
1376#define ACP_DSP1_INTR_STAT__I2SMicDataAvAck__SHIFT 0x1
1377#define ACP_DSP1_INTR_STAT__I2SSpkr0DataEmptyStat_MASK 0x4
1378#define ACP_DSP1_INTR_STAT__I2SSpkr0DataEmptyStat__SHIFT 0x2
1379#define ACP_DSP1_INTR_STAT__I2SSpkr0DataEmptyAck_MASK 0x4
1380#define ACP_DSP1_INTR_STAT__I2SSpkr0DataEmptyAck__SHIFT 0x2
1381#define ACP_DSP1_INTR_STAT__I2SSpkr1DataEmptyStat_MASK 0x8
1382#define ACP_DSP1_INTR_STAT__I2SSpkr1DataEmptyStat__SHIFT 0x3
1383#define ACP_DSP1_INTR_STAT__I2SSpkr1DataEmptyAck_MASK 0x8
1384#define ACP_DSP1_INTR_STAT__I2SSpkr1DataEmptyAck__SHIFT 0x3
1385#define ACP_DSP1_INTR_STAT__I2SBTDataAvStat_MASK 0x10
1386#define ACP_DSP1_INTR_STAT__I2SBTDataAvStat__SHIFT 0x4
1387#define ACP_DSP1_INTR_STAT__I2SBTDataAvAck_MASK 0x10
1388#define ACP_DSP1_INTR_STAT__I2SBTDataAvAck__SHIFT 0x4
1389#define ACP_DSP1_INTR_STAT__AzaliaIntrStat_MASK 0x40
1390#define ACP_DSP1_INTR_STAT__AzaliaIntrStat__SHIFT 0x6
1391#define ACP_DSP1_INTR_STAT__AzaliaIntrAck_MASK 0x40
1392#define ACP_DSP1_INTR_STAT__AzaliaIntrAck__SHIFT 0x6
1393#define ACP_DSP1_INTR_STAT__SMUMailboxWriteStat_MASK 0x100
1394#define ACP_DSP1_INTR_STAT__SMUMailboxWriteStat__SHIFT 0x8
1395#define ACP_DSP1_INTR_STAT__SMUMailboxWriteAck_MASK 0x100
1396#define ACP_DSP1_INTR_STAT__SMUMailboxWriteAck__SHIFT 0x8
1397#define ACP_DSP1_INTR_STAT__SMUStutterStatusStat_MASK 0x200
1398#define ACP_DSP1_INTR_STAT__SMUStutterStatusStat__SHIFT 0x9
1399#define ACP_DSP1_INTR_STAT__SMUStutterStatusAck_MASK 0x200
1400#define ACP_DSP1_INTR_STAT__SMUStutterStatusAck__SHIFT 0x9
1401#define ACP_DSP1_INTR_STAT__MCStutterStatusStat_MASK 0x400
1402#define ACP_DSP1_INTR_STAT__MCStutterStatusStat__SHIFT 0xa
1403#define ACP_DSP1_INTR_STAT__MCStutterStatusAck_MASK 0x400
1404#define ACP_DSP1_INTR_STAT__MCStutterStatusAck__SHIFT 0xa
1405#define ACP_DSP1_INTR_STAT__DSPExtTimerStat_MASK 0x800
1406#define ACP_DSP1_INTR_STAT__DSPExtTimerStat__SHIFT 0xb
1407#define ACP_DSP1_INTR_STAT__DSPExtTimerAck_MASK 0x800
1408#define ACP_DSP1_INTR_STAT__DSPExtTimerAck__SHIFT 0xb
1409#define ACP_DSP1_INTR_STAT__DSPSemRespStat_MASK 0x1000
1410#define ACP_DSP1_INTR_STAT__DSPSemRespStat__SHIFT 0xc
1411#define ACP_DSP1_INTR_STAT__DSPSemRespAck_MASK 0x1000
1412#define ACP_DSP1_INTR_STAT__DSPSemRespAck__SHIFT 0xc
1413#define ACP_DSP1_INTR_STAT__I2SBTDataEmptyStat_MASK 0x2000
1414#define ACP_DSP1_INTR_STAT__I2SBTDataEmptyStat__SHIFT 0xd
1415#define ACP_DSP1_INTR_STAT__I2SBTDataEmptyAck_MASK 0x2000
1416#define ACP_DSP1_INTR_STAT__I2SBTDataEmptyAck__SHIFT 0xd
1417#define ACP_DSP1_INTR_STAT__DMAIOCStat_MASK 0xffff0000
1418#define ACP_DSP1_INTR_STAT__DMAIOCStat__SHIFT 0x10
1419#define ACP_DSP1_INTR_STAT__DMAIOCAck_MASK 0xffff0000
1420#define ACP_DSP1_INTR_STAT__DMAIOCAck__SHIFT 0x10
1421#define ACP_DSP1_TIMEOUT_CNTL__DSP1TimeoutValue_MASK 0x3ffff
1422#define ACP_DSP1_TIMEOUT_CNTL__DSP1TimeoutValue__SHIFT 0x0
1423#define ACP_DSP1_TIMEOUT_CNTL__CntEn_MASK 0x80000000
1424#define ACP_DSP1_TIMEOUT_CNTL__CntEn__SHIFT 0x1f
1425#define ACP_DSP2_INTR_CNTL__ACPErrMask_MASK 0x1
1426#define ACP_DSP2_INTR_CNTL__ACPErrMask__SHIFT 0x0
1427#define ACP_DSP2_INTR_CNTL__I2SMicDataAvMask_MASK 0x2
1428#define ACP_DSP2_INTR_CNTL__I2SMicDataAvMask__SHIFT 0x1
1429#define ACP_DSP2_INTR_CNTL__I2SSpkr0DataEmptyMask_MASK 0x4
1430#define ACP_DSP2_INTR_CNTL__I2SSpkr0DataEmptyMask__SHIFT 0x2
1431#define ACP_DSP2_INTR_CNTL__I2SSpkr1DataEmptyMask_MASK 0x8
1432#define ACP_DSP2_INTR_CNTL__I2SSpkr1DataEmptyMask__SHIFT 0x3
1433#define ACP_DSP2_INTR_CNTL__I2SBTDataAvMask_MASK 0x10
1434#define ACP_DSP2_INTR_CNTL__I2SBTDataAvMask__SHIFT 0x4
1435#define ACP_DSP2_INTR_CNTL__AzaliaIntrMask_MASK 0x40
1436#define ACP_DSP2_INTR_CNTL__AzaliaIntrMask__SHIFT 0x6
1437#define ACP_DSP2_INTR_CNTL__SMUMailboxWriteMask_MASK 0x100
1438#define ACP_DSP2_INTR_CNTL__SMUMailboxWriteMask__SHIFT 0x8
1439#define ACP_DSP2_INTR_CNTL__SMUStutterStatusMask_MASK 0x200
1440#define ACP_DSP2_INTR_CNTL__SMUStutterStatusMask__SHIFT 0x9
1441#define ACP_DSP2_INTR_CNTL__MCStutterStatusMask_MASK 0x400
1442#define ACP_DSP2_INTR_CNTL__MCStutterStatusMask__SHIFT 0xa
1443#define ACP_DSP2_INTR_CNTL__DSPExtTimerMask_MASK 0x800
1444#define ACP_DSP2_INTR_CNTL__DSPExtTimerMask__SHIFT 0xb
1445#define ACP_DSP2_INTR_CNTL__DSPSemRespMask_MASK 0x1000
1446#define ACP_DSP2_INTR_CNTL__DSPSemRespMask__SHIFT 0xc
1447#define ACP_DSP2_INTR_CNTL__I2SBTDataEmptyMask_MASK 0x2000
1448#define ACP_DSP2_INTR_CNTL__I2SBTDataEmptyMask__SHIFT 0xd
1449#define ACP_DSP2_INTR_CNTL__DMAIOCMask_MASK 0xffff0000
1450#define ACP_DSP2_INTR_CNTL__DMAIOCMask__SHIFT 0x10
1451#define ACP_DSP2_INTR_STAT__ACPErrStat_MASK 0x1
1452#define ACP_DSP2_INTR_STAT__ACPErrStat__SHIFT 0x0
1453#define ACP_DSP2_INTR_STAT__ACPErrAck_MASK 0x1
1454#define ACP_DSP2_INTR_STAT__ACPErrAck__SHIFT 0x0
1455#define ACP_DSP2_INTR_STAT__I2SMicDataAvStat_MASK 0x2
1456#define ACP_DSP2_INTR_STAT__I2SMicDataAvStat__SHIFT 0x1
1457#define ACP_DSP2_INTR_STAT__I2SMicDataAvAck_MASK 0x2
1458#define ACP_DSP2_INTR_STAT__I2SMicDataAvAck__SHIFT 0x1
1459#define ACP_DSP2_INTR_STAT__I2SSpkr0DataEmptyStat_MASK 0x4
1460#define ACP_DSP2_INTR_STAT__I2SSpkr0DataEmptyStat__SHIFT 0x2
1461#define ACP_DSP2_INTR_STAT__I2SSpkr0DataEmptyAck_MASK 0x4
1462#define ACP_DSP2_INTR_STAT__I2SSpkr0DataEmptyAck__SHIFT 0x2
1463#define ACP_DSP2_INTR_STAT__I2SSpkr1DataEmptyStat_MASK 0x8
1464#define ACP_DSP2_INTR_STAT__I2SSpkr1DataEmptyStat__SHIFT 0x3
1465#define ACP_DSP2_INTR_STAT__I2SSpkr1DataEmptyAck_MASK 0x8
1466#define ACP_DSP2_INTR_STAT__I2SSpkr1DataEmptyAck__SHIFT 0x3
1467#define ACP_DSP2_INTR_STAT__I2SBTDataAvStat_MASK 0x10
1468#define ACP_DSP2_INTR_STAT__I2SBTDataAvStat__SHIFT 0x4
1469#define ACP_DSP2_INTR_STAT__I2SBTDataAvAck_MASK 0x10
1470#define ACP_DSP2_INTR_STAT__I2SBTDataAvAck__SHIFT 0x4
1471#define ACP_DSP2_INTR_STAT__AzaliaIntrStat_MASK 0x40
1472#define ACP_DSP2_INTR_STAT__AzaliaIntrStat__SHIFT 0x6
1473#define ACP_DSP2_INTR_STAT__AzaliaIntrAck_MASK 0x40
1474#define ACP_DSP2_INTR_STAT__AzaliaIntrAck__SHIFT 0x6
1475#define ACP_DSP2_INTR_STAT__SMUMailboxWriteStat_MASK 0x100
1476#define ACP_DSP2_INTR_STAT__SMUMailboxWriteStat__SHIFT 0x8
1477#define ACP_DSP2_INTR_STAT__SMUMailboxWriteAck_MASK 0x100
1478#define ACP_DSP2_INTR_STAT__SMUMailboxWriteAck__SHIFT 0x8
1479#define ACP_DSP2_INTR_STAT__SMUStutterStatusStat_MASK 0x200
1480#define ACP_DSP2_INTR_STAT__SMUStutterStatusStat__SHIFT 0x9
1481#define ACP_DSP2_INTR_STAT__SMUStutterStatusAck_MASK 0x200
1482#define ACP_DSP2_INTR_STAT__SMUStutterStatusAck__SHIFT 0x9
1483#define ACP_DSP2_INTR_STAT__MCStutterStatusStat_MASK 0x400
1484#define ACP_DSP2_INTR_STAT__MCStutterStatusStat__SHIFT 0xa
1485#define ACP_DSP2_INTR_STAT__MCStutterStatusAck_MASK 0x400
1486#define ACP_DSP2_INTR_STAT__MCStutterStatusAck__SHIFT 0xa
1487#define ACP_DSP2_INTR_STAT__DSPExtTimerStat_MASK 0x800
1488#define ACP_DSP2_INTR_STAT__DSPExtTimerStat__SHIFT 0xb
1489#define ACP_DSP2_INTR_STAT__DSPExtTimerAck_MASK 0x800
1490#define ACP_DSP2_INTR_STAT__DSPExtTimerAck__SHIFT 0xb
1491#define ACP_DSP2_INTR_STAT__DSPSemRespStat_MASK 0x1000
1492#define ACP_DSP2_INTR_STAT__DSPSemRespStat__SHIFT 0xc
1493#define ACP_DSP2_INTR_STAT__DSPSemRespAck_MASK 0x1000
1494#define ACP_DSP2_INTR_STAT__DSPSemRespAck__SHIFT 0xc
1495#define ACP_DSP2_INTR_STAT__I2SBTDataEmptyStat_MASK 0x2000
1496#define ACP_DSP2_INTR_STAT__I2SBTDataEmptyStat__SHIFT 0xd
1497#define ACP_DSP2_INTR_STAT__I2SBTDataEmptyAck_MASK 0x2000
1498#define ACP_DSP2_INTR_STAT__I2SBTDataEmptyAck__SHIFT 0xd
1499#define ACP_DSP2_INTR_STAT__DMAIOCStat_MASK 0xffff0000
1500#define ACP_DSP2_INTR_STAT__DMAIOCStat__SHIFT 0x10
1501#define ACP_DSP2_INTR_STAT__DMAIOCAck_MASK 0xffff0000
1502#define ACP_DSP2_INTR_STAT__DMAIOCAck__SHIFT 0x10
1503#define ACP_DSP2_TIMEOUT_CNTL__DSP2TimeoutValue_MASK 0x3ffff
1504#define ACP_DSP2_TIMEOUT_CNTL__DSP2TimeoutValue__SHIFT 0x0
1505#define ACP_DSP2_TIMEOUT_CNTL__CntEn_MASK 0x80000000
1506#define ACP_DSP2_TIMEOUT_CNTL__CntEn__SHIFT 0x1f
1507#define ACP_DSP0_EXT_TIMER_CNTL__TimerCount_MASK 0xffffff
1508#define ACP_DSP0_EXT_TIMER_CNTL__TimerCount__SHIFT 0x0
1509#define ACP_DSP0_EXT_TIMER_CNTL__TimerCntl_MASK 0xc0000000
1510#define ACP_DSP0_EXT_TIMER_CNTL__TimerCntl__SHIFT 0x1e
1511#define ACP_DSP1_EXT_TIMER_CNTL__TimerCount_MASK 0xffffff
1512#define ACP_DSP1_EXT_TIMER_CNTL__TimerCount__SHIFT 0x0
1513#define ACP_DSP1_EXT_TIMER_CNTL__TimerCntl_MASK 0xc0000000
1514#define ACP_DSP1_EXT_TIMER_CNTL__TimerCntl__SHIFT 0x1e
1515#define ACP_DSP2_EXT_TIMER_CNTL__TimerCount_MASK 0xffffff
1516#define ACP_DSP2_EXT_TIMER_CNTL__TimerCount__SHIFT 0x0
1517#define ACP_DSP2_EXT_TIMER_CNTL__TimerCntl_MASK 0xc0000000
1518#define ACP_DSP2_EXT_TIMER_CNTL__TimerCntl__SHIFT 0x1e
1519#define ACP_AXI2DAGB_SEM_0__AXI2DAGBGblSemReg_MASK 0x1
1520#define ACP_AXI2DAGB_SEM_0__AXI2DAGBGblSemReg__SHIFT 0x0
1521#define ACP_AXI2DAGB_SEM_1__AXI2DAGBGblSemReg_MASK 0x1
1522#define ACP_AXI2DAGB_SEM_1__AXI2DAGBGblSemReg__SHIFT 0x0
1523#define ACP_AXI2DAGB_SEM_2__AXI2DAGBGblSemReg_MASK 0x1
1524#define ACP_AXI2DAGB_SEM_2__AXI2DAGBGblSemReg__SHIFT 0x0
1525#define ACP_AXI2DAGB_SEM_3__AXI2DAGBGblSemReg_MASK 0x1
1526#define ACP_AXI2DAGB_SEM_3__AXI2DAGBGblSemReg__SHIFT 0x0
1527#define ACP_AXI2DAGB_SEM_4__AXI2DAGBGblSemReg_MASK 0x1
1528#define ACP_AXI2DAGB_SEM_4__AXI2DAGBGblSemReg__SHIFT 0x0
1529#define ACP_AXI2DAGB_SEM_5__AXI2DAGBGblSemReg_MASK 0x1
1530#define ACP_AXI2DAGB_SEM_5__AXI2DAGBGblSemReg__SHIFT 0x0
1531#define ACP_AXI2DAGB_SEM_6__AXI2DAGBGblSemReg_MASK 0x1
1532#define ACP_AXI2DAGB_SEM_6__AXI2DAGBGblSemReg__SHIFT 0x0
1533#define ACP_AXI2DAGB_SEM_7__AXI2DAGBGblSemReg_MASK 0x1
1534#define ACP_AXI2DAGB_SEM_7__AXI2DAGBGblSemReg__SHIFT 0x0
1535#define ACP_AXI2DAGB_SEM_8__AXI2DAGBGblSemReg_MASK 0x1
1536#define ACP_AXI2DAGB_SEM_8__AXI2DAGBGblSemReg__SHIFT 0x0
1537#define ACP_AXI2DAGB_SEM_9__AXI2DAGBGblSemReg_MASK 0x1
1538#define ACP_AXI2DAGB_SEM_9__AXI2DAGBGblSemReg__SHIFT 0x0
1539#define ACP_AXI2DAGB_SEM_10__AXI2DAGBGblSemReg_MASK 0x1
1540#define ACP_AXI2DAGB_SEM_10__AXI2DAGBGblSemReg__SHIFT 0x0
1541#define ACP_AXI2DAGB_SEM_11__AXI2DAGBGblSemReg_MASK 0x1
1542#define ACP_AXI2DAGB_SEM_11__AXI2DAGBGblSemReg__SHIFT 0x0
1543#define ACP_AXI2DAGB_SEM_12__AXI2DAGBGblSemReg_MASK 0x1
1544#define ACP_AXI2DAGB_SEM_12__AXI2DAGBGblSemReg__SHIFT 0x0
1545#define ACP_AXI2DAGB_SEM_13__AXI2DAGBGblSemReg_MASK 0x1
1546#define ACP_AXI2DAGB_SEM_13__AXI2DAGBGblSemReg__SHIFT 0x0
1547#define ACP_AXI2DAGB_SEM_14__AXI2DAGBGblSemReg_MASK 0x1
1548#define ACP_AXI2DAGB_SEM_14__AXI2DAGBGblSemReg__SHIFT 0x0
1549#define ACP_AXI2DAGB_SEM_15__AXI2DAGBGblSemReg_MASK 0x1
1550#define ACP_AXI2DAGB_SEM_15__AXI2DAGBGblSemReg__SHIFT 0x0
1551#define ACP_AXI2DAGB_SEM_16__AXI2DAGBGblSemReg_MASK 0x1
1552#define ACP_AXI2DAGB_SEM_16__AXI2DAGBGblSemReg__SHIFT 0x0
1553#define ACP_AXI2DAGB_SEM_17__AXI2DAGBGblSemReg_MASK 0x1
1554#define ACP_AXI2DAGB_SEM_17__AXI2DAGBGblSemReg__SHIFT 0x0
1555#define ACP_AXI2DAGB_SEM_18__AXI2DAGBGblSemReg_MASK 0x1
1556#define ACP_AXI2DAGB_SEM_18__AXI2DAGBGblSemReg__SHIFT 0x0
1557#define ACP_AXI2DAGB_SEM_19__AXI2DAGBGblSemReg_MASK 0x1
1558#define ACP_AXI2DAGB_SEM_19__AXI2DAGBGblSemReg__SHIFT 0x0
1559#define ACP_AXI2DAGB_SEM_20__AXI2DAGBGblSemReg_MASK 0x1
1560#define ACP_AXI2DAGB_SEM_20__AXI2DAGBGblSemReg__SHIFT 0x0
1561#define ACP_AXI2DAGB_SEM_21__AXI2DAGBGblSemReg_MASK 0x1
1562#define ACP_AXI2DAGB_SEM_21__AXI2DAGBGblSemReg__SHIFT 0x0
1563#define ACP_AXI2DAGB_SEM_22__AXI2DAGBGblSemReg_MASK 0x1
1564#define ACP_AXI2DAGB_SEM_22__AXI2DAGBGblSemReg__SHIFT 0x0
1565#define ACP_AXI2DAGB_SEM_23__AXI2DAGBGblSemReg_MASK 0x1
1566#define ACP_AXI2DAGB_SEM_23__AXI2DAGBGblSemReg__SHIFT 0x0
1567#define ACP_AXI2DAGB_SEM_24__AXI2DAGBGblSemReg_MASK 0x1
1568#define ACP_AXI2DAGB_SEM_24__AXI2DAGBGblSemReg__SHIFT 0x0
1569#define ACP_AXI2DAGB_SEM_25__AXI2DAGBGblSemReg_MASK 0x1
1570#define ACP_AXI2DAGB_SEM_25__AXI2DAGBGblSemReg__SHIFT 0x0
1571#define ACP_AXI2DAGB_SEM_26__AXI2DAGBGblSemReg_MASK 0x1
1572#define ACP_AXI2DAGB_SEM_26__AXI2DAGBGblSemReg__SHIFT 0x0
1573#define ACP_AXI2DAGB_SEM_27__AXI2DAGBGblSemReg_MASK 0x1
1574#define ACP_AXI2DAGB_SEM_27__AXI2DAGBGblSemReg__SHIFT 0x0
1575#define ACP_AXI2DAGB_SEM_28__AXI2DAGBGblSemReg_MASK 0x1
1576#define ACP_AXI2DAGB_SEM_28__AXI2DAGBGblSemReg__SHIFT 0x0
1577#define ACP_AXI2DAGB_SEM_29__AXI2DAGBGblSemReg_MASK 0x1
1578#define ACP_AXI2DAGB_SEM_29__AXI2DAGBGblSemReg__SHIFT 0x0
1579#define ACP_AXI2DAGB_SEM_30__AXI2DAGBGblSemReg_MASK 0x1
1580#define ACP_AXI2DAGB_SEM_30__AXI2DAGBGblSemReg__SHIFT 0x0
1581#define ACP_AXI2DAGB_SEM_31__AXI2DAGBGblSemReg_MASK 0x1
1582#define ACP_AXI2DAGB_SEM_31__AXI2DAGBGblSemReg__SHIFT 0x0
1583#define ACP_AXI2DAGB_SEM_32__AXI2DAGBGblSemReg_MASK 0x1
1584#define ACP_AXI2DAGB_SEM_32__AXI2DAGBGblSemReg__SHIFT 0x0
1585#define ACP_AXI2DAGB_SEM_33__AXI2DAGBGblSemReg_MASK 0x1
1586#define ACP_AXI2DAGB_SEM_33__AXI2DAGBGblSemReg__SHIFT 0x0
1587#define ACP_AXI2DAGB_SEM_34__AXI2DAGBGblSemReg_MASK 0x1
1588#define ACP_AXI2DAGB_SEM_34__AXI2DAGBGblSemReg__SHIFT 0x0
1589#define ACP_AXI2DAGB_SEM_35__AXI2DAGBGblSemReg_MASK 0x1
1590#define ACP_AXI2DAGB_SEM_35__AXI2DAGBGblSemReg__SHIFT 0x0
1591#define ACP_AXI2DAGB_SEM_36__AXI2DAGBGblSemReg_MASK 0x1
1592#define ACP_AXI2DAGB_SEM_36__AXI2DAGBGblSemReg__SHIFT 0x0
1593#define ACP_AXI2DAGB_SEM_37__AXI2DAGBGblSemReg_MASK 0x1
1594#define ACP_AXI2DAGB_SEM_37__AXI2DAGBGblSemReg__SHIFT 0x0
1595#define ACP_AXI2DAGB_SEM_38__AXI2DAGBGblSemReg_MASK 0x1
1596#define ACP_AXI2DAGB_SEM_38__AXI2DAGBGblSemReg__SHIFT 0x0
1597#define ACP_AXI2DAGB_SEM_39__AXI2DAGBGblSemReg_MASK 0x1
1598#define ACP_AXI2DAGB_SEM_39__AXI2DAGBGblSemReg__SHIFT 0x0
1599#define ACP_AXI2DAGB_SEM_40__AXI2DAGBGblSemReg_MASK 0x1
1600#define ACP_AXI2DAGB_SEM_40__AXI2DAGBGblSemReg__SHIFT 0x0
1601#define ACP_AXI2DAGB_SEM_41__AXI2DAGBGblSemReg_MASK 0x1
1602#define ACP_AXI2DAGB_SEM_41__AXI2DAGBGblSemReg__SHIFT 0x0
1603#define ACP_AXI2DAGB_SEM_42__AXI2DAGBGblSemReg_MASK 0x1
1604#define ACP_AXI2DAGB_SEM_42__AXI2DAGBGblSemReg__SHIFT 0x0
1605#define ACP_AXI2DAGB_SEM_43__AXI2DAGBGblSemReg_MASK 0x1
1606#define ACP_AXI2DAGB_SEM_43__AXI2DAGBGblSemReg__SHIFT 0x0
1607#define ACP_AXI2DAGB_SEM_44__AXI2DAGBGblSemReg_MASK 0x1
1608#define ACP_AXI2DAGB_SEM_44__AXI2DAGBGblSemReg__SHIFT 0x0
1609#define ACP_AXI2DAGB_SEM_45__AXI2DAGBGblSemReg_MASK 0x1
1610#define ACP_AXI2DAGB_SEM_45__AXI2DAGBGblSemReg__SHIFT 0x0
1611#define ACP_AXI2DAGB_SEM_46__AXI2DAGBGblSemReg_MASK 0x1
1612#define ACP_AXI2DAGB_SEM_46__AXI2DAGBGblSemReg__SHIFT 0x0
1613#define ACP_AXI2DAGB_SEM_47__AXI2DAGBGblSemReg_MASK 0x1
1614#define ACP_AXI2DAGB_SEM_47__AXI2DAGBGblSemReg__SHIFT 0x0
1615#define ACP_SRBM_Client_Base_Addr__SRBM_Client_base_addr_MASK 0xff
1616#define ACP_SRBM_Client_Base_Addr__SRBM_Client_base_addr__SHIFT 0x0
1617#define ACP_SRBM_Client_RDDATA__ReadData_MASK 0xffffffff
1618#define ACP_SRBM_Client_RDDATA__ReadData__SHIFT 0x0
1619#define ACP_SRBM_Cycle_Sts__SRBM_Client_Sts_MASK 0x1
1620#define ACP_SRBM_Cycle_Sts__SRBM_Client_Sts__SHIFT 0x0
1621#define ACP_SRBM_Targ_Idx_Addr__SRBM_Targ_Idx_addr_MASK 0x7ffffff
1622#define ACP_SRBM_Targ_Idx_Addr__SRBM_Targ_Idx_addr__SHIFT 0x0
1623#define ACP_SRBM_Targ_Idx_Data__SRBM_Targ_Idx_Data_MASK 0xffffffff
1624#define ACP_SRBM_Targ_Idx_Data__SRBM_Targ_Idx_Data__SHIFT 0x0
1625#define ACP_SEMA_ADDR_LOW__ADDR_9_3_MASK 0x7f
1626#define ACP_SEMA_ADDR_LOW__ADDR_9_3__SHIFT 0x0
1627#define ACP_SEMA_ADDR_HIGH__ADDR_39_10_MASK 0x3fffffff
1628#define ACP_SEMA_ADDR_HIGH__ADDR_39_10__SHIFT 0x0
1629#define ACP_SEMA_CMD__REQ_CMD_MASK 0xf
1630#define ACP_SEMA_CMD__REQ_CMD__SHIFT 0x0
1631#define ACP_SEMA_CMD__WR_PHASE_MASK 0x30
1632#define ACP_SEMA_CMD__WR_PHASE__SHIFT 0x4
1633#define ACP_SEMA_CMD__VMID_EN_MASK 0x80
1634#define ACP_SEMA_CMD__VMID_EN__SHIFT 0x7
1635#define ACP_SEMA_CMD__VMID_MASK 0xf00
1636#define ACP_SEMA_CMD__VMID__SHIFT 0x8
1637#define ACP_SEMA_CMD__ATC_MASK 0x1000
1638#define ACP_SEMA_CMD__ATC__SHIFT 0xc
1639#define ACP_SEMA_STS__REQ_STS_MASK 0x3
1640#define ACP_SEMA_STS__REQ_STS__SHIFT 0x0
1641#define ACP_SEMA_STS__REQ_RESP_AVAIL_MASK 0x100
1642#define ACP_SEMA_STS__REQ_RESP_AVAIL__SHIFT 0x8
1643#define ACP_SEMA_REQ__ISSUE_POLL_REQ_MASK 0x1
1644#define ACP_SEMA_REQ__ISSUE_POLL_REQ__SHIFT 0x0
1645#define ACP_FW_STATUS__RUN_MASK 0x1
1646#define ACP_FW_STATUS__RUN__SHIFT 0x0
1647#define ACP_FUTURE_REG_ACLK_0__ACPFutureReg_MASK 0xffffffff
1648#define ACP_FUTURE_REG_ACLK_0__ACPFutureReg__SHIFT 0x0
1649#define ACP_FUTURE_REG_ACLK_1__ACPFutureReg_MASK 0xffffffff
1650#define ACP_FUTURE_REG_ACLK_1__ACPFutureReg__SHIFT 0x0
1651#define ACP_FUTURE_REG_ACLK_2__ACPFutureReg_MASK 0xffffffff
1652#define ACP_FUTURE_REG_ACLK_2__ACPFutureReg__SHIFT 0x0
1653#define ACP_FUTURE_REG_ACLK_3__ACPFutureReg_MASK 0xffffffff
1654#define ACP_FUTURE_REG_ACLK_3__ACPFutureReg__SHIFT 0x0
1655#define ACP_FUTURE_REG_ACLK_4__ACPFutureReg_MASK 0xffffffff
1656#define ACP_FUTURE_REG_ACLK_4__ACPFutureReg__SHIFT 0x0
1657#define ACP_TIMER__ACP_Timer_count_MASK 0xffffffff
1658#define ACP_TIMER__ACP_Timer_count__SHIFT 0x0
1659#define ACP_TIMER_CNTL__ACP_Timer_control_MASK 0x1
1660#define ACP_TIMER_CNTL__ACP_Timer_control__SHIFT 0x0
1661#define ACP_DSP0_TIMER__ACP_DSP0_timer_MASK 0xffffff
1662#define ACP_DSP0_TIMER__ACP_DSP0_timer__SHIFT 0x0
1663#define ACP_DSP1_TIMER__ACP_DSP1_timer_MASK 0xffffff
1664#define ACP_DSP1_TIMER__ACP_DSP1_timer__SHIFT 0x0
1665#define ACP_DSP2_TIMER__ACP_DSP2_timer_MASK 0xffffff
1666#define ACP_DSP2_TIMER__ACP_DSP2_timer__SHIFT 0x0
1667#define ACP_I2S_TRANSMIT_BYTE_CNT_HIGH__i2s_sp_tx_byte_cnt_high_MASK 0xffffffff
1668#define ACP_I2S_TRANSMIT_BYTE_CNT_HIGH__i2s_sp_tx_byte_cnt_high__SHIFT 0x0
1669#define ACP_I2S_TRANSMIT_BYTE_CNT_LOW__i2s_sp_tx_byte_cnt_low_MASK 0xffffffff
1670#define ACP_I2S_TRANSMIT_BYTE_CNT_LOW__i2s_sp_tx_byte_cnt_low__SHIFT 0x0
1671#define ACP_I2S_BT_TRANSMIT_BYTE_CNT_HIGH__i2s_bt_tx_byte_cnt_high_MASK 0xffffffff
1672#define ACP_I2S_BT_TRANSMIT_BYTE_CNT_HIGH__i2s_bt_tx_byte_cnt_high__SHIFT 0x0
1673#define ACP_I2S_BT_TRANSMIT_BYTE_CNT_LOW__i2s_bt_tx_byte_cnt_low_MASK 0xffffffff
1674#define ACP_I2S_BT_TRANSMIT_BYTE_CNT_LOW__i2s_bt_tx_byte_cnt_low__SHIFT 0x0
1675#define ACP_I2S_BT_RECEIVE_BYTE_CNT_HIGH__i2s_bt_rx_byte_cnt_high_MASK 0xffffffff
1676#define ACP_I2S_BT_RECEIVE_BYTE_CNT_HIGH__i2s_bt_rx_byte_cnt_high__SHIFT 0x0
1677#define ACP_I2S_BT_RECEIVE_BYTE_CNT_LOW__i2s_bt_rx_byte_cnt_low_MASK 0xffffffff
1678#define ACP_I2S_BT_RECEIVE_BYTE_CNT_LOW__i2s_bt_rx_byte_cnt_low__SHIFT 0x0
1679#define ACP_DSP0_CS_STATE__DSP0_CS_state_MASK 0x1
1680#define ACP_DSP0_CS_STATE__DSP0_CS_state__SHIFT 0x0
1681#define ACP_DSP1_CS_STATE__DSP1_CS_state_MASK 0x1
1682#define ACP_DSP1_CS_STATE__DSP1_CS_state__SHIFT 0x0
1683#define ACP_DSP2_CS_STATE__DSP2_CS_state_MASK 0x1
1684#define ACP_DSP2_CS_STATE__DSP2_CS_state__SHIFT 0x0
1685#define ACP_SCRATCH_REG_BASE_ADDR__SCRATCH_REG_BASE_ADDR_MASK 0x7ffff
1686#define ACP_SCRATCH_REG_BASE_ADDR__SCRATCH_REG_BASE_ADDR__SHIFT 0x0
1687#define CC_ACP_EFUSE__DSP0_DISABLE_MASK 0x2
1688#define CC_ACP_EFUSE__DSP0_DISABLE__SHIFT 0x1
1689#define CC_ACP_EFUSE__DSP1_DISABLE_MASK 0x4
1690#define CC_ACP_EFUSE__DSP1_DISABLE__SHIFT 0x2
1691#define CC_ACP_EFUSE__DSP2_DISABLE_MASK 0x8
1692#define CC_ACP_EFUSE__DSP2_DISABLE__SHIFT 0x3
1693#define CC_ACP_EFUSE__ACP_DISABLE_MASK 0x10
1694#define CC_ACP_EFUSE__ACP_DISABLE__SHIFT 0x4
1695#define ACP_PGFSM_RETAIN_REG__ACP_P1_ON_OFF_MASK 0x1
1696#define ACP_PGFSM_RETAIN_REG__ACP_P1_ON_OFF__SHIFT 0x0
1697#define ACP_PGFSM_RETAIN_REG__ACP_P2_ON_OFF_MASK 0x2
1698#define ACP_PGFSM_RETAIN_REG__ACP_P2_ON_OFF__SHIFT 0x1
1699#define ACP_PGFSM_RETAIN_REG__ACP_DSP0_ON_OFF_MASK 0x4
1700#define ACP_PGFSM_RETAIN_REG__ACP_DSP0_ON_OFF__SHIFT 0x2
1701#define ACP_PGFSM_RETAIN_REG__ACP_DSP1_ON_OFF_MASK 0x8
1702#define ACP_PGFSM_RETAIN_REG__ACP_DSP1_ON_OFF__SHIFT 0x3
1703#define ACP_PGFSM_RETAIN_REG__ACP_DSP2_ON_OFF_MASK 0x10
1704#define ACP_PGFSM_RETAIN_REG__ACP_DSP2_ON_OFF__SHIFT 0x4
1705#define ACP_PGFSM_RETAIN_REG__ACP_AZ_ON_OFF_MASK 0x20
1706#define ACP_PGFSM_RETAIN_REG__ACP_AZ_ON_OFF__SHIFT 0x5
1707#define ACP_PGFSM_CONFIG_REG__FSM_ADDR_MASK 0xff
1708#define ACP_PGFSM_CONFIG_REG__FSM_ADDR__SHIFT 0x0
1709#define ACP_PGFSM_CONFIG_REG__Power_Down_MASK 0x100
1710#define ACP_PGFSM_CONFIG_REG__Power_Down__SHIFT 0x8
1711#define ACP_PGFSM_CONFIG_REG__Power_Up_MASK 0x200
1712#define ACP_PGFSM_CONFIG_REG__Power_Up__SHIFT 0x9
1713#define ACP_PGFSM_CONFIG_REG__P1_Select_MASK 0x400
1714#define ACP_PGFSM_CONFIG_REG__P1_Select__SHIFT 0xa
1715#define ACP_PGFSM_CONFIG_REG__P2_Select_MASK 0x800
1716#define ACP_PGFSM_CONFIG_REG__P2_Select__SHIFT 0xb
1717#define ACP_PGFSM_CONFIG_REG__Wr_MASK 0x1000
1718#define ACP_PGFSM_CONFIG_REG__Wr__SHIFT 0xc
1719#define ACP_PGFSM_CONFIG_REG__Rd_MASK 0x2000
1720#define ACP_PGFSM_CONFIG_REG__Rd__SHIFT 0xd
1721#define ACP_PGFSM_CONFIG_REG__RdData_Reset_MASK 0x4000
1722#define ACP_PGFSM_CONFIG_REG__RdData_Reset__SHIFT 0xe
1723#define ACP_PGFSM_CONFIG_REG__Short_Format_MASK 0x8000
1724#define ACP_PGFSM_CONFIG_REG__Short_Format__SHIFT 0xf
1725#define ACP_PGFSM_CONFIG_REG__BPM_CG_MG_FGCG_MASK 0x3ff0000
1726#define ACP_PGFSM_CONFIG_REG__BPM_CG_MG_FGCG__SHIFT 0x10
1727#define ACP_PGFSM_CONFIG_REG__SRBM_override_MASK 0x4000000
1728#define ACP_PGFSM_CONFIG_REG__SRBM_override__SHIFT 0x1a
1729#define ACP_PGFSM_CONFIG_REG__Rsvd_BPM_Addr_MASK 0x8000000
1730#define ACP_PGFSM_CONFIG_REG__Rsvd_BPM_Addr__SHIFT 0x1b
1731#define ACP_PGFSM_CONFIG_REG__REG_ADDR_MASK 0xf0000000
1732#define ACP_PGFSM_CONFIG_REG__REG_ADDR__SHIFT 0x1c
1733#define ACP_PGFSM_WRITE_REG__Write_value_MASK 0xffffffff
1734#define ACP_PGFSM_WRITE_REG__Write_value__SHIFT 0x0
1735#define ACP_PGFSM_READ_REG_0__Read_value_MASK 0xffffff
1736#define ACP_PGFSM_READ_REG_0__Read_value__SHIFT 0x0
1737#define ACP_PGFSM_READ_REG_1__Read_value_MASK 0xffffff
1738#define ACP_PGFSM_READ_REG_1__Read_value__SHIFT 0x0
1739#define ACP_PGFSM_READ_REG_2__Read_value_MASK 0xffffff
1740#define ACP_PGFSM_READ_REG_2__Read_value__SHIFT 0x0
1741#define ACP_PGFSM_READ_REG_3__Read_value_MASK 0xffffff
1742#define ACP_PGFSM_READ_REG_3__Read_value__SHIFT 0x0
1743#define ACP_PGFSM_READ_REG_4__Read_value_MASK 0xffffff
1744#define ACP_PGFSM_READ_REG_4__Read_value__SHIFT 0x0
1745#define ACP_PGFSM_READ_REG_5__Read_value_MASK 0xffffff
1746#define ACP_PGFSM_READ_REG_5__Read_value__SHIFT 0x0
1747#define ACP_IP_PGFSM_ENABLE__ACP_IP_ACCESS_MASK 0x1
1748#define ACP_IP_PGFSM_ENABLE__ACP_IP_ACCESS__SHIFT 0x0
1749#define ACP_I2S_PIN_CONFIG__ACP_I2S_PIN_CONFIG_MASK 0x3
1750#define ACP_I2S_PIN_CONFIG__ACP_I2S_PIN_CONFIG__SHIFT 0x0
1751#define ACP_AZALIA_I2S_SELECT__AZ_I2S_SELECT_MASK 0x1
1752#define ACP_AZALIA_I2S_SELECT__AZ_I2S_SELECT__SHIFT 0x0
1753#define ACP_CHIP_PKG_FOR_PAD_ISOLATION__external_fch_package_MASK 0x1
1754#define ACP_CHIP_PKG_FOR_PAD_ISOLATION__external_fch_package__SHIFT 0x0
1755#define ACP_AUDIO_PAD_PULLUP_PULLDOWN_CTRL__ACP_AUDIO_PAD_pullup_disable_MASK 0x7ff
1756#define ACP_AUDIO_PAD_PULLUP_PULLDOWN_CTRL__ACP_AUDIO_PAD_pullup_disable__SHIFT 0x0
1757#define ACP_AUDIO_PAD_PULLUP_PULLDOWN_CTRL__ACP_AUDIO_PAD_pulldown_enable_MASK 0x7ff0000
1758#define ACP_AUDIO_PAD_PULLUP_PULLDOWN_CTRL__ACP_AUDIO_PAD_pulldown_enable__SHIFT 0x10
1759#define ACP_BT_UART_PAD_SEL__ACP_BT_UART_PAD_SEL_MASK 0x1
1760#define ACP_BT_UART_PAD_SEL__ACP_BT_UART_PAD_SEL__SHIFT 0x0
1761#define ACP_SCRATCH_REG_0__ACP_SCRATCH_REG_MASK 0xffffffff
1762#define ACP_SCRATCH_REG_0__ACP_SCRATCH_REG__SHIFT 0x0
1763#define ACP_SCRATCH_REG_1__ACP_SCRATCH_REG_MASK 0xffffffff
1764#define ACP_SCRATCH_REG_1__ACP_SCRATCH_REG__SHIFT 0x0
1765#define ACP_SCRATCH_REG_2__ACP_SCRATCH_REG_MASK 0xffffffff
1766#define ACP_SCRATCH_REG_2__ACP_SCRATCH_REG__SHIFT 0x0
1767#define ACP_SCRATCH_REG_3__ACP_SCRATCH_REG_MASK 0xffffffff
1768#define ACP_SCRATCH_REG_3__ACP_SCRATCH_REG__SHIFT 0x0
1769#define ACP_SCRATCH_REG_4__ACP_SCRATCH_REG_MASK 0xffffffff
1770#define ACP_SCRATCH_REG_4__ACP_SCRATCH_REG__SHIFT 0x0
1771#define ACP_SCRATCH_REG_5__ACP_SCRATCH_REG_MASK 0xffffffff
1772#define ACP_SCRATCH_REG_5__ACP_SCRATCH_REG__SHIFT 0x0
1773#define ACP_SCRATCH_REG_6__ACP_SCRATCH_REG_MASK 0xffffffff
1774#define ACP_SCRATCH_REG_6__ACP_SCRATCH_REG__SHIFT 0x0
1775#define ACP_SCRATCH_REG_7__ACP_SCRATCH_REG_MASK 0xffffffff
1776#define ACP_SCRATCH_REG_7__ACP_SCRATCH_REG__SHIFT 0x0
1777#define ACP_SCRATCH_REG_8__ACP_SCRATCH_REG_MASK 0xffffffff
1778#define ACP_SCRATCH_REG_8__ACP_SCRATCH_REG__SHIFT 0x0
1779#define ACP_SCRATCH_REG_9__ACP_SCRATCH_REG_MASK 0xffffffff
1780#define ACP_SCRATCH_REG_9__ACP_SCRATCH_REG__SHIFT 0x0
1781#define ACP_SCRATCH_REG_10__ACP_SCRATCH_REG_MASK 0xffffffff
1782#define ACP_SCRATCH_REG_10__ACP_SCRATCH_REG__SHIFT 0x0
1783#define ACP_SCRATCH_REG_11__ACP_SCRATCH_REG_MASK 0xffffffff
1784#define ACP_SCRATCH_REG_11__ACP_SCRATCH_REG__SHIFT 0x0
1785#define ACP_SCRATCH_REG_12__ACP_SCRATCH_REG_MASK 0xffffffff
1786#define ACP_SCRATCH_REG_12__ACP_SCRATCH_REG__SHIFT 0x0
1787#define ACP_SCRATCH_REG_13__ACP_SCRATCH_REG_MASK 0xffffffff
1788#define ACP_SCRATCH_REG_13__ACP_SCRATCH_REG__SHIFT 0x0
1789#define ACP_SCRATCH_REG_14__ACP_SCRATCH_REG_MASK 0xffffffff
1790#define ACP_SCRATCH_REG_14__ACP_SCRATCH_REG__SHIFT 0x0
1791#define ACP_SCRATCH_REG_15__ACP_SCRATCH_REG_MASK 0xffffffff
1792#define ACP_SCRATCH_REG_15__ACP_SCRATCH_REG__SHIFT 0x0
1793#define ACP_SCRATCH_REG_16__ACP_SCRATCH_REG_MASK 0xffffffff
1794#define ACP_SCRATCH_REG_16__ACP_SCRATCH_REG__SHIFT 0x0
1795#define ACP_SCRATCH_REG_17__ACP_SCRATCH_REG_MASK 0xffffffff
1796#define ACP_SCRATCH_REG_17__ACP_SCRATCH_REG__SHIFT 0x0
1797#define ACP_SCRATCH_REG_18__ACP_SCRATCH_REG_MASK 0xffffffff
1798#define ACP_SCRATCH_REG_18__ACP_SCRATCH_REG__SHIFT 0x0
1799#define ACP_SCRATCH_REG_19__ACP_SCRATCH_REG_MASK 0xffffffff
1800#define ACP_SCRATCH_REG_19__ACP_SCRATCH_REG__SHIFT 0x0
1801#define ACP_SCRATCH_REG_20__ACP_SCRATCH_REG_MASK 0xffffffff
1802#define ACP_SCRATCH_REG_20__ACP_SCRATCH_REG__SHIFT 0x0
1803#define ACP_SCRATCH_REG_21__ACP_SCRATCH_REG_MASK 0xffffffff
1804#define ACP_SCRATCH_REG_21__ACP_SCRATCH_REG__SHIFT 0x0
1805#define ACP_SCRATCH_REG_22__ACP_SCRATCH_REG_MASK 0xffffffff
1806#define ACP_SCRATCH_REG_22__ACP_SCRATCH_REG__SHIFT 0x0
1807#define ACP_SCRATCH_REG_23__ACP_SCRATCH_REG_MASK 0xffffffff
1808#define ACP_SCRATCH_REG_23__ACP_SCRATCH_REG__SHIFT 0x0
1809#define ACP_SCRATCH_REG_24__ACP_SCRATCH_REG_MASK 0xffffffff
1810#define ACP_SCRATCH_REG_24__ACP_SCRATCH_REG__SHIFT 0x0
1811#define ACP_SCRATCH_REG_25__ACP_SCRATCH_REG_MASK 0xffffffff
1812#define ACP_SCRATCH_REG_25__ACP_SCRATCH_REG__SHIFT 0x0
1813#define ACP_SCRATCH_REG_26__ACP_SCRATCH_REG_MASK 0xffffffff
1814#define ACP_SCRATCH_REG_26__ACP_SCRATCH_REG__SHIFT 0x0
1815#define ACP_SCRATCH_REG_27__ACP_SCRATCH_REG_MASK 0xffffffff
1816#define ACP_SCRATCH_REG_27__ACP_SCRATCH_REG__SHIFT 0x0
1817#define ACP_SCRATCH_REG_28__ACP_SCRATCH_REG_MASK 0xffffffff
1818#define ACP_SCRATCH_REG_28__ACP_SCRATCH_REG__SHIFT 0x0
1819#define ACP_SCRATCH_REG_29__ACP_SCRATCH_REG_MASK 0xffffffff
1820#define ACP_SCRATCH_REG_29__ACP_SCRATCH_REG__SHIFT 0x0
1821#define ACP_SCRATCH_REG_30__ACP_SCRATCH_REG_MASK 0xffffffff
1822#define ACP_SCRATCH_REG_30__ACP_SCRATCH_REG__SHIFT 0x0
1823#define ACP_SCRATCH_REG_31__ACP_SCRATCH_REG_MASK 0xffffffff
1824#define ACP_SCRATCH_REG_31__ACP_SCRATCH_REG__SHIFT 0x0
1825#define ACP_SCRATCH_REG_32__ACP_SCRATCH_REG_MASK 0xffffffff
1826#define ACP_SCRATCH_REG_32__ACP_SCRATCH_REG__SHIFT 0x0
1827#define ACP_SCRATCH_REG_33__ACP_SCRATCH_REG_MASK 0xffffffff
1828#define ACP_SCRATCH_REG_33__ACP_SCRATCH_REG__SHIFT 0x0
1829#define ACP_SCRATCH_REG_34__ACP_SCRATCH_REG_MASK 0xffffffff
1830#define ACP_SCRATCH_REG_34__ACP_SCRATCH_REG__SHIFT 0x0
1831#define ACP_SCRATCH_REG_35__ACP_SCRATCH_REG_MASK 0xffffffff
1832#define ACP_SCRATCH_REG_35__ACP_SCRATCH_REG__SHIFT 0x0
1833#define ACP_SCRATCH_REG_36__ACP_SCRATCH_REG_MASK 0xffffffff
1834#define ACP_SCRATCH_REG_36__ACP_SCRATCH_REG__SHIFT 0x0
1835#define ACP_SCRATCH_REG_37__ACP_SCRATCH_REG_MASK 0xffffffff
1836#define ACP_SCRATCH_REG_37__ACP_SCRATCH_REG__SHIFT 0x0
1837#define ACP_SCRATCH_REG_38__ACP_SCRATCH_REG_MASK 0xffffffff
1838#define ACP_SCRATCH_REG_38__ACP_SCRATCH_REG__SHIFT 0x0
1839#define ACP_SCRATCH_REG_39__ACP_SCRATCH_REG_MASK 0xffffffff
1840#define ACP_SCRATCH_REG_39__ACP_SCRATCH_REG__SHIFT 0x0
1841#define ACP_SCRATCH_REG_40__ACP_SCRATCH_REG_MASK 0xffffffff
1842#define ACP_SCRATCH_REG_40__ACP_SCRATCH_REG__SHIFT 0x0
1843#define ACP_SCRATCH_REG_41__ACP_SCRATCH_REG_MASK 0xffffffff
1844#define ACP_SCRATCH_REG_41__ACP_SCRATCH_REG__SHIFT 0x0
1845#define ACP_SCRATCH_REG_42__ACP_SCRATCH_REG_MASK 0xffffffff
1846#define ACP_SCRATCH_REG_42__ACP_SCRATCH_REG__SHIFT 0x0
1847#define ACP_SCRATCH_REG_43__ACP_SCRATCH_REG_MASK 0xffffffff
1848#define ACP_SCRATCH_REG_43__ACP_SCRATCH_REG__SHIFT 0x0
1849#define ACP_SCRATCH_REG_44__ACP_SCRATCH_REG_MASK 0xffffffff
1850#define ACP_SCRATCH_REG_44__ACP_SCRATCH_REG__SHIFT 0x0
1851#define ACP_SCRATCH_REG_45__ACP_SCRATCH_REG_MASK 0xffffffff
1852#define ACP_SCRATCH_REG_45__ACP_SCRATCH_REG__SHIFT 0x0
1853#define ACP_SCRATCH_REG_46__ACP_SCRATCH_REG_MASK 0xffffffff
1854#define ACP_SCRATCH_REG_46__ACP_SCRATCH_REG__SHIFT 0x0
1855#define ACP_SCRATCH_REG_47__ACP_SCRATCH_REG_MASK 0xffffffff
1856#define ACP_SCRATCH_REG_47__ACP_SCRATCH_REG__SHIFT 0x0
1857#define ACP_VOICE_WAKEUP_ENABLE__voice_wakeup_enable_MASK 0x1
1858#define ACP_VOICE_WAKEUP_ENABLE__voice_wakeup_enable__SHIFT 0x0
1859#define ACP_VOICE_WAKEUP_STATUS__voice_wakeup_status_MASK 0x1
1860#define ACP_VOICE_WAKEUP_STATUS__voice_wakeup_status__SHIFT 0x0
1861#define I2S_VOICE_WAKEUP_LOWER_THRESHOLD__i2s_voice_wakeup_lower_threshold_MASK 0xffffffff
1862#define I2S_VOICE_WAKEUP_LOWER_THRESHOLD__i2s_voice_wakeup_lower_threshold__SHIFT 0x0
1863#define I2S_VOICE_WAKEUP_HIGHER_THRESHOLD__i2s_voice_wakeup_higher_threshold_MASK 0xffffffff
1864#define I2S_VOICE_WAKEUP_HIGHER_THRESHOLD__i2s_voice_wakeup_higher_threshold__SHIFT 0x0
1865#define I2S_VOICE_WAKEUP_NO_OF_SAMPLES__i2s_voice_wakeup_no_of_samples_MASK 0xffff
1866#define I2S_VOICE_WAKEUP_NO_OF_SAMPLES__i2s_voice_wakeup_no_of_samples__SHIFT 0x0
1867#define I2S_VOICE_WAKEUP_NO_OF_PEAKS__i2s_voice_wakeup_no_of_peaks_MASK 0xffff
1868#define I2S_VOICE_WAKEUP_NO_OF_PEAKS__i2s_voice_wakeup_no_of_peaks__SHIFT 0x0
1869#define I2S_VOICE_WAKEUP_DURATION_OF_N_PEAKS__i2s_voice_wakeup_duration_of_n_peaks_MASK 0xffffffff
1870#define I2S_VOICE_WAKEUP_DURATION_OF_N_PEAKS__i2s_voice_wakeup_duration_of_n_peaks__SHIFT 0x0
1871#define I2S_VOICE_WAKEUP_BITCLK_TOGGLE_DETECTION__i2s_voice_wakeup_bitclk_toggle_wakeup_en_MASK 0x1
1872#define I2S_VOICE_WAKEUP_BITCLK_TOGGLE_DETECTION__i2s_voice_wakeup_bitclk_toggle_wakeup_en__SHIFT 0x0
1873#define I2S_VOICE_WAKEUP_DATA_PATH_SWITCH__i2s_voice_wakeup_data_path_switch_req_MASK 0x1
1874#define I2S_VOICE_WAKEUP_DATA_PATH_SWITCH__i2s_voice_wakeup_data_path_switch_req__SHIFT 0x0
1875#define I2S_VOICE_WAKEUP_DATA_PATH_SWITCH__i2s_voice_wakeup_data_path_switch_ack_MASK 0x2
1876#define I2S_VOICE_WAKEUP_DATA_PATH_SWITCH__i2s_voice_wakeup_data_path_switch_ack__SHIFT 0x1
1877#define I2S_VOICE_WAKEUP_DATA_POINTER__i2s_voice_wakeup_data_pointer_MASK 0xffffffff
1878#define I2S_VOICE_WAKEUP_DATA_POINTER__i2s_voice_wakeup_data_pointer__SHIFT 0x0
1879#define I2S_VOICE_WAKEUP_AUTH_MATCH__i2s_voice_wakeup_authentication_valid_MASK 0x1
1880#define I2S_VOICE_WAKEUP_AUTH_MATCH__i2s_voice_wakeup_authentication_valid__SHIFT 0x0
1881#define I2S_VOICE_WAKEUP_AUTH_MATCH__i2s_voice_wakeup_authentication_match_MASK 0x2
1882#define I2S_VOICE_WAKEUP_AUTH_MATCH__i2s_voice_wakeup_authentication_match__SHIFT 0x1
1883#define I2S_VOICE_WAKEUP_8KB_WRAP__i2s_voice_wakeup_8kb_wrap_MASK 0x1
1884#define I2S_VOICE_WAKEUP_8KB_WRAP__i2s_voice_wakeup_8kb_wrap__SHIFT 0x0
1885#define ACP_I2S_RECEIVED_BYTE_CNT_HIGH__i2s_mic_rx_byte_cnt_high_MASK 0xffffffff
1886#define ACP_I2S_RECEIVED_BYTE_CNT_HIGH__i2s_mic_rx_byte_cnt_high__SHIFT 0x0
1887#define ACP_I2S_RECEIVED_BYTE_CNT_LOW__i2s_mic_rx_byte_cnt_low_MASK 0xffffffff
1888#define ACP_I2S_RECEIVED_BYTE_CNT_LOW__i2s_mic_rx_byte_cnt_low__SHIFT 0x0
1889#define ACP_I2S_MICSP_TRANSMIT_BYTE_CNT_HIGH__i2s_micsp_tx_byte_cnt_high_MASK 0xffffffff
1890#define ACP_I2S_MICSP_TRANSMIT_BYTE_CNT_HIGH__i2s_micsp_tx_byte_cnt_high__SHIFT 0x0
1891#define ACP_I2S_MICSP_TRANSMIT_BYTE_CNT_LOW__i2s_micsp_tx_byte_cnt_low_MASK 0xffffffff
1892#define ACP_I2S_MICSP_TRANSMIT_BYTE_CNT_LOW__i2s_micsp_tx_byte_cnt_low__SHIFT 0x0
1893#define ACP_MEM_SHUT_DOWN_REQ_LO__ACP_ShutDownReq_RAML_MASK 0xffffffff
1894#define ACP_MEM_SHUT_DOWN_REQ_LO__ACP_ShutDownReq_RAML__SHIFT 0x0
1895#define ACP_MEM_SHUT_DOWN_REQ_HI__ACP_ShutDownReq_RAMH_MASK 0xffff
1896#define ACP_MEM_SHUT_DOWN_REQ_HI__ACP_ShutDownReq_RAMH__SHIFT 0x0
1897#define ACP_MEM_SHUT_DOWN_STS_LO__ACP_ShutDownSts_RAML_MASK 0xffffffff
1898#define ACP_MEM_SHUT_DOWN_STS_LO__ACP_ShutDownSts_RAML__SHIFT 0x0
1899#define ACP_MEM_SHUT_DOWN_STS_HI__ACP_ShutDownSts_RAMH_MASK 0xffff
1900#define ACP_MEM_SHUT_DOWN_STS_HI__ACP_ShutDownSts_RAMH__SHIFT 0x0
1901#define ACP_MEM_DEEP_SLEEP_REQ_LO__ACP_DeepSleepReq_RAML_MASK 0xffffffff
1902#define ACP_MEM_DEEP_SLEEP_REQ_LO__ACP_DeepSleepReq_RAML__SHIFT 0x0
1903#define ACP_MEM_DEEP_SLEEP_REQ_HI__ACP_DeepSleepReq_RAMH_MASK 0xffff
1904#define ACP_MEM_DEEP_SLEEP_REQ_HI__ACP_DeepSleepReq_RAMH__SHIFT 0x0
1905#define ACP_MEM_DEEP_SLEEP_STS_LO__ACP_DeepSleepSts_RAML_MASK 0xffffffff
1906#define ACP_MEM_DEEP_SLEEP_STS_LO__ACP_DeepSleepSts_RAML__SHIFT 0x0
1907#define ACP_MEM_DEEP_SLEEP_STS_HI__ACP_DeepSleepSts_RAMH_MASK 0xffff
1908#define ACP_MEM_DEEP_SLEEP_STS_HI__ACP_DeepSleepSts_RAMH__SHIFT 0x0
1909#define ACP_MEM_WAKEUP_FROM_SHUT_DOWN_LO__acp_mem_wakeup_from_shut_down_lo_MASK 0xffffffff
1910#define ACP_MEM_WAKEUP_FROM_SHUT_DOWN_LO__acp_mem_wakeup_from_shut_down_lo__SHIFT 0x0
1911#define ACP_MEM_WAKEUP_FROM_SHUT_DOWN_HI__acp_mem_wakeup_from_shut_down_hi_MASK 0xffff
1912#define ACP_MEM_WAKEUP_FROM_SHUT_DOWN_HI__acp_mem_wakeup_from_shut_down_hi__SHIFT 0x0
1913#define ACP_MEM_WAKEUP_FROM_SLEEP_LO__acp_mem_wakeup_from_sleep_lo_MASK 0xffffffff
1914#define ACP_MEM_WAKEUP_FROM_SLEEP_LO__acp_mem_wakeup_from_sleep_lo__SHIFT 0x0
1915#define ACP_MEM_WAKEUP_FROM_SLEEP_HI__acp_mem_wakeup_from_sleep_hi_MASK 0xffff
1916#define ACP_MEM_WAKEUP_FROM_SLEEP_HI__acp_mem_wakeup_from_sleep_hi__SHIFT 0x0
1917#define ACP_I2SSP_IER__I2SSP_IEN_MASK 0x1
1918#define ACP_I2SSP_IER__I2SSP_IEN__SHIFT 0x0
1919#define ACP_I2SSP_IRER__I2SSP_RXEN_MASK 0x1
1920#define ACP_I2SSP_IRER__I2SSP_RXEN__SHIFT 0x0
1921#define ACP_I2SSP_ITER__I2SSP_TXEN_MASK 0x1
1922#define ACP_I2SSP_ITER__I2SSP_TXEN__SHIFT 0x0
1923#define ACP_I2SSP_CER__I2SSP_CLKEN_MASK 0x1
1924#define ACP_I2SSP_CER__I2SSP_CLKEN__SHIFT 0x0
1925#define ACP_I2SSP_CCR__I2SSP_SCLKG_MASK 0x7
1926#define ACP_I2SSP_CCR__I2SSP_SCLKG__SHIFT 0x0
1927#define ACP_I2SSP_CCR__I2SSP_WSS_MASK 0x18
1928#define ACP_I2SSP_CCR__I2SSP_WSS__SHIFT 0x3
1929#define ACP_I2SSP_RXFFR__I2SSP_RXFFR_MASK 0x1
1930#define ACP_I2SSP_RXFFR__I2SSP_RXFFR__SHIFT 0x0
1931#define ACP_I2SSP_TXFFR__I2SSP_TXFFR_MASK 0x1
1932#define ACP_I2SSP_TXFFR__I2SSP_TXFFR__SHIFT 0x0
1933#define ACP_I2SSP_LRBR0__I2SSP_LRBR0_MASK 0xffffffff
1934#define ACP_I2SSP_LRBR0__I2SSP_LRBR0__SHIFT 0x0
1935#define ACP_I2SSP_RRBR0__I2SSP_RRBR0_MASK 0xffffffff
1936#define ACP_I2SSP_RRBR0__I2SSP_RRBR0__SHIFT 0x0
1937#define ACP_I2SSP_RER0__I2SSP_RXCHEN0_MASK 0x1
1938#define ACP_I2SSP_RER0__I2SSP_RXCHEN0__SHIFT 0x0
1939#define ACP_I2SSP_TER0__I2SSP_TXCHEN0_MASK 0x1
1940#define ACP_I2SSP_TER0__I2SSP_TXCHEN0__SHIFT 0x0
1941#define ACP_I2SSP_RCR0__I2SSP_WLEN_MASK 0x7
1942#define ACP_I2SSP_RCR0__I2SSP_WLEN__SHIFT 0x0
1943#define ACP_I2SSP_TCR0__I2SSP_WLEN_MASK 0x7
1944#define ACP_I2SSP_TCR0__I2SSP_WLEN__SHIFT 0x0
1945#define ACP_I2SSP_ISR0__I2SSP_RXDA_MASK 0x1
1946#define ACP_I2SSP_ISR0__I2SSP_RXDA__SHIFT 0x0
1947#define ACP_I2SSP_ISR0__I2SSP_RXFO_MASK 0x2
1948#define ACP_I2SSP_ISR0__I2SSP_RXFO__SHIFT 0x1
1949#define ACP_I2SSP_ISR0__I2SSP_TXFE_MASK 0x10
1950#define ACP_I2SSP_ISR0__I2SSP_TXFE__SHIFT 0x4
1951#define ACP_I2SSP_ISR0__I2SSP_TXFO_MASK 0x20
1952#define ACP_I2SSP_ISR0__I2SSP_TXFO__SHIFT 0x5
1953#define ACP_I2SSP_IMR0__I2SSP_RXDAM_MASK 0x1
1954#define ACP_I2SSP_IMR0__I2SSP_RXDAM__SHIFT 0x0
1955#define ACP_I2SSP_IMR0__I2SSP_RXFOM_MASK 0x2
1956#define ACP_I2SSP_IMR0__I2SSP_RXFOM__SHIFT 0x1
1957#define ACP_I2SSP_IMR0__I2SSP_TXFEM_MASK 0x10
1958#define ACP_I2SSP_IMR0__I2SSP_TXFEM__SHIFT 0x4
1959#define ACP_I2SSP_IMR0__I2SSP_TXFOM_MASK 0x20
1960#define ACP_I2SSP_IMR0__I2SSP_TXFOM__SHIFT 0x5
1961#define ACP_I2SSP_ROR0__I2SSP_RXCHO_MASK 0x1
1962#define ACP_I2SSP_ROR0__I2SSP_RXCHO__SHIFT 0x0
1963#define ACP_I2SSP_TOR0__I2SSP_TXCHO_MASK 0x1
1964#define ACP_I2SSP_TOR0__I2SSP_TXCHO__SHIFT 0x0
1965#define ACP_I2SSP_RFCR0__I2SSP_RXCHDT_MASK 0xf
1966#define ACP_I2SSP_RFCR0__I2SSP_RXCHDT__SHIFT 0x0
1967#define ACP_I2SSP_TFCR0__I2SSP_TXCHET_MASK 0xf
1968#define ACP_I2SSP_TFCR0__I2SSP_TXCHET__SHIFT 0x0
1969#define ACP_I2SSP_RFF0__I2SSP_RXCHFR_MASK 0x1
1970#define ACP_I2SSP_RFF0__I2SSP_RXCHFR__SHIFT 0x0
1971#define ACP_I2SSP_TFF0__I2SSP_TXCHFR_MASK 0x1
1972#define ACP_I2SSP_TFF0__I2SSP_TXCHFR__SHIFT 0x0
1973#define ACP_I2SSP_RXDMA__I2SSP_RXDMA_MASK 0xffffffff
1974#define ACP_I2SSP_RXDMA__I2SSP_RXDMA__SHIFT 0x0
1975#define ACP_I2SSP_RRXDMA__I2SSP_RRXDMA_MASK 0x1
1976#define ACP_I2SSP_RRXDMA__I2SSP_RRXDMA__SHIFT 0x0
1977#define ACP_I2SSP_TXDMA__I2SSP_TXDMA_MASK 0xffffffff
1978#define ACP_I2SSP_TXDMA__I2SSP_TXDMA__SHIFT 0x0
1979#define ACP_I2SSP_RTXDMA__I2SSP_RTXDMA_MASK 0x1
1980#define ACP_I2SSP_RTXDMA__I2SSP_RTXDMA__SHIFT 0x0
1981#define ACP_I2SSP_COMP_PARAM_2__I2SSP_RX_WPRDSIZE_0_MASK 0x7
1982#define ACP_I2SSP_COMP_PARAM_2__I2SSP_RX_WPRDSIZE_0__SHIFT 0x0
1983#define ACP_I2SSP_COMP_PARAM_2__I2SSP_RX_WPRDSIZE_1_MASK 0x38
1984#define ACP_I2SSP_COMP_PARAM_2__I2SSP_RX_WPRDSIZE_1__SHIFT 0x3
1985#define ACP_I2SSP_COMP_PARAM_2__I2SSP_RX_WPRDSIZE_2_MASK 0x380
1986#define ACP_I2SSP_COMP_PARAM_2__I2SSP_RX_WPRDSIZE_2__SHIFT 0x7
1987#define ACP_I2SSP_COMP_PARAM_2__I2SSP_RX_WPRDSIZE_3_MASK 0x1c00
1988#define ACP_I2SSP_COMP_PARAM_2__I2SSP_RX_WPRDSIZE_3__SHIFT 0xa
1989#define ACP_I2SSP_COMP_PARAM_1__I2SSP_APB_DATA_WIDTH_MASK 0x3
1990#define ACP_I2SSP_COMP_PARAM_1__I2SSP_APB_DATA_WIDTH__SHIFT 0x0
1991#define ACP_I2SSP_COMP_PARAM_1__I2SSP_FIFO_DEPTH_GLOBAL_MASK 0xc
1992#define ACP_I2SSP_COMP_PARAM_1__I2SSP_FIFO_DEPTH_GLOBAL__SHIFT 0x2
1993#define ACP_I2SSP_COMP_PARAM_1__I2SSP_MODE_EN_MASK 0x10
1994#define ACP_I2SSP_COMP_PARAM_1__I2SSP_MODE_EN__SHIFT 0x4
1995#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TRANSMITTER_BLOCK_MASK 0x20
1996#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TRANSMITTER_BLOCK__SHIFT 0x5
1997#define ACP_I2SSP_COMP_PARAM_1__I2SSP_RECEIVER_BLOCK_MASK 0x40
1998#define ACP_I2SSP_COMP_PARAM_1__I2SSP_RECEIVER_BLOCK__SHIFT 0x6
1999#define ACP_I2SSP_COMP_PARAM_1__I2SSP_RX_CHANNLES_MASK 0x180
2000#define ACP_I2SSP_COMP_PARAM_1__I2SSP_RX_CHANNLES__SHIFT 0x7
2001#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TX_CHANNLES_MASK 0x600
2002#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TX_CHANNLES__SHIFT 0x9
2003#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TX_WORDSIZE_0_MASK 0x70000
2004#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TX_WORDSIZE_0__SHIFT 0x10
2005#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TX_WORDSIZE_1_MASK 0x380000
2006#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TX_WORDSIZE_1__SHIFT 0x13
2007#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TX_WORDSIZE_2_MASK 0x1c00000
2008#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TX_WORDSIZE_2__SHIFT 0x16
2009#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TX_WORDSIZE_3_MASK 0xe000000
2010#define ACP_I2SSP_COMP_PARAM_1__I2SSP_TX_WORDSIZE_3__SHIFT 0x19
2011#define ACP_I2SSP_COMP_VERSION__I2SSP_APB_DATA_WIDTH_MASK 0xffffffff
2012#define ACP_I2SSP_COMP_VERSION__I2SSP_APB_DATA_WIDTH__SHIFT 0x0
2013#define ACP_I2SSP_COMP_TYPE__I2SSP_COMP_TYPE_MASK 0xffffffff
2014#define ACP_I2SSP_COMP_TYPE__I2SSP_COMP_TYPE__SHIFT 0x0
2015#define ACP_I2SMICSP_IER__I2SMICSP_IEN_MASK 0x1
2016#define ACP_I2SMICSP_IER__I2SMICSP_IEN__SHIFT 0x0
2017#define ACP_I2SMICSP_IRER__I2SMICSP_RXEN_MASK 0x1
2018#define ACP_I2SMICSP_IRER__I2SMICSP_RXEN__SHIFT 0x0
2019#define ACP_I2SMICSP_ITER__I2SMICSP_TXEN_MASK 0x1
2020#define ACP_I2SMICSP_ITER__I2SMICSP_TXEN__SHIFT 0x0
2021#define ACP_I2SMICSP_CER__I2SMICSP_CLKEN_MASK 0x1
2022#define ACP_I2SMICSP_CER__I2SMICSP_CLKEN__SHIFT 0x0
2023#define ACP_I2SMICSP_CCR__I2SMICSP_SCLKG_MASK 0x7
2024#define ACP_I2SMICSP_CCR__I2SMICSP_SCLKG__SHIFT 0x0
2025#define ACP_I2SMICSP_CCR__I2SMICSP_WSS_MASK 0x18
2026#define ACP_I2SMICSP_CCR__I2SMICSP_WSS__SHIFT 0x3
2027#define ACP_I2SMICSP_RXFFR__I2SMICSP_RXFFR_MASK 0x1
2028#define ACP_I2SMICSP_RXFFR__I2SMICSP_RXFFR__SHIFT 0x0
2029#define ACP_I2SMICSP_TXFFR__I2SMICSP_TXFFR_MASK 0x1
2030#define ACP_I2SMICSP_TXFFR__I2SMICSP_TXFFR__SHIFT 0x0
2031#define ACP_I2SMICSP_LRBR0__I2SMICSP_LRBR0_MASK 0xffffffff
2032#define ACP_I2SMICSP_LRBR0__I2SMICSP_LRBR0__SHIFT 0x0
2033#define ACP_I2SMICSP_RRBR0__I2SMICSP_RRBR0_MASK 0xffffffff
2034#define ACP_I2SMICSP_RRBR0__I2SMICSP_RRBR0__SHIFT 0x0
2035#define ACP_I2SMICSP_RER0__I2SMICSP_RXCHEN0_MASK 0x1
2036#define ACP_I2SMICSP_RER0__I2SMICSP_RXCHEN0__SHIFT 0x0
2037#define ACP_I2SMICSP_TER0__I2SMICSP_TXCHEN0_MASK 0x1
2038#define ACP_I2SMICSP_TER0__I2SMICSP_TXCHEN0__SHIFT 0x0
2039#define ACP_I2SMICSP_RCR0__I2SMICSP_WLEN_MASK 0x7
2040#define ACP_I2SMICSP_RCR0__I2SMICSP_WLEN__SHIFT 0x0
2041#define ACP_I2SMICSP_TCR0__I2SMICSP_WLEN_MASK 0x7
2042#define ACP_I2SMICSP_TCR0__I2SMICSP_WLEN__SHIFT 0x0
2043#define ACP_I2SMICSP_ISR0__I2SMICSP_RXDA_MASK 0x1
2044#define ACP_I2SMICSP_ISR0__I2SMICSP_RXDA__SHIFT 0x0
2045#define ACP_I2SMICSP_ISR0__I2SMICSP_RXFO_MASK 0x2
2046#define ACP_I2SMICSP_ISR0__I2SMICSP_RXFO__SHIFT 0x1
2047#define ACP_I2SMICSP_ISR0__I2SMICSP_TXFE_MASK 0x10
2048#define ACP_I2SMICSP_ISR0__I2SMICSP_TXFE__SHIFT 0x4
2049#define ACP_I2SMICSP_ISR0__I2SMICSP_TXFO_MASK 0x20
2050#define ACP_I2SMICSP_ISR0__I2SMICSP_TXFO__SHIFT 0x5
2051#define ACP_I2SMICSP_IMR0__I2SMICSP_RXDAM_MASK 0x1
2052#define ACP_I2SMICSP_IMR0__I2SMICSP_RXDAM__SHIFT 0x0
2053#define ACP_I2SMICSP_IMR0__I2SMICSP_RXFOM_MASK 0x2
2054#define ACP_I2SMICSP_IMR0__I2SMICSP_RXFOM__SHIFT 0x1
2055#define ACP_I2SMICSP_IMR0__I2SMICSP_TXFEM_MASK 0x10
2056#define ACP_I2SMICSP_IMR0__I2SMICSP_TXFEM__SHIFT 0x4
2057#define ACP_I2SMICSP_IMR0__I2SMICSP_TXFOM_MASK 0x20
2058#define ACP_I2SMICSP_IMR0__I2SMICSP_TXFOM__SHIFT 0x5
2059#define ACP_I2SMICSP_ROR0__I2SMICSP_RXCHO_MASK 0x1
2060#define ACP_I2SMICSP_ROR0__I2SMICSP_RXCHO__SHIFT 0x0
2061#define ACP_I2SMICSP_TOR0__I2SMICSP_TXCHO_MASK 0x1
2062#define ACP_I2SMICSP_TOR0__I2SMICSP_TXCHO__SHIFT 0x0
2063#define ACP_I2SMICSP_RFCR0__I2SMICSP_RXCHDT_MASK 0xf
2064#define ACP_I2SMICSP_RFCR0__I2SMICSP_RXCHDT__SHIFT 0x0
2065#define ACP_I2SMICSP_TFCR0__I2SMICSP_TXCHET_MASK 0xf
2066#define ACP_I2SMICSP_TFCR0__I2SMICSP_TXCHET__SHIFT 0x0
2067#define ACP_I2SMICSP_RFF0__I2SMICSP_RXCHFR_MASK 0x1
2068#define ACP_I2SMICSP_RFF0__I2SMICSP_RXCHFR__SHIFT 0x0
2069#define ACP_I2SMICSP_TFF0__I2SMICSP_TXCHFR_MASK 0x1
2070#define ACP_I2SMICSP_TFF0__I2SMICSP_TXCHFR__SHIFT 0x0
2071#define ACP_I2SMICSP_LRBR1__I2SMICSP_LRBR1_MASK 0xffffffff
2072#define ACP_I2SMICSP_LRBR1__I2SMICSP_LRBR1__SHIFT 0x0
2073#define ACP_I2SMICSP_RRBR1__I2SMICSP_RRBR1_MASK 0xffffffff
2074#define ACP_I2SMICSP_RRBR1__I2SMICSP_RRBR1__SHIFT 0x0
2075#define ACP_I2SMICSP_RER1__I2SMICSP_RXCHEN1_MASK 0x1
2076#define ACP_I2SMICSP_RER1__I2SMICSP_RXCHEN1__SHIFT 0x0
2077#define ACP_I2SMICSP_TER1__I2SMICSP_TXCHEN1_MASK 0x1
2078#define ACP_I2SMICSP_TER1__I2SMICSP_TXCHEN1__SHIFT 0x0
2079#define ACP_I2SMICSP_RCR1__I2SMICSP_WLEN_MASK 0x7
2080#define ACP_I2SMICSP_RCR1__I2SMICSP_WLEN__SHIFT 0x0
2081#define ACP_I2SMICSP_TCR1__I2SMICSP_WLEN_MASK 0x7
2082#define ACP_I2SMICSP_TCR1__I2SMICSP_WLEN__SHIFT 0x0
2083#define ACP_I2SMICSP_ISR1__I2SMICSP_RXDA_MASK 0x1
2084#define ACP_I2SMICSP_ISR1__I2SMICSP_RXDA__SHIFT 0x0
2085#define ACP_I2SMICSP_ISR1__I2SMICSP_RXFO_MASK 0x2
2086#define ACP_I2SMICSP_ISR1__I2SMICSP_RXFO__SHIFT 0x1
2087#define ACP_I2SMICSP_ISR1__I2SMICSP_TXFE_MASK 0x10
2088#define ACP_I2SMICSP_ISR1__I2SMICSP_TXFE__SHIFT 0x4
2089#define ACP_I2SMICSP_ISR1__I2SMICSP_TXFO_MASK 0x20
2090#define ACP_I2SMICSP_ISR1__I2SMICSP_TXFO__SHIFT 0x5
2091#define ACP_I2SMICSP_IMR1__I2SMICSP_RXDAM_MASK 0x1
2092#define ACP_I2SMICSP_IMR1__I2SMICSP_RXDAM__SHIFT 0x0
2093#define ACP_I2SMICSP_IMR1__I2SMICSP_RXFOM_MASK 0x2
2094#define ACP_I2SMICSP_IMR1__I2SMICSP_RXFOM__SHIFT 0x1
2095#define ACP_I2SMICSP_IMR1__I2SMICSP_TXFEM_MASK 0x10
2096#define ACP_I2SMICSP_IMR1__I2SMICSP_TXFEM__SHIFT 0x4
2097#define ACP_I2SMICSP_IMR1__I2SMICSP_TXFOM_MASK 0x20
2098#define ACP_I2SMICSP_IMR1__I2SMICSP_TXFOM__SHIFT 0x5
2099#define ACP_I2SMICSP_ROR1__I2SMICSP_RXCHO_MASK 0x1
2100#define ACP_I2SMICSP_ROR1__I2SMICSP_RXCHO__SHIFT 0x0
2101#define ACP_I2SMICSP_TOR1__I2SMICSP_TXCHO_MASK 0x1
2102#define ACP_I2SMICSP_TOR1__I2SMICSP_TXCHO__SHIFT 0x0
2103#define ACP_I2SMICSP_RFCR1__I2SMICSP_RXCHDT_MASK 0xf
2104#define ACP_I2SMICSP_RFCR1__I2SMICSP_RXCHDT__SHIFT 0x0
2105#define ACP_I2SMICSP_TFCR1__I2SMICSP_TXCHET_MASK 0xf
2106#define ACP_I2SMICSP_TFCR1__I2SMICSP_TXCHET__SHIFT 0x0
2107#define ACP_I2SMICSP_RFF1__I2SMICSP_RXCHFR_MASK 0x1
2108#define ACP_I2SMICSP_RFF1__I2SMICSP_RXCHFR__SHIFT 0x0
2109#define ACP_I2SMICSP_TFF1__I2SMICSP_TXCHFR_MASK 0x1
2110#define ACP_I2SMICSP_TFF1__I2SMICSP_TXCHFR__SHIFT 0x0
2111#define ACP_I2SMICSP_RXDMA__I2SMICSP_RXDMA_MASK 0xffffffff
2112#define ACP_I2SMICSP_RXDMA__I2SMICSP_RXDMA__SHIFT 0x0
2113#define ACP_I2SMICSP_RRXDMA__I2SMICSP_RRXDMA_MASK 0x1
2114#define ACP_I2SMICSP_RRXDMA__I2SMICSP_RRXDMA__SHIFT 0x0
2115#define ACP_I2SMICSP_TXDMA__I2SMICSP_TXDMA_MASK 0xffffffff
2116#define ACP_I2SMICSP_TXDMA__I2SMICSP_TXDMA__SHIFT 0x0
2117#define ACP_I2SMICSP_RTXDMA__I2SMICSP_RTXDMA_MASK 0x1
2118#define ACP_I2SMICSP_RTXDMA__I2SMICSP_RTXDMA__SHIFT 0x0
2119#define ACP_I2SMICSP_COMP_PARAM_2__I2SMICSP_RX_WPRDSIZE_0_MASK 0x7
2120#define ACP_I2SMICSP_COMP_PARAM_2__I2SMICSP_RX_WPRDSIZE_0__SHIFT 0x0
2121#define ACP_I2SMICSP_COMP_PARAM_2__I2SMICSP_RX_WPRDSIZE_1_MASK 0x38
2122#define ACP_I2SMICSP_COMP_PARAM_2__I2SMICSP_RX_WPRDSIZE_1__SHIFT 0x3
2123#define ACP_I2SMICSP_COMP_PARAM_2__I2SMICSP_RX_WPRDSIZE_2_MASK 0x380
2124#define ACP_I2SMICSP_COMP_PARAM_2__I2SMICSP_RX_WPRDSIZE_2__SHIFT 0x7
2125#define ACP_I2SMICSP_COMP_PARAM_2__I2SMICSP_RX_WPRDSIZE_3_MASK 0x1c00
2126#define ACP_I2SMICSP_COMP_PARAM_2__I2SMICSP_RX_WPRDSIZE_3__SHIFT 0xa
2127#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_APB_DATA_WIDTH_MASK 0x3
2128#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_APB_DATA_WIDTH__SHIFT 0x0
2129#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_FIFO_DEPTH_GLOBAL_MASK 0xc
2130#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_FIFO_DEPTH_GLOBAL__SHIFT 0x2
2131#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_MODE_EN_MASK 0x10
2132#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_MODE_EN__SHIFT 0x4
2133#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TRANSMITTER_BLOCK_MASK 0x20
2134#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TRANSMITTER_BLOCK__SHIFT 0x5
2135#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_RECEIVER_BLOCK_MASK 0x40
2136#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_RECEIVER_BLOCK__SHIFT 0x6
2137#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_RX_CHANNLES_MASK 0x180
2138#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_RX_CHANNLES__SHIFT 0x7
2139#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TX_CHANNLES_MASK 0x600
2140#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TX_CHANNLES__SHIFT 0x9
2141#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TX_WORDSIZE_0_MASK 0x70000
2142#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TX_WORDSIZE_0__SHIFT 0x10
2143#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TX_WORDSIZE_1_MASK 0x380000
2144#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TX_WORDSIZE_1__SHIFT 0x13
2145#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TX_WORDSIZE_2_MASK 0x1c00000
2146#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TX_WORDSIZE_2__SHIFT 0x16
2147#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TX_WORDSIZE_3_MASK 0xe000000
2148#define ACP_I2SMICSP_COMP_PARAM_1__I2SMICSP_TX_WORDSIZE_3__SHIFT 0x19
2149#define ACP_I2SMICSP_COMP_VERSION__I2SMICSP_APB_DATA_WIDTH_MASK 0xffffffff
2150#define ACP_I2SMICSP_COMP_VERSION__I2SMICSP_APB_DATA_WIDTH__SHIFT 0x0
2151#define ACP_I2SMICSP_COMP_TYPE__I2SMICSP_COMP_TYPE_MASK 0xffffffff
2152#define ACP_I2SMICSP_COMP_TYPE__I2SMICSP_COMP_TYPE__SHIFT 0x0
2153#define ACP_I2SBT_IER__I2SBT_IEN_MASK 0x1
2154#define ACP_I2SBT_IER__I2SBT_IEN__SHIFT 0x0
2155#define ACP_I2SBT_IRER__I2SBT_RXEN_MASK 0x1
2156#define ACP_I2SBT_IRER__I2SBT_RXEN__SHIFT 0x0
2157#define ACP_I2SBT_ITER__I2SBT_TXEN_MASK 0x1
2158#define ACP_I2SBT_ITER__I2SBT_TXEN__SHIFT 0x0
2159#define ACP_I2SBT_CER__I2SBT_CLKEN_MASK 0x1
2160#define ACP_I2SBT_CER__I2SBT_CLKEN__SHIFT 0x0
2161#define ACP_I2SBT_CCR__I2SBT_SCLKG_MASK 0x7
2162#define ACP_I2SBT_CCR__I2SBT_SCLKG__SHIFT 0x0
2163#define ACP_I2SBT_CCR__I2SBT_WSS_MASK 0x18
2164#define ACP_I2SBT_CCR__I2SBT_WSS__SHIFT 0x3
2165#define ACP_I2SBT_RXFFR__I2SBT_RXFFR_MASK 0x1
2166#define ACP_I2SBT_RXFFR__I2SBT_RXFFR__SHIFT 0x0
2167#define ACP_I2SBT_TXFFR__I2SBT_TXFFR_MASK 0x1
2168#define ACP_I2SBT_TXFFR__I2SBT_TXFFR__SHIFT 0x0
2169#define ACP_I2SBT_LRBR0__I2SBT_LRBR0_MASK 0xffffffff
2170#define ACP_I2SBT_LRBR0__I2SBT_LRBR0__SHIFT 0x0
2171#define ACP_I2SBT_RRBR0__I2SBT_RRBR0_MASK 0xffffffff
2172#define ACP_I2SBT_RRBR0__I2SBT_RRBR0__SHIFT 0x0
2173#define ACP_I2SBT_RER0__I2SBT_RXCHEN0_MASK 0x1
2174#define ACP_I2SBT_RER0__I2SBT_RXCHEN0__SHIFT 0x0
2175#define ACP_I2SBT_TER0__I2SBT_TXCHEN0_MASK 0x1
2176#define ACP_I2SBT_TER0__I2SBT_TXCHEN0__SHIFT 0x0
2177#define ACP_I2SBT_RCR0__I2SBT_WLEN_MASK 0x7
2178#define ACP_I2SBT_RCR0__I2SBT_WLEN__SHIFT 0x0
2179#define ACP_I2SBT_TCR0__I2SBT_WLEN_MASK 0x7
2180#define ACP_I2SBT_TCR0__I2SBT_WLEN__SHIFT 0x0
2181#define ACP_I2SBT_ISR0__I2SBT_RXDA_MASK 0x1
2182#define ACP_I2SBT_ISR0__I2SBT_RXDA__SHIFT 0x0
2183#define ACP_I2SBT_ISR0__I2SBT_RXFO_MASK 0x2
2184#define ACP_I2SBT_ISR0__I2SBT_RXFO__SHIFT 0x1
2185#define ACP_I2SBT_ISR0__I2SBT_TXFE_MASK 0x10
2186#define ACP_I2SBT_ISR0__I2SBT_TXFE__SHIFT 0x4
2187#define ACP_I2SBT_ISR0__I2SBT_TXFO_MASK 0x20
2188#define ACP_I2SBT_ISR0__I2SBT_TXFO__SHIFT 0x5
2189#define ACP_I2SBT_IMR0__I2SBT_RXDAM_MASK 0x1
2190#define ACP_I2SBT_IMR0__I2SBT_RXDAM__SHIFT 0x0
2191#define ACP_I2SBT_IMR0__I2SBT_RXFOM_MASK 0x2
2192#define ACP_I2SBT_IMR0__I2SBT_RXFOM__SHIFT 0x1
2193#define ACP_I2SBT_IMR0__I2SBT_TXFEM_MASK 0x10
2194#define ACP_I2SBT_IMR0__I2SBT_TXFEM__SHIFT 0x4
2195#define ACP_I2SBT_IMR0__I2SBT_TXFOM_MASK 0x20
2196#define ACP_I2SBT_IMR0__I2SBT_TXFOM__SHIFT 0x5
2197#define ACP_I2SBT_ROR0__I2SBT_RXCHO_MASK 0x1
2198#define ACP_I2SBT_ROR0__I2SBT_RXCHO__SHIFT 0x0
2199#define ACP_I2SBT_TOR0__I2SBT_TXCHO_MASK 0x1
2200#define ACP_I2SBT_TOR0__I2SBT_TXCHO__SHIFT 0x0
2201#define ACP_I2SBT_RFCR0__I2SBT_RXCHDT_MASK 0xf
2202#define ACP_I2SBT_RFCR0__I2SBT_RXCHDT__SHIFT 0x0
2203#define ACP_I2SBT_TFCR0__I2SBT_TXCHET_MASK 0xf
2204#define ACP_I2SBT_TFCR0__I2SBT_TXCHET__SHIFT 0x0
2205#define ACP_I2SBT_RFF0__I2SBT_RXCHFR_MASK 0x1
2206#define ACP_I2SBT_RFF0__I2SBT_RXCHFR__SHIFT 0x0
2207#define ACP_I2SBT_TFF0__I2SBT_TXCHFR_MASK 0x1
2208#define ACP_I2SBT_TFF0__I2SBT_TXCHFR__SHIFT 0x0
2209#define ACP_I2SBT_LRBR1__I2SBT_LRBR1_MASK 0xffffffff
2210#define ACP_I2SBT_LRBR1__I2SBT_LRBR1__SHIFT 0x0
2211#define ACP_I2SBT_RRBR1__I2SBT_RRBR1_MASK 0xffffffff
2212#define ACP_I2SBT_RRBR1__I2SBT_RRBR1__SHIFT 0x0
2213#define ACP_I2SBT_RER1__I2SBT_RXCHEN1_MASK 0x1
2214#define ACP_I2SBT_RER1__I2SBT_RXCHEN1__SHIFT 0x0
2215#define ACP_I2SBT_TER1__I2SBT_TXCHEN1_MASK 0x1
2216#define ACP_I2SBT_TER1__I2SBT_TXCHEN1__SHIFT 0x0
2217#define ACP_I2SBT_RCR1__I2SBT_WLEN_MASK 0x7
2218#define ACP_I2SBT_RCR1__I2SBT_WLEN__SHIFT 0x0
2219#define ACP_I2SBT_TCR1__I2SBT_WLEN_MASK 0x7
2220#define ACP_I2SBT_TCR1__I2SBT_WLEN__SHIFT 0x0
2221#define ACP_I2SBT_ISR1__I2SBT_RXDA_MASK 0x1
2222#define ACP_I2SBT_ISR1__I2SBT_RXDA__SHIFT 0x0
2223#define ACP_I2SBT_ISR1__I2SBT_RXFO_MASK 0x2
2224#define ACP_I2SBT_ISR1__I2SBT_RXFO__SHIFT 0x1
2225#define ACP_I2SBT_ISR1__I2SBT_TXFE_MASK 0x10
2226#define ACP_I2SBT_ISR1__I2SBT_TXFE__SHIFT 0x4
2227#define ACP_I2SBT_ISR1__I2SBT_TXFO_MASK 0x20
2228#define ACP_I2SBT_ISR1__I2SBT_TXFO__SHIFT 0x5
2229#define ACP_I2SBT_IMR1__I2SBT_RXDAM_MASK 0x1
2230#define ACP_I2SBT_IMR1__I2SBT_RXDAM__SHIFT 0x0
2231#define ACP_I2SBT_IMR1__I2SBT_RXFOM_MASK 0x2
2232#define ACP_I2SBT_IMR1__I2SBT_RXFOM__SHIFT 0x1
2233#define ACP_I2SBT_IMR1__I2SBT_TXFEM_MASK 0x10
2234#define ACP_I2SBT_IMR1__I2SBT_TXFEM__SHIFT 0x4
2235#define ACP_I2SBT_IMR1__I2SBT_TXFOM_MASK 0x20
2236#define ACP_I2SBT_IMR1__I2SBT_TXFOM__SHIFT 0x5
2237#define ACP_I2SBT_ROR1__I2SBT_RXCHO_MASK 0x1
2238#define ACP_I2SBT_ROR1__I2SBT_RXCHO__SHIFT 0x0
2239#define ACP_I2SBT_TOR1__I2SBT_TXCHO_MASK 0x1
2240#define ACP_I2SBT_TOR1__I2SBT_TXCHO__SHIFT 0x0
2241#define ACP_I2SBT_RFCR1__I2SBT_RXCHDT_MASK 0xf
2242#define ACP_I2SBT_RFCR1__I2SBT_RXCHDT__SHIFT 0x0
2243#define ACP_I2SBT_TFCR1__I2SBT_TXCHET_MASK 0xf
2244#define ACP_I2SBT_TFCR1__I2SBT_TXCHET__SHIFT 0x0
2245#define ACP_I2SBT_RFF1__I2SBT_RXCHFR_MASK 0x1
2246#define ACP_I2SBT_RFF1__I2SBT_RXCHFR__SHIFT 0x0
2247#define ACP_I2SBT_TFF1__I2SBT_TXCHFR_MASK 0x1
2248#define ACP_I2SBT_TFF1__I2SBT_TXCHFR__SHIFT 0x0
2249#define ACP_I2SBT_RXDMA__I2SBT_RXDMA_MASK 0xffffffff
2250#define ACP_I2SBT_RXDMA__I2SBT_RXDMA__SHIFT 0x0
2251#define ACP_I2SBT_RRXDMA__I2SBT_RRXDMA_MASK 0x1
2252#define ACP_I2SBT_RRXDMA__I2SBT_RRXDMA__SHIFT 0x0
2253#define ACP_I2SBT_TXDMA__I2SBT_TXDMA_MASK 0xffffffff
2254#define ACP_I2SBT_TXDMA__I2SBT_TXDMA__SHIFT 0x0
2255#define ACP_I2SBT_RTXDMA__I2SBT_RTXDMA_MASK 0x1
2256#define ACP_I2SBT_RTXDMA__I2SBT_RTXDMA__SHIFT 0x0
2257#define ACP_I2SBT_COMP_PARAM_2__I2SBT_RX_WPRDSIZE_0_MASK 0x7
2258#define ACP_I2SBT_COMP_PARAM_2__I2SBT_RX_WPRDSIZE_0__SHIFT 0x0
2259#define ACP_I2SBT_COMP_PARAM_2__I2SBT_RX_WPRDSIZE_1_MASK 0x38
2260#define ACP_I2SBT_COMP_PARAM_2__I2SBT_RX_WPRDSIZE_1__SHIFT 0x3
2261#define ACP_I2SBT_COMP_PARAM_2__I2SBT_RX_WPRDSIZE_2_MASK 0x380
2262#define ACP_I2SBT_COMP_PARAM_2__I2SBT_RX_WPRDSIZE_2__SHIFT 0x7
2263#define ACP_I2SBT_COMP_PARAM_2__I2SBT_RX_WPRDSIZE_3_MASK 0x1c00
2264#define ACP_I2SBT_COMP_PARAM_2__I2SBT_RX_WPRDSIZE_3__SHIFT 0xa
2265#define ACP_I2SBT_COMP_PARAM_1__I2SBT_APB_DATA_WIDTH_MASK 0x3
2266#define ACP_I2SBT_COMP_PARAM_1__I2SBT_APB_DATA_WIDTH__SHIFT 0x0
2267#define ACP_I2SBT_COMP_PARAM_1__I2SBT_FIFO_DEPTH_GLOBAL_MASK 0xc
2268#define ACP_I2SBT_COMP_PARAM_1__I2SBT_FIFO_DEPTH_GLOBAL__SHIFT 0x2
2269#define ACP_I2SBT_COMP_PARAM_1__I2SBT_MODE_EN_MASK 0x10
2270#define ACP_I2SBT_COMP_PARAM_1__I2SBT_MODE_EN__SHIFT 0x4
2271#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TRANSMITTER_BLOCK_MASK 0x20
2272#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TRANSMITTER_BLOCK__SHIFT 0x5
2273#define ACP_I2SBT_COMP_PARAM_1__I2SBT_RECEIVER_BLOCK_MASK 0x40
2274#define ACP_I2SBT_COMP_PARAM_1__I2SBT_RECEIVER_BLOCK__SHIFT 0x6
2275#define ACP_I2SBT_COMP_PARAM_1__I2SBT_RX_CHANNLES_MASK 0x180
2276#define ACP_I2SBT_COMP_PARAM_1__I2SBT_RX_CHANNLES__SHIFT 0x7
2277#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TX_CHANNLES_MASK 0x600
2278#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TX_CHANNLES__SHIFT 0x9
2279#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TX_WORDSIZE_0_MASK 0x70000
2280#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TX_WORDSIZE_0__SHIFT 0x10
2281#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TX_WORDSIZE_1_MASK 0x380000
2282#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TX_WORDSIZE_1__SHIFT 0x13
2283#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TX_WORDSIZE_2_MASK 0x1c00000
2284#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TX_WORDSIZE_2__SHIFT 0x16
2285#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TX_WORDSIZE_3_MASK 0xe000000
2286#define ACP_I2SBT_COMP_PARAM_1__I2SBT_TX_WORDSIZE_3__SHIFT 0x19
2287#define ACP_I2SBT_COMP_VERSION__I2SBT_APB_DATA_WIDTH_MASK 0xffffffff
2288#define ACP_I2SBT_COMP_VERSION__I2SBT_APB_DATA_WIDTH__SHIFT 0x0
2289#define ACP_I2SBT_COMP_TYPE__I2SBT_COMP_TYPE_MASK 0xffffffff
2290#define ACP_I2SBT_COMP_TYPE__I2SBT_COMP_TYPE__SHIFT 0x0
2291
2292#endif /* ACP_2_2_SH_MASK_H */
diff --git a/sound/soc/atmel/Kconfig b/sound/soc/atmel/Kconfig
index 2d30464b81ce..06e099e802df 100644
--- a/sound/soc/atmel/Kconfig
+++ b/sound/soc/atmel/Kconfig
@@ -68,4 +68,13 @@ config SND_ATMEL_SOC_CLASSD
68 help 68 help
69 Say Y if you want to add support for Atmel ASoC driver for boards using 69 Say Y if you want to add support for Atmel ASoC driver for boards using
70 CLASSD. 70 CLASSD.
71
72config SND_ATMEL_SOC_PDMIC
73 tristate "Atmel ASoC driver for boards using PDMIC"
74 depends on OF && (ARCH_AT91 || COMPILE_TEST)
75 select SND_SOC_GENERIC_DMAENGINE_PCM
76 select REGMAP_MMIO
77 help
78 Say Y if you want to add support for Atmel ASoC driver for boards using
79 PDMIC.
71endif 80endif
diff --git a/sound/soc/atmel/Makefile b/sound/soc/atmel/Makefile
index f6f7db428216..a2b127bd9c87 100644
--- a/sound/soc/atmel/Makefile
+++ b/sound/soc/atmel/Makefile
@@ -12,8 +12,10 @@ snd-soc-sam9g20-wm8731-objs := sam9g20_wm8731.o
12snd-atmel-soc-wm8904-objs := atmel_wm8904.o 12snd-atmel-soc-wm8904-objs := atmel_wm8904.o
13snd-soc-sam9x5-wm8731-objs := sam9x5_wm8731.o 13snd-soc-sam9x5-wm8731-objs := sam9x5_wm8731.o
14snd-atmel-soc-classd-objs := atmel-classd.o 14snd-atmel-soc-classd-objs := atmel-classd.o
15snd-atmel-soc-pdmic-objs := atmel-pdmic.o
15 16
16obj-$(CONFIG_SND_AT91_SOC_SAM9G20_WM8731) += snd-soc-sam9g20-wm8731.o 17obj-$(CONFIG_SND_AT91_SOC_SAM9G20_WM8731) += snd-soc-sam9g20-wm8731.o
17obj-$(CONFIG_SND_ATMEL_SOC_WM8904) += snd-atmel-soc-wm8904.o 18obj-$(CONFIG_SND_ATMEL_SOC_WM8904) += snd-atmel-soc-wm8904.o
18obj-$(CONFIG_SND_AT91_SOC_SAM9X5_WM8731) += snd-soc-sam9x5-wm8731.o 19obj-$(CONFIG_SND_AT91_SOC_SAM9X5_WM8731) += snd-soc-sam9x5-wm8731.o
19obj-$(CONFIG_SND_ATMEL_SOC_CLASSD) += snd-atmel-soc-classd.o 20obj-$(CONFIG_SND_ATMEL_SOC_CLASSD) += snd-atmel-soc-classd.o
21obj-$(CONFIG_SND_ATMEL_SOC_PDMIC) += snd-atmel-soc-pdmic.o
diff --git a/sound/soc/atmel/atmel-classd.c b/sound/soc/atmel/atmel-classd.c
index 8276675730ef..6107de9c538b 100644
--- a/sound/soc/atmel/atmel-classd.c
+++ b/sound/soc/atmel/atmel-classd.c
@@ -106,7 +106,7 @@ static const struct snd_pcm_hardware atmel_classd_hw = {
106 .rates = ATMEL_CLASSD_RATES, 106 .rates = ATMEL_CLASSD_RATES,
107 .rate_min = 8000, 107 .rate_min = 8000,
108 .rate_max = 96000, 108 .rate_max = 96000,
109 .channels_min = 2, 109 .channels_min = 1,
110 .channels_max = 2, 110 .channels_max = 2,
111 .buffer_bytes_max = 64 * 1024, 111 .buffer_bytes_max = 64 * 1024,
112 .period_bytes_min = 256, 112 .period_bytes_min = 256,
@@ -145,7 +145,7 @@ static const struct snd_soc_dai_ops atmel_classd_cpu_dai_ops = {
145 145
146static struct snd_soc_dai_driver atmel_classd_cpu_dai = { 146static struct snd_soc_dai_driver atmel_classd_cpu_dai = {
147 .playback = { 147 .playback = {
148 .channels_min = 2, 148 .channels_min = 1,
149 .channels_max = 2, 149 .channels_max = 2,
150 .rates = ATMEL_CLASSD_RATES, 150 .rates = ATMEL_CLASSD_RATES,
151 .formats = SNDRV_PCM_FMTBIT_S16_LE,}, 151 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
@@ -171,9 +171,13 @@ atmel_classd_platform_configure_dma(struct snd_pcm_substream *substream,
171 return -EINVAL; 171 return -EINVAL;
172 } 172 }
173 173
174 if (params_channels(params) == 1)
175 slave_config->dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
176 else
177 slave_config->dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
178
174 slave_config->direction = DMA_MEM_TO_DEV; 179 slave_config->direction = DMA_MEM_TO_DEV;
175 slave_config->dst_addr = dd->phy_base + CLASSD_THR; 180 slave_config->dst_addr = dd->phy_base + CLASSD_THR;
176 slave_config->dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
177 slave_config->dst_maxburst = 1; 181 slave_config->dst_maxburst = 1;
178 slave_config->src_maxburst = 1; 182 slave_config->src_maxburst = 1;
179 slave_config->device_fc = false; 183 slave_config->device_fc = false;
@@ -486,7 +490,7 @@ static struct snd_soc_dai_driver atmel_classd_codec_dai = {
486 .name = ATMEL_CLASSD_CODEC_DAI_NAME, 490 .name = ATMEL_CLASSD_CODEC_DAI_NAME,
487 .playback = { 491 .playback = {
488 .stream_name = "Playback", 492 .stream_name = "Playback",
489 .channels_min = 2, 493 .channels_min = 1,
490 .channels_max = 2, 494 .channels_max = 2,
491 .rates = ATMEL_CLASSD_RATES, 495 .rates = ATMEL_CLASSD_RATES,
492 .formats = SNDRV_PCM_FMTBIT_S16_LE, 496 .formats = SNDRV_PCM_FMTBIT_S16_LE,
@@ -636,8 +640,10 @@ static int atmel_classd_probe(struct platform_device *pdev)
636 640
637 /* register sound card */ 641 /* register sound card */
638 card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL); 642 card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
639 if (!card) 643 if (!card) {
640 return -ENOMEM; 644 ret = -ENOMEM;
645 goto unregister_codec;
646 }
641 647
642 snd_soc_card_set_drvdata(card, dd); 648 snd_soc_card_set_drvdata(card, dd);
643 platform_set_drvdata(pdev, card); 649 platform_set_drvdata(pdev, card);
@@ -645,16 +651,20 @@ static int atmel_classd_probe(struct platform_device *pdev)
645 ret = atmel_classd_asoc_card_init(dev, card); 651 ret = atmel_classd_asoc_card_init(dev, card);
646 if (ret) { 652 if (ret) {
647 dev_err(dev, "failed to init sound card\n"); 653 dev_err(dev, "failed to init sound card\n");
648 return ret; 654 goto unregister_codec;
649 } 655 }
650 656
651 ret = devm_snd_soc_register_card(dev, card); 657 ret = devm_snd_soc_register_card(dev, card);
652 if (ret) { 658 if (ret) {
653 dev_err(dev, "failed to register sound card: %d\n", ret); 659 dev_err(dev, "failed to register sound card: %d\n", ret);
654 return ret; 660 goto unregister_codec;
655 } 661 }
656 662
657 return 0; 663 return 0;
664
665unregister_codec:
666 snd_soc_unregister_codec(dev);
667 return ret;
658} 668}
659 669
660static int atmel_classd_remove(struct platform_device *pdev) 670static int atmel_classd_remove(struct platform_device *pdev)
diff --git a/sound/soc/atmel/atmel-pdmic.c b/sound/soc/atmel/atmel-pdmic.c
new file mode 100644
index 000000000000..aee4787a0b89
--- /dev/null
+++ b/sound/soc/atmel/atmel-pdmic.c
@@ -0,0 +1,738 @@
1/* Atmel PDMIC driver
2 *
3 * Copyright (C) 2015 Atmel
4 *
5 * Author: Songjun Wu <songjun.wu@atmel.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 or later
9 * as published by the Free Software Foundation.
10 */
11
12#include <linux/of.h>
13#include <linux/clk.h>
14#include <linux/module.h>
15#include <linux/platform_device.h>
16#include <linux/regmap.h>
17#include <sound/core.h>
18#include <sound/dmaengine_pcm.h>
19#include <sound/pcm_params.h>
20#include <sound/tlv.h>
21#include "atmel-pdmic.h"
22
23struct atmel_pdmic_pdata {
24 u32 mic_min_freq;
25 u32 mic_max_freq;
26 s32 mic_offset;
27 const char *card_name;
28};
29
30struct atmel_pdmic {
31 dma_addr_t phy_base;
32 struct regmap *regmap;
33 struct clk *pclk;
34 struct clk *gclk;
35 int irq;
36 struct snd_pcm_substream *substream;
37 const struct atmel_pdmic_pdata *pdata;
38};
39
40static const struct of_device_id atmel_pdmic_of_match[] = {
41 {
42 .compatible = "atmel,sama5d2-pdmic",
43 }, {
44 /* sentinel */
45 }
46};
47MODULE_DEVICE_TABLE(of, atmel_pdmic_of_match);
48
49#define PDMIC_OFFSET_MAX_VAL S16_MAX
50#define PDMIC_OFFSET_MIN_VAL S16_MIN
51
52static struct atmel_pdmic_pdata *atmel_pdmic_dt_init(struct device *dev)
53{
54 struct device_node *np = dev->of_node;
55 struct atmel_pdmic_pdata *pdata;
56
57 if (!np) {
58 dev_err(dev, "device node not found\n");
59 return ERR_PTR(-EINVAL);
60 }
61
62 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
63 if (!pdata)
64 return ERR_PTR(-ENOMEM);
65
66 if (of_property_read_string(np, "atmel,model", &pdata->card_name))
67 pdata->card_name = "PDMIC";
68
69 if (of_property_read_u32(np, "atmel,mic-min-freq",
70 &pdata->mic_min_freq)) {
71 dev_err(dev, "failed to get mic-min-freq\n");
72 return ERR_PTR(-EINVAL);
73 }
74
75 if (of_property_read_u32(np, "atmel,mic-max-freq",
76 &pdata->mic_max_freq)) {
77 dev_err(dev, "failed to get mic-max-freq\n");
78 return ERR_PTR(-EINVAL);
79 }
80
81 if (pdata->mic_max_freq < pdata->mic_min_freq) {
82 dev_err(dev,
83 "mic-max-freq should not less than mic-min-freq\n");
84 return ERR_PTR(-EINVAL);
85 }
86
87 if (of_property_read_s32(np, "atmel,mic-offset", &pdata->mic_offset))
88 pdata->mic_offset = 0;
89
90 if (pdata->mic_offset > PDMIC_OFFSET_MAX_VAL) {
91 dev_warn(dev,
92 "mic-offset value %d is larger than the max value %d, the max value is specified\n",
93 pdata->mic_offset, PDMIC_OFFSET_MAX_VAL);
94 pdata->mic_offset = PDMIC_OFFSET_MAX_VAL;
95 } else if (pdata->mic_offset < PDMIC_OFFSET_MIN_VAL) {
96 dev_warn(dev,
97 "mic-offset value %d is less than the min value %d, the min value is specified\n",
98 pdata->mic_offset, PDMIC_OFFSET_MIN_VAL);
99 pdata->mic_offset = PDMIC_OFFSET_MIN_VAL;
100 }
101
102 return pdata;
103}
104
105/* cpu dai component */
106static int atmel_pdmic_cpu_dai_startup(struct snd_pcm_substream *substream,
107 struct snd_soc_dai *cpu_dai)
108{
109 struct snd_soc_pcm_runtime *rtd = substream->private_data;
110 struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
111 int ret;
112
113 ret = clk_prepare_enable(dd->gclk);
114 if (ret)
115 return ret;
116
117 ret = clk_prepare_enable(dd->pclk);
118 if (ret)
119 return ret;
120
121 /* Clear all bits in the Control Register(PDMIC_CR) */
122 regmap_write(dd->regmap, PDMIC_CR, 0);
123
124 dd->substream = substream;
125
126 /* Enable the overrun error interrupt */
127 regmap_write(dd->regmap, PDMIC_IER, PDMIC_IER_OVRE);
128
129 return 0;
130}
131
132static void atmel_pdmic_cpu_dai_shutdown(struct snd_pcm_substream *substream,
133 struct snd_soc_dai *cpu_dai)
134{
135 struct snd_soc_pcm_runtime *rtd = substream->private_data;
136 struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
137
138 /* Disable the overrun error interrupt */
139 regmap_write(dd->regmap, PDMIC_IDR, PDMIC_IDR_OVRE);
140
141 clk_disable_unprepare(dd->gclk);
142 clk_disable_unprepare(dd->pclk);
143}
144
145static int atmel_pdmic_cpu_dai_prepare(struct snd_pcm_substream *substream,
146 struct snd_soc_dai *cpu_dai)
147{
148 struct snd_soc_pcm_runtime *rtd = substream->private_data;
149 struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
150 u32 val;
151
152 /* Clean the PDMIC Converted Data Register */
153 return regmap_read(dd->regmap, PDMIC_CDR, &val);
154}
155
156static const struct snd_soc_dai_ops atmel_pdmic_cpu_dai_ops = {
157 .startup = atmel_pdmic_cpu_dai_startup,
158 .shutdown = atmel_pdmic_cpu_dai_shutdown,
159 .prepare = atmel_pdmic_cpu_dai_prepare,
160};
161
162#define ATMEL_PDMIC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE)
163
164static struct snd_soc_dai_driver atmel_pdmic_cpu_dai = {
165 .capture = {
166 .channels_min = 1,
167 .channels_max = 1,
168 .rates = SNDRV_PCM_RATE_KNOT,
169 .formats = ATMEL_PDMIC_FORMATS,},
170 .ops = &atmel_pdmic_cpu_dai_ops,
171};
172
173static const struct snd_soc_component_driver atmel_pdmic_cpu_dai_component = {
174 .name = "atmel-pdmic",
175};
176
177/* platform */
178#define ATMEL_PDMIC_MAX_BUF_SIZE (64 * 1024)
179#define ATMEL_PDMIC_PREALLOC_BUF_SIZE ATMEL_PDMIC_MAX_BUF_SIZE
180
181static const struct snd_pcm_hardware atmel_pdmic_hw = {
182 .info = SNDRV_PCM_INFO_MMAP
183 | SNDRV_PCM_INFO_MMAP_VALID
184 | SNDRV_PCM_INFO_INTERLEAVED
185 | SNDRV_PCM_INFO_RESUME
186 | SNDRV_PCM_INFO_PAUSE,
187 .formats = ATMEL_PDMIC_FORMATS,
188 .buffer_bytes_max = ATMEL_PDMIC_MAX_BUF_SIZE,
189 .period_bytes_min = 256,
190 .period_bytes_max = 32 * 1024,
191 .periods_min = 2,
192 .periods_max = 256,
193};
194
195static int
196atmel_pdmic_platform_configure_dma(struct snd_pcm_substream *substream,
197 struct snd_pcm_hw_params *params,
198 struct dma_slave_config *slave_config)
199{
200 struct snd_soc_pcm_runtime *rtd = substream->private_data;
201 struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
202 int ret;
203
204 ret = snd_hwparams_to_dma_slave_config(substream, params,
205 slave_config);
206 if (ret) {
207 dev_err(rtd->platform->dev,
208 "hw params to dma slave configure failed\n");
209 return ret;
210 }
211
212 slave_config->src_addr = dd->phy_base + PDMIC_CDR;
213 slave_config->src_maxburst = 1;
214 slave_config->dst_maxburst = 1;
215
216 return 0;
217}
218
219static const struct snd_dmaengine_pcm_config
220atmel_pdmic_dmaengine_pcm_config = {
221 .prepare_slave_config = atmel_pdmic_platform_configure_dma,
222 .pcm_hardware = &atmel_pdmic_hw,
223 .prealloc_buffer_size = ATMEL_PDMIC_PREALLOC_BUF_SIZE,
224};
225
226/* codec */
227/* Mic Gain = dgain * 2^(-scale) */
228struct mic_gain {
229 unsigned int dgain;
230 unsigned int scale;
231};
232
233/* range from -90 dB to 90 dB */
234static const struct mic_gain mic_gain_table[] = {
235{ 1, 15}, { 1, 14}, /* -90, -84 dB */
236{ 3, 15}, { 1, 13}, { 3, 14}, { 1, 12}, /* -81, -78, -75, -72 dB */
237{ 5, 14}, { 13, 15}, /* -70, -68 dB */
238{ 9, 14}, { 21, 15}, { 23, 15}, { 13, 14}, /* -65 ~ -62 dB */
239{ 29, 15}, { 33, 15}, { 37, 15}, { 41, 15}, /* -61 ~ -58 dB */
240{ 23, 14}, { 13, 13}, { 58, 15}, { 65, 15}, /* -57 ~ -54 dB */
241{ 73, 15}, { 41, 14}, { 23, 13}, { 13, 12}, /* -53 ~ -50 dB */
242{ 29, 13}, { 65, 14}, { 73, 14}, { 41, 13}, /* -49 ~ -46 dB */
243{ 23, 12}, { 207, 15}, { 29, 12}, { 65, 13}, /* -45 ~ -42 dB */
244{ 73, 13}, { 41, 12}, { 23, 11}, { 413, 15}, /* -41 ~ -38 dB */
245{ 463, 15}, { 519, 15}, { 583, 15}, { 327, 14}, /* -37 ~ -34 dB */
246{ 367, 14}, { 823, 15}, { 231, 13}, { 1036, 15}, /* -33 ~ -30 dB */
247{ 1163, 15}, { 1305, 15}, { 183, 12}, { 1642, 15}, /* -29 ~ -26 dB */
248{ 1843, 15}, { 2068, 15}, { 145, 11}, { 2603, 15}, /* -25 ~ -22 dB */
249{ 365, 12}, { 3277, 15}, { 3677, 15}, { 4125, 15}, /* -21 ~ -18 dB */
250{ 4629, 15}, { 5193, 15}, { 5827, 15}, { 3269, 14}, /* -17 ~ -14 dB */
251{ 917, 12}, { 8231, 15}, { 9235, 15}, { 5181, 14}, /* -13 ~ -10 dB */
252{11627, 15}, {13045, 15}, {14637, 15}, {16423, 15}, /* -9 ~ -6 dB */
253{18427, 15}, {20675, 15}, { 5799, 13}, {26029, 15}, /* -5 ~ -2 dB */
254{ 7301, 13}, { 1, 0}, {18383, 14}, {10313, 13}, /* -1 ~ 2 dB */
255{23143, 14}, {25967, 14}, {29135, 14}, {16345, 13}, /* 3 ~ 6 dB */
256{ 4585, 11}, {20577, 13}, { 1443, 9}, {25905, 13}, /* 7 ~ 10 dB */
257{14533, 12}, { 8153, 11}, { 2287, 9}, {20529, 12}, /* 11 ~ 14 dB */
258{11517, 11}, { 6461, 10}, {28997, 12}, { 4067, 9}, /* 15 ~ 18 dB */
259{18253, 11}, { 10, 0}, {22979, 11}, {25783, 11}, /* 19 ~ 22 dB */
260{28929, 11}, {32459, 11}, { 9105, 9}, {20431, 10}, /* 23 ~ 26 dB */
261{22925, 10}, {12861, 9}, { 7215, 8}, {16191, 9}, /* 27 ~ 30 dB */
262{ 9083, 8}, {20383, 9}, {11435, 8}, { 6145, 7}, /* 31 ~ 34 dB */
263{ 3599, 6}, {32305, 9}, {18123, 8}, {20335, 8}, /* 35 ~ 38 dB */
264{ 713, 3}, { 100, 0}, { 7181, 6}, { 8057, 6}, /* 39 ~ 42 dB */
265{ 565, 2}, {20287, 7}, {11381, 6}, {25539, 7}, /* 43 ~ 46 dB */
266{ 1791, 3}, { 4019, 4}, { 9019, 5}, {20239, 6}, /* 47 ~ 50 dB */
267{ 5677, 4}, {25479, 6}, { 7147, 4}, { 8019, 4}, /* 51 ~ 54 dB */
268{17995, 5}, {20191, 5}, {11327, 4}, {12709, 4}, /* 55 ~ 58 dB */
269{ 3565, 2}, { 1000, 0}, { 1122, 0}, { 1259, 0}, /* 59 ~ 62 dB */
270{ 2825, 1}, {12679, 3}, { 7113, 2}, { 7981, 2}, /* 63 ~ 66 dB */
271{ 8955, 2}, {20095, 3}, {22547, 3}, {12649, 2}, /* 67 ~ 70 dB */
272{28385, 3}, { 3981, 0}, {17867, 2}, {20047, 2}, /* 71 ~ 74 dB */
273{11247, 1}, {12619, 1}, {14159, 1}, {31773, 2}, /* 75 ~ 78 dB */
274{17825, 1}, {10000, 0}, {11220, 0}, {12589, 0}, /* 79 ~ 82 dB */
275{28251, 1}, {15849, 0}, {17783, 0}, {19953, 0}, /* 83 ~ 86 dB */
276{22387, 0}, {25119, 0}, {28184, 0}, {31623, 0}, /* 87 ~ 90 dB */
277};
278
279static const DECLARE_TLV_DB_RANGE(mic_gain_tlv,
280 0, 1, TLV_DB_SCALE_ITEM(-9000, 600, 0),
281 2, 5, TLV_DB_SCALE_ITEM(-8100, 300, 0),
282 6, 7, TLV_DB_SCALE_ITEM(-7000, 200, 0),
283 8, ARRAY_SIZE(mic_gain_table)-1, TLV_DB_SCALE_ITEM(-6500, 100, 0),
284);
285
286int pdmic_get_mic_volsw(struct snd_kcontrol *kcontrol,
287 struct snd_ctl_elem_value *ucontrol)
288{
289 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
290 unsigned int dgain_val, scale_val;
291 int i;
292
293 dgain_val = (snd_soc_read(codec, PDMIC_DSPR1) & PDMIC_DSPR1_DGAIN_MASK)
294 >> PDMIC_DSPR1_DGAIN_SHIFT;
295
296 scale_val = (snd_soc_read(codec, PDMIC_DSPR0) & PDMIC_DSPR0_SCALE_MASK)
297 >> PDMIC_DSPR0_SCALE_SHIFT;
298
299 for (i = 0; i < ARRAY_SIZE(mic_gain_table); i++) {
300 if ((mic_gain_table[i].dgain == dgain_val) &&
301 (mic_gain_table[i].scale == scale_val))
302 ucontrol->value.integer.value[0] = i;
303 }
304
305 return 0;
306}
307
308static int pdmic_put_mic_volsw(struct snd_kcontrol *kcontrol,
309 struct snd_ctl_elem_value *ucontrol)
310{
311 struct soc_mixer_control *mc =
312 (struct soc_mixer_control *)kcontrol->private_value;
313 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
314 int max = mc->max;
315 unsigned int val;
316 int ret;
317
318 val = ucontrol->value.integer.value[0];
319
320 if (val > max)
321 return -EINVAL;
322
323 ret = snd_soc_update_bits(codec, PDMIC_DSPR1, PDMIC_DSPR1_DGAIN_MASK,
324 mic_gain_table[val].dgain << PDMIC_DSPR1_DGAIN_SHIFT);
325 if (ret < 0)
326 return ret;
327
328 ret = snd_soc_update_bits(codec, PDMIC_DSPR0, PDMIC_DSPR0_SCALE_MASK,
329 mic_gain_table[val].scale << PDMIC_DSPR0_SCALE_SHIFT);
330 if (ret < 0)
331 return ret;
332
333 return 0;
334}
335
336static const struct snd_kcontrol_new atmel_pdmic_snd_controls[] = {
337SOC_SINGLE_EXT_TLV("Mic Capture Volume", PDMIC_DSPR1, PDMIC_DSPR1_DGAIN_SHIFT,
338 ARRAY_SIZE(mic_gain_table)-1, 0,
339 pdmic_get_mic_volsw, pdmic_put_mic_volsw, mic_gain_tlv),
340
341SOC_SINGLE("High Pass Filter Switch", PDMIC_DSPR0,
342 PDMIC_DSPR0_HPFBYP_SHIFT, 1, 1),
343
344SOC_SINGLE("SINCC Filter Switch", PDMIC_DSPR0, PDMIC_DSPR0_SINBYP_SHIFT, 1, 1),
345};
346
347static int atmel_pdmic_codec_probe(struct snd_soc_codec *codec)
348{
349 struct snd_soc_card *card = snd_soc_codec_get_drvdata(codec);
350 struct atmel_pdmic *dd = snd_soc_card_get_drvdata(card);
351
352 snd_soc_update_bits(codec, PDMIC_DSPR1, PDMIC_DSPR1_OFFSET_MASK,
353 (u32)(dd->pdata->mic_offset << PDMIC_DSPR1_OFFSET_SHIFT));
354
355 return 0;
356}
357
358static struct snd_soc_codec_driver soc_codec_dev_pdmic = {
359 .probe = atmel_pdmic_codec_probe,
360 .controls = atmel_pdmic_snd_controls,
361 .num_controls = ARRAY_SIZE(atmel_pdmic_snd_controls),
362};
363
364/* codec dai component */
365#define PDMIC_MR_PRESCAL_MAX_VAL 127
366
367static int
368atmel_pdmic_codec_dai_hw_params(struct snd_pcm_substream *substream,
369 struct snd_pcm_hw_params *params,
370 struct snd_soc_dai *codec_dai)
371{
372 struct snd_soc_pcm_runtime *rtd = substream->private_data;
373 struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card);
374 struct snd_soc_codec *codec = codec_dai->codec;
375 unsigned int rate_min = substream->runtime->hw.rate_min;
376 unsigned int rate_max = substream->runtime->hw.rate_max;
377 int fs = params_rate(params);
378 int bits = params_width(params);
379 unsigned long pclk_rate, gclk_rate;
380 unsigned int f_pdmic;
381 u32 mr_val, dspr0_val, pclk_prescal, gclk_prescal;
382
383 if (params_channels(params) != 1) {
384 dev_err(codec->dev,
385 "only supports one channel\n");
386 return -EINVAL;
387 }
388
389 if ((fs < rate_min) || (fs > rate_max)) {
390 dev_err(codec->dev,
391 "sample rate is %dHz, min rate is %dHz, max rate is %dHz\n",
392 fs, rate_min, rate_max);
393
394 return -EINVAL;
395 }
396
397 switch (bits) {
398 case 16:
399 dspr0_val = (PDMIC_DSPR0_SIZE_16_BITS
400 << PDMIC_DSPR0_SIZE_SHIFT);
401 break;
402 case 32:
403 dspr0_val = (PDMIC_DSPR0_SIZE_32_BITS
404 << PDMIC_DSPR0_SIZE_SHIFT);
405 break;
406 default:
407 return -EINVAL;
408 }
409
410 if ((fs << 7) > (rate_max << 6)) {
411 f_pdmic = fs << 6;
412 dspr0_val |= PDMIC_DSPR0_OSR_64 << PDMIC_DSPR0_OSR_SHIFT;
413 } else {
414 f_pdmic = fs << 7;
415 dspr0_val |= PDMIC_DSPR0_OSR_128 << PDMIC_DSPR0_OSR_SHIFT;
416 }
417
418 pclk_rate = clk_get_rate(dd->pclk);
419 gclk_rate = clk_get_rate(dd->gclk);
420
421 /* PRESCAL = SELCK/(2*f_pdmic) - 1*/
422 pclk_prescal = (u32)(pclk_rate/(f_pdmic << 1)) - 1;
423 gclk_prescal = (u32)(gclk_rate/(f_pdmic << 1)) - 1;
424
425 if ((pclk_prescal > PDMIC_MR_PRESCAL_MAX_VAL) ||
426 (gclk_rate/((gclk_prescal + 1) << 1) <
427 pclk_rate/((pclk_prescal + 1) << 1))) {
428 mr_val = gclk_prescal << PDMIC_MR_PRESCAL_SHIFT;
429 mr_val |= PDMIC_MR_CLKS_GCK << PDMIC_MR_CLKS_SHIFT;
430 } else {
431 mr_val = pclk_prescal << PDMIC_MR_PRESCAL_SHIFT;
432 mr_val |= PDMIC_MR_CLKS_PCK << PDMIC_MR_CLKS_SHIFT;
433 }
434
435 snd_soc_update_bits(codec, PDMIC_MR,
436 PDMIC_MR_PRESCAL_MASK | PDMIC_MR_CLKS_MASK, mr_val);
437
438 snd_soc_update_bits(codec, PDMIC_DSPR0,
439 PDMIC_DSPR0_OSR_MASK | PDMIC_DSPR0_SIZE_MASK, dspr0_val);
440
441 return 0;
442}
443
444static int atmel_pdmic_codec_dai_prepare(struct snd_pcm_substream *substream,
445 struct snd_soc_dai *codec_dai)
446{
447 struct snd_soc_codec *codec = codec_dai->codec;
448
449 snd_soc_update_bits(codec, PDMIC_CR, PDMIC_CR_ENPDM_MASK,
450 PDMIC_CR_ENPDM_DIS << PDMIC_CR_ENPDM_SHIFT);
451
452 return 0;
453}
454
455static int atmel_pdmic_codec_dai_trigger(struct snd_pcm_substream *substream,
456 int cmd, struct snd_soc_dai *codec_dai)
457{
458 struct snd_soc_codec *codec = codec_dai->codec;
459 u32 val;
460
461 switch (cmd) {
462 case SNDRV_PCM_TRIGGER_START:
463 case SNDRV_PCM_TRIGGER_RESUME:
464 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
465 val = PDMIC_CR_ENPDM_EN << PDMIC_CR_ENPDM_SHIFT;
466 break;
467 case SNDRV_PCM_TRIGGER_STOP:
468 case SNDRV_PCM_TRIGGER_SUSPEND:
469 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
470 val = PDMIC_CR_ENPDM_DIS << PDMIC_CR_ENPDM_SHIFT;
471 break;
472 default:
473 return -EINVAL;
474 }
475
476 snd_soc_update_bits(codec, PDMIC_CR, PDMIC_CR_ENPDM_MASK, val);
477
478 return 0;
479}
480
481static const struct snd_soc_dai_ops atmel_pdmic_codec_dai_ops = {
482 .hw_params = atmel_pdmic_codec_dai_hw_params,
483 .prepare = atmel_pdmic_codec_dai_prepare,
484 .trigger = atmel_pdmic_codec_dai_trigger,
485};
486
487#define ATMEL_PDMIC_CODEC_DAI_NAME "atmel-pdmic-hifi"
488
489static struct snd_soc_dai_driver atmel_pdmic_codec_dai = {
490 .name = ATMEL_PDMIC_CODEC_DAI_NAME,
491 .capture = {
492 .stream_name = "Capture",
493 .channels_min = 1,
494 .channels_max = 1,
495 .rates = SNDRV_PCM_RATE_KNOT,
496 .formats = ATMEL_PDMIC_FORMATS,
497 },
498 .ops = &atmel_pdmic_codec_dai_ops,
499};
500
501/* ASoC sound card */
502static int atmel_pdmic_asoc_card_init(struct device *dev,
503 struct snd_soc_card *card)
504{
505 struct snd_soc_dai_link *dai_link;
506 struct atmel_pdmic *dd = snd_soc_card_get_drvdata(card);
507
508 dai_link = devm_kzalloc(dev, sizeof(*dai_link), GFP_KERNEL);
509 if (!dai_link)
510 return -ENOMEM;
511
512 dai_link->name = "PDMIC";
513 dai_link->stream_name = "PDMIC PCM";
514 dai_link->codec_dai_name = ATMEL_PDMIC_CODEC_DAI_NAME;
515 dai_link->cpu_dai_name = dev_name(dev);
516 dai_link->codec_name = dev_name(dev);
517 dai_link->platform_name = dev_name(dev);
518
519 card->dai_link = dai_link;
520 card->num_links = 1;
521 card->name = dd->pdata->card_name;
522 card->dev = dev;
523
524 return 0;
525}
526
527static void atmel_pdmic_get_sample_rate(struct atmel_pdmic *dd,
528 unsigned int *rate_min, unsigned int *rate_max)
529{
530 u32 mic_min_freq = dd->pdata->mic_min_freq;
531 u32 mic_max_freq = dd->pdata->mic_max_freq;
532 u32 clk_max_rate = (u32)(clk_get_rate(dd->pclk) >> 1);
533 u32 clk_min_rate = (u32)(clk_get_rate(dd->gclk) >> 8);
534
535 if (mic_max_freq > clk_max_rate)
536 mic_max_freq = clk_max_rate;
537
538 if (mic_min_freq < clk_min_rate)
539 mic_min_freq = clk_min_rate;
540
541 *rate_min = DIV_ROUND_CLOSEST(mic_min_freq, 128);
542 *rate_max = mic_max_freq >> 6;
543}
544
545/* PDMIC interrupt handler */
546static irqreturn_t atmel_pdmic_interrupt(int irq, void *dev_id)
547{
548 struct atmel_pdmic *dd = (struct atmel_pdmic *)dev_id;
549 u32 pdmic_isr;
550 irqreturn_t ret = IRQ_NONE;
551
552 regmap_read(dd->regmap, PDMIC_ISR, &pdmic_isr);
553
554 if (pdmic_isr & PDMIC_ISR_OVRE) {
555 regmap_update_bits(dd->regmap, PDMIC_CR, PDMIC_CR_ENPDM_MASK,
556 PDMIC_CR_ENPDM_DIS << PDMIC_CR_ENPDM_SHIFT);
557
558 snd_pcm_stop_xrun(dd->substream);
559
560 ret = IRQ_HANDLED;
561 }
562
563 return ret;
564}
565
566/* regmap configuration */
567#define ATMEL_PDMIC_REG_MAX 0x124
568static const struct regmap_config atmel_pdmic_regmap_config = {
569 .reg_bits = 32,
570 .reg_stride = 4,
571 .val_bits = 32,
572 .max_register = ATMEL_PDMIC_REG_MAX,
573};
574
575static int atmel_pdmic_probe(struct platform_device *pdev)
576{
577 struct device *dev = &pdev->dev;
578 struct atmel_pdmic *dd;
579 struct resource *res;
580 void __iomem *io_base;
581 const struct atmel_pdmic_pdata *pdata;
582 struct snd_soc_card *card;
583 unsigned int rate_min, rate_max;
584 int ret;
585
586 pdata = atmel_pdmic_dt_init(dev);
587 if (IS_ERR(pdata))
588 return PTR_ERR(pdata);
589
590 dd = devm_kzalloc(dev, sizeof(*dd), GFP_KERNEL);
591 if (!dd)
592 return -ENOMEM;
593
594 dd->pdata = pdata;
595
596 dd->irq = platform_get_irq(pdev, 0);
597 if (dd->irq < 0) {
598 ret = dd->irq;
599 dev_err(dev, "failed to could not get irq: %d\n", ret);
600 return ret;
601 }
602
603 dd->pclk = devm_clk_get(dev, "pclk");
604 if (IS_ERR(dd->pclk)) {
605 ret = PTR_ERR(dd->pclk);
606 dev_err(dev, "failed to get peripheral clock: %d\n", ret);
607 return ret;
608 }
609
610 dd->gclk = devm_clk_get(dev, "gclk");
611 if (IS_ERR(dd->gclk)) {
612 ret = PTR_ERR(dd->gclk);
613 dev_err(dev, "failed to get GCK: %d\n", ret);
614 return ret;
615 }
616
617 /* The gclk clock frequency must always be tree times
618 * lower than the pclk clock frequency
619 */
620 ret = clk_set_rate(dd->gclk, clk_get_rate(dd->pclk)/3);
621 if (ret) {
622 dev_err(dev, "failed to set GCK clock rate: %d\n", ret);
623 return ret;
624 }
625
626 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
627 if (!res) {
628 dev_err(dev, "no memory resource\n");
629 return -ENXIO;
630 }
631
632 io_base = devm_ioremap_resource(dev, res);
633 if (IS_ERR(io_base)) {
634 ret = PTR_ERR(io_base);
635 dev_err(dev, "failed to remap register memory: %d\n", ret);
636 return ret;
637 }
638
639 dd->phy_base = res->start;
640
641 dd->regmap = devm_regmap_init_mmio(dev, io_base,
642 &atmel_pdmic_regmap_config);
643 if (IS_ERR(dd->regmap)) {
644 ret = PTR_ERR(dd->regmap);
645 dev_err(dev, "failed to init register map: %d\n", ret);
646 return ret;
647 }
648
649 ret = devm_request_irq(dev, dd->irq, atmel_pdmic_interrupt, 0,
650 "PDMIC", (void *)dd);
651 if (ret < 0) {
652 dev_err(dev, "can't register ISR for IRQ %u (ret=%i)\n",
653 dd->irq, ret);
654 return ret;
655 }
656
657 /* Get the minimal and maximal sample rate that micphone supports */
658 atmel_pdmic_get_sample_rate(dd, &rate_min, &rate_max);
659
660 /* register cpu dai */
661 atmel_pdmic_cpu_dai.capture.rate_min = rate_min;
662 atmel_pdmic_cpu_dai.capture.rate_max = rate_max;
663 ret = devm_snd_soc_register_component(dev,
664 &atmel_pdmic_cpu_dai_component,
665 &atmel_pdmic_cpu_dai, 1);
666 if (ret) {
667 dev_err(dev, "could not register CPU DAI: %d\n", ret);
668 return ret;
669 }
670
671 /* register platform */
672 ret = devm_snd_dmaengine_pcm_register(dev,
673 &atmel_pdmic_dmaengine_pcm_config,
674 0);
675 if (ret) {
676 dev_err(dev, "could not register platform: %d\n", ret);
677 return ret;
678 }
679
680 /* register codec and codec dai */
681 atmel_pdmic_codec_dai.capture.rate_min = rate_min;
682 atmel_pdmic_codec_dai.capture.rate_max = rate_max;
683 ret = snd_soc_register_codec(dev, &soc_codec_dev_pdmic,
684 &atmel_pdmic_codec_dai, 1);
685 if (ret) {
686 dev_err(dev, "could not register codec: %d\n", ret);
687 return ret;
688 }
689
690 /* register sound card */
691 card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
692 if (!card) {
693 ret = -ENOMEM;
694 goto unregister_codec;
695 }
696
697 snd_soc_card_set_drvdata(card, dd);
698 platform_set_drvdata(pdev, card);
699
700 ret = atmel_pdmic_asoc_card_init(dev, card);
701 if (ret) {
702 dev_err(dev, "failed to init sound card: %d\n", ret);
703 goto unregister_codec;
704 }
705
706 ret = devm_snd_soc_register_card(dev, card);
707 if (ret) {
708 dev_err(dev, "failed to register sound card: %d\n", ret);
709 goto unregister_codec;
710 }
711
712 return 0;
713
714unregister_codec:
715 snd_soc_unregister_codec(dev);
716 return ret;
717}
718
719static int atmel_pdmic_remove(struct platform_device *pdev)
720{
721 snd_soc_unregister_codec(&pdev->dev);
722 return 0;
723}
724
725static struct platform_driver atmel_pdmic_driver = {
726 .driver = {
727 .name = "atmel-pdmic",
728 .of_match_table = of_match_ptr(atmel_pdmic_of_match),
729 .pm = &snd_soc_pm_ops,
730 },
731 .probe = atmel_pdmic_probe,
732 .remove = atmel_pdmic_remove,
733};
734module_platform_driver(atmel_pdmic_driver);
735
736MODULE_DESCRIPTION("Atmel PDMIC driver under ALSA SoC architecture");
737MODULE_AUTHOR("Songjun Wu <songjun.wu@atmel.com>");
738MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/atmel/atmel-pdmic.h b/sound/soc/atmel/atmel-pdmic.h
new file mode 100644
index 000000000000..4527ac741919
--- /dev/null
+++ b/sound/soc/atmel/atmel-pdmic.h
@@ -0,0 +1,80 @@
1#ifndef __ATMEL_PDMIC_H_
2#define __ATMEL_PDMIC_H_
3
4#include <linux/bitops.h>
5
6#define PDMIC_CR 0x00000000
7
8#define PDMIC_CR_SWRST 0x1
9#define PDMIC_CR_SWRST_MASK BIT(0)
10#define PDMIC_CR_SWRST_SHIFT (0)
11
12#define PDMIC_CR_ENPDM_DIS 0x0
13#define PDMIC_CR_ENPDM_EN 0x1
14#define PDMIC_CR_ENPDM_MASK BIT(4)
15#define PDMIC_CR_ENPDM_SHIFT (4)
16
17#define PDMIC_MR 0x00000004
18
19#define PDMIC_MR_CLKS_PCK 0x0
20#define PDMIC_MR_CLKS_GCK 0x1
21#define PDMIC_MR_CLKS_MASK BIT(4)
22#define PDMIC_MR_CLKS_SHIFT (4)
23
24#define PDMIC_MR_PRESCAL_MASK GENMASK(14, 8)
25#define PDMIC_MR_PRESCAL_SHIFT (8)
26
27#define PDMIC_CDR 0x00000014
28
29#define PDMIC_IER 0x00000018
30#define PDMIC_IER_OVRE BIT(25)
31
32#define PDMIC_IDR 0x0000001c
33#define PDMIC_IDR_OVRE BIT(25)
34
35#define PDMIC_IMR 0x00000020
36
37#define PDMIC_ISR 0x00000024
38#define PDMIC_ISR_OVRE BIT(25)
39
40#define PDMIC_DSPR0 0x00000058
41
42#define PDMIC_DSPR0_HPFBYP_DIS 0x1
43#define PDMIC_DSPR0_HPFBYP_EN 0x0
44#define PDMIC_DSPR0_HPFBYP_MASK BIT(1)
45#define PDMIC_DSPR0_HPFBYP_SHIFT (1)
46
47#define PDMIC_DSPR0_SINBYP_DIS 0x1
48#define PDMIC_DSPR0_SINBYP_EN 0x0
49#define PDMIC_DSPR0_SINBYP_MASK BIT(2)
50#define PDMIC_DSPR0_SINBYP_SHIFT (2)
51
52#define PDMIC_DSPR0_SIZE_16_BITS 0x0
53#define PDMIC_DSPR0_SIZE_32_BITS 0x1
54#define PDMIC_DSPR0_SIZE_MASK BIT(3)
55#define PDMIC_DSPR0_SIZE_SHIFT (3)
56
57#define PDMIC_DSPR0_OSR_128 0x0
58#define PDMIC_DSPR0_OSR_64 0x1
59#define PDMIC_DSPR0_OSR_MASK GENMASK(6, 4)
60#define PDMIC_DSPR0_OSR_SHIFT (4)
61
62#define PDMIC_DSPR0_SCALE_MASK GENMASK(11, 8)
63#define PDMIC_DSPR0_SCALE_SHIFT (8)
64
65#define PDMIC_DSPR0_SHIFT_MASK GENMASK(15, 12)
66#define PDMIC_DSPR0_SHIFT_SHIFT (12)
67
68#define PDMIC_DSPR1 0x0000005c
69
70#define PDMIC_DSPR1_DGAIN_MASK GENMASK(14, 0)
71#define PDMIC_DSPR1_DGAIN_SHIFT (0)
72
73#define PDMIC_DSPR1_OFFSET_MASK GENMASK(31, 16)
74#define PDMIC_DSPR1_OFFSET_SHIFT (16)
75
76#define PDMIC_WPMR 0x000000e4
77
78#define PDMIC_WPSR 0x000000e8
79
80#endif
diff --git a/sound/soc/atmel/atmel_wm8904.c b/sound/soc/atmel/atmel_wm8904.c
index 1933bcd46cca..fdd28ed3e0b9 100644
--- a/sound/soc/atmel/atmel_wm8904.c
+++ b/sound/soc/atmel/atmel_wm8904.c
@@ -183,6 +183,7 @@ static struct platform_driver atmel_asoc_wm8904_driver = {
183 .driver = { 183 .driver = {
184 .name = "atmel-wm8904-audio", 184 .name = "atmel-wm8904-audio",
185 .of_match_table = of_match_ptr(atmel_asoc_wm8904_dt_ids), 185 .of_match_table = of_match_ptr(atmel_asoc_wm8904_dt_ids),
186 .pm = &snd_soc_pm_ops,
186 }, 187 },
187 .probe = atmel_asoc_wm8904_probe, 188 .probe = atmel_asoc_wm8904_probe,
188 .remove = atmel_asoc_wm8904_remove, 189 .remove = atmel_asoc_wm8904_remove,
diff --git a/sound/soc/bcm/bcm2835-i2s.c b/sound/soc/bcm/bcm2835-i2s.c
index 8c435beb263d..3303d5f58082 100644
--- a/sound/soc/bcm/bcm2835-i2s.c
+++ b/sound/soc/bcm/bcm2835-i2s.c
@@ -31,20 +31,20 @@
31 * General Public License for more details. 31 * General Public License for more details.
32 */ 32 */
33 33
34#include <linux/clk.h>
35#include <linux/delay.h>
36#include <linux/device.h>
34#include <linux/init.h> 37#include <linux/init.h>
38#include <linux/io.h>
35#include <linux/module.h> 39#include <linux/module.h>
36#include <linux/device.h>
37#include <linux/slab.h> 40#include <linux/slab.h>
38#include <linux/delay.h>
39#include <linux/io.h>
40#include <linux/clk.h>
41 41
42#include <sound/core.h> 42#include <sound/core.h>
43#include <sound/dmaengine_pcm.h>
44#include <sound/initval.h>
43#include <sound/pcm.h> 45#include <sound/pcm.h>
44#include <sound/pcm_params.h> 46#include <sound/pcm_params.h>
45#include <sound/initval.h>
46#include <sound/soc.h> 47#include <sound/soc.h>
47#include <sound/dmaengine_pcm.h>
48 48
49/* Clock registers */ 49/* Clock registers */
50#define BCM2835_CLK_PCMCTL_REG 0x00 50#define BCM2835_CLK_PCMCTL_REG 0x00
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index cfdafc4c11ea..50693c867e71 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -55,9 +55,11 @@ config SND_SOC_ALL_CODECS
55 select SND_SOC_CS4271_SPI if SPI_MASTER 55 select SND_SOC_CS4271_SPI if SPI_MASTER
56 select SND_SOC_CS42XX8_I2C if I2C 56 select SND_SOC_CS42XX8_I2C if I2C
57 select SND_SOC_CS4349 if I2C 57 select SND_SOC_CS4349 if I2C
58 select SND_SOC_CS47L24 if MFD_CS47L24
58 select SND_SOC_CX20442 if TTY 59 select SND_SOC_CX20442 if TTY
59 select SND_SOC_DA7210 if SND_SOC_I2C_AND_SPI 60 select SND_SOC_DA7210 if SND_SOC_I2C_AND_SPI
60 select SND_SOC_DA7213 if I2C 61 select SND_SOC_DA7213 if I2C
62 select SND_SOC_DA7218 if I2C
61 select SND_SOC_DA7219 if I2C 63 select SND_SOC_DA7219 if I2C
62 select SND_SOC_DA732X if I2C 64 select SND_SOC_DA732X if I2C
63 select SND_SOC_DA9055 if I2C 65 select SND_SOC_DA9055 if I2C
@@ -66,7 +68,9 @@ config SND_SOC_ALL_CODECS
66 select SND_SOC_ES8328_SPI if SPI_MASTER 68 select SND_SOC_ES8328_SPI if SPI_MASTER
67 select SND_SOC_ES8328_I2C if I2C 69 select SND_SOC_ES8328_I2C if I2C
68 select SND_SOC_GTM601 70 select SND_SOC_GTM601
71 select SND_SOC_HDAC_HDMI
69 select SND_SOC_ICS43432 72 select SND_SOC_ICS43432
73 select SND_SOC_INNO_RK3036
70 select SND_SOC_ISABELLE if I2C 74 select SND_SOC_ISABELLE if I2C
71 select SND_SOC_JZ4740_CODEC 75 select SND_SOC_JZ4740_CODEC
72 select SND_SOC_LM4857 if I2C 76 select SND_SOC_LM4857 if I2C
@@ -83,16 +87,20 @@ config SND_SOC_ALL_CODECS
83 select SND_SOC_ML26124 if I2C 87 select SND_SOC_ML26124 if I2C
84 select SND_SOC_NAU8825 if I2C 88 select SND_SOC_NAU8825 if I2C
85 select SND_SOC_PCM1681 if I2C 89 select SND_SOC_PCM1681 if I2C
86 select SND_SOC_PCM1792A if SPI_MASTER 90 select SND_SOC_PCM179X if SPI_MASTER
87 select SND_SOC_PCM3008 91 select SND_SOC_PCM3008
92 select SND_SOC_PCM3168A_I2C if I2C
93 select SND_SOC_PCM3168A_SPI if SPI_MASTER
88 select SND_SOC_PCM512x_I2C if I2C 94 select SND_SOC_PCM512x_I2C if I2C
89 select SND_SOC_PCM512x_SPI if SPI_MASTER 95 select SND_SOC_PCM512x_SPI if SPI_MASTER
90 select SND_SOC_RT286 if I2C 96 select SND_SOC_RT286 if I2C
91 select SND_SOC_RT298 if I2C 97 select SND_SOC_RT298 if I2C
98 select SND_SOC_RT5616 if I2C
92 select SND_SOC_RT5631 if I2C 99 select SND_SOC_RT5631 if I2C
93 select SND_SOC_RT5640 if I2C 100 select SND_SOC_RT5640 if I2C
94 select SND_SOC_RT5645 if I2C 101 select SND_SOC_RT5645 if I2C
95 select SND_SOC_RT5651 if I2C 102 select SND_SOC_RT5651 if I2C
103 select SND_SOC_RT5659 if I2C
96 select SND_SOC_RT5670 if I2C 104 select SND_SOC_RT5670 if I2C
97 select SND_SOC_RT5677 if I2C && SPI_MASTER 105 select SND_SOC_RT5677 if I2C && SPI_MASTER
98 select SND_SOC_SGTL5000 if I2C 106 select SND_SOC_SGTL5000 if I2C
@@ -195,10 +203,12 @@ config SND_SOC_88PM860X
195 203
196config SND_SOC_ARIZONA 204config SND_SOC_ARIZONA
197 tristate 205 tristate
206 default y if SND_SOC_CS47L24=y
198 default y if SND_SOC_WM5102=y 207 default y if SND_SOC_WM5102=y
199 default y if SND_SOC_WM5110=y 208 default y if SND_SOC_WM5110=y
200 default y if SND_SOC_WM8997=y 209 default y if SND_SOC_WM8997=y
201 default y if SND_SOC_WM8998=y 210 default y if SND_SOC_WM8998=y
211 default m if SND_SOC_CS47L24=m
202 default m if SND_SOC_WM5102=m 212 default m if SND_SOC_WM5102=m
203 default m if SND_SOC_WM5110=m 213 default m if SND_SOC_WM5110=m
204 default m if SND_SOC_WM8997=m 214 default m if SND_SOC_WM8997=m
@@ -211,9 +221,12 @@ config SND_SOC_WM_HUBS
211 221
212config SND_SOC_WM_ADSP 222config SND_SOC_WM_ADSP
213 tristate 223 tristate
224 select SND_SOC_COMPRESS
225 default y if SND_SOC_CS47L24=y
214 default y if SND_SOC_WM5102=y 226 default y if SND_SOC_WM5102=y
215 default y if SND_SOC_WM5110=y 227 default y if SND_SOC_WM5110=y
216 default y if SND_SOC_WM2200=y 228 default y if SND_SOC_WM2200=y
229 default m if SND_SOC_CS47L24=m
217 default m if SND_SOC_WM5102=m 230 default m if SND_SOC_WM5102=m
218 default m if SND_SOC_WM5110=m 231 default m if SND_SOC_WM5110=m
219 default m if SND_SOC_WM2200=m 232 default m if SND_SOC_WM2200=m
@@ -422,6 +435,9 @@ config SND_SOC_CS4349
422 tristate "Cirrus Logic CS4349 CODEC" 435 tristate "Cirrus Logic CS4349 CODEC"
423 depends on I2C 436 depends on I2C
424 437
438config SND_SOC_CS47L24
439 tristate
440
425config SND_SOC_CX20442 441config SND_SOC_CX20442
426 tristate 442 tristate
427 depends on TTY 443 depends on TTY
@@ -439,6 +455,9 @@ config SND_SOC_DA7210
439config SND_SOC_DA7213 455config SND_SOC_DA7213
440 tristate 456 tristate
441 457
458config SND_SOC_DA7218
459 tristate
460
442config SND_SOC_DA7219 461config SND_SOC_DA7219
443 tristate 462 tristate
444 463
@@ -468,9 +487,17 @@ config SND_SOC_ES8328_SPI
468config SND_SOC_GTM601 487config SND_SOC_GTM601
469 tristate 'GTM601 UMTS modem audio codec' 488 tristate 'GTM601 UMTS modem audio codec'
470 489
490config SND_SOC_HDAC_HDMI
491 tristate
492 select SND_HDA_EXT_CORE
493 select HDMI
494
471config SND_SOC_ICS43432 495config SND_SOC_ICS43432
472 tristate 496 tristate
473 497
498config SND_SOC_INNO_RK3036
499 tristate "Inno codec driver for RK3036 SoC"
500
474config SND_SOC_ISABELLE 501config SND_SOC_ISABELLE
475 tristate 502 tristate
476 503
@@ -499,13 +526,28 @@ config SND_SOC_PCM1681
499 tristate "Texas Instruments PCM1681 CODEC" 526 tristate "Texas Instruments PCM1681 CODEC"
500 depends on I2C 527 depends on I2C
501 528
502config SND_SOC_PCM1792A 529config SND_SOC_PCM179X
503 tristate "Texas Instruments PCM1792A CODEC" 530 tristate "Texas Instruments PCM179X CODEC"
504 depends on SPI_MASTER 531 depends on SPI_MASTER
505 532
506config SND_SOC_PCM3008 533config SND_SOC_PCM3008
507 tristate 534 tristate
508 535
536config SND_SOC_PCM3168A
537 tristate
538
539config SND_SOC_PCM3168A_I2C
540 tristate "Texas Instruments PCM3168A CODEC - I2C"
541 depends on I2C
542 select SND_SOC_PCM3168A
543 select REGMAP_I2C
544
545config SND_SOC_PCM3168A_SPI
546 tristate "Texas Instruments PCM3168A CODEC - SPI"
547 depends on SPI_MASTER
548 select SND_SOC_PCM3168A
549 select REGMAP_SPI
550
509config SND_SOC_PCM512x 551config SND_SOC_PCM512x
510 tristate 552 tristate
511 553
@@ -523,14 +565,18 @@ config SND_SOC_PCM512x_SPI
523 565
524config SND_SOC_RL6231 566config SND_SOC_RL6231
525 tristate 567 tristate
568 default y if SND_SOC_RT5616=y
526 default y if SND_SOC_RT5640=y 569 default y if SND_SOC_RT5640=y
527 default y if SND_SOC_RT5645=y 570 default y if SND_SOC_RT5645=y
528 default y if SND_SOC_RT5651=y 571 default y if SND_SOC_RT5651=y
572 default y if SND_SOC_RT5659=y
529 default y if SND_SOC_RT5670=y 573 default y if SND_SOC_RT5670=y
530 default y if SND_SOC_RT5677=y 574 default y if SND_SOC_RT5677=y
575 default m if SND_SOC_RT5616=m
531 default m if SND_SOC_RT5640=m 576 default m if SND_SOC_RT5640=m
532 default m if SND_SOC_RT5645=m 577 default m if SND_SOC_RT5645=m
533 default m if SND_SOC_RT5651=m 578 default m if SND_SOC_RT5651=m
579 default m if SND_SOC_RT5659=m
534 default m if SND_SOC_RT5670=m 580 default m if SND_SOC_RT5670=m
535 default m if SND_SOC_RT5677=m 581 default m if SND_SOC_RT5677=m
536 582
@@ -549,6 +595,9 @@ config SND_SOC_RT298
549 tristate 595 tristate
550 depends on I2C 596 depends on I2C
551 597
598config SND_SOC_RT5616
599 tristate
600
552config SND_SOC_RT5631 601config SND_SOC_RT5631
553 tristate "Realtek ALC5631/RT5631 CODEC" 602 tristate "Realtek ALC5631/RT5631 CODEC"
554 depends on I2C 603 depends on I2C
@@ -562,6 +611,9 @@ config SND_SOC_RT5645
562config SND_SOC_RT5651 611config SND_SOC_RT5651
563 tristate 612 tristate
564 613
614config SND_SOC_RT5659
615 tristate
616
565config SND_SOC_RT5670 617config SND_SOC_RT5670
566 tristate 618 tristate
567 619
@@ -838,7 +890,8 @@ config SND_SOC_WM8971
838 tristate 890 tristate
839 891
840config SND_SOC_WM8974 892config SND_SOC_WM8974
841 tristate 893 tristate "Wolfson Microelectronics WM8974 codec"
894 depends on I2C
842 895
843config SND_SOC_WM8978 896config SND_SOC_WM8978
844 tristate "Wolfson Microelectronics WM8978 codec" 897 tristate "Wolfson Microelectronics WM8978 codec"
@@ -891,6 +944,7 @@ config SND_SOC_WM9712
891 944
892config SND_SOC_WM9713 945config SND_SOC_WM9713
893 tristate 946 tristate
947 select REGMAP_AC97
894 948
895# Amp 949# Amp
896config SND_SOC_LM4857 950config SND_SOC_LM4857
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index f632fc42f59f..d44f7d347183 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -47,9 +47,11 @@ snd-soc-cs4271-spi-objs := cs4271-spi.o
47snd-soc-cs42xx8-objs := cs42xx8.o 47snd-soc-cs42xx8-objs := cs42xx8.o
48snd-soc-cs42xx8-i2c-objs := cs42xx8-i2c.o 48snd-soc-cs42xx8-i2c-objs := cs42xx8-i2c.o
49snd-soc-cs4349-objs := cs4349.o 49snd-soc-cs4349-objs := cs4349.o
50snd-soc-cs47l24-objs := cs47l24.o
50snd-soc-cx20442-objs := cx20442.o 51snd-soc-cx20442-objs := cx20442.o
51snd-soc-da7210-objs := da7210.o 52snd-soc-da7210-objs := da7210.o
52snd-soc-da7213-objs := da7213.o 53snd-soc-da7213-objs := da7213.o
54snd-soc-da7218-objs := da7218.o
53snd-soc-da7219-objs := da7219.o da7219-aad.o 55snd-soc-da7219-objs := da7219.o da7219-aad.o
54snd-soc-da732x-objs := da732x.o 56snd-soc-da732x-objs := da732x.o
55snd-soc-da9055-objs := da9055.o 57snd-soc-da9055-objs := da9055.o
@@ -59,7 +61,9 @@ snd-soc-es8328-objs := es8328.o
59snd-soc-es8328-i2c-objs := es8328-i2c.o 61snd-soc-es8328-i2c-objs := es8328-i2c.o
60snd-soc-es8328-spi-objs := es8328-spi.o 62snd-soc-es8328-spi-objs := es8328-spi.o
61snd-soc-gtm601-objs := gtm601.o 63snd-soc-gtm601-objs := gtm601.o
64snd-soc-hdac-hdmi-objs := hdac_hdmi.o
62snd-soc-ics43432-objs := ics43432.o 65snd-soc-ics43432-objs := ics43432.o
66snd-soc-inno-rk3036-objs := inno_rk3036.o
63snd-soc-isabelle-objs := isabelle.o 67snd-soc-isabelle-objs := isabelle.o
64snd-soc-jz4740-codec-objs := jz4740.o 68snd-soc-jz4740-codec-objs := jz4740.o
65snd-soc-l3-objs := l3.o 69snd-soc-l3-objs := l3.o
@@ -76,8 +80,11 @@ snd-soc-mc13783-objs := mc13783.o
76snd-soc-ml26124-objs := ml26124.o 80snd-soc-ml26124-objs := ml26124.o
77snd-soc-nau8825-objs := nau8825.o 81snd-soc-nau8825-objs := nau8825.o
78snd-soc-pcm1681-objs := pcm1681.o 82snd-soc-pcm1681-objs := pcm1681.o
79snd-soc-pcm1792a-codec-objs := pcm1792a.o 83snd-soc-pcm179x-codec-objs := pcm179x.o
80snd-soc-pcm3008-objs := pcm3008.o 84snd-soc-pcm3008-objs := pcm3008.o
85snd-soc-pcm3168a-objs := pcm3168a.o
86snd-soc-pcm3168a-i2c-objs := pcm3168a-i2c.o
87snd-soc-pcm3168a-spi-objs := pcm3168a-spi.o
81snd-soc-pcm512x-objs := pcm512x.o 88snd-soc-pcm512x-objs := pcm512x.o
82snd-soc-pcm512x-i2c-objs := pcm512x-i2c.o 89snd-soc-pcm512x-i2c-objs := pcm512x-i2c.o
83snd-soc-pcm512x-spi-objs := pcm512x-spi.o 90snd-soc-pcm512x-spi-objs := pcm512x-spi.o
@@ -85,10 +92,12 @@ snd-soc-rl6231-objs := rl6231.o
85snd-soc-rl6347a-objs := rl6347a.o 92snd-soc-rl6347a-objs := rl6347a.o
86snd-soc-rt286-objs := rt286.o 93snd-soc-rt286-objs := rt286.o
87snd-soc-rt298-objs := rt298.o 94snd-soc-rt298-objs := rt298.o
95snd-soc-rt5616-objs := rt5616.o
88snd-soc-rt5631-objs := rt5631.o 96snd-soc-rt5631-objs := rt5631.o
89snd-soc-rt5640-objs := rt5640.o 97snd-soc-rt5640-objs := rt5640.o
90snd-soc-rt5645-objs := rt5645.o 98snd-soc-rt5645-objs := rt5645.o
91snd-soc-rt5651-objs := rt5651.o 99snd-soc-rt5651-objs := rt5651.o
100snd-soc-rt5659-objs := rt5659.o
92snd-soc-rt5670-objs := rt5670.o 101snd-soc-rt5670-objs := rt5670.o
93snd-soc-rt5677-objs := rt5677.o 102snd-soc-rt5677-objs := rt5677.o
94snd-soc-rt5677-spi-objs := rt5677-spi.o 103snd-soc-rt5677-spi-objs := rt5677-spi.o
@@ -242,9 +251,11 @@ obj-$(CONFIG_SND_SOC_CS4271_SPI) += snd-soc-cs4271-spi.o
242obj-$(CONFIG_SND_SOC_CS42XX8) += snd-soc-cs42xx8.o 251obj-$(CONFIG_SND_SOC_CS42XX8) += snd-soc-cs42xx8.o
243obj-$(CONFIG_SND_SOC_CS42XX8_I2C) += snd-soc-cs42xx8-i2c.o 252obj-$(CONFIG_SND_SOC_CS42XX8_I2C) += snd-soc-cs42xx8-i2c.o
244obj-$(CONFIG_SND_SOC_CS4349) += snd-soc-cs4349.o 253obj-$(CONFIG_SND_SOC_CS4349) += snd-soc-cs4349.o
254obj-$(CONFIG_SND_SOC_CS47L24) += snd-soc-cs47l24.o
245obj-$(CONFIG_SND_SOC_CX20442) += snd-soc-cx20442.o 255obj-$(CONFIG_SND_SOC_CX20442) += snd-soc-cx20442.o
246obj-$(CONFIG_SND_SOC_DA7210) += snd-soc-da7210.o 256obj-$(CONFIG_SND_SOC_DA7210) += snd-soc-da7210.o
247obj-$(CONFIG_SND_SOC_DA7213) += snd-soc-da7213.o 257obj-$(CONFIG_SND_SOC_DA7213) += snd-soc-da7213.o
258obj-$(CONFIG_SND_SOC_DA7218) += snd-soc-da7218.o
248obj-$(CONFIG_SND_SOC_DA7219) += snd-soc-da7219.o 259obj-$(CONFIG_SND_SOC_DA7219) += snd-soc-da7219.o
249obj-$(CONFIG_SND_SOC_DA732X) += snd-soc-da732x.o 260obj-$(CONFIG_SND_SOC_DA732X) += snd-soc-da732x.o
250obj-$(CONFIG_SND_SOC_DA9055) += snd-soc-da9055.o 261obj-$(CONFIG_SND_SOC_DA9055) += snd-soc-da9055.o
@@ -254,7 +265,9 @@ obj-$(CONFIG_SND_SOC_ES8328) += snd-soc-es8328.o
254obj-$(CONFIG_SND_SOC_ES8328_I2C)+= snd-soc-es8328-i2c.o 265obj-$(CONFIG_SND_SOC_ES8328_I2C)+= snd-soc-es8328-i2c.o
255obj-$(CONFIG_SND_SOC_ES8328_SPI)+= snd-soc-es8328-spi.o 266obj-$(CONFIG_SND_SOC_ES8328_SPI)+= snd-soc-es8328-spi.o
256obj-$(CONFIG_SND_SOC_GTM601) += snd-soc-gtm601.o 267obj-$(CONFIG_SND_SOC_GTM601) += snd-soc-gtm601.o
268obj-$(CONFIG_SND_SOC_HDAC_HDMI) += snd-soc-hdac-hdmi.o
257obj-$(CONFIG_SND_SOC_ICS43432) += snd-soc-ics43432.o 269obj-$(CONFIG_SND_SOC_ICS43432) += snd-soc-ics43432.o
270obj-$(CONFIG_SND_SOC_INNO_RK3036) += snd-soc-inno-rk3036.o
258obj-$(CONFIG_SND_SOC_ISABELLE) += snd-soc-isabelle.o 271obj-$(CONFIG_SND_SOC_ISABELLE) += snd-soc-isabelle.o
259obj-$(CONFIG_SND_SOC_JZ4740_CODEC) += snd-soc-jz4740-codec.o 272obj-$(CONFIG_SND_SOC_JZ4740_CODEC) += snd-soc-jz4740-codec.o
260obj-$(CONFIG_SND_SOC_L3) += snd-soc-l3.o 273obj-$(CONFIG_SND_SOC_L3) += snd-soc-l3.o
@@ -271,8 +284,11 @@ obj-$(CONFIG_SND_SOC_MC13783) += snd-soc-mc13783.o
271obj-$(CONFIG_SND_SOC_ML26124) += snd-soc-ml26124.o 284obj-$(CONFIG_SND_SOC_ML26124) += snd-soc-ml26124.o
272obj-$(CONFIG_SND_SOC_NAU8825) += snd-soc-nau8825.o 285obj-$(CONFIG_SND_SOC_NAU8825) += snd-soc-nau8825.o
273obj-$(CONFIG_SND_SOC_PCM1681) += snd-soc-pcm1681.o 286obj-$(CONFIG_SND_SOC_PCM1681) += snd-soc-pcm1681.o
274obj-$(CONFIG_SND_SOC_PCM1792A) += snd-soc-pcm1792a-codec.o 287obj-$(CONFIG_SND_SOC_PCM179X) += snd-soc-pcm179x-codec.o
275obj-$(CONFIG_SND_SOC_PCM3008) += snd-soc-pcm3008.o 288obj-$(CONFIG_SND_SOC_PCM3008) += snd-soc-pcm3008.o
289obj-$(CONFIG_SND_SOC_PCM3168A) += snd-soc-pcm3168a.o
290obj-$(CONFIG_SND_SOC_PCM3168A_I2C) += snd-soc-pcm3168a-i2c.o
291obj-$(CONFIG_SND_SOC_PCM3168A_SPI) += snd-soc-pcm3168a-spi.o
276obj-$(CONFIG_SND_SOC_PCM512x) += snd-soc-pcm512x.o 292obj-$(CONFIG_SND_SOC_PCM512x) += snd-soc-pcm512x.o
277obj-$(CONFIG_SND_SOC_PCM512x_I2C) += snd-soc-pcm512x-i2c.o 293obj-$(CONFIG_SND_SOC_PCM512x_I2C) += snd-soc-pcm512x-i2c.o
278obj-$(CONFIG_SND_SOC_PCM512x_SPI) += snd-soc-pcm512x-spi.o 294obj-$(CONFIG_SND_SOC_PCM512x_SPI) += snd-soc-pcm512x-spi.o
@@ -280,10 +296,12 @@ obj-$(CONFIG_SND_SOC_RL6231) += snd-soc-rl6231.o
280obj-$(CONFIG_SND_SOC_RL6347A) += snd-soc-rl6347a.o 296obj-$(CONFIG_SND_SOC_RL6347A) += snd-soc-rl6347a.o
281obj-$(CONFIG_SND_SOC_RT286) += snd-soc-rt286.o 297obj-$(CONFIG_SND_SOC_RT286) += snd-soc-rt286.o
282obj-$(CONFIG_SND_SOC_RT298) += snd-soc-rt298.o 298obj-$(CONFIG_SND_SOC_RT298) += snd-soc-rt298.o
299obj-$(CONFIG_SND_SOC_RT5616) += snd-soc-rt5616.o
283obj-$(CONFIG_SND_SOC_RT5631) += snd-soc-rt5631.o 300obj-$(CONFIG_SND_SOC_RT5631) += snd-soc-rt5631.o
284obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o 301obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o
285obj-$(CONFIG_SND_SOC_RT5645) += snd-soc-rt5645.o 302obj-$(CONFIG_SND_SOC_RT5645) += snd-soc-rt5645.o
286obj-$(CONFIG_SND_SOC_RT5651) += snd-soc-rt5651.o 303obj-$(CONFIG_SND_SOC_RT5651) += snd-soc-rt5651.o
304obj-$(CONFIG_SND_SOC_RT5659) += snd-soc-rt5659.o
287obj-$(CONFIG_SND_SOC_RT5670) += snd-soc-rt5670.o 305obj-$(CONFIG_SND_SOC_RT5670) += snd-soc-rt5670.o
288obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o 306obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o
289obj-$(CONFIG_SND_SOC_RT5677_SPI) += snd-soc-rt5677-spi.o 307obj-$(CONFIG_SND_SOC_RT5677_SPI) += snd-soc-rt5677-spi.o
diff --git a/sound/soc/codecs/ak4613.c b/sound/soc/codecs/ak4613.c
index 07a266460ec3..647f69de6baa 100644
--- a/sound/soc/codecs/ak4613.c
+++ b/sound/soc/codecs/ak4613.c
@@ -70,18 +70,11 @@
70#define FMT_MASK (0xf8) 70#define FMT_MASK (0xf8)
71 71
72/* CTRL2 */ 72/* CTRL2 */
73#define DFS_MASK (3 << 2)
73#define DFS_NORMAL_SPEED (0 << 2) 74#define DFS_NORMAL_SPEED (0 << 2)
74#define DFS_DOUBLE_SPEED (1 << 2) 75#define DFS_DOUBLE_SPEED (1 << 2)
75#define DFS_QUAD_SPEED (2 << 2) 76#define DFS_QUAD_SPEED (2 << 2)
76 77
77struct ak4613_priv {
78 struct mutex lock;
79
80 unsigned int fmt;
81 u8 fmt_ctrl;
82 int cnt;
83};
84
85struct ak4613_formats { 78struct ak4613_formats {
86 unsigned int width; 79 unsigned int width;
87 unsigned int fmt; 80 unsigned int fmt;
@@ -92,6 +85,16 @@ struct ak4613_interface {
92 struct ak4613_formats playback; 85 struct ak4613_formats playback;
93}; 86};
94 87
88struct ak4613_priv {
89 struct mutex lock;
90 const struct ak4613_interface *iface;
91
92 unsigned int fmt;
93 u8 oc;
94 u8 ic;
95 int cnt;
96};
97
95/* 98/*
96 * Playback Volume 99 * Playback Volume
97 * 100 *
@@ -126,7 +129,7 @@ static const struct reg_default ak4613_reg[] = {
126 { 0x14, 0x00 }, { 0x15, 0x00 }, { 0x16, 0x00 }, 129 { 0x14, 0x00 }, { 0x15, 0x00 }, { 0x16, 0x00 },
127}; 130};
128 131
129#define AUDIO_IFACE_IDX_TO_VAL(i) (i << 3) 132#define AUDIO_IFACE_TO_VAL(fmts) ((fmts - ak4613_iface) << 3)
130#define AUDIO_IFACE(b, fmt) { b, SND_SOC_DAIFMT_##fmt } 133#define AUDIO_IFACE(b, fmt) { b, SND_SOC_DAIFMT_##fmt }
131static const struct ak4613_interface ak4613_iface[] = { 134static const struct ak4613_interface ak4613_iface[] = {
132 /* capture */ /* playback */ 135 /* capture */ /* playback */
@@ -240,7 +243,7 @@ static void ak4613_dai_shutdown(struct snd_pcm_substream *substream,
240 priv->cnt = 0; 243 priv->cnt = 0;
241 } 244 }
242 if (!priv->cnt) 245 if (!priv->cnt)
243 priv->fmt_ctrl = NO_FMT; 246 priv->iface = NULL;
244 mutex_unlock(&priv->lock); 247 mutex_unlock(&priv->lock);
245} 248}
246 249
@@ -265,13 +268,35 @@ static int ak4613_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
265 return 0; 268 return 0;
266} 269}
267 270
271static bool ak4613_dai_fmt_matching(const struct ak4613_interface *iface,
272 int is_play,
273 unsigned int fmt, unsigned int width)
274{
275 const struct ak4613_formats *fmts;
276
277 fmts = (is_play) ? &iface->playback : &iface->capture;
278
279 if (fmts->fmt != fmt)
280 return false;
281
282 if (fmt == SND_SOC_DAIFMT_RIGHT_J) {
283 if (fmts->width != width)
284 return false;
285 } else {
286 if (fmts->width < width)
287 return false;
288 }
289
290 return true;
291}
292
268static int ak4613_dai_hw_params(struct snd_pcm_substream *substream, 293static int ak4613_dai_hw_params(struct snd_pcm_substream *substream,
269 struct snd_pcm_hw_params *params, 294 struct snd_pcm_hw_params *params,
270 struct snd_soc_dai *dai) 295 struct snd_soc_dai *dai)
271{ 296{
272 struct snd_soc_codec *codec = dai->codec; 297 struct snd_soc_codec *codec = dai->codec;
273 struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec); 298 struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec);
274 const struct ak4613_formats *fmts; 299 const struct ak4613_interface *iface;
275 struct device *dev = codec->dev; 300 struct device *dev = codec->dev;
276 unsigned int width = params_width(params); 301 unsigned int width = params_width(params);
277 unsigned int fmt = priv->fmt; 302 unsigned int fmt = priv->fmt;
@@ -305,33 +330,27 @@ static int ak4613_dai_hw_params(struct snd_pcm_substream *substream,
305 * It doesn't support TDM at this point 330 * It doesn't support TDM at this point
306 */ 331 */
307 fmt_ctrl = NO_FMT; 332 fmt_ctrl = NO_FMT;
308 for (i = 0; i < ARRAY_SIZE(ak4613_iface); i++) { 333 ret = -EINVAL;
309 fmts = (is_play) ? &ak4613_iface[i].playback : 334 iface = NULL;
310 &ak4613_iface[i].capture;
311
312 if (fmts->fmt != fmt)
313 continue;
314 335
315 if (fmt == SND_SOC_DAIFMT_RIGHT_J) { 336 mutex_lock(&priv->lock);
316 if (fmts->width != width) 337 if (priv->iface) {
317 continue; 338 if (ak4613_dai_fmt_matching(priv->iface, is_play, fmt, width))
318 } else { 339 iface = priv->iface;
319 if (fmts->width < width) 340 } else {
341 for (i = ARRAY_SIZE(ak4613_iface); i >= 0; i--) {
342 if (!ak4613_dai_fmt_matching(ak4613_iface + i,
343 is_play,
344 fmt, width))
320 continue; 345 continue;
346 iface = ak4613_iface + i;
347 break;
321 } 348 }
322
323 fmt_ctrl = AUDIO_IFACE_IDX_TO_VAL(i);
324 break;
325 } 349 }
326 350
327 ret = -EINVAL; 351 if ((priv->iface == NULL) ||
328 if (fmt_ctrl == NO_FMT) 352 (priv->iface == iface)) {
329 goto hw_params_end; 353 priv->iface = iface;
330
331 mutex_lock(&priv->lock);
332 if ((priv->fmt_ctrl == NO_FMT) ||
333 (priv->fmt_ctrl == fmt_ctrl)) {
334 priv->fmt_ctrl = fmt_ctrl;
335 priv->cnt++; 354 priv->cnt++;
336 ret = 0; 355 ret = 0;
337 } 356 }
@@ -340,8 +359,13 @@ static int ak4613_dai_hw_params(struct snd_pcm_substream *substream,
340 if (ret < 0) 359 if (ret < 0)
341 goto hw_params_end; 360 goto hw_params_end;
342 361
362 fmt_ctrl = AUDIO_IFACE_TO_VAL(iface);
363
343 snd_soc_update_bits(codec, CTRL1, FMT_MASK, fmt_ctrl); 364 snd_soc_update_bits(codec, CTRL1, FMT_MASK, fmt_ctrl);
344 snd_soc_write(codec, CTRL2, ctrl2); 365 snd_soc_update_bits(codec, CTRL2, DFS_MASK, ctrl2);
366
367 snd_soc_write(codec, ICTRL, priv->ic);
368 snd_soc_write(codec, OCTRL, priv->oc);
345 369
346hw_params_end: 370hw_params_end:
347 if (ret < 0) 371 if (ret < 0)
@@ -431,6 +455,28 @@ static struct snd_soc_codec_driver soc_codec_dev_ak4613 = {
431 .num_dapm_routes = ARRAY_SIZE(ak4613_intercon), 455 .num_dapm_routes = ARRAY_SIZE(ak4613_intercon),
432}; 456};
433 457
458static void ak4613_parse_of(struct ak4613_priv *priv,
459 struct device *dev)
460{
461 struct device_node *np = dev->of_node;
462 char prop[32];
463 int i;
464
465 /* Input 1 - 2 */
466 for (i = 0; i < 2; i++) {
467 snprintf(prop, sizeof(prop), "asahi-kasei,in%d-single-end", i + 1);
468 if (!of_get_property(np, prop, NULL))
469 priv->ic |= 1 << i;
470 }
471
472 /* Output 1 - 6 */
473 for (i = 0; i < 6; i++) {
474 snprintf(prop, sizeof(prop), "asahi-kasei,out%d-single-end", i + 1);
475 if (!of_get_property(np, prop, NULL))
476 priv->oc |= 1 << i;
477 }
478}
479
434static int ak4613_i2c_probe(struct i2c_client *i2c, 480static int ak4613_i2c_probe(struct i2c_client *i2c,
435 const struct i2c_device_id *id) 481 const struct i2c_device_id *id)
436{ 482{
@@ -458,7 +504,9 @@ static int ak4613_i2c_probe(struct i2c_client *i2c,
458 if (!priv) 504 if (!priv)
459 return -ENOMEM; 505 return -ENOMEM;
460 506
461 priv->fmt_ctrl = NO_FMT; 507 ak4613_parse_of(priv, dev);
508
509 priv->iface = NULL;
462 priv->cnt = 0; 510 priv->cnt = 0;
463 511
464 mutex_init(&priv->lock); 512 mutex_init(&priv->lock);
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c
index 93b400800905..33143fe1de0b 100644
--- a/sound/soc/codecs/arizona.c
+++ b/sound/soc/codecs/arizona.c
@@ -310,7 +310,7 @@ int arizona_init_gpio(struct snd_soc_codec *codec)
310} 310}
311EXPORT_SYMBOL_GPL(arizona_init_gpio); 311EXPORT_SYMBOL_GPL(arizona_init_gpio);
312 312
313const char *arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS] = { 313const char * const arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS] = {
314 "None", 314 "None",
315 "Tone Generator 1", 315 "Tone Generator 1",
316 "Tone Generator 2", 316 "Tone Generator 2",
@@ -418,7 +418,7 @@ const char *arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS] = {
418}; 418};
419EXPORT_SYMBOL_GPL(arizona_mixer_texts); 419EXPORT_SYMBOL_GPL(arizona_mixer_texts);
420 420
421int arizona_mixer_values[ARIZONA_NUM_MIXER_INPUTS] = { 421unsigned int arizona_mixer_values[ARIZONA_NUM_MIXER_INPUTS] = {
422 0x00, /* None */ 422 0x00, /* None */
423 0x04, /* Tone */ 423 0x04, /* Tone */
424 0x05, 424 0x05,
@@ -555,12 +555,12 @@ const char *arizona_sample_rate_val_to_name(unsigned int rate_val)
555} 555}
556EXPORT_SYMBOL_GPL(arizona_sample_rate_val_to_name); 556EXPORT_SYMBOL_GPL(arizona_sample_rate_val_to_name);
557 557
558const char *arizona_rate_text[ARIZONA_RATE_ENUM_SIZE] = { 558const char * const arizona_rate_text[ARIZONA_RATE_ENUM_SIZE] = {
559 "SYNCCLK rate", "8kHz", "16kHz", "ASYNCCLK rate", 559 "SYNCCLK rate", "8kHz", "16kHz", "ASYNCCLK rate",
560}; 560};
561EXPORT_SYMBOL_GPL(arizona_rate_text); 561EXPORT_SYMBOL_GPL(arizona_rate_text);
562 562
563const int arizona_rate_val[ARIZONA_RATE_ENUM_SIZE] = { 563const unsigned int arizona_rate_val[ARIZONA_RATE_ENUM_SIZE] = {
564 0, 1, 2, 8, 564 0, 1, 2, 8,
565}; 565};
566EXPORT_SYMBOL_GPL(arizona_rate_val); 566EXPORT_SYMBOL_GPL(arizona_rate_val);
@@ -702,6 +702,100 @@ const struct soc_enum arizona_in_dmic_osr[] = {
702}; 702};
703EXPORT_SYMBOL_GPL(arizona_in_dmic_osr); 703EXPORT_SYMBOL_GPL(arizona_in_dmic_osr);
704 704
705static const char * const arizona_anc_input_src_text[] = {
706 "None", "IN1", "IN2", "IN3", "IN4",
707};
708
709static const char * const arizona_anc_channel_src_text[] = {
710 "None", "Left", "Right", "Combine",
711};
712
713const struct soc_enum arizona_anc_input_src[] = {
714 SOC_ENUM_SINGLE(ARIZONA_ANC_SRC,
715 ARIZONA_IN_RXANCL_SEL_SHIFT,
716 ARRAY_SIZE(arizona_anc_input_src_text),
717 arizona_anc_input_src_text),
718 SOC_ENUM_SINGLE(ARIZONA_FCL_ADC_REFORMATTER_CONTROL,
719 ARIZONA_FCL_MIC_MODE_SEL,
720 ARRAY_SIZE(arizona_anc_channel_src_text),
721 arizona_anc_channel_src_text),
722 SOC_ENUM_SINGLE(ARIZONA_ANC_SRC,
723 ARIZONA_IN_RXANCR_SEL_SHIFT,
724 ARRAY_SIZE(arizona_anc_input_src_text),
725 arizona_anc_input_src_text),
726 SOC_ENUM_SINGLE(ARIZONA_FCR_ADC_REFORMATTER_CONTROL,
727 ARIZONA_FCR_MIC_MODE_SEL,
728 ARRAY_SIZE(arizona_anc_channel_src_text),
729 arizona_anc_channel_src_text),
730};
731EXPORT_SYMBOL_GPL(arizona_anc_input_src);
732
733static const char * const arizona_anc_ng_texts[] = {
734 "None",
735 "Internal",
736 "External",
737};
738
739SOC_ENUM_SINGLE_DECL(arizona_anc_ng_enum, SND_SOC_NOPM, 0,
740 arizona_anc_ng_texts);
741EXPORT_SYMBOL_GPL(arizona_anc_ng_enum);
742
743static const char * const arizona_output_anc_src_text[] = {
744 "None", "RXANCL", "RXANCR",
745};
746
747const struct soc_enum arizona_output_anc_src[] = {
748 SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_1L,
749 ARIZONA_OUT1L_ANC_SRC_SHIFT,
750 ARRAY_SIZE(arizona_output_anc_src_text),
751 arizona_output_anc_src_text),
752 SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_1R,
753 ARIZONA_OUT1R_ANC_SRC_SHIFT,
754 ARRAY_SIZE(arizona_output_anc_src_text),
755 arizona_output_anc_src_text),
756 SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_2L,
757 ARIZONA_OUT2L_ANC_SRC_SHIFT,
758 ARRAY_SIZE(arizona_output_anc_src_text),
759 arizona_output_anc_src_text),
760 SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_2R,
761 ARIZONA_OUT2R_ANC_SRC_SHIFT,
762 ARRAY_SIZE(arizona_output_anc_src_text),
763 arizona_output_anc_src_text),
764 SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_3L,
765 ARIZONA_OUT3L_ANC_SRC_SHIFT,
766 ARRAY_SIZE(arizona_output_anc_src_text),
767 arizona_output_anc_src_text),
768 SOC_ENUM_SINGLE(ARIZONA_DAC_VOLUME_LIMIT_3R,
769 ARIZONA_OUT3R_ANC_SRC_SHIFT,
770 ARRAY_SIZE(arizona_output_anc_src_text),
771 arizona_output_anc_src_text),
772 SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_4L,
773 ARIZONA_OUT4L_ANC_SRC_SHIFT,
774 ARRAY_SIZE(arizona_output_anc_src_text),
775 arizona_output_anc_src_text),
776 SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_4R,
777 ARIZONA_OUT4R_ANC_SRC_SHIFT,
778 ARRAY_SIZE(arizona_output_anc_src_text),
779 arizona_output_anc_src_text),
780 SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_5L,
781 ARIZONA_OUT5L_ANC_SRC_SHIFT,
782 ARRAY_SIZE(arizona_output_anc_src_text),
783 arizona_output_anc_src_text),
784 SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_5R,
785 ARIZONA_OUT5R_ANC_SRC_SHIFT,
786 ARRAY_SIZE(arizona_output_anc_src_text),
787 arizona_output_anc_src_text),
788 SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_6L,
789 ARIZONA_OUT6L_ANC_SRC_SHIFT,
790 ARRAY_SIZE(arizona_output_anc_src_text),
791 arizona_output_anc_src_text),
792 SOC_ENUM_SINGLE(ARIZONA_OUTPUT_PATH_CONFIG_6R,
793 ARIZONA_OUT6R_ANC_SRC_SHIFT,
794 ARRAY_SIZE(arizona_output_anc_src_text),
795 arizona_output_anc_src_text),
796};
797EXPORT_SYMBOL_GPL(arizona_output_anc_src);
798
705static void arizona_in_set_vu(struct snd_soc_codec *codec, int ena) 799static void arizona_in_set_vu(struct snd_soc_codec *codec, int ena)
706{ 800{
707 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); 801 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
@@ -1023,6 +1117,31 @@ void arizona_init_dvfs(struct arizona_priv *priv)
1023} 1117}
1024EXPORT_SYMBOL_GPL(arizona_init_dvfs); 1118EXPORT_SYMBOL_GPL(arizona_init_dvfs);
1025 1119
1120int arizona_anc_ev(struct snd_soc_dapm_widget *w,
1121 struct snd_kcontrol *kcontrol,
1122 int event)
1123{
1124 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1125 unsigned int mask = 0x3 << w->shift;
1126 unsigned int val;
1127
1128 switch (event) {
1129 case SND_SOC_DAPM_POST_PMU:
1130 val = 1 << w->shift;
1131 break;
1132 case SND_SOC_DAPM_PRE_PMD:
1133 val = 1 << (w->shift + 1);
1134 break;
1135 default:
1136 return 0;
1137 }
1138
1139 snd_soc_update_bits(codec, ARIZONA_CLOCK_CONTROL, mask, val);
1140
1141 return 0;
1142}
1143EXPORT_SYMBOL_GPL(arizona_anc_ev);
1144
1026static unsigned int arizona_opclk_ref_48k_rates[] = { 1145static unsigned int arizona_opclk_ref_48k_rates[] = {
1027 6144000, 1146 6144000,
1028 12288000, 1147 12288000,
@@ -1095,7 +1214,7 @@ int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id,
1095 unsigned int reg; 1214 unsigned int reg;
1096 unsigned int mask = ARIZONA_SYSCLK_FREQ_MASK | ARIZONA_SYSCLK_SRC_MASK; 1215 unsigned int mask = ARIZONA_SYSCLK_FREQ_MASK | ARIZONA_SYSCLK_SRC_MASK;
1097 unsigned int val = source << ARIZONA_SYSCLK_SRC_SHIFT; 1216 unsigned int val = source << ARIZONA_SYSCLK_SRC_SHIFT;
1098 unsigned int *clk; 1217 int *clk;
1099 1218
1100 switch (clk_id) { 1219 switch (clk_id) {
1101 case ARIZONA_CLK_SYSCLK: 1220 case ARIZONA_CLK_SYSCLK:
@@ -1375,6 +1494,9 @@ static int arizona_startup(struct snd_pcm_substream *substream,
1375 const struct snd_pcm_hw_constraint_list *constraint; 1494 const struct snd_pcm_hw_constraint_list *constraint;
1376 unsigned int base_rate; 1495 unsigned int base_rate;
1377 1496
1497 if (!substream->runtime)
1498 return 0;
1499
1378 switch (dai_priv->clk) { 1500 switch (dai_priv->clk) {
1379 case ARIZONA_CLK_SYSCLK: 1501 case ARIZONA_CLK_SYSCLK:
1380 base_rate = priv->sysclk; 1502 base_rate = priv->sysclk;
@@ -1901,18 +2023,18 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
1901 } 2023 }
1902 2024
1903 switch (fll->arizona->type) { 2025 switch (fll->arizona->type) {
2026 case WM5102:
2027 case WM8997:
2028 return init_ratio;
1904 case WM5110: 2029 case WM5110:
1905 case WM8280: 2030 case WM8280:
1906 if (fll->arizona->rev < 3 || sync) 2031 if (fll->arizona->rev < 3 || sync)
1907 return init_ratio; 2032 return init_ratio;
1908 break; 2033 break;
1909 case WM8998: 2034 default:
1910 case WM1814:
1911 if (sync) 2035 if (sync)
1912 return init_ratio; 2036 return init_ratio;
1913 break; 2037 break;
1914 default:
1915 return init_ratio;
1916 } 2038 }
1917 2039
1918 cfg->fratio = init_ratio - 1; 2040 cfg->fratio = init_ratio - 1;
@@ -2093,9 +2215,9 @@ static int arizona_enable_fll(struct arizona_fll *fll)
2093 /* Facilitate smooth refclk across the transition */ 2215 /* Facilitate smooth refclk across the transition */
2094 regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9, 2216 regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9,
2095 ARIZONA_FLL1_GAIN_MASK, 0); 2217 ARIZONA_FLL1_GAIN_MASK, 0);
2096 regmap_update_bits_async(fll->arizona->regmap, fll->base + 1, 2218 regmap_update_bits(fll->arizona->regmap, fll->base + 1,
2097 ARIZONA_FLL1_FREERUN, 2219 ARIZONA_FLL1_FREERUN, ARIZONA_FLL1_FREERUN);
2098 ARIZONA_FLL1_FREERUN); 2220 udelay(32);
2099 } 2221 }
2100 2222
2101 /* 2223 /*
diff --git a/sound/soc/codecs/arizona.h b/sound/soc/codecs/arizona.h
index fea8b8ae8e1a..8b6adb5419bb 100644
--- a/sound/soc/codecs/arizona.h
+++ b/sound/soc/codecs/arizona.h
@@ -57,7 +57,7 @@
57#define ARIZONA_CLK_98MHZ 5 57#define ARIZONA_CLK_98MHZ 5
58#define ARIZONA_CLK_147MHZ 6 58#define ARIZONA_CLK_147MHZ 6
59 59
60#define ARIZONA_MAX_DAI 6 60#define ARIZONA_MAX_DAI 8
61#define ARIZONA_MAX_ADSP 4 61#define ARIZONA_MAX_ADSP 4
62 62
63#define ARIZONA_DVFS_SR1_RQ 0x001 63#define ARIZONA_DVFS_SR1_RQ 0x001
@@ -96,8 +96,8 @@ struct arizona_priv {
96#define ARIZONA_NUM_MIXER_INPUTS 104 96#define ARIZONA_NUM_MIXER_INPUTS 104
97 97
98extern const unsigned int arizona_mixer_tlv[]; 98extern const unsigned int arizona_mixer_tlv[];
99extern const char *arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS]; 99extern const char * const arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS];
100extern int arizona_mixer_values[ARIZONA_NUM_MIXER_INPUTS]; 100extern unsigned int arizona_mixer_values[ARIZONA_NUM_MIXER_INPUTS];
101 101
102#define ARIZONA_GAINMUX_CONTROLS(name, base) \ 102#define ARIZONA_GAINMUX_CONTROLS(name, base) \
103 SOC_SINGLE_RANGE_TLV(name " Input Volume", base + 1, \ 103 SOC_SINGLE_RANGE_TLV(name " Input Volume", base + 1, \
@@ -216,8 +216,8 @@ extern int arizona_mixer_values[ARIZONA_NUM_MIXER_INPUTS];
216#define ARIZONA_RATE_ENUM_SIZE 4 216#define ARIZONA_RATE_ENUM_SIZE 4
217#define ARIZONA_SAMPLE_RATE_ENUM_SIZE 14 217#define ARIZONA_SAMPLE_RATE_ENUM_SIZE 14
218 218
219extern const char *arizona_rate_text[ARIZONA_RATE_ENUM_SIZE]; 219extern const char * const arizona_rate_text[ARIZONA_RATE_ENUM_SIZE];
220extern const int arizona_rate_val[ARIZONA_RATE_ENUM_SIZE]; 220extern const unsigned int arizona_rate_val[ARIZONA_RATE_ENUM_SIZE];
221extern const char * const arizona_sample_rate_text[ARIZONA_SAMPLE_RATE_ENUM_SIZE]; 221extern const char * const arizona_sample_rate_text[ARIZONA_SAMPLE_RATE_ENUM_SIZE];
222extern const unsigned int arizona_sample_rate_val[ARIZONA_SAMPLE_RATE_ENUM_SIZE]; 222extern const unsigned int arizona_sample_rate_val[ARIZONA_SAMPLE_RATE_ENUM_SIZE];
223 223
@@ -242,6 +242,10 @@ extern const struct soc_enum arizona_in_dmic_osr[];
242 242
243extern const struct snd_kcontrol_new arizona_adsp2_rate_controls[]; 243extern const struct snd_kcontrol_new arizona_adsp2_rate_controls[];
244 244
245extern const struct soc_enum arizona_anc_input_src[];
246extern const struct soc_enum arizona_anc_ng_enum;
247extern const struct soc_enum arizona_output_anc_src[];
248
245extern int arizona_in_ev(struct snd_soc_dapm_widget *w, 249extern int arizona_in_ev(struct snd_soc_dapm_widget *w,
246 struct snd_kcontrol *kcontrol, 250 struct snd_kcontrol *kcontrol,
247 int event); 251 int event);
@@ -251,6 +255,9 @@ extern int arizona_out_ev(struct snd_soc_dapm_widget *w,
251extern int arizona_hp_ev(struct snd_soc_dapm_widget *w, 255extern int arizona_hp_ev(struct snd_soc_dapm_widget *w,
252 struct snd_kcontrol *kcontrol, 256 struct snd_kcontrol *kcontrol,
253 int event); 257 int event);
258extern int arizona_anc_ev(struct snd_soc_dapm_widget *w,
259 struct snd_kcontrol *kcontrol,
260 int event);
254 261
255extern int arizona_eq_coeff_put(struct snd_kcontrol *kcontrol, 262extern int arizona_eq_coeff_put(struct snd_kcontrol *kcontrol,
256 struct snd_ctl_elem_value *ucontrol); 263 struct snd_ctl_elem_value *ucontrol);
diff --git a/sound/soc/codecs/cs47l24.c b/sound/soc/codecs/cs47l24.c
new file mode 100644
index 000000000000..dc5ae7f7a1bd
--- /dev/null
+++ b/sound/soc/codecs/cs47l24.c
@@ -0,0 +1,1148 @@
1/*
2 * cs47l24.h -- ALSA SoC Audio driver for Cirrus Logic CS47L24
3 *
4 * Copyright 2015 Cirrus Logic Inc.
5 *
6 * Author: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#include <linux/module.h>
14#include <linux/moduleparam.h>
15#include <linux/init.h>
16#include <linux/delay.h>
17#include <linux/pm.h>
18#include <linux/pm_runtime.h>
19#include <linux/regmap.h>
20#include <linux/slab.h>
21#include <sound/core.h>
22#include <sound/pcm.h>
23#include <sound/pcm_params.h>
24#include <sound/soc.h>
25#include <sound/jack.h>
26#include <sound/initval.h>
27#include <sound/tlv.h>
28
29#include <linux/mfd/arizona/core.h>
30#include <linux/mfd/arizona/registers.h>
31
32#include "arizona.h"
33#include "wm_adsp.h"
34#include "cs47l24.h"
35
36struct cs47l24_priv {
37 struct arizona_priv core;
38 struct arizona_fll fll[2];
39};
40
41static const struct wm_adsp_region cs47l24_dsp2_regions[] = {
42 { .type = WMFW_ADSP2_PM, .base = 0x200000 },
43 { .type = WMFW_ADSP2_ZM, .base = 0x280000 },
44 { .type = WMFW_ADSP2_XM, .base = 0x290000 },
45 { .type = WMFW_ADSP2_YM, .base = 0x2a8000 },
46};
47
48static const struct wm_adsp_region cs47l24_dsp3_regions[] = {
49 { .type = WMFW_ADSP2_PM, .base = 0x300000 },
50 { .type = WMFW_ADSP2_ZM, .base = 0x380000 },
51 { .type = WMFW_ADSP2_XM, .base = 0x390000 },
52 { .type = WMFW_ADSP2_YM, .base = 0x3a8000 },
53};
54
55static const struct wm_adsp_region *cs47l24_dsp_regions[] = {
56 cs47l24_dsp2_regions,
57 cs47l24_dsp3_regions,
58};
59
60static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
61static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
62static DECLARE_TLV_DB_SCALE(noise_tlv, -13200, 600, 0);
63static DECLARE_TLV_DB_SCALE(ng_tlv, -10200, 600, 0);
64
65#define CS47L24_NG_SRC(name, base) \
66 SOC_SINGLE(name " NG HPOUT1L Switch", base, 0, 1, 0), \
67 SOC_SINGLE(name " NG HPOUT1R Switch", base, 1, 1, 0), \
68 SOC_SINGLE(name " NG SPKOUT Switch", base, 6, 1, 0)
69
70static const struct snd_kcontrol_new cs47l24_snd_controls[] = {
71SOC_ENUM("IN1 OSR", arizona_in_dmic_osr[0]),
72SOC_ENUM("IN2 OSR", arizona_in_dmic_osr[1]),
73
74SOC_ENUM("IN HPF Cutoff Frequency", arizona_in_hpf_cut_enum),
75
76SOC_SINGLE("IN1L HPF Switch", ARIZONA_IN1L_CONTROL,
77 ARIZONA_IN1L_HPF_SHIFT, 1, 0),
78SOC_SINGLE("IN1R HPF Switch", ARIZONA_IN1R_CONTROL,
79 ARIZONA_IN1R_HPF_SHIFT, 1, 0),
80SOC_SINGLE("IN2L HPF Switch", ARIZONA_IN2L_CONTROL,
81 ARIZONA_IN2L_HPF_SHIFT, 1, 0),
82SOC_SINGLE("IN2R HPF Switch", ARIZONA_IN2R_CONTROL,
83 ARIZONA_IN2R_HPF_SHIFT, 1, 0),
84
85SOC_SINGLE_TLV("IN1L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1L,
86 ARIZONA_IN1L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
87SOC_SINGLE_TLV("IN1R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1R,
88 ARIZONA_IN1R_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
89SOC_SINGLE_TLV("IN2L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2L,
90 ARIZONA_IN2L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
91SOC_SINGLE_TLV("IN2R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2R,
92 ARIZONA_IN2R_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
93
94SOC_ENUM("Input Ramp Up", arizona_in_vi_ramp),
95SOC_ENUM("Input Ramp Down", arizona_in_vd_ramp),
96
97ARIZONA_MIXER_CONTROLS("EQ1", ARIZONA_EQ1MIX_INPUT_1_SOURCE),
98ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
99
100ARIZONA_EQ_CONTROL("EQ1 Coefficients", ARIZONA_EQ1_2),
101SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,
102 24, 0, eq_tlv),
103SOC_SINGLE_TLV("EQ1 B2 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B2_GAIN_SHIFT,
104 24, 0, eq_tlv),
105SOC_SINGLE_TLV("EQ1 B3 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B3_GAIN_SHIFT,
106 24, 0, eq_tlv),
107SOC_SINGLE_TLV("EQ1 B4 Volume", ARIZONA_EQ1_2, ARIZONA_EQ1_B4_GAIN_SHIFT,
108 24, 0, eq_tlv),
109SOC_SINGLE_TLV("EQ1 B5 Volume", ARIZONA_EQ1_2, ARIZONA_EQ1_B5_GAIN_SHIFT,
110 24, 0, eq_tlv),
111
112ARIZONA_EQ_CONTROL("EQ2 Coefficients", ARIZONA_EQ2_2),
113SOC_SINGLE_TLV("EQ2 B1 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B1_GAIN_SHIFT,
114 24, 0, eq_tlv),
115SOC_SINGLE_TLV("EQ2 B2 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B2_GAIN_SHIFT,
116 24, 0, eq_tlv),
117SOC_SINGLE_TLV("EQ2 B3 Volume", ARIZONA_EQ2_1, ARIZONA_EQ2_B3_GAIN_SHIFT,
118 24, 0, eq_tlv),
119SOC_SINGLE_TLV("EQ2 B4 Volume", ARIZONA_EQ2_2, ARIZONA_EQ2_B4_GAIN_SHIFT,
120 24, 0, eq_tlv),
121SOC_SINGLE_TLV("EQ2 B5 Volume", ARIZONA_EQ2_2, ARIZONA_EQ2_B5_GAIN_SHIFT,
122 24, 0, eq_tlv),
123
124ARIZONA_MIXER_CONTROLS("DRC1L", ARIZONA_DRC1LMIX_INPUT_1_SOURCE),
125ARIZONA_MIXER_CONTROLS("DRC1R", ARIZONA_DRC1RMIX_INPUT_1_SOURCE),
126ARIZONA_MIXER_CONTROLS("DRC2L", ARIZONA_DRC2LMIX_INPUT_1_SOURCE),
127ARIZONA_MIXER_CONTROLS("DRC2R", ARIZONA_DRC2RMIX_INPUT_1_SOURCE),
128
129SND_SOC_BYTES_MASK("DRC1", ARIZONA_DRC1_CTRL1, 5,
130 ARIZONA_DRC1R_ENA | ARIZONA_DRC1L_ENA),
131SND_SOC_BYTES_MASK("DRC2", ARIZONA_DRC2_CTRL1, 5,
132 ARIZONA_DRC2R_ENA | ARIZONA_DRC2L_ENA),
133
134ARIZONA_MIXER_CONTROLS("LHPF1", ARIZONA_HPLP1MIX_INPUT_1_SOURCE),
135ARIZONA_MIXER_CONTROLS("LHPF2", ARIZONA_HPLP2MIX_INPUT_1_SOURCE),
136ARIZONA_MIXER_CONTROLS("LHPF3", ARIZONA_HPLP3MIX_INPUT_1_SOURCE),
137ARIZONA_MIXER_CONTROLS("LHPF4", ARIZONA_HPLP4MIX_INPUT_1_SOURCE),
138
139ARIZONA_LHPF_CONTROL("LHPF1 Coefficients", ARIZONA_HPLPF1_2),
140ARIZONA_LHPF_CONTROL("LHPF2 Coefficients", ARIZONA_HPLPF2_2),
141ARIZONA_LHPF_CONTROL("LHPF3 Coefficients", ARIZONA_HPLPF3_2),
142ARIZONA_LHPF_CONTROL("LHPF4 Coefficients", ARIZONA_HPLPF4_2),
143
144SOC_ENUM("LHPF1 Mode", arizona_lhpf1_mode),
145SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mode),
146SOC_ENUM("LHPF3 Mode", arizona_lhpf3_mode),
147SOC_ENUM("LHPF4 Mode", arizona_lhpf4_mode),
148
149SOC_ENUM("ISRC1 FSL", arizona_isrc_fsl[0]),
150SOC_ENUM("ISRC2 FSL", arizona_isrc_fsl[1]),
151SOC_ENUM("ISRC3 FSL", arizona_isrc_fsl[2]),
152SOC_ENUM("ISRC1 FSH", arizona_isrc_fsh[0]),
153SOC_ENUM("ISRC2 FSH", arizona_isrc_fsh[1]),
154SOC_ENUM("ISRC3 FSH", arizona_isrc_fsh[2]),
155SOC_ENUM("ASRC RATE 1", arizona_asrc_rate1),
156
157ARIZONA_MIXER_CONTROLS("DSP2L", ARIZONA_DSP2LMIX_INPUT_1_SOURCE),
158ARIZONA_MIXER_CONTROLS("DSP2R", ARIZONA_DSP2RMIX_INPUT_1_SOURCE),
159ARIZONA_MIXER_CONTROLS("DSP3L", ARIZONA_DSP3LMIX_INPUT_1_SOURCE),
160ARIZONA_MIXER_CONTROLS("DSP3R", ARIZONA_DSP3RMIX_INPUT_1_SOURCE),
161
162SOC_SINGLE_TLV("Noise Generator Volume", ARIZONA_COMFORT_NOISE_GENERATOR,
163 ARIZONA_NOISE_GEN_GAIN_SHIFT, 0x16, 0, noise_tlv),
164
165ARIZONA_MIXER_CONTROLS("HPOUT1L", ARIZONA_OUT1LMIX_INPUT_1_SOURCE),
166ARIZONA_MIXER_CONTROLS("HPOUT1R", ARIZONA_OUT1RMIX_INPUT_1_SOURCE),
167ARIZONA_MIXER_CONTROLS("SPKOUT", ARIZONA_OUT4LMIX_INPUT_1_SOURCE),
168
169SOC_SINGLE("HPOUT1 SC Protect Switch", ARIZONA_HP1_SHORT_CIRCUIT_CTRL,
170 ARIZONA_HP1_SC_ENA_SHIFT, 1, 0),
171
172SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
173 ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),
174SOC_SINGLE("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
175 ARIZONA_OUT4L_MUTE_SHIFT, 1, 1),
176
177SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
178 ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
179 0xbf, 0, digital_tlv),
180SOC_SINGLE_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L,
181 ARIZONA_OUT4L_VOL_SHIFT,
182 0xbf, 0, digital_tlv),
183
184SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp),
185SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp),
186
187SOC_SINGLE("Noise Gate Switch", ARIZONA_NOISE_GATE_CONTROL,
188 ARIZONA_NGATE_ENA_SHIFT, 1, 0),
189SOC_SINGLE_TLV("Noise Gate Threshold Volume", ARIZONA_NOISE_GATE_CONTROL,
190 ARIZONA_NGATE_THR_SHIFT, 7, 1, ng_tlv),
191SOC_ENUM("Noise Gate Hold", arizona_ng_hold),
192
193CS47L24_NG_SRC("HPOUT1L", ARIZONA_NOISE_GATE_SELECT_1L),
194CS47L24_NG_SRC("HPOUT1R", ARIZONA_NOISE_GATE_SELECT_1R),
195CS47L24_NG_SRC("SPKOUT", ARIZONA_NOISE_GATE_SELECT_4L),
196
197ARIZONA_MIXER_CONTROLS("AIF1TX1", ARIZONA_AIF1TX1MIX_INPUT_1_SOURCE),
198ARIZONA_MIXER_CONTROLS("AIF1TX2", ARIZONA_AIF1TX2MIX_INPUT_1_SOURCE),
199ARIZONA_MIXER_CONTROLS("AIF1TX3", ARIZONA_AIF1TX3MIX_INPUT_1_SOURCE),
200ARIZONA_MIXER_CONTROLS("AIF1TX4", ARIZONA_AIF1TX4MIX_INPUT_1_SOURCE),
201ARIZONA_MIXER_CONTROLS("AIF1TX5", ARIZONA_AIF1TX5MIX_INPUT_1_SOURCE),
202ARIZONA_MIXER_CONTROLS("AIF1TX6", ARIZONA_AIF1TX6MIX_INPUT_1_SOURCE),
203ARIZONA_MIXER_CONTROLS("AIF1TX7", ARIZONA_AIF1TX7MIX_INPUT_1_SOURCE),
204ARIZONA_MIXER_CONTROLS("AIF1TX8", ARIZONA_AIF1TX8MIX_INPUT_1_SOURCE),
205
206ARIZONA_MIXER_CONTROLS("AIF2TX1", ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE),
207ARIZONA_MIXER_CONTROLS("AIF2TX2", ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE),
208ARIZONA_MIXER_CONTROLS("AIF2TX3", ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE),
209ARIZONA_MIXER_CONTROLS("AIF2TX4", ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE),
210ARIZONA_MIXER_CONTROLS("AIF2TX5", ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE),
211ARIZONA_MIXER_CONTROLS("AIF2TX6", ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE),
212
213ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),
214ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE),
215};
216
217ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE);
218ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE);
219
220ARIZONA_MIXER_ENUMS(DRC1L, ARIZONA_DRC1LMIX_INPUT_1_SOURCE);
221ARIZONA_MIXER_ENUMS(DRC1R, ARIZONA_DRC1RMIX_INPUT_1_SOURCE);
222ARIZONA_MIXER_ENUMS(DRC2L, ARIZONA_DRC2LMIX_INPUT_1_SOURCE);
223ARIZONA_MIXER_ENUMS(DRC2R, ARIZONA_DRC2RMIX_INPUT_1_SOURCE);
224
225ARIZONA_MIXER_ENUMS(LHPF1, ARIZONA_HPLP1MIX_INPUT_1_SOURCE);
226ARIZONA_MIXER_ENUMS(LHPF2, ARIZONA_HPLP2MIX_INPUT_1_SOURCE);
227ARIZONA_MIXER_ENUMS(LHPF3, ARIZONA_HPLP3MIX_INPUT_1_SOURCE);
228ARIZONA_MIXER_ENUMS(LHPF4, ARIZONA_HPLP4MIX_INPUT_1_SOURCE);
229
230ARIZONA_MIXER_ENUMS(DSP2L, ARIZONA_DSP2LMIX_INPUT_1_SOURCE);
231ARIZONA_MIXER_ENUMS(DSP2R, ARIZONA_DSP2RMIX_INPUT_1_SOURCE);
232ARIZONA_DSP_AUX_ENUMS(DSP2, ARIZONA_DSP2AUX1MIX_INPUT_1_SOURCE);
233
234ARIZONA_MIXER_ENUMS(DSP3L, ARIZONA_DSP3LMIX_INPUT_1_SOURCE);
235ARIZONA_MIXER_ENUMS(DSP3R, ARIZONA_DSP3RMIX_INPUT_1_SOURCE);
236ARIZONA_DSP_AUX_ENUMS(DSP3, ARIZONA_DSP3AUX1MIX_INPUT_1_SOURCE);
237
238ARIZONA_MIXER_ENUMS(PWM1, ARIZONA_PWM1MIX_INPUT_1_SOURCE);
239ARIZONA_MIXER_ENUMS(PWM2, ARIZONA_PWM2MIX_INPUT_1_SOURCE);
240
241ARIZONA_MIXER_ENUMS(OUT1L, ARIZONA_OUT1LMIX_INPUT_1_SOURCE);
242ARIZONA_MIXER_ENUMS(OUT1R, ARIZONA_OUT1RMIX_INPUT_1_SOURCE);
243ARIZONA_MIXER_ENUMS(SPKOUT, ARIZONA_OUT4LMIX_INPUT_1_SOURCE);
244
245ARIZONA_MIXER_ENUMS(AIF1TX1, ARIZONA_AIF1TX1MIX_INPUT_1_SOURCE);
246ARIZONA_MIXER_ENUMS(AIF1TX2, ARIZONA_AIF1TX2MIX_INPUT_1_SOURCE);
247ARIZONA_MIXER_ENUMS(AIF1TX3, ARIZONA_AIF1TX3MIX_INPUT_1_SOURCE);
248ARIZONA_MIXER_ENUMS(AIF1TX4, ARIZONA_AIF1TX4MIX_INPUT_1_SOURCE);
249ARIZONA_MIXER_ENUMS(AIF1TX5, ARIZONA_AIF1TX5MIX_INPUT_1_SOURCE);
250ARIZONA_MIXER_ENUMS(AIF1TX6, ARIZONA_AIF1TX6MIX_INPUT_1_SOURCE);
251ARIZONA_MIXER_ENUMS(AIF1TX7, ARIZONA_AIF1TX7MIX_INPUT_1_SOURCE);
252ARIZONA_MIXER_ENUMS(AIF1TX8, ARIZONA_AIF1TX8MIX_INPUT_1_SOURCE);
253
254ARIZONA_MIXER_ENUMS(AIF2TX1, ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE);
255ARIZONA_MIXER_ENUMS(AIF2TX2, ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE);
256ARIZONA_MIXER_ENUMS(AIF2TX3, ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE);
257ARIZONA_MIXER_ENUMS(AIF2TX4, ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE);
258ARIZONA_MIXER_ENUMS(AIF2TX5, ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE);
259ARIZONA_MIXER_ENUMS(AIF2TX6, ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE);
260
261ARIZONA_MIXER_ENUMS(AIF3TX1, ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE);
262ARIZONA_MIXER_ENUMS(AIF3TX2, ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE);
263
264ARIZONA_MUX_ENUMS(ASRC1L, ARIZONA_ASRC1LMIX_INPUT_1_SOURCE);
265ARIZONA_MUX_ENUMS(ASRC1R, ARIZONA_ASRC1RMIX_INPUT_1_SOURCE);
266ARIZONA_MUX_ENUMS(ASRC2L, ARIZONA_ASRC2LMIX_INPUT_1_SOURCE);
267ARIZONA_MUX_ENUMS(ASRC2R, ARIZONA_ASRC2RMIX_INPUT_1_SOURCE);
268
269ARIZONA_MUX_ENUMS(ISRC1INT1, ARIZONA_ISRC1INT1MIX_INPUT_1_SOURCE);
270ARIZONA_MUX_ENUMS(ISRC1INT2, ARIZONA_ISRC1INT2MIX_INPUT_1_SOURCE);
271ARIZONA_MUX_ENUMS(ISRC1INT3, ARIZONA_ISRC1INT3MIX_INPUT_1_SOURCE);
272ARIZONA_MUX_ENUMS(ISRC1INT4, ARIZONA_ISRC1INT4MIX_INPUT_1_SOURCE);
273
274ARIZONA_MUX_ENUMS(ISRC1DEC1, ARIZONA_ISRC1DEC1MIX_INPUT_1_SOURCE);
275ARIZONA_MUX_ENUMS(ISRC1DEC2, ARIZONA_ISRC1DEC2MIX_INPUT_1_SOURCE);
276ARIZONA_MUX_ENUMS(ISRC1DEC3, ARIZONA_ISRC1DEC3MIX_INPUT_1_SOURCE);
277ARIZONA_MUX_ENUMS(ISRC1DEC4, ARIZONA_ISRC1DEC4MIX_INPUT_1_SOURCE);
278
279ARIZONA_MUX_ENUMS(ISRC2INT1, ARIZONA_ISRC2INT1MIX_INPUT_1_SOURCE);
280ARIZONA_MUX_ENUMS(ISRC2INT2, ARIZONA_ISRC2INT2MIX_INPUT_1_SOURCE);
281ARIZONA_MUX_ENUMS(ISRC2INT3, ARIZONA_ISRC2INT3MIX_INPUT_1_SOURCE);
282ARIZONA_MUX_ENUMS(ISRC2INT4, ARIZONA_ISRC2INT4MIX_INPUT_1_SOURCE);
283
284ARIZONA_MUX_ENUMS(ISRC2DEC1, ARIZONA_ISRC2DEC1MIX_INPUT_1_SOURCE);
285ARIZONA_MUX_ENUMS(ISRC2DEC2, ARIZONA_ISRC2DEC2MIX_INPUT_1_SOURCE);
286ARIZONA_MUX_ENUMS(ISRC2DEC3, ARIZONA_ISRC2DEC3MIX_INPUT_1_SOURCE);
287ARIZONA_MUX_ENUMS(ISRC2DEC4, ARIZONA_ISRC2DEC4MIX_INPUT_1_SOURCE);
288
289ARIZONA_MUX_ENUMS(ISRC3INT1, ARIZONA_ISRC3INT1MIX_INPUT_1_SOURCE);
290ARIZONA_MUX_ENUMS(ISRC3INT2, ARIZONA_ISRC3INT2MIX_INPUT_1_SOURCE);
291ARIZONA_MUX_ENUMS(ISRC3INT3, ARIZONA_ISRC3INT3MIX_INPUT_1_SOURCE);
292ARIZONA_MUX_ENUMS(ISRC3INT4, ARIZONA_ISRC3INT4MIX_INPUT_1_SOURCE);
293
294ARIZONA_MUX_ENUMS(ISRC3DEC1, ARIZONA_ISRC3DEC1MIX_INPUT_1_SOURCE);
295ARIZONA_MUX_ENUMS(ISRC3DEC2, ARIZONA_ISRC3DEC2MIX_INPUT_1_SOURCE);
296ARIZONA_MUX_ENUMS(ISRC3DEC3, ARIZONA_ISRC3DEC3MIX_INPUT_1_SOURCE);
297ARIZONA_MUX_ENUMS(ISRC3DEC4, ARIZONA_ISRC3DEC4MIX_INPUT_1_SOURCE);
298
299static const char * const cs47l24_aec_loopback_texts[] = {
300 "HPOUT1L", "HPOUT1R", "SPKOUT",
301};
302
303static const unsigned int cs47l24_aec_loopback_values[] = {
304 0, 1, 6,
305};
306
307static const struct soc_enum cs47l24_aec_loopback =
308 SOC_VALUE_ENUM_SINGLE(ARIZONA_DAC_AEC_CONTROL_1,
309 ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf,
310 ARRAY_SIZE(cs47l24_aec_loopback_texts),
311 cs47l24_aec_loopback_texts,
312 cs47l24_aec_loopback_values);
313
314static const struct snd_kcontrol_new cs47l24_aec_loopback_mux =
315 SOC_DAPM_ENUM("AEC Loopback", cs47l24_aec_loopback);
316
317static const struct snd_soc_dapm_widget cs47l24_dapm_widgets[] = {
318SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1,
319 ARIZONA_SYSCLK_ENA_SHIFT, 0, NULL, 0),
320SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
321 ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0),
322SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
323 ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0),
324SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK,
325 ARIZONA_OPCLK_ASYNC_ENA_SHIFT, 0, NULL, 0),
326
327SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD", 20, 0),
328SND_SOC_DAPM_REGULATOR_SUPPLY("MICVDD", 0, SND_SOC_DAPM_REGULATOR_BYPASS),
329SND_SOC_DAPM_REGULATOR_SUPPLY("SPKVDD", 0, 0),
330
331SND_SOC_DAPM_SIGGEN("TONE"),
332SND_SOC_DAPM_SIGGEN("NOISE"),
333SND_SOC_DAPM_SIGGEN("HAPTICS"),
334
335SND_SOC_DAPM_INPUT("IN1L"),
336SND_SOC_DAPM_INPUT("IN1R"),
337SND_SOC_DAPM_INPUT("IN2L"),
338SND_SOC_DAPM_INPUT("IN2R"),
339
340SND_SOC_DAPM_OUTPUT("DRC1 Signal Activity"),
341SND_SOC_DAPM_OUTPUT("DRC2 Signal Activity"),
342
343SND_SOC_DAPM_PGA_E("IN1L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1L_ENA_SHIFT,
344 0, NULL, 0, arizona_in_ev,
345 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
346 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
347SND_SOC_DAPM_PGA_E("IN1R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN1R_ENA_SHIFT,
348 0, NULL, 0, arizona_in_ev,
349 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
350 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
351SND_SOC_DAPM_PGA_E("IN2L PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2L_ENA_SHIFT,
352 0, NULL, 0, arizona_in_ev,
353 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
354 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
355SND_SOC_DAPM_PGA_E("IN2R PGA", ARIZONA_INPUT_ENABLES, ARIZONA_IN2R_ENA_SHIFT,
356 0, NULL, 0, arizona_in_ev,
357 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
358 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
359
360SND_SOC_DAPM_SUPPLY("MICBIAS1", ARIZONA_MIC_BIAS_CTRL_1,
361 ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
362SND_SOC_DAPM_SUPPLY("MICBIAS2", ARIZONA_MIC_BIAS_CTRL_2,
363 ARIZONA_MICB1_ENA_SHIFT, 0, NULL, 0),
364
365SND_SOC_DAPM_PGA("Noise Generator", ARIZONA_COMFORT_NOISE_GENERATOR,
366 ARIZONA_NOISE_GEN_ENA_SHIFT, 0, NULL, 0),
367
368SND_SOC_DAPM_PGA("Tone Generator 1", ARIZONA_TONE_GENERATOR_1,
369 ARIZONA_TONE1_ENA_SHIFT, 0, NULL, 0),
370SND_SOC_DAPM_PGA("Tone Generator 2", ARIZONA_TONE_GENERATOR_1,
371 ARIZONA_TONE2_ENA_SHIFT, 0, NULL, 0),
372
373SND_SOC_DAPM_PGA("EQ1", ARIZONA_EQ1_1, ARIZONA_EQ1_ENA_SHIFT, 0, NULL, 0),
374SND_SOC_DAPM_PGA("EQ2", ARIZONA_EQ2_1, ARIZONA_EQ2_ENA_SHIFT, 0, NULL, 0),
375
376SND_SOC_DAPM_PGA("DRC1L", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1L_ENA_SHIFT, 0,
377 NULL, 0),
378SND_SOC_DAPM_PGA("DRC1R", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1R_ENA_SHIFT, 0,
379 NULL, 0),
380SND_SOC_DAPM_PGA("DRC2L", ARIZONA_DRC2_CTRL1, ARIZONA_DRC2L_ENA_SHIFT, 0,
381 NULL, 0),
382SND_SOC_DAPM_PGA("DRC2R", ARIZONA_DRC2_CTRL1, ARIZONA_DRC2R_ENA_SHIFT, 0,
383 NULL, 0),
384
385SND_SOC_DAPM_PGA("LHPF1", ARIZONA_HPLPF1_1, ARIZONA_LHPF1_ENA_SHIFT, 0,
386 NULL, 0),
387SND_SOC_DAPM_PGA("LHPF2", ARIZONA_HPLPF2_1, ARIZONA_LHPF2_ENA_SHIFT, 0,
388 NULL, 0),
389SND_SOC_DAPM_PGA("LHPF3", ARIZONA_HPLPF3_1, ARIZONA_LHPF3_ENA_SHIFT, 0,
390 NULL, 0),
391SND_SOC_DAPM_PGA("LHPF4", ARIZONA_HPLPF4_1, ARIZONA_LHPF4_ENA_SHIFT, 0,
392 NULL, 0),
393
394SND_SOC_DAPM_PGA("PWM1 Driver", ARIZONA_PWM_DRIVE_1, ARIZONA_PWM1_ENA_SHIFT,
395 0, NULL, 0),
396SND_SOC_DAPM_PGA("PWM2 Driver", ARIZONA_PWM_DRIVE_1, ARIZONA_PWM2_ENA_SHIFT,
397 0, NULL, 0),
398
399SND_SOC_DAPM_PGA("ASRC1L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC1L_ENA_SHIFT, 0,
400 NULL, 0),
401SND_SOC_DAPM_PGA("ASRC1R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC1R_ENA_SHIFT, 0,
402 NULL, 0),
403SND_SOC_DAPM_PGA("ASRC2L", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2L_ENA_SHIFT, 0,
404 NULL, 0),
405SND_SOC_DAPM_PGA("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0,
406 NULL, 0),
407
408WM_ADSP2("DSP2", 1),
409WM_ADSP2("DSP3", 2),
410
411SND_SOC_DAPM_PGA("ISRC1INT1", ARIZONA_ISRC_1_CTRL_3,
412 ARIZONA_ISRC1_INT0_ENA_SHIFT, 0, NULL, 0),
413SND_SOC_DAPM_PGA("ISRC1INT2", ARIZONA_ISRC_1_CTRL_3,
414 ARIZONA_ISRC1_INT1_ENA_SHIFT, 0, NULL, 0),
415SND_SOC_DAPM_PGA("ISRC1INT3", ARIZONA_ISRC_1_CTRL_3,
416 ARIZONA_ISRC1_INT2_ENA_SHIFT, 0, NULL, 0),
417SND_SOC_DAPM_PGA("ISRC1INT4", ARIZONA_ISRC_1_CTRL_3,
418 ARIZONA_ISRC1_INT3_ENA_SHIFT, 0, NULL, 0),
419
420SND_SOC_DAPM_PGA("ISRC1DEC1", ARIZONA_ISRC_1_CTRL_3,
421 ARIZONA_ISRC1_DEC0_ENA_SHIFT, 0, NULL, 0),
422SND_SOC_DAPM_PGA("ISRC1DEC2", ARIZONA_ISRC_1_CTRL_3,
423 ARIZONA_ISRC1_DEC1_ENA_SHIFT, 0, NULL, 0),
424SND_SOC_DAPM_PGA("ISRC1DEC3", ARIZONA_ISRC_1_CTRL_3,
425 ARIZONA_ISRC1_DEC2_ENA_SHIFT, 0, NULL, 0),
426SND_SOC_DAPM_PGA("ISRC1DEC4", ARIZONA_ISRC_1_CTRL_3,
427 ARIZONA_ISRC1_DEC3_ENA_SHIFT, 0, NULL, 0),
428
429SND_SOC_DAPM_PGA("ISRC2INT1", ARIZONA_ISRC_2_CTRL_3,
430 ARIZONA_ISRC2_INT0_ENA_SHIFT, 0, NULL, 0),
431SND_SOC_DAPM_PGA("ISRC2INT2", ARIZONA_ISRC_2_CTRL_3,
432 ARIZONA_ISRC2_INT1_ENA_SHIFT, 0, NULL, 0),
433SND_SOC_DAPM_PGA("ISRC2INT3", ARIZONA_ISRC_2_CTRL_3,
434 ARIZONA_ISRC2_INT2_ENA_SHIFT, 0, NULL, 0),
435SND_SOC_DAPM_PGA("ISRC2INT4", ARIZONA_ISRC_2_CTRL_3,
436 ARIZONA_ISRC2_INT3_ENA_SHIFT, 0, NULL, 0),
437
438SND_SOC_DAPM_PGA("ISRC2DEC1", ARIZONA_ISRC_2_CTRL_3,
439 ARIZONA_ISRC2_DEC0_ENA_SHIFT, 0, NULL, 0),
440SND_SOC_DAPM_PGA("ISRC2DEC2", ARIZONA_ISRC_2_CTRL_3,
441 ARIZONA_ISRC2_DEC1_ENA_SHIFT, 0, NULL, 0),
442SND_SOC_DAPM_PGA("ISRC2DEC3", ARIZONA_ISRC_2_CTRL_3,
443 ARIZONA_ISRC2_DEC2_ENA_SHIFT, 0, NULL, 0),
444SND_SOC_DAPM_PGA("ISRC2DEC4", ARIZONA_ISRC_2_CTRL_3,
445 ARIZONA_ISRC2_DEC3_ENA_SHIFT, 0, NULL, 0),
446
447SND_SOC_DAPM_PGA("ISRC3INT1", ARIZONA_ISRC_3_CTRL_3,
448 ARIZONA_ISRC3_INT0_ENA_SHIFT, 0, NULL, 0),
449SND_SOC_DAPM_PGA("ISRC3INT2", ARIZONA_ISRC_3_CTRL_3,
450 ARIZONA_ISRC3_INT1_ENA_SHIFT, 0, NULL, 0),
451SND_SOC_DAPM_PGA("ISRC3INT3", ARIZONA_ISRC_3_CTRL_3,
452 ARIZONA_ISRC3_INT2_ENA_SHIFT, 0, NULL, 0),
453SND_SOC_DAPM_PGA("ISRC3INT4", ARIZONA_ISRC_3_CTRL_3,
454 ARIZONA_ISRC3_INT3_ENA_SHIFT, 0, NULL, 0),
455
456SND_SOC_DAPM_PGA("ISRC3DEC1", ARIZONA_ISRC_3_CTRL_3,
457 ARIZONA_ISRC3_DEC0_ENA_SHIFT, 0, NULL, 0),
458SND_SOC_DAPM_PGA("ISRC3DEC2", ARIZONA_ISRC_3_CTRL_3,
459 ARIZONA_ISRC3_DEC1_ENA_SHIFT, 0, NULL, 0),
460SND_SOC_DAPM_PGA("ISRC3DEC3", ARIZONA_ISRC_3_CTRL_3,
461 ARIZONA_ISRC3_DEC2_ENA_SHIFT, 0, NULL, 0),
462SND_SOC_DAPM_PGA("ISRC3DEC4", ARIZONA_ISRC_3_CTRL_3,
463 ARIZONA_ISRC3_DEC3_ENA_SHIFT, 0, NULL, 0),
464
465SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
466 ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
467 &cs47l24_aec_loopback_mux),
468
469SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0,
470 ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0),
471SND_SOC_DAPM_AIF_OUT("AIF1TX2", NULL, 0,
472 ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX2_ENA_SHIFT, 0),
473SND_SOC_DAPM_AIF_OUT("AIF1TX3", NULL, 0,
474 ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX3_ENA_SHIFT, 0),
475SND_SOC_DAPM_AIF_OUT("AIF1TX4", NULL, 0,
476 ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX4_ENA_SHIFT, 0),
477SND_SOC_DAPM_AIF_OUT("AIF1TX5", NULL, 0,
478 ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX5_ENA_SHIFT, 0),
479SND_SOC_DAPM_AIF_OUT("AIF1TX6", NULL, 0,
480 ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX6_ENA_SHIFT, 0),
481SND_SOC_DAPM_AIF_OUT("AIF1TX7", NULL, 0,
482 ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX7_ENA_SHIFT, 0),
483SND_SOC_DAPM_AIF_OUT("AIF1TX8", NULL, 0,
484 ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX8_ENA_SHIFT, 0),
485
486SND_SOC_DAPM_AIF_IN("AIF1RX1", NULL, 0,
487 ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX1_ENA_SHIFT, 0),
488SND_SOC_DAPM_AIF_IN("AIF1RX2", NULL, 0,
489 ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX2_ENA_SHIFT, 0),
490SND_SOC_DAPM_AIF_IN("AIF1RX3", NULL, 0,
491 ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX3_ENA_SHIFT, 0),
492SND_SOC_DAPM_AIF_IN("AIF1RX4", NULL, 0,
493 ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX4_ENA_SHIFT, 0),
494SND_SOC_DAPM_AIF_IN("AIF1RX5", NULL, 0,
495 ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX5_ENA_SHIFT, 0),
496SND_SOC_DAPM_AIF_IN("AIF1RX6", NULL, 0,
497 ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX6_ENA_SHIFT, 0),
498SND_SOC_DAPM_AIF_IN("AIF1RX7", NULL, 0,
499 ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX7_ENA_SHIFT, 0),
500SND_SOC_DAPM_AIF_IN("AIF1RX8", NULL, 0,
501 ARIZONA_AIF1_RX_ENABLES, ARIZONA_AIF1RX8_ENA_SHIFT, 0),
502
503SND_SOC_DAPM_AIF_OUT("AIF2TX1", NULL, 0,
504 ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX1_ENA_SHIFT, 0),
505SND_SOC_DAPM_AIF_OUT("AIF2TX2", NULL, 0,
506 ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX2_ENA_SHIFT, 0),
507SND_SOC_DAPM_AIF_OUT("AIF2TX3", NULL, 0,
508 ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX3_ENA_SHIFT, 0),
509SND_SOC_DAPM_AIF_OUT("AIF2TX4", NULL, 0,
510 ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX4_ENA_SHIFT, 0),
511SND_SOC_DAPM_AIF_OUT("AIF2TX5", NULL, 0,
512 ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX5_ENA_SHIFT, 0),
513SND_SOC_DAPM_AIF_OUT("AIF2TX6", NULL, 0,
514 ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX6_ENA_SHIFT, 0),
515
516SND_SOC_DAPM_AIF_IN("AIF2RX1", NULL, 0,
517 ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX1_ENA_SHIFT, 0),
518SND_SOC_DAPM_AIF_IN("AIF2RX2", NULL, 0,
519 ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX2_ENA_SHIFT, 0),
520SND_SOC_DAPM_AIF_IN("AIF2RX3", NULL, 0,
521 ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX3_ENA_SHIFT, 0),
522SND_SOC_DAPM_AIF_IN("AIF2RX4", NULL, 0,
523 ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX4_ENA_SHIFT, 0),
524SND_SOC_DAPM_AIF_IN("AIF2RX5", NULL, 0,
525 ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX5_ENA_SHIFT, 0),
526SND_SOC_DAPM_AIF_IN("AIF2RX6", NULL, 0,
527 ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX6_ENA_SHIFT, 0),
528
529SND_SOC_DAPM_AIF_OUT("AIF3TX1", NULL, 0,
530 ARIZONA_AIF3_TX_ENABLES, ARIZONA_AIF3TX1_ENA_SHIFT, 0),
531SND_SOC_DAPM_AIF_OUT("AIF3TX2", NULL, 0,
532 ARIZONA_AIF3_TX_ENABLES, ARIZONA_AIF3TX2_ENA_SHIFT, 0),
533
534SND_SOC_DAPM_AIF_IN("AIF3RX1", NULL, 0,
535 ARIZONA_AIF3_RX_ENABLES, ARIZONA_AIF3RX1_ENA_SHIFT, 0),
536SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 0,
537 ARIZONA_AIF3_RX_ENABLES, ARIZONA_AIF3RX2_ENA_SHIFT, 0),
538
539SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM,
540 ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
541 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
542 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
543SND_SOC_DAPM_PGA_E("OUT1R", SND_SOC_NOPM,
544 ARIZONA_OUT1R_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
545 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
546 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
547
548ARIZONA_MIXER_WIDGETS(EQ1, "EQ1"),
549ARIZONA_MIXER_WIDGETS(EQ2, "EQ2"),
550
551ARIZONA_MIXER_WIDGETS(DRC1L, "DRC1L"),
552ARIZONA_MIXER_WIDGETS(DRC1R, "DRC1R"),
553ARIZONA_MIXER_WIDGETS(DRC2L, "DRC2L"),
554ARIZONA_MIXER_WIDGETS(DRC2R, "DRC2R"),
555
556ARIZONA_MIXER_WIDGETS(LHPF1, "LHPF1"),
557ARIZONA_MIXER_WIDGETS(LHPF2, "LHPF2"),
558ARIZONA_MIXER_WIDGETS(LHPF3, "LHPF3"),
559ARIZONA_MIXER_WIDGETS(LHPF4, "LHPF4"),
560
561ARIZONA_MIXER_WIDGETS(PWM1, "PWM1"),
562ARIZONA_MIXER_WIDGETS(PWM2, "PWM2"),
563
564ARIZONA_MIXER_WIDGETS(OUT1L, "HPOUT1L"),
565ARIZONA_MIXER_WIDGETS(OUT1R, "HPOUT1R"),
566ARIZONA_MIXER_WIDGETS(SPKOUT, "SPKOUT"),
567
568ARIZONA_MIXER_WIDGETS(AIF1TX1, "AIF1TX1"),
569ARIZONA_MIXER_WIDGETS(AIF1TX2, "AIF1TX2"),
570ARIZONA_MIXER_WIDGETS(AIF1TX3, "AIF1TX3"),
571ARIZONA_MIXER_WIDGETS(AIF1TX4, "AIF1TX4"),
572ARIZONA_MIXER_WIDGETS(AIF1TX5, "AIF1TX5"),
573ARIZONA_MIXER_WIDGETS(AIF1TX6, "AIF1TX6"),
574ARIZONA_MIXER_WIDGETS(AIF1TX7, "AIF1TX7"),
575ARIZONA_MIXER_WIDGETS(AIF1TX8, "AIF1TX8"),
576
577ARIZONA_MIXER_WIDGETS(AIF2TX1, "AIF2TX1"),
578ARIZONA_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"),
579ARIZONA_MIXER_WIDGETS(AIF2TX3, "AIF2TX3"),
580ARIZONA_MIXER_WIDGETS(AIF2TX4, "AIF2TX4"),
581ARIZONA_MIXER_WIDGETS(AIF2TX5, "AIF2TX5"),
582ARIZONA_MIXER_WIDGETS(AIF2TX6, "AIF2TX6"),
583
584ARIZONA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),
585ARIZONA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"),
586
587ARIZONA_MUX_WIDGETS(ASRC1L, "ASRC1L"),
588ARIZONA_MUX_WIDGETS(ASRC1R, "ASRC1R"),
589ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"),
590ARIZONA_MUX_WIDGETS(ASRC2R, "ASRC2R"),
591
592ARIZONA_DSP_WIDGETS(DSP2, "DSP2"),
593ARIZONA_DSP_WIDGETS(DSP3, "DSP3"),
594
595ARIZONA_MUX_WIDGETS(ISRC1DEC1, "ISRC1DEC1"),
596ARIZONA_MUX_WIDGETS(ISRC1DEC2, "ISRC1DEC2"),
597ARIZONA_MUX_WIDGETS(ISRC1DEC3, "ISRC1DEC3"),
598ARIZONA_MUX_WIDGETS(ISRC1DEC4, "ISRC1DEC4"),
599
600ARIZONA_MUX_WIDGETS(ISRC1INT1, "ISRC1INT1"),
601ARIZONA_MUX_WIDGETS(ISRC1INT2, "ISRC1INT2"),
602ARIZONA_MUX_WIDGETS(ISRC1INT3, "ISRC1INT3"),
603ARIZONA_MUX_WIDGETS(ISRC1INT4, "ISRC1INT4"),
604
605ARIZONA_MUX_WIDGETS(ISRC2DEC1, "ISRC2DEC1"),
606ARIZONA_MUX_WIDGETS(ISRC2DEC2, "ISRC2DEC2"),
607ARIZONA_MUX_WIDGETS(ISRC2DEC3, "ISRC2DEC3"),
608ARIZONA_MUX_WIDGETS(ISRC2DEC4, "ISRC2DEC4"),
609
610ARIZONA_MUX_WIDGETS(ISRC2INT1, "ISRC2INT1"),
611ARIZONA_MUX_WIDGETS(ISRC2INT2, "ISRC2INT2"),
612ARIZONA_MUX_WIDGETS(ISRC2INT3, "ISRC2INT3"),
613ARIZONA_MUX_WIDGETS(ISRC2INT4, "ISRC2INT4"),
614
615ARIZONA_MUX_WIDGETS(ISRC3DEC1, "ISRC3DEC1"),
616ARIZONA_MUX_WIDGETS(ISRC3DEC2, "ISRC3DEC2"),
617ARIZONA_MUX_WIDGETS(ISRC3DEC3, "ISRC3DEC3"),
618ARIZONA_MUX_WIDGETS(ISRC3DEC4, "ISRC3DEC4"),
619
620ARIZONA_MUX_WIDGETS(ISRC3INT1, "ISRC3INT1"),
621ARIZONA_MUX_WIDGETS(ISRC3INT2, "ISRC3INT2"),
622ARIZONA_MUX_WIDGETS(ISRC3INT3, "ISRC3INT3"),
623ARIZONA_MUX_WIDGETS(ISRC3INT4, "ISRC3INT4"),
624
625SND_SOC_DAPM_OUTPUT("HPOUT1L"),
626SND_SOC_DAPM_OUTPUT("HPOUT1R"),
627SND_SOC_DAPM_OUTPUT("SPKOUTN"),
628SND_SOC_DAPM_OUTPUT("SPKOUTP"),
629
630SND_SOC_DAPM_OUTPUT("MICSUPP"),
631};
632
633#define ARIZONA_MIXER_INPUT_ROUTES(name) \
634 { name, "Noise Generator", "Noise Generator" }, \
635 { name, "Tone Generator 1", "Tone Generator 1" }, \
636 { name, "Tone Generator 2", "Tone Generator 2" }, \
637 { name, "Haptics", "HAPTICS" }, \
638 { name, "AEC", "AEC Loopback" }, \
639 { name, "IN1L", "IN1L PGA" }, \
640 { name, "IN1R", "IN1R PGA" }, \
641 { name, "IN2L", "IN2L PGA" }, \
642 { name, "IN2R", "IN2R PGA" }, \
643 { name, "AIF1RX1", "AIF1RX1" }, \
644 { name, "AIF1RX2", "AIF1RX2" }, \
645 { name, "AIF1RX3", "AIF1RX3" }, \
646 { name, "AIF1RX4", "AIF1RX4" }, \
647 { name, "AIF1RX5", "AIF1RX5" }, \
648 { name, "AIF1RX6", "AIF1RX6" }, \
649 { name, "AIF1RX7", "AIF1RX7" }, \
650 { name, "AIF1RX8", "AIF1RX8" }, \
651 { name, "AIF2RX1", "AIF2RX1" }, \
652 { name, "AIF2RX2", "AIF2RX2" }, \
653 { name, "AIF2RX3", "AIF2RX3" }, \
654 { name, "AIF2RX4", "AIF2RX4" }, \
655 { name, "AIF2RX5", "AIF2RX5" }, \
656 { name, "AIF2RX6", "AIF2RX6" }, \
657 { name, "AIF3RX1", "AIF3RX1" }, \
658 { name, "AIF3RX2", "AIF3RX2" }, \
659 { name, "EQ1", "EQ1" }, \
660 { name, "EQ2", "EQ2" }, \
661 { name, "DRC1L", "DRC1L" }, \
662 { name, "DRC1R", "DRC1R" }, \
663 { name, "DRC2L", "DRC2L" }, \
664 { name, "DRC2R", "DRC2R" }, \
665 { name, "LHPF1", "LHPF1" }, \
666 { name, "LHPF2", "LHPF2" }, \
667 { name, "LHPF3", "LHPF3" }, \
668 { name, "LHPF4", "LHPF4" }, \
669 { name, "ASRC1L", "ASRC1L" }, \
670 { name, "ASRC1R", "ASRC1R" }, \
671 { name, "ASRC2L", "ASRC2L" }, \
672 { name, "ASRC2R", "ASRC2R" }, \
673 { name, "ISRC1DEC1", "ISRC1DEC1" }, \
674 { name, "ISRC1DEC2", "ISRC1DEC2" }, \
675 { name, "ISRC1DEC3", "ISRC1DEC3" }, \
676 { name, "ISRC1DEC4", "ISRC1DEC4" }, \
677 { name, "ISRC1INT1", "ISRC1INT1" }, \
678 { name, "ISRC1INT2", "ISRC1INT2" }, \
679 { name, "ISRC1INT3", "ISRC1INT3" }, \
680 { name, "ISRC1INT4", "ISRC1INT4" }, \
681 { name, "ISRC2DEC1", "ISRC2DEC1" }, \
682 { name, "ISRC2DEC2", "ISRC2DEC2" }, \
683 { name, "ISRC2DEC3", "ISRC2DEC3" }, \
684 { name, "ISRC2DEC4", "ISRC2DEC4" }, \
685 { name, "ISRC2INT1", "ISRC2INT1" }, \
686 { name, "ISRC2INT2", "ISRC2INT2" }, \
687 { name, "ISRC2INT3", "ISRC2INT3" }, \
688 { name, "ISRC2INT4", "ISRC2INT4" }, \
689 { name, "ISRC3DEC1", "ISRC3DEC1" }, \
690 { name, "ISRC3DEC2", "ISRC3DEC2" }, \
691 { name, "ISRC3DEC3", "ISRC3DEC3" }, \
692 { name, "ISRC3DEC4", "ISRC3DEC4" }, \
693 { name, "ISRC3INT1", "ISRC3INT1" }, \
694 { name, "ISRC3INT2", "ISRC3INT2" }, \
695 { name, "ISRC3INT3", "ISRC3INT3" }, \
696 { name, "ISRC3INT4", "ISRC3INT4" }, \
697 { name, "DSP2.1", "DSP2" }, \
698 { name, "DSP2.2", "DSP2" }, \
699 { name, "DSP2.3", "DSP2" }, \
700 { name, "DSP2.4", "DSP2" }, \
701 { name, "DSP2.5", "DSP2" }, \
702 { name, "DSP2.6", "DSP2" }, \
703 { name, "DSP3.1", "DSP3" }, \
704 { name, "DSP3.2", "DSP3" }, \
705 { name, "DSP3.3", "DSP3" }, \
706 { name, "DSP3.4", "DSP3" }, \
707 { name, "DSP3.5", "DSP3" }, \
708 { name, "DSP3.6", "DSP3" }
709
710static const struct snd_soc_dapm_route cs47l24_dapm_routes[] = {
711 { "OUT1L", NULL, "CPVDD" },
712 { "OUT1R", NULL, "CPVDD" },
713
714 { "OUT4L", NULL, "SPKVDD" },
715
716 { "OUT1L", NULL, "SYSCLK" },
717 { "OUT1R", NULL, "SYSCLK" },
718 { "OUT4L", NULL, "SYSCLK" },
719
720 { "IN1L", NULL, "SYSCLK" },
721 { "IN1R", NULL, "SYSCLK" },
722 { "IN2L", NULL, "SYSCLK" },
723 { "IN2R", NULL, "SYSCLK" },
724
725 { "MICBIAS1", NULL, "MICVDD" },
726 { "MICBIAS2", NULL, "MICVDD" },
727
728 { "Noise Generator", NULL, "SYSCLK" },
729 { "Tone Generator 1", NULL, "SYSCLK" },
730 { "Tone Generator 2", NULL, "SYSCLK" },
731
732 { "Noise Generator", NULL, "NOISE" },
733 { "Tone Generator 1", NULL, "TONE" },
734 { "Tone Generator 2", NULL, "TONE" },
735
736 { "AIF1 Capture", NULL, "AIF1TX1" },
737 { "AIF1 Capture", NULL, "AIF1TX2" },
738 { "AIF1 Capture", NULL, "AIF1TX3" },
739 { "AIF1 Capture", NULL, "AIF1TX4" },
740 { "AIF1 Capture", NULL, "AIF1TX5" },
741 { "AIF1 Capture", NULL, "AIF1TX6" },
742 { "AIF1 Capture", NULL, "AIF1TX7" },
743 { "AIF1 Capture", NULL, "AIF1TX8" },
744
745 { "AIF1RX1", NULL, "AIF1 Playback" },
746 { "AIF1RX2", NULL, "AIF1 Playback" },
747 { "AIF1RX3", NULL, "AIF1 Playback" },
748 { "AIF1RX4", NULL, "AIF1 Playback" },
749 { "AIF1RX5", NULL, "AIF1 Playback" },
750 { "AIF1RX6", NULL, "AIF1 Playback" },
751 { "AIF1RX7", NULL, "AIF1 Playback" },
752 { "AIF1RX8", NULL, "AIF1 Playback" },
753
754 { "AIF2 Capture", NULL, "AIF2TX1" },
755 { "AIF2 Capture", NULL, "AIF2TX2" },
756 { "AIF2 Capture", NULL, "AIF2TX3" },
757 { "AIF2 Capture", NULL, "AIF2TX4" },
758 { "AIF2 Capture", NULL, "AIF2TX5" },
759 { "AIF2 Capture", NULL, "AIF2TX6" },
760
761 { "AIF2RX1", NULL, "AIF2 Playback" },
762 { "AIF2RX2", NULL, "AIF2 Playback" },
763 { "AIF2RX3", NULL, "AIF2 Playback" },
764 { "AIF2RX4", NULL, "AIF2 Playback" },
765 { "AIF2RX5", NULL, "AIF2 Playback" },
766 { "AIF2RX6", NULL, "AIF2 Playback" },
767
768 { "AIF3 Capture", NULL, "AIF3TX1" },
769 { "AIF3 Capture", NULL, "AIF3TX2" },
770
771 { "AIF3RX1", NULL, "AIF3 Playback" },
772 { "AIF3RX2", NULL, "AIF3 Playback" },
773
774 { "AIF1 Playback", NULL, "SYSCLK" },
775 { "AIF2 Playback", NULL, "SYSCLK" },
776 { "AIF3 Playback", NULL, "SYSCLK" },
777
778 { "AIF1 Capture", NULL, "SYSCLK" },
779 { "AIF2 Capture", NULL, "SYSCLK" },
780 { "AIF3 Capture", NULL, "SYSCLK" },
781
782 { "IN1L PGA", NULL, "IN1L" },
783 { "IN1R PGA", NULL, "IN1R" },
784
785 { "IN2L PGA", NULL, "IN2L" },
786 { "IN2R PGA", NULL, "IN2R" },
787
788 ARIZONA_MIXER_ROUTES("OUT1L", "HPOUT1L"),
789 ARIZONA_MIXER_ROUTES("OUT1R", "HPOUT1R"),
790
791 ARIZONA_MIXER_ROUTES("OUT4L", "SPKOUT"),
792
793 ARIZONA_MIXER_ROUTES("PWM1 Driver", "PWM1"),
794 ARIZONA_MIXER_ROUTES("PWM2 Driver", "PWM2"),
795
796 ARIZONA_MIXER_ROUTES("AIF1TX1", "AIF1TX1"),
797 ARIZONA_MIXER_ROUTES("AIF1TX2", "AIF1TX2"),
798 ARIZONA_MIXER_ROUTES("AIF1TX3", "AIF1TX3"),
799 ARIZONA_MIXER_ROUTES("AIF1TX4", "AIF1TX4"),
800 ARIZONA_MIXER_ROUTES("AIF1TX5", "AIF1TX5"),
801 ARIZONA_MIXER_ROUTES("AIF1TX6", "AIF1TX6"),
802 ARIZONA_MIXER_ROUTES("AIF1TX7", "AIF1TX7"),
803 ARIZONA_MIXER_ROUTES("AIF1TX8", "AIF1TX8"),
804
805 ARIZONA_MIXER_ROUTES("AIF2TX1", "AIF2TX1"),
806 ARIZONA_MIXER_ROUTES("AIF2TX2", "AIF2TX2"),
807 ARIZONA_MIXER_ROUTES("AIF2TX3", "AIF2TX3"),
808 ARIZONA_MIXER_ROUTES("AIF2TX4", "AIF2TX4"),
809 ARIZONA_MIXER_ROUTES("AIF2TX5", "AIF2TX5"),
810 ARIZONA_MIXER_ROUTES("AIF2TX6", "AIF2TX6"),
811
812 ARIZONA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),
813 ARIZONA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),
814
815 ARIZONA_MIXER_ROUTES("EQ1", "EQ1"),
816 ARIZONA_MIXER_ROUTES("EQ2", "EQ2"),
817
818 ARIZONA_MIXER_ROUTES("DRC1L", "DRC1L"),
819 ARIZONA_MIXER_ROUTES("DRC1R", "DRC1R"),
820 ARIZONA_MIXER_ROUTES("DRC2L", "DRC2L"),
821 ARIZONA_MIXER_ROUTES("DRC2R", "DRC2R"),
822
823 ARIZONA_MIXER_ROUTES("LHPF1", "LHPF1"),
824 ARIZONA_MIXER_ROUTES("LHPF2", "LHPF2"),
825 ARIZONA_MIXER_ROUTES("LHPF3", "LHPF3"),
826 ARIZONA_MIXER_ROUTES("LHPF4", "LHPF4"),
827
828 ARIZONA_MUX_ROUTES("ASRC1L", "ASRC1L"),
829 ARIZONA_MUX_ROUTES("ASRC1R", "ASRC1R"),
830 ARIZONA_MUX_ROUTES("ASRC2L", "ASRC2L"),
831 ARIZONA_MUX_ROUTES("ASRC2R", "ASRC2R"),
832
833 ARIZONA_DSP_ROUTES("DSP2"),
834 ARIZONA_DSP_ROUTES("DSP3"),
835
836 ARIZONA_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"),
837 ARIZONA_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"),
838 ARIZONA_MUX_ROUTES("ISRC1INT3", "ISRC1INT3"),
839 ARIZONA_MUX_ROUTES("ISRC1INT4", "ISRC1INT4"),
840
841 ARIZONA_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"),
842 ARIZONA_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"),
843 ARIZONA_MUX_ROUTES("ISRC1DEC3", "ISRC1DEC3"),
844 ARIZONA_MUX_ROUTES("ISRC1DEC4", "ISRC1DEC4"),
845
846 ARIZONA_MUX_ROUTES("ISRC2INT1", "ISRC2INT1"),
847 ARIZONA_MUX_ROUTES("ISRC2INT2", "ISRC2INT2"),
848 ARIZONA_MUX_ROUTES("ISRC2INT3", "ISRC2INT3"),
849 ARIZONA_MUX_ROUTES("ISRC2INT4", "ISRC2INT4"),
850
851 ARIZONA_MUX_ROUTES("ISRC2DEC1", "ISRC2DEC1"),
852 ARIZONA_MUX_ROUTES("ISRC2DEC2", "ISRC2DEC2"),
853 ARIZONA_MUX_ROUTES("ISRC2DEC3", "ISRC2DEC3"),
854 ARIZONA_MUX_ROUTES("ISRC2DEC4", "ISRC2DEC4"),
855
856 ARIZONA_MUX_ROUTES("ISRC3INT1", "ISRC3INT1"),
857 ARIZONA_MUX_ROUTES("ISRC3INT2", "ISRC3INT2"),
858 ARIZONA_MUX_ROUTES("ISRC3INT3", "ISRC3INT3"),
859 ARIZONA_MUX_ROUTES("ISRC3INT4", "ISRC3INT4"),
860
861 ARIZONA_MUX_ROUTES("ISRC3DEC1", "ISRC3DEC1"),
862 ARIZONA_MUX_ROUTES("ISRC3DEC2", "ISRC3DEC2"),
863 ARIZONA_MUX_ROUTES("ISRC3DEC3", "ISRC3DEC3"),
864 ARIZONA_MUX_ROUTES("ISRC3DEC4", "ISRC3DEC4"),
865
866 { "AEC Loopback", "HPOUT1L", "OUT1L" },
867 { "AEC Loopback", "HPOUT1R", "OUT1R" },
868 { "HPOUT1L", NULL, "OUT1L" },
869 { "HPOUT1R", NULL, "OUT1R" },
870
871 { "AEC Loopback", "SPKOUT", "OUT4L" },
872 { "SPKOUTN", NULL, "OUT4L" },
873 { "SPKOUTP", NULL, "OUT4L" },
874
875 { "MICSUPP", NULL, "SYSCLK" },
876
877 { "DRC1 Signal Activity", NULL, "DRC1L" },
878 { "DRC1 Signal Activity", NULL, "DRC1R" },
879 { "DRC2 Signal Activity", NULL, "DRC2L" },
880 { "DRC2 Signal Activity", NULL, "DRC2R" },
881};
882
883static int cs47l24_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
884 unsigned int Fref, unsigned int Fout)
885{
886 struct cs47l24_priv *cs47l24 = snd_soc_codec_get_drvdata(codec);
887
888 switch (fll_id) {
889 case CS47L24_FLL1:
890 return arizona_set_fll(&cs47l24->fll[0], source, Fref, Fout);
891 case CS47L24_FLL2:
892 return arizona_set_fll(&cs47l24->fll[1], source, Fref, Fout);
893 case CS47L24_FLL1_REFCLK:
894 return arizona_set_fll_refclk(&cs47l24->fll[0], source, Fref,
895 Fout);
896 case CS47L24_FLL2_REFCLK:
897 return arizona_set_fll_refclk(&cs47l24->fll[1], source, Fref,
898 Fout);
899 default:
900 return -EINVAL;
901 }
902}
903
904#define CS47L24_RATES SNDRV_PCM_RATE_8000_192000
905
906#define CS47L24_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
907 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
908
909static struct snd_soc_dai_driver cs47l24_dai[] = {
910 {
911 .name = "cs47l24-aif1",
912 .id = 1,
913 .base = ARIZONA_AIF1_BCLK_CTRL,
914 .playback = {
915 .stream_name = "AIF1 Playback",
916 .channels_min = 1,
917 .channels_max = 8,
918 .rates = CS47L24_RATES,
919 .formats = CS47L24_FORMATS,
920 },
921 .capture = {
922 .stream_name = "AIF1 Capture",
923 .channels_min = 1,
924 .channels_max = 8,
925 .rates = CS47L24_RATES,
926 .formats = CS47L24_FORMATS,
927 },
928 .ops = &arizona_dai_ops,
929 .symmetric_rates = 1,
930 .symmetric_samplebits = 1,
931 },
932 {
933 .name = "cs47l24-aif2",
934 .id = 2,
935 .base = ARIZONA_AIF2_BCLK_CTRL,
936 .playback = {
937 .stream_name = "AIF2 Playback",
938 .channels_min = 1,
939 .channels_max = 6,
940 .rates = CS47L24_RATES,
941 .formats = CS47L24_FORMATS,
942 },
943 .capture = {
944 .stream_name = "AIF2 Capture",
945 .channels_min = 1,
946 .channels_max = 6,
947 .rates = CS47L24_RATES,
948 .formats = CS47L24_FORMATS,
949 },
950 .ops = &arizona_dai_ops,
951 .symmetric_rates = 1,
952 .symmetric_samplebits = 1,
953 },
954 {
955 .name = "cs47l24-aif3",
956 .id = 3,
957 .base = ARIZONA_AIF3_BCLK_CTRL,
958 .playback = {
959 .stream_name = "AIF3 Playback",
960 .channels_min = 1,
961 .channels_max = 2,
962 .rates = CS47L24_RATES,
963 .formats = CS47L24_FORMATS,
964 },
965 .capture = {
966 .stream_name = "AIF3 Capture",
967 .channels_min = 1,
968 .channels_max = 2,
969 .rates = CS47L24_RATES,
970 .formats = CS47L24_FORMATS,
971 },
972 .ops = &arizona_dai_ops,
973 .symmetric_rates = 1,
974 .symmetric_samplebits = 1,
975 },
976};
977
978static int cs47l24_codec_probe(struct snd_soc_codec *codec)
979{
980 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
981 struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(codec);
982 int ret;
983
984 priv->core.arizona->dapm = dapm;
985
986 arizona_init_spk(codec);
987 arizona_init_gpio(codec);
988 arizona_init_mono(codec);
989
990 ret = wm_adsp2_codec_probe(&priv->core.adsp[1], codec);
991 if (ret)
992 goto err_adsp2_codec_probe;
993
994 ret = wm_adsp2_codec_probe(&priv->core.adsp[2], codec);
995 if (ret)
996 goto err_adsp2_codec_probe;
997
998 ret = snd_soc_add_codec_controls(codec,
999 &arizona_adsp2_rate_controls[1], 2);
1000 if (ret)
1001 goto err_adsp2_codec_probe;
1002
1003 snd_soc_dapm_disable_pin(dapm, "HAPTICS");
1004
1005 return 0;
1006
1007err_adsp2_codec_probe:
1008 wm_adsp2_codec_remove(&priv->core.adsp[1], codec);
1009 wm_adsp2_codec_remove(&priv->core.adsp[2], codec);
1010
1011 return ret;
1012}
1013
1014static int cs47l24_codec_remove(struct snd_soc_codec *codec)
1015{
1016 struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(codec);
1017
1018
1019 wm_adsp2_codec_remove(&priv->core.adsp[1], codec);
1020 wm_adsp2_codec_remove(&priv->core.adsp[2], codec);
1021
1022 priv->core.arizona->dapm = NULL;
1023
1024 return 0;
1025}
1026
1027#define CS47L24_DIG_VU 0x0200
1028
1029static unsigned int cs47l24_digital_vu[] = {
1030 ARIZONA_DAC_DIGITAL_VOLUME_1L,
1031 ARIZONA_DAC_DIGITAL_VOLUME_1R,
1032 ARIZONA_DAC_DIGITAL_VOLUME_4L,
1033};
1034
1035static struct regmap *cs47l24_get_regmap(struct device *dev)
1036{
1037 struct cs47l24_priv *priv = dev_get_drvdata(dev);
1038
1039 return priv->core.arizona->regmap;
1040}
1041
1042static struct snd_soc_codec_driver soc_codec_dev_cs47l24 = {
1043 .probe = cs47l24_codec_probe,
1044 .remove = cs47l24_codec_remove,
1045 .get_regmap = cs47l24_get_regmap,
1046
1047 .idle_bias_off = true,
1048
1049 .set_sysclk = arizona_set_sysclk,
1050 .set_pll = cs47l24_set_fll,
1051
1052 .controls = cs47l24_snd_controls,
1053 .num_controls = ARRAY_SIZE(cs47l24_snd_controls),
1054 .dapm_widgets = cs47l24_dapm_widgets,
1055 .num_dapm_widgets = ARRAY_SIZE(cs47l24_dapm_widgets),
1056 .dapm_routes = cs47l24_dapm_routes,
1057 .num_dapm_routes = ARRAY_SIZE(cs47l24_dapm_routes),
1058};
1059
1060static int cs47l24_probe(struct platform_device *pdev)
1061{
1062 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1063 struct cs47l24_priv *cs47l24;
1064 int i, ret;
1065
1066 BUILD_BUG_ON(ARRAY_SIZE(cs47l24_dai) > ARIZONA_MAX_DAI);
1067
1068 cs47l24 = devm_kzalloc(&pdev->dev, sizeof(struct cs47l24_priv),
1069 GFP_KERNEL);
1070 if (!cs47l24)
1071 return -ENOMEM;
1072
1073 platform_set_drvdata(pdev, cs47l24);
1074
1075 cs47l24->core.arizona = arizona;
1076 cs47l24->core.num_inputs = 4;
1077
1078 for (i = 1; i <= 2; i++) {
1079 cs47l24->core.adsp[i].part = "cs47l24";
1080 cs47l24->core.adsp[i].num = i + 1;
1081 cs47l24->core.adsp[i].type = WMFW_ADSP2;
1082 cs47l24->core.adsp[i].dev = arizona->dev;
1083 cs47l24->core.adsp[i].regmap = arizona->regmap;
1084
1085 cs47l24->core.adsp[i].base = ARIZONA_DSP1_CONTROL_1 +
1086 (0x100 * i);
1087 cs47l24->core.adsp[i].mem = cs47l24_dsp_regions[i - 1];
1088 cs47l24->core.adsp[i].num_mems =
1089 ARRAY_SIZE(cs47l24_dsp2_regions);
1090
1091 ret = wm_adsp2_init(&cs47l24->core.adsp[i]);
1092 if (ret != 0)
1093 return ret;
1094 }
1095
1096 for (i = 0; i < ARRAY_SIZE(cs47l24->fll); i++)
1097 cs47l24->fll[i].vco_mult = 3;
1098
1099 arizona_init_fll(arizona, 1, ARIZONA_FLL1_CONTROL_1 - 1,
1100 ARIZONA_IRQ_FLL1_LOCK, ARIZONA_IRQ_FLL1_CLOCK_OK,
1101 &cs47l24->fll[0]);
1102 arizona_init_fll(arizona, 2, ARIZONA_FLL2_CONTROL_1 - 1,
1103 ARIZONA_IRQ_FLL2_LOCK, ARIZONA_IRQ_FLL2_CLOCK_OK,
1104 &cs47l24->fll[1]);
1105
1106 /* SR2 fixed at 8kHz, SR3 fixed at 16kHz */
1107 regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_2,
1108 ARIZONA_SAMPLE_RATE_2_MASK, 0x11);
1109 regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_3,
1110 ARIZONA_SAMPLE_RATE_3_MASK, 0x12);
1111
1112 for (i = 0; i < ARRAY_SIZE(cs47l24_dai); i++)
1113 arizona_init_dai(&cs47l24->core, i);
1114
1115 /* Latch volume update bits */
1116 for (i = 0; i < ARRAY_SIZE(cs47l24_digital_vu); i++)
1117 regmap_update_bits(arizona->regmap, cs47l24_digital_vu[i],
1118 CS47L24_DIG_VU, CS47L24_DIG_VU);
1119
1120 pm_runtime_enable(&pdev->dev);
1121 pm_runtime_idle(&pdev->dev);
1122
1123 return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_cs47l24,
1124 cs47l24_dai, ARRAY_SIZE(cs47l24_dai));
1125}
1126
1127static int cs47l24_remove(struct platform_device *pdev)
1128{
1129 snd_soc_unregister_codec(&pdev->dev);
1130 pm_runtime_disable(&pdev->dev);
1131
1132 return 0;
1133}
1134
1135static struct platform_driver cs47l24_codec_driver = {
1136 .driver = {
1137 .name = "cs47l24-codec",
1138 },
1139 .probe = cs47l24_probe,
1140 .remove = cs47l24_remove,
1141};
1142
1143module_platform_driver(cs47l24_codec_driver);
1144
1145MODULE_DESCRIPTION("ASoC CS47L24 driver");
1146MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.wolfsonmicro.com>");
1147MODULE_LICENSE("GPL v2");
1148MODULE_ALIAS("platform:cs47l24-codec");
diff --git a/sound/soc/codecs/cs47l24.h b/sound/soc/codecs/cs47l24.h
new file mode 100644
index 000000000000..77ab2b77b2e6
--- /dev/null
+++ b/sound/soc/codecs/cs47l24.h
@@ -0,0 +1,23 @@
1/*
2 * cs47l24.h -- ALSA SoC Audio driver for Cirrus Logic CS47L24
3 *
4 * Copyright 2015 Cirrus Logic Inc.
5 *
6 * Author: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#ifndef _CS47L24_H
14#define _CS47L24_H
15
16#include "arizona.h"
17
18#define CS47L24_FLL1 1
19#define CS47L24_FLL2 2
20#define CS47L24_FLL1_REFCLK 3
21#define CS47L24_FLL2_REFCLK 4
22
23#endif
diff --git a/sound/soc/codecs/da7218.c b/sound/soc/codecs/da7218.c
new file mode 100644
index 000000000000..93575f251866
--- /dev/null
+++ b/sound/soc/codecs/da7218.c
@@ -0,0 +1,3341 @@
1/*
2 * da7218.c - DA7218 ALSA SoC Codec Driver
3 *
4 * Copyright (c) 2015 Dialog Semiconductor
5 *
6 * Author: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 */
13
14#include <linux/clk.h>
15#include <linux/i2c.h>
16#include <linux/of_device.h>
17#include <linux/regmap.h>
18#include <linux/slab.h>
19#include <linux/pm.h>
20#include <linux/module.h>
21#include <linux/delay.h>
22#include <linux/regulator/consumer.h>
23#include <sound/pcm.h>
24#include <sound/pcm_params.h>
25#include <sound/soc.h>
26#include <sound/soc-dapm.h>
27#include <sound/jack.h>
28#include <sound/initval.h>
29#include <sound/tlv.h>
30#include <asm/div64.h>
31
32#include <sound/da7218.h>
33#include "da7218.h"
34
35
36/*
37 * TLVs and Enums
38 */
39
40/* Input TLVs */
41static const DECLARE_TLV_DB_SCALE(da7218_mic_gain_tlv, -600, 600, 0);
42static const DECLARE_TLV_DB_SCALE(da7218_mixin_gain_tlv, -450, 150, 0);
43static const DECLARE_TLV_DB_SCALE(da7218_in_dig_gain_tlv, -8325, 75, 0);
44static const DECLARE_TLV_DB_SCALE(da7218_ags_trigger_tlv, -9000, 600, 0);
45static const DECLARE_TLV_DB_SCALE(da7218_ags_att_max_tlv, 0, 600, 0);
46static const DECLARE_TLV_DB_SCALE(da7218_alc_threshold_tlv, -9450, 150, 0);
47static const DECLARE_TLV_DB_SCALE(da7218_alc_gain_tlv, 0, 600, 0);
48static const DECLARE_TLV_DB_SCALE(da7218_alc_ana_gain_tlv, 0, 600, 0);
49
50/* Input/Output TLVs */
51static const DECLARE_TLV_DB_SCALE(da7218_dmix_gain_tlv, -4200, 150, 0);
52
53/* Output TLVs */
54static const DECLARE_TLV_DB_SCALE(da7218_dgs_trigger_tlv, -9450, 150, 0);
55static const DECLARE_TLV_DB_SCALE(da7218_dgs_anticlip_tlv, -4200, 600, 0);
56static const DECLARE_TLV_DB_SCALE(da7218_dgs_signal_tlv, -9000, 600, 0);
57static const DECLARE_TLV_DB_SCALE(da7218_out_eq_band_tlv, -1050, 150, 0);
58static const DECLARE_TLV_DB_SCALE(da7218_out_dig_gain_tlv, -8325, 75, 0);
59static const DECLARE_TLV_DB_SCALE(da7218_dac_ng_threshold_tlv, -10200, 600, 0);
60static const DECLARE_TLV_DB_SCALE(da7218_mixout_gain_tlv, -100, 50, 0);
61static const DECLARE_TLV_DB_SCALE(da7218_hp_gain_tlv, -5700, 150, 0);
62
63/* Input Enums */
64static const char * const da7218_alc_attack_rate_txt[] = {
65 "7.33/fs", "14.66/fs", "29.32/fs", "58.64/fs", "117.3/fs", "234.6/fs",
66 "469.1/fs", "938.2/fs", "1876/fs", "3753/fs", "7506/fs", "15012/fs",
67 "30024/fs",
68};
69
70static const struct soc_enum da7218_alc_attack_rate =
71 SOC_ENUM_SINGLE(DA7218_ALC_CTRL2, DA7218_ALC_ATTACK_SHIFT,
72 DA7218_ALC_ATTACK_MAX, da7218_alc_attack_rate_txt);
73
74static const char * const da7218_alc_release_rate_txt[] = {
75 "28.66/fs", "57.33/fs", "114.6/fs", "229.3/fs", "458.6/fs", "917.1/fs",
76 "1834/fs", "3668/fs", "7337/fs", "14674/fs", "29348/fs",
77};
78
79static const struct soc_enum da7218_alc_release_rate =
80 SOC_ENUM_SINGLE(DA7218_ALC_CTRL2, DA7218_ALC_RELEASE_SHIFT,
81 DA7218_ALC_RELEASE_MAX, da7218_alc_release_rate_txt);
82
83static const char * const da7218_alc_hold_time_txt[] = {
84 "62/fs", "124/fs", "248/fs", "496/fs", "992/fs", "1984/fs", "3968/fs",
85 "7936/fs", "15872/fs", "31744/fs", "63488/fs", "126976/fs",
86 "253952/fs", "507904/fs", "1015808/fs", "2031616/fs"
87};
88
89static const struct soc_enum da7218_alc_hold_time =
90 SOC_ENUM_SINGLE(DA7218_ALC_CTRL3, DA7218_ALC_HOLD_SHIFT,
91 DA7218_ALC_HOLD_MAX, da7218_alc_hold_time_txt);
92
93static const char * const da7218_alc_anticlip_step_txt[] = {
94 "0.034dB/fs", "0.068dB/fs", "0.136dB/fs", "0.272dB/fs",
95};
96
97static const struct soc_enum da7218_alc_anticlip_step =
98 SOC_ENUM_SINGLE(DA7218_ALC_ANTICLIP_CTRL,
99 DA7218_ALC_ANTICLIP_STEP_SHIFT,
100 DA7218_ALC_ANTICLIP_STEP_MAX,
101 da7218_alc_anticlip_step_txt);
102
103static const char * const da7218_integ_rate_txt[] = {
104 "1/4", "1/16", "1/256", "1/65536"
105};
106
107static const struct soc_enum da7218_integ_attack_rate =
108 SOC_ENUM_SINGLE(DA7218_ENV_TRACK_CTRL, DA7218_INTEG_ATTACK_SHIFT,
109 DA7218_INTEG_MAX, da7218_integ_rate_txt);
110
111static const struct soc_enum da7218_integ_release_rate =
112 SOC_ENUM_SINGLE(DA7218_ENV_TRACK_CTRL, DA7218_INTEG_RELEASE_SHIFT,
113 DA7218_INTEG_MAX, da7218_integ_rate_txt);
114
115/* Input/Output Enums */
116static const char * const da7218_gain_ramp_rate_txt[] = {
117 "Nominal Rate * 8", "Nominal Rate", "Nominal Rate / 8",
118 "Nominal Rate / 16",
119};
120
121static const struct soc_enum da7218_gain_ramp_rate =
122 SOC_ENUM_SINGLE(DA7218_GAIN_RAMP_CTRL, DA7218_GAIN_RAMP_RATE_SHIFT,
123 DA7218_GAIN_RAMP_RATE_MAX, da7218_gain_ramp_rate_txt);
124
125static const char * const da7218_hpf_mode_txt[] = {
126 "Disabled", "Audio", "Voice",
127};
128
129static const unsigned int da7218_hpf_mode_val[] = {
130 DA7218_HPF_DISABLED, DA7218_HPF_AUDIO_EN, DA7218_HPF_VOICE_EN,
131};
132
133static const struct soc_enum da7218_in1_hpf_mode =
134 SOC_VALUE_ENUM_SINGLE(DA7218_IN_1_HPF_FILTER_CTRL,
135 DA7218_HPF_MODE_SHIFT, DA7218_HPF_MODE_MASK,
136 DA7218_HPF_MODE_MAX, da7218_hpf_mode_txt,
137 da7218_hpf_mode_val);
138
139static const struct soc_enum da7218_in2_hpf_mode =
140 SOC_VALUE_ENUM_SINGLE(DA7218_IN_2_HPF_FILTER_CTRL,
141 DA7218_HPF_MODE_SHIFT, DA7218_HPF_MODE_MASK,
142 DA7218_HPF_MODE_MAX, da7218_hpf_mode_txt,
143 da7218_hpf_mode_val);
144
145static const struct soc_enum da7218_out1_hpf_mode =
146 SOC_VALUE_ENUM_SINGLE(DA7218_OUT_1_HPF_FILTER_CTRL,
147 DA7218_HPF_MODE_SHIFT, DA7218_HPF_MODE_MASK,
148 DA7218_HPF_MODE_MAX, da7218_hpf_mode_txt,
149 da7218_hpf_mode_val);
150
151static const char * const da7218_audio_hpf_corner_txt[] = {
152 "2Hz", "4Hz", "8Hz", "16Hz",
153};
154
155static const struct soc_enum da7218_in1_audio_hpf_corner =
156 SOC_ENUM_SINGLE(DA7218_IN_1_HPF_FILTER_CTRL,
157 DA7218_IN_1_AUDIO_HPF_CORNER_SHIFT,
158 DA7218_AUDIO_HPF_CORNER_MAX,
159 da7218_audio_hpf_corner_txt);
160
161static const struct soc_enum da7218_in2_audio_hpf_corner =
162 SOC_ENUM_SINGLE(DA7218_IN_2_HPF_FILTER_CTRL,
163 DA7218_IN_2_AUDIO_HPF_CORNER_SHIFT,
164 DA7218_AUDIO_HPF_CORNER_MAX,
165 da7218_audio_hpf_corner_txt);
166
167static const struct soc_enum da7218_out1_audio_hpf_corner =
168 SOC_ENUM_SINGLE(DA7218_OUT_1_HPF_FILTER_CTRL,
169 DA7218_OUT_1_AUDIO_HPF_CORNER_SHIFT,
170 DA7218_AUDIO_HPF_CORNER_MAX,
171 da7218_audio_hpf_corner_txt);
172
173static const char * const da7218_voice_hpf_corner_txt[] = {
174 "2.5Hz", "25Hz", "50Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz",
175};
176
177static const struct soc_enum da7218_in1_voice_hpf_corner =
178 SOC_ENUM_SINGLE(DA7218_IN_1_HPF_FILTER_CTRL,
179 DA7218_IN_1_VOICE_HPF_CORNER_SHIFT,
180 DA7218_VOICE_HPF_CORNER_MAX,
181 da7218_voice_hpf_corner_txt);
182
183static const struct soc_enum da7218_in2_voice_hpf_corner =
184 SOC_ENUM_SINGLE(DA7218_IN_2_HPF_FILTER_CTRL,
185 DA7218_IN_2_VOICE_HPF_CORNER_SHIFT,
186 DA7218_VOICE_HPF_CORNER_MAX,
187 da7218_voice_hpf_corner_txt);
188
189static const struct soc_enum da7218_out1_voice_hpf_corner =
190 SOC_ENUM_SINGLE(DA7218_OUT_1_HPF_FILTER_CTRL,
191 DA7218_OUT_1_VOICE_HPF_CORNER_SHIFT,
192 DA7218_VOICE_HPF_CORNER_MAX,
193 da7218_voice_hpf_corner_txt);
194
195static const char * const da7218_tonegen_dtmf_key_txt[] = {
196 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D",
197 "*", "#"
198};
199
200static const struct soc_enum da7218_tonegen_dtmf_key =
201 SOC_ENUM_SINGLE(DA7218_TONE_GEN_CFG1, DA7218_DTMF_REG_SHIFT,
202 DA7218_DTMF_REG_MAX, da7218_tonegen_dtmf_key_txt);
203
204static const char * const da7218_tonegen_swg_sel_txt[] = {
205 "Sum", "SWG1", "SWG2", "SWG1_1-Cos"
206};
207
208static const struct soc_enum da7218_tonegen_swg_sel =
209 SOC_ENUM_SINGLE(DA7218_TONE_GEN_CFG2, DA7218_SWG_SEL_SHIFT,
210 DA7218_SWG_SEL_MAX, da7218_tonegen_swg_sel_txt);
211
212/* Output Enums */
213static const char * const da7218_dgs_rise_coeff_txt[] = {
214 "1/1", "1/16", "1/64", "1/256", "1/1024", "1/4096", "1/16384",
215};
216
217static const struct soc_enum da7218_dgs_rise_coeff =
218 SOC_ENUM_SINGLE(DA7218_DGS_RISE_FALL, DA7218_DGS_RISE_COEFF_SHIFT,
219 DA7218_DGS_RISE_COEFF_MAX, da7218_dgs_rise_coeff_txt);
220
221static const char * const da7218_dgs_fall_coeff_txt[] = {
222 "1/4", "1/16", "1/64", "1/256", "1/1024", "1/4096", "1/16384", "1/65536",
223};
224
225static const struct soc_enum da7218_dgs_fall_coeff =
226 SOC_ENUM_SINGLE(DA7218_DGS_RISE_FALL, DA7218_DGS_FALL_COEFF_SHIFT,
227 DA7218_DGS_FALL_COEFF_MAX, da7218_dgs_fall_coeff_txt);
228
229static const char * const da7218_dac_ng_setup_time_txt[] = {
230 "256 Samples", "512 Samples", "1024 Samples", "2048 Samples"
231};
232
233static const struct soc_enum da7218_dac_ng_setup_time =
234 SOC_ENUM_SINGLE(DA7218_DAC_NG_SETUP_TIME,
235 DA7218_DAC_NG_SETUP_TIME_SHIFT,
236 DA7218_DAC_NG_SETUP_TIME_MAX,
237 da7218_dac_ng_setup_time_txt);
238
239static const char * const da7218_dac_ng_rampup_txt[] = {
240 "0.22ms/dB", "0.0138ms/dB"
241};
242
243static const struct soc_enum da7218_dac_ng_rampup_rate =
244 SOC_ENUM_SINGLE(DA7218_DAC_NG_SETUP_TIME,
245 DA7218_DAC_NG_RAMPUP_RATE_SHIFT,
246 DA7218_DAC_NG_RAMPUP_RATE_MAX,
247 da7218_dac_ng_rampup_txt);
248
249static const char * const da7218_dac_ng_rampdown_txt[] = {
250 "0.88ms/dB", "14.08ms/dB"
251};
252
253static const struct soc_enum da7218_dac_ng_rampdown_rate =
254 SOC_ENUM_SINGLE(DA7218_DAC_NG_SETUP_TIME,
255 DA7218_DAC_NG_RAMPDN_RATE_SHIFT,
256 DA7218_DAC_NG_RAMPDN_RATE_MAX,
257 da7218_dac_ng_rampdown_txt);
258
259static const char * const da7218_cp_mchange_txt[] = {
260 "Largest Volume", "DAC Volume", "Signal Magnitude"
261};
262
263static const unsigned int da7218_cp_mchange_val[] = {
264 DA7218_CP_MCHANGE_LARGEST_VOL, DA7218_CP_MCHANGE_DAC_VOL,
265 DA7218_CP_MCHANGE_SIG_MAG
266};
267
268static const struct soc_enum da7218_cp_mchange =
269 SOC_VALUE_ENUM_SINGLE(DA7218_CP_CTRL, DA7218_CP_MCHANGE_SHIFT,
270 DA7218_CP_MCHANGE_REL_MASK, DA7218_CP_MCHANGE_MAX,
271 da7218_cp_mchange_txt, da7218_cp_mchange_val);
272
273static const char * const da7218_cp_fcontrol_txt[] = {
274 "1MHz", "500KHz", "250KHz", "125KHz", "63KHz", "0KHz"
275};
276
277static const struct soc_enum da7218_cp_fcontrol =
278 SOC_ENUM_SINGLE(DA7218_CP_DELAY, DA7218_CP_FCONTROL_SHIFT,
279 DA7218_CP_FCONTROL_MAX, da7218_cp_fcontrol_txt);
280
281static const char * const da7218_cp_tau_delay_txt[] = {
282 "0ms", "2ms", "4ms", "16ms", "64ms", "128ms", "256ms", "512ms"
283};
284
285static const struct soc_enum da7218_cp_tau_delay =
286 SOC_ENUM_SINGLE(DA7218_CP_DELAY, DA7218_CP_TAU_DELAY_SHIFT,
287 DA7218_CP_TAU_DELAY_MAX, da7218_cp_tau_delay_txt);
288
289/*
290 * Control Functions
291 */
292
293/* ALC */
294static void da7218_alc_calib(struct snd_soc_codec *codec)
295{
296 u8 mic_1_ctrl, mic_2_ctrl;
297 u8 mixin_1_ctrl, mixin_2_ctrl;
298 u8 in_1l_filt_ctrl, in_1r_filt_ctrl, in_2l_filt_ctrl, in_2r_filt_ctrl;
299 u8 in_1_hpf_ctrl, in_2_hpf_ctrl;
300 u8 calib_ctrl;
301 int i = 0;
302 bool calibrated = false;
303
304 /* Save current state of MIC control registers */
305 mic_1_ctrl = snd_soc_read(codec, DA7218_MIC_1_CTRL);
306 mic_2_ctrl = snd_soc_read(codec, DA7218_MIC_2_CTRL);
307
308 /* Save current state of input mixer control registers */
309 mixin_1_ctrl = snd_soc_read(codec, DA7218_MIXIN_1_CTRL);
310 mixin_2_ctrl = snd_soc_read(codec, DA7218_MIXIN_2_CTRL);
311
312 /* Save current state of input filter control registers */
313 in_1l_filt_ctrl = snd_soc_read(codec, DA7218_IN_1L_FILTER_CTRL);
314 in_1r_filt_ctrl = snd_soc_read(codec, DA7218_IN_1R_FILTER_CTRL);
315 in_2l_filt_ctrl = snd_soc_read(codec, DA7218_IN_2L_FILTER_CTRL);
316 in_2r_filt_ctrl = snd_soc_read(codec, DA7218_IN_2R_FILTER_CTRL);
317
318 /* Save current state of input HPF control registers */
319 in_1_hpf_ctrl = snd_soc_read(codec, DA7218_IN_1_HPF_FILTER_CTRL);
320 in_2_hpf_ctrl = snd_soc_read(codec, DA7218_IN_2_HPF_FILTER_CTRL);
321
322 /* Enable then Mute MIC PGAs */
323 snd_soc_update_bits(codec, DA7218_MIC_1_CTRL, DA7218_MIC_1_AMP_EN_MASK,
324 DA7218_MIC_1_AMP_EN_MASK);
325 snd_soc_update_bits(codec, DA7218_MIC_2_CTRL, DA7218_MIC_2_AMP_EN_MASK,
326 DA7218_MIC_2_AMP_EN_MASK);
327 snd_soc_update_bits(codec, DA7218_MIC_1_CTRL,
328 DA7218_MIC_1_AMP_MUTE_EN_MASK,
329 DA7218_MIC_1_AMP_MUTE_EN_MASK);
330 snd_soc_update_bits(codec, DA7218_MIC_2_CTRL,
331 DA7218_MIC_2_AMP_MUTE_EN_MASK,
332 DA7218_MIC_2_AMP_MUTE_EN_MASK);
333
334 /* Enable input mixers unmuted */
335 snd_soc_update_bits(codec, DA7218_MIXIN_1_CTRL,
336 DA7218_MIXIN_1_AMP_EN_MASK |
337 DA7218_MIXIN_1_AMP_MUTE_EN_MASK,
338 DA7218_MIXIN_1_AMP_EN_MASK);
339 snd_soc_update_bits(codec, DA7218_MIXIN_2_CTRL,
340 DA7218_MIXIN_2_AMP_EN_MASK |
341 DA7218_MIXIN_2_AMP_MUTE_EN_MASK,
342 DA7218_MIXIN_2_AMP_EN_MASK);
343
344 /* Enable input filters unmuted */
345 snd_soc_update_bits(codec, DA7218_IN_1L_FILTER_CTRL,
346 DA7218_IN_1L_FILTER_EN_MASK |
347 DA7218_IN_1L_MUTE_EN_MASK,
348 DA7218_IN_1L_FILTER_EN_MASK);
349 snd_soc_update_bits(codec, DA7218_IN_1R_FILTER_CTRL,
350 DA7218_IN_1R_FILTER_EN_MASK |
351 DA7218_IN_1R_MUTE_EN_MASK,
352 DA7218_IN_1R_FILTER_EN_MASK);
353 snd_soc_update_bits(codec, DA7218_IN_2L_FILTER_CTRL,
354 DA7218_IN_2L_FILTER_EN_MASK |
355 DA7218_IN_2L_MUTE_EN_MASK,
356 DA7218_IN_2L_FILTER_EN_MASK);
357 snd_soc_update_bits(codec, DA7218_IN_2R_FILTER_CTRL,
358 DA7218_IN_2R_FILTER_EN_MASK |
359 DA7218_IN_2R_MUTE_EN_MASK,
360 DA7218_IN_2R_FILTER_EN_MASK);
361
362 /*
363 * Make sure input HPFs voice mode is disabled, otherwise for sampling
364 * rates above 32KHz the ADC signals will be stopped and will cause
365 * calibration to lock up.
366 */
367 snd_soc_update_bits(codec, DA7218_IN_1_HPF_FILTER_CTRL,
368 DA7218_IN_1_VOICE_EN_MASK, 0);
369 snd_soc_update_bits(codec, DA7218_IN_2_HPF_FILTER_CTRL,
370 DA7218_IN_2_VOICE_EN_MASK, 0);
371
372 /* Perform auto calibration */
373 snd_soc_update_bits(codec, DA7218_CALIB_CTRL, DA7218_CALIB_AUTO_EN_MASK,
374 DA7218_CALIB_AUTO_EN_MASK);
375 do {
376 calib_ctrl = snd_soc_read(codec, DA7218_CALIB_CTRL);
377 if (calib_ctrl & DA7218_CALIB_AUTO_EN_MASK) {
378 ++i;
379 usleep_range(DA7218_ALC_CALIB_DELAY_MIN,
380 DA7218_ALC_CALIB_DELAY_MAX);
381 } else {
382 calibrated = true;
383 }
384
385 } while ((i < DA7218_ALC_CALIB_MAX_TRIES) && (!calibrated));
386
387 /* If auto calibration fails, disable DC offset, hybrid ALC */
388 if ((!calibrated) || (calib_ctrl & DA7218_CALIB_OVERFLOW_MASK)) {
389 dev_warn(codec->dev,
390 "ALC auto calibration failed - %s\n",
391 (calibrated) ? "overflow" : "timeout");
392 snd_soc_update_bits(codec, DA7218_CALIB_CTRL,
393 DA7218_CALIB_OFFSET_EN_MASK, 0);
394 snd_soc_update_bits(codec, DA7218_ALC_CTRL1,
395 DA7218_ALC_SYNC_MODE_MASK, 0);
396
397 } else {
398 /* Enable DC offset cancellation */
399 snd_soc_update_bits(codec, DA7218_CALIB_CTRL,
400 DA7218_CALIB_OFFSET_EN_MASK,
401 DA7218_CALIB_OFFSET_EN_MASK);
402
403 /* Enable ALC hybrid mode */
404 snd_soc_update_bits(codec, DA7218_ALC_CTRL1,
405 DA7218_ALC_SYNC_MODE_MASK,
406 DA7218_ALC_SYNC_MODE_CH1 |
407 DA7218_ALC_SYNC_MODE_CH2);
408 }
409
410 /* Restore input HPF control registers to original states */
411 snd_soc_write(codec, DA7218_IN_1_HPF_FILTER_CTRL, in_1_hpf_ctrl);
412 snd_soc_write(codec, DA7218_IN_2_HPF_FILTER_CTRL, in_2_hpf_ctrl);
413
414 /* Restore input filter control registers to original states */
415 snd_soc_write(codec, DA7218_IN_1L_FILTER_CTRL, in_1l_filt_ctrl);
416 snd_soc_write(codec, DA7218_IN_1R_FILTER_CTRL, in_1r_filt_ctrl);
417 snd_soc_write(codec, DA7218_IN_2L_FILTER_CTRL, in_2l_filt_ctrl);
418 snd_soc_write(codec, DA7218_IN_2R_FILTER_CTRL, in_2r_filt_ctrl);
419
420 /* Restore input mixer control registers to original state */
421 snd_soc_write(codec, DA7218_MIXIN_1_CTRL, mixin_1_ctrl);
422 snd_soc_write(codec, DA7218_MIXIN_2_CTRL, mixin_2_ctrl);
423
424 /* Restore MIC control registers to original states */
425 snd_soc_write(codec, DA7218_MIC_1_CTRL, mic_1_ctrl);
426 snd_soc_write(codec, DA7218_MIC_2_CTRL, mic_2_ctrl);
427}
428
429static int da7218_mixin_gain_put(struct snd_kcontrol *kcontrol,
430 struct snd_ctl_elem_value *ucontrol)
431{
432 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
433 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
434 int ret;
435
436 ret = snd_soc_put_volsw(kcontrol, ucontrol);
437
438 /*
439 * If ALC in operation and value of control has been updated,
440 * make sure calibrated offsets are updated.
441 */
442 if ((ret == 1) && (da7218->alc_en))
443 da7218_alc_calib(codec);
444
445 return ret;
446}
447
448static int da7218_alc_sw_put(struct snd_kcontrol *kcontrol,
449 struct snd_ctl_elem_value *ucontrol)
450{
451 struct soc_mixer_control *mc =
452 (struct soc_mixer_control *) kcontrol->private_value;
453 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
454 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
455 unsigned int lvalue = ucontrol->value.integer.value[0];
456 unsigned int rvalue = ucontrol->value.integer.value[1];
457 unsigned int lshift = mc->shift;
458 unsigned int rshift = mc->rshift;
459 unsigned int mask = (mc->max << lshift) | (mc->max << rshift);
460
461 /* Force ALC offset calibration if enabling ALC */
462 if ((lvalue || rvalue) && (!da7218->alc_en))
463 da7218_alc_calib(codec);
464
465 /* Update bits to detail which channels are enabled/disabled */
466 da7218->alc_en &= ~mask;
467 da7218->alc_en |= (lvalue << lshift) | (rvalue << rshift);
468
469 return snd_soc_put_volsw(kcontrol, ucontrol);
470}
471
472/* ToneGen */
473static int da7218_tonegen_freq_get(struct snd_kcontrol *kcontrol,
474 struct snd_ctl_elem_value *ucontrol)
475{
476 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
477 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
478 struct soc_mixer_control *mixer_ctrl =
479 (struct soc_mixer_control *) kcontrol->private_value;
480 unsigned int reg = mixer_ctrl->reg;
481 u16 val;
482 int ret;
483
484 /*
485 * Frequency value spans two 8-bit registers, lower then upper byte.
486 * Therefore we need to convert to host endianness here.
487 */
488 ret = regmap_raw_read(da7218->regmap, reg, &val, 2);
489 if (ret)
490 return ret;
491
492 ucontrol->value.integer.value[0] = le16_to_cpu(val);
493
494 return 0;
495}
496
497static int da7218_tonegen_freq_put(struct snd_kcontrol *kcontrol,
498 struct snd_ctl_elem_value *ucontrol)
499{
500 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
501 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
502 struct soc_mixer_control *mixer_ctrl =
503 (struct soc_mixer_control *) kcontrol->private_value;
504 unsigned int reg = mixer_ctrl->reg;
505 u16 val;
506
507 /*
508 * Frequency value spans two 8-bit registers, lower then upper byte.
509 * Therefore we need to convert to little endian here to align with
510 * HW registers.
511 */
512 val = cpu_to_le16(ucontrol->value.integer.value[0]);
513
514 return regmap_raw_write(da7218->regmap, reg, &val, 2);
515}
516
517static int da7218_mic_lvl_det_sw_put(struct snd_kcontrol *kcontrol,
518 struct snd_ctl_elem_value *ucontrol)
519{
520 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
521 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
522 struct soc_mixer_control *mixer_ctrl =
523 (struct soc_mixer_control *) kcontrol->private_value;
524 unsigned int lvalue = ucontrol->value.integer.value[0];
525 unsigned int rvalue = ucontrol->value.integer.value[1];
526 unsigned int lshift = mixer_ctrl->shift;
527 unsigned int rshift = mixer_ctrl->rshift;
528 unsigned int mask = (mixer_ctrl->max << lshift) |
529 (mixer_ctrl->max << rshift);
530 da7218->mic_lvl_det_en &= ~mask;
531 da7218->mic_lvl_det_en |= (lvalue << lshift) | (rvalue << rshift);
532
533 /*
534 * Here we only enable the feature on paths which are already
535 * powered. If a channel is enabled here for level detect, but that path
536 * isn't powered, then the channel will actually be enabled when we do
537 * power the path (IN_FILTER widget events). This handling avoids
538 * unwanted level detect events.
539 */
540 return snd_soc_write(codec, mixer_ctrl->reg,
541 (da7218->in_filt_en & da7218->mic_lvl_det_en));
542}
543
544static int da7218_mic_lvl_det_sw_get(struct snd_kcontrol *kcontrol,
545 struct snd_ctl_elem_value *ucontrol)
546{
547 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
548 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
549 struct soc_mixer_control *mixer_ctrl =
550 (struct soc_mixer_control *) kcontrol->private_value;
551 unsigned int lshift = mixer_ctrl->shift;
552 unsigned int rshift = mixer_ctrl->rshift;
553 unsigned int lmask = (mixer_ctrl->max << lshift);
554 unsigned int rmask = (mixer_ctrl->max << rshift);
555
556 ucontrol->value.integer.value[0] =
557 (da7218->mic_lvl_det_en & lmask) >> lshift;
558 ucontrol->value.integer.value[1] =
559 (da7218->mic_lvl_det_en & rmask) >> rshift;
560
561 return 0;
562}
563
564static int da7218_biquad_coeff_get(struct snd_kcontrol *kcontrol,
565 struct snd_ctl_elem_value *ucontrol)
566{
567 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
568 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
569 struct soc_bytes_ext *bytes_ext =
570 (struct soc_bytes_ext *) kcontrol->private_value;
571
572 /* Determine which BiQuads we're setting based on size of config data */
573 switch (bytes_ext->max) {
574 case DA7218_OUT_1_BIQ_5STAGE_CFG_SIZE:
575 memcpy(ucontrol->value.bytes.data, da7218->biq_5stage_coeff,
576 bytes_ext->max);
577 break;
578 case DA7218_SIDETONE_BIQ_3STAGE_CFG_SIZE:
579 memcpy(ucontrol->value.bytes.data, da7218->stbiq_3stage_coeff,
580 bytes_ext->max);
581 break;
582 default:
583 return -EINVAL;
584 }
585
586 return 0;
587}
588
589static int da7218_biquad_coeff_put(struct snd_kcontrol *kcontrol,
590 struct snd_ctl_elem_value *ucontrol)
591{
592 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
593 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
594 struct soc_bytes_ext *bytes_ext =
595 (struct soc_bytes_ext *) kcontrol->private_value;
596 u8 reg, out_filt1l;
597 u8 cfg[DA7218_BIQ_CFG_SIZE];
598 int i;
599
600 /*
601 * Determine which BiQuads we're setting based on size of config data,
602 * and stored the data for use by get function.
603 */
604 switch (bytes_ext->max) {
605 case DA7218_OUT_1_BIQ_5STAGE_CFG_SIZE:
606 reg = DA7218_OUT_1_BIQ_5STAGE_DATA;
607 memcpy(da7218->biq_5stage_coeff, ucontrol->value.bytes.data,
608 bytes_ext->max);
609 break;
610 case DA7218_SIDETONE_BIQ_3STAGE_CFG_SIZE:
611 reg = DA7218_SIDETONE_BIQ_3STAGE_DATA;
612 memcpy(da7218->stbiq_3stage_coeff, ucontrol->value.bytes.data,
613 bytes_ext->max);
614 break;
615 default:
616 return -EINVAL;
617 }
618
619 /* Make sure at least out filter1 enabled to allow programming */
620 out_filt1l = snd_soc_read(codec, DA7218_OUT_1L_FILTER_CTRL);
621 snd_soc_write(codec, DA7218_OUT_1L_FILTER_CTRL,
622 out_filt1l | DA7218_OUT_1L_FILTER_EN_MASK);
623
624 for (i = 0; i < bytes_ext->max; ++i) {
625 cfg[DA7218_BIQ_CFG_DATA] = ucontrol->value.bytes.data[i];
626 cfg[DA7218_BIQ_CFG_ADDR] = i;
627 regmap_raw_write(da7218->regmap, reg, cfg, DA7218_BIQ_CFG_SIZE);
628 }
629
630 /* Restore filter to previous setting */
631 snd_soc_write(codec, DA7218_OUT_1L_FILTER_CTRL, out_filt1l);
632
633 return 0;
634}
635
636
637/*
638 * KControls
639 */
640
641static const struct snd_kcontrol_new da7218_snd_controls[] = {
642 /* Mics */
643 SOC_SINGLE_TLV("Mic1 Volume", DA7218_MIC_1_GAIN,
644 DA7218_MIC_1_AMP_GAIN_SHIFT, DA7218_MIC_AMP_GAIN_MAX,
645 DA7218_NO_INVERT, da7218_mic_gain_tlv),
646 SOC_SINGLE("Mic1 Switch", DA7218_MIC_1_CTRL,
647 DA7218_MIC_1_AMP_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
648 DA7218_INVERT),
649 SOC_SINGLE_TLV("Mic2 Volume", DA7218_MIC_2_GAIN,
650 DA7218_MIC_2_AMP_GAIN_SHIFT, DA7218_MIC_AMP_GAIN_MAX,
651 DA7218_NO_INVERT, da7218_mic_gain_tlv),
652 SOC_SINGLE("Mic2 Switch", DA7218_MIC_2_CTRL,
653 DA7218_MIC_2_AMP_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
654 DA7218_INVERT),
655
656 /* Mixer Input */
657 SOC_SINGLE_EXT_TLV("Mixin1 Volume", DA7218_MIXIN_1_GAIN,
658 DA7218_MIXIN_1_AMP_GAIN_SHIFT,
659 DA7218_MIXIN_AMP_GAIN_MAX, DA7218_NO_INVERT,
660 snd_soc_get_volsw, da7218_mixin_gain_put,
661 da7218_mixin_gain_tlv),
662 SOC_SINGLE("Mixin1 Switch", DA7218_MIXIN_1_CTRL,
663 DA7218_MIXIN_1_AMP_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
664 DA7218_INVERT),
665 SOC_SINGLE("Mixin1 Gain Ramp Switch", DA7218_MIXIN_1_CTRL,
666 DA7218_MIXIN_1_AMP_RAMP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
667 DA7218_NO_INVERT),
668 SOC_SINGLE("Mixin1 ZC Gain Switch", DA7218_MIXIN_1_CTRL,
669 DA7218_MIXIN_1_AMP_ZC_EN_SHIFT, DA7218_SWITCH_EN_MAX,
670 DA7218_NO_INVERT),
671 SOC_SINGLE_EXT_TLV("Mixin2 Volume", DA7218_MIXIN_2_GAIN,
672 DA7218_MIXIN_2_AMP_GAIN_SHIFT,
673 DA7218_MIXIN_AMP_GAIN_MAX, DA7218_NO_INVERT,
674 snd_soc_get_volsw, da7218_mixin_gain_put,
675 da7218_mixin_gain_tlv),
676 SOC_SINGLE("Mixin2 Switch", DA7218_MIXIN_2_CTRL,
677 DA7218_MIXIN_2_AMP_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
678 DA7218_INVERT),
679 SOC_SINGLE("Mixin2 Gain Ramp Switch", DA7218_MIXIN_2_CTRL,
680 DA7218_MIXIN_2_AMP_RAMP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
681 DA7218_NO_INVERT),
682 SOC_SINGLE("Mixin2 ZC Gain Switch", DA7218_MIXIN_2_CTRL,
683 DA7218_MIXIN_2_AMP_ZC_EN_SHIFT, DA7218_SWITCH_EN_MAX,
684 DA7218_NO_INVERT),
685
686 /* ADCs */
687 SOC_SINGLE("ADC1 AAF Switch", DA7218_ADC_1_CTRL,
688 DA7218_ADC_1_AAF_EN_SHIFT, DA7218_SWITCH_EN_MAX,
689 DA7218_NO_INVERT),
690 SOC_SINGLE("ADC2 AAF Switch", DA7218_ADC_2_CTRL,
691 DA7218_ADC_2_AAF_EN_SHIFT, DA7218_SWITCH_EN_MAX,
692 DA7218_NO_INVERT),
693 SOC_SINGLE("ADC LP Mode Switch", DA7218_ADC_MODE,
694 DA7218_ADC_LP_MODE_SHIFT, DA7218_SWITCH_EN_MAX,
695 DA7218_NO_INVERT),
696
697 /* Input Filters */
698 SOC_SINGLE_TLV("In Filter1L Volume", DA7218_IN_1L_GAIN,
699 DA7218_IN_1L_DIGITAL_GAIN_SHIFT,
700 DA7218_IN_DIGITAL_GAIN_MAX, DA7218_NO_INVERT,
701 da7218_in_dig_gain_tlv),
702 SOC_SINGLE("In Filter1L Switch", DA7218_IN_1L_FILTER_CTRL,
703 DA7218_IN_1L_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
704 DA7218_INVERT),
705 SOC_SINGLE("In Filter1L Gain Ramp Switch", DA7218_IN_1L_FILTER_CTRL,
706 DA7218_IN_1L_RAMP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
707 DA7218_NO_INVERT),
708 SOC_SINGLE_TLV("In Filter1R Volume", DA7218_IN_1R_GAIN,
709 DA7218_IN_1R_DIGITAL_GAIN_SHIFT,
710 DA7218_IN_DIGITAL_GAIN_MAX, DA7218_NO_INVERT,
711 da7218_in_dig_gain_tlv),
712 SOC_SINGLE("In Filter1R Switch", DA7218_IN_1R_FILTER_CTRL,
713 DA7218_IN_1R_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
714 DA7218_INVERT),
715 SOC_SINGLE("In Filter1R Gain Ramp Switch",
716 DA7218_IN_1R_FILTER_CTRL, DA7218_IN_1R_RAMP_EN_SHIFT,
717 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
718 SOC_SINGLE_TLV("In Filter2L Volume", DA7218_IN_2L_GAIN,
719 DA7218_IN_2L_DIGITAL_GAIN_SHIFT,
720 DA7218_IN_DIGITAL_GAIN_MAX, DA7218_NO_INVERT,
721 da7218_in_dig_gain_tlv),
722 SOC_SINGLE("In Filter2L Switch", DA7218_IN_2L_FILTER_CTRL,
723 DA7218_IN_2L_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
724 DA7218_INVERT),
725 SOC_SINGLE("In Filter2L Gain Ramp Switch", DA7218_IN_2L_FILTER_CTRL,
726 DA7218_IN_2L_RAMP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
727 DA7218_NO_INVERT),
728 SOC_SINGLE_TLV("In Filter2R Volume", DA7218_IN_2R_GAIN,
729 DA7218_IN_2R_DIGITAL_GAIN_SHIFT,
730 DA7218_IN_DIGITAL_GAIN_MAX, DA7218_NO_INVERT,
731 da7218_in_dig_gain_tlv),
732 SOC_SINGLE("In Filter2R Switch", DA7218_IN_2R_FILTER_CTRL,
733 DA7218_IN_2R_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
734 DA7218_INVERT),
735 SOC_SINGLE("In Filter2R Gain Ramp Switch",
736 DA7218_IN_2R_FILTER_CTRL, DA7218_IN_2R_RAMP_EN_SHIFT,
737 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
738
739 /* AGS */
740 SOC_SINGLE_TLV("AGS Trigger", DA7218_AGS_TRIGGER,
741 DA7218_AGS_TRIGGER_SHIFT, DA7218_AGS_TRIGGER_MAX,
742 DA7218_INVERT, da7218_ags_trigger_tlv),
743 SOC_SINGLE_TLV("AGS Max Attenuation", DA7218_AGS_ATT_MAX,
744 DA7218_AGS_ATT_MAX_SHIFT, DA7218_AGS_ATT_MAX_MAX,
745 DA7218_NO_INVERT, da7218_ags_att_max_tlv),
746 SOC_SINGLE("AGS Anticlip Switch", DA7218_AGS_ANTICLIP_CTRL,
747 DA7218_AGS_ANTICLIP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
748 DA7218_NO_INVERT),
749 SOC_SINGLE("AGS Channel1 Switch", DA7218_AGS_ENABLE,
750 DA7218_AGS_ENABLE_CHAN1_SHIFT, DA7218_SWITCH_EN_MAX,
751 DA7218_NO_INVERT),
752 SOC_SINGLE("AGS Channel2 Switch", DA7218_AGS_ENABLE,
753 DA7218_AGS_ENABLE_CHAN2_SHIFT, DA7218_SWITCH_EN_MAX,
754 DA7218_NO_INVERT),
755
756 /* ALC */
757 SOC_ENUM("ALC Attack Rate", da7218_alc_attack_rate),
758 SOC_ENUM("ALC Release Rate", da7218_alc_release_rate),
759 SOC_ENUM("ALC Hold Time", da7218_alc_hold_time),
760 SOC_SINGLE_TLV("ALC Noise Threshold", DA7218_ALC_NOISE,
761 DA7218_ALC_NOISE_SHIFT, DA7218_ALC_THRESHOLD_MAX,
762 DA7218_INVERT, da7218_alc_threshold_tlv),
763 SOC_SINGLE_TLV("ALC Min Threshold", DA7218_ALC_TARGET_MIN,
764 DA7218_ALC_THRESHOLD_MIN_SHIFT, DA7218_ALC_THRESHOLD_MAX,
765 DA7218_INVERT, da7218_alc_threshold_tlv),
766 SOC_SINGLE_TLV("ALC Max Threshold", DA7218_ALC_TARGET_MAX,
767 DA7218_ALC_THRESHOLD_MAX_SHIFT, DA7218_ALC_THRESHOLD_MAX,
768 DA7218_INVERT, da7218_alc_threshold_tlv),
769 SOC_SINGLE_TLV("ALC Max Attenuation", DA7218_ALC_GAIN_LIMITS,
770 DA7218_ALC_ATTEN_MAX_SHIFT, DA7218_ALC_ATTEN_GAIN_MAX,
771 DA7218_NO_INVERT, da7218_alc_gain_tlv),
772 SOC_SINGLE_TLV("ALC Max Gain", DA7218_ALC_GAIN_LIMITS,
773 DA7218_ALC_GAIN_MAX_SHIFT, DA7218_ALC_ATTEN_GAIN_MAX,
774 DA7218_NO_INVERT, da7218_alc_gain_tlv),
775 SOC_SINGLE_RANGE_TLV("ALC Min Analog Gain", DA7218_ALC_ANA_GAIN_LIMITS,
776 DA7218_ALC_ANA_GAIN_MIN_SHIFT,
777 DA7218_ALC_ANA_GAIN_MIN, DA7218_ALC_ANA_GAIN_MAX,
778 DA7218_NO_INVERT, da7218_alc_ana_gain_tlv),
779 SOC_SINGLE_RANGE_TLV("ALC Max Analog Gain", DA7218_ALC_ANA_GAIN_LIMITS,
780 DA7218_ALC_ANA_GAIN_MAX_SHIFT,
781 DA7218_ALC_ANA_GAIN_MIN, DA7218_ALC_ANA_GAIN_MAX,
782 DA7218_NO_INVERT, da7218_alc_ana_gain_tlv),
783 SOC_ENUM("ALC Anticlip Step", da7218_alc_anticlip_step),
784 SOC_SINGLE("ALC Anticlip Switch", DA7218_ALC_ANTICLIP_CTRL,
785 DA7218_ALC_ANTICLIP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
786 DA7218_NO_INVERT),
787 SOC_DOUBLE_EXT("ALC Channel1 Switch", DA7218_ALC_CTRL1,
788 DA7218_ALC_CHAN1_L_EN_SHIFT, DA7218_ALC_CHAN1_R_EN_SHIFT,
789 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT,
790 snd_soc_get_volsw, da7218_alc_sw_put),
791 SOC_DOUBLE_EXT("ALC Channel2 Switch", DA7218_ALC_CTRL1,
792 DA7218_ALC_CHAN2_L_EN_SHIFT, DA7218_ALC_CHAN2_R_EN_SHIFT,
793 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT,
794 snd_soc_get_volsw, da7218_alc_sw_put),
795
796 /* Envelope Tracking */
797 SOC_ENUM("Envelope Tracking Attack Rate", da7218_integ_attack_rate),
798 SOC_ENUM("Envelope Tracking Release Rate", da7218_integ_release_rate),
799
800 /* Input High-Pass Filters */
801 SOC_ENUM("In Filter1 HPF Mode", da7218_in1_hpf_mode),
802 SOC_ENUM("In Filter1 HPF Corner Audio", da7218_in1_audio_hpf_corner),
803 SOC_ENUM("In Filter1 HPF Corner Voice", da7218_in1_voice_hpf_corner),
804 SOC_ENUM("In Filter2 HPF Mode", da7218_in2_hpf_mode),
805 SOC_ENUM("In Filter2 HPF Corner Audio", da7218_in2_audio_hpf_corner),
806 SOC_ENUM("In Filter2 HPF Corner Voice", da7218_in2_voice_hpf_corner),
807
808 /* Mic Level Detect */
809 SOC_DOUBLE_EXT("Mic Level Detect Channel1 Switch", DA7218_LVL_DET_CTRL,
810 DA7218_LVL_DET_EN_CHAN1L_SHIFT,
811 DA7218_LVL_DET_EN_CHAN1R_SHIFT, DA7218_SWITCH_EN_MAX,
812 DA7218_NO_INVERT, da7218_mic_lvl_det_sw_get,
813 da7218_mic_lvl_det_sw_put),
814 SOC_DOUBLE_EXT("Mic Level Detect Channel2 Switch", DA7218_LVL_DET_CTRL,
815 DA7218_LVL_DET_EN_CHAN2L_SHIFT,
816 DA7218_LVL_DET_EN_CHAN2R_SHIFT, DA7218_SWITCH_EN_MAX,
817 DA7218_NO_INVERT, da7218_mic_lvl_det_sw_get,
818 da7218_mic_lvl_det_sw_put),
819 SOC_SINGLE("Mic Level Detect Level", DA7218_LVL_DET_LEVEL,
820 DA7218_LVL_DET_LEVEL_SHIFT, DA7218_LVL_DET_LEVEL_MAX,
821 DA7218_NO_INVERT),
822
823 /* Digital Mixer (Input) */
824 SOC_SINGLE_TLV("DMix In Filter1L Out1 DAIL Volume",
825 DA7218_DMIX_OUTDAI_1L_INFILT_1L_GAIN,
826 DA7218_OUTDAI_1L_INFILT_1L_GAIN_SHIFT,
827 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
828 da7218_dmix_gain_tlv),
829 SOC_SINGLE_TLV("DMix In Filter1L Out1 DAIR Volume",
830 DA7218_DMIX_OUTDAI_1R_INFILT_1L_GAIN,
831 DA7218_OUTDAI_1R_INFILT_1L_GAIN_SHIFT,
832 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
833 da7218_dmix_gain_tlv),
834 SOC_SINGLE_TLV("DMix In Filter1L Out2 DAIL Volume",
835 DA7218_DMIX_OUTDAI_2L_INFILT_1L_GAIN,
836 DA7218_OUTDAI_2L_INFILT_1L_GAIN_SHIFT,
837 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
838 da7218_dmix_gain_tlv),
839 SOC_SINGLE_TLV("DMix In Filter1L Out2 DAIR Volume",
840 DA7218_DMIX_OUTDAI_2R_INFILT_1L_GAIN,
841 DA7218_OUTDAI_2R_INFILT_1L_GAIN_SHIFT,
842 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
843 da7218_dmix_gain_tlv),
844
845 SOC_SINGLE_TLV("DMix In Filter1R Out1 DAIL Volume",
846 DA7218_DMIX_OUTDAI_1L_INFILT_1R_GAIN,
847 DA7218_OUTDAI_1L_INFILT_1R_GAIN_SHIFT,
848 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
849 da7218_dmix_gain_tlv),
850 SOC_SINGLE_TLV("DMix In Filter1R Out1 DAIR Volume",
851 DA7218_DMIX_OUTDAI_1R_INFILT_1R_GAIN,
852 DA7218_OUTDAI_1R_INFILT_1R_GAIN_SHIFT,
853 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
854 da7218_dmix_gain_tlv),
855 SOC_SINGLE_TLV("DMix In Filter1R Out2 DAIL Volume",
856 DA7218_DMIX_OUTDAI_2L_INFILT_1R_GAIN,
857 DA7218_OUTDAI_2L_INFILT_1R_GAIN_SHIFT,
858 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
859 da7218_dmix_gain_tlv),
860 SOC_SINGLE_TLV("DMix In Filter1R Out2 DAIR Volume",
861 DA7218_DMIX_OUTDAI_2R_INFILT_1R_GAIN,
862 DA7218_OUTDAI_2R_INFILT_1R_GAIN_SHIFT,
863 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
864 da7218_dmix_gain_tlv),
865
866 SOC_SINGLE_TLV("DMix In Filter2L Out1 DAIL Volume",
867 DA7218_DMIX_OUTDAI_1L_INFILT_2L_GAIN,
868 DA7218_OUTDAI_1L_INFILT_2L_GAIN_SHIFT,
869 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
870 da7218_dmix_gain_tlv),
871 SOC_SINGLE_TLV("DMix In Filter2L Out1 DAIR Volume",
872 DA7218_DMIX_OUTDAI_1R_INFILT_2L_GAIN,
873 DA7218_OUTDAI_1R_INFILT_2L_GAIN_SHIFT,
874 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
875 da7218_dmix_gain_tlv),
876 SOC_SINGLE_TLV("DMix In Filter2L Out2 DAIL Volume",
877 DA7218_DMIX_OUTDAI_2L_INFILT_2L_GAIN,
878 DA7218_OUTDAI_2L_INFILT_2L_GAIN_SHIFT,
879 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
880 da7218_dmix_gain_tlv),
881 SOC_SINGLE_TLV("DMix In Filter2L Out2 DAIR Volume",
882 DA7218_DMIX_OUTDAI_2R_INFILT_2L_GAIN,
883 DA7218_OUTDAI_2R_INFILT_2L_GAIN_SHIFT,
884 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
885 da7218_dmix_gain_tlv),
886
887 SOC_SINGLE_TLV("DMix In Filter2R Out1 DAIL Volume",
888 DA7218_DMIX_OUTDAI_1L_INFILT_2R_GAIN,
889 DA7218_OUTDAI_1L_INFILT_2R_GAIN_SHIFT,
890 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
891 da7218_dmix_gain_tlv),
892 SOC_SINGLE_TLV("DMix In Filter2R Out1 DAIR Volume",
893 DA7218_DMIX_OUTDAI_1R_INFILT_2R_GAIN,
894 DA7218_OUTDAI_1R_INFILT_2R_GAIN_SHIFT,
895 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
896 da7218_dmix_gain_tlv),
897 SOC_SINGLE_TLV("DMix In Filter2R Out2 DAIL Volume",
898 DA7218_DMIX_OUTDAI_2L_INFILT_2R_GAIN,
899 DA7218_OUTDAI_2L_INFILT_2R_GAIN_SHIFT,
900 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
901 da7218_dmix_gain_tlv),
902 SOC_SINGLE_TLV("DMix In Filter2R Out2 DAIR Volume",
903 DA7218_DMIX_OUTDAI_2R_INFILT_2R_GAIN,
904 DA7218_OUTDAI_2R_INFILT_2R_GAIN_SHIFT,
905 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
906 da7218_dmix_gain_tlv),
907
908 SOC_SINGLE_TLV("DMix ToneGen Out1 DAIL Volume",
909 DA7218_DMIX_OUTDAI_1L_TONEGEN_GAIN,
910 DA7218_OUTDAI_1L_TONEGEN_GAIN_SHIFT,
911 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
912 da7218_dmix_gain_tlv),
913 SOC_SINGLE_TLV("DMix ToneGen Out1 DAIR Volume",
914 DA7218_DMIX_OUTDAI_1R_TONEGEN_GAIN,
915 DA7218_OUTDAI_1R_TONEGEN_GAIN_SHIFT,
916 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
917 da7218_dmix_gain_tlv),
918 SOC_SINGLE_TLV("DMix ToneGen Out2 DAIL Volume",
919 DA7218_DMIX_OUTDAI_2L_TONEGEN_GAIN,
920 DA7218_OUTDAI_2L_TONEGEN_GAIN_SHIFT,
921 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
922 da7218_dmix_gain_tlv),
923 SOC_SINGLE_TLV("DMix ToneGen Out2 DAIR Volume",
924 DA7218_DMIX_OUTDAI_2R_TONEGEN_GAIN,
925 DA7218_OUTDAI_2R_TONEGEN_GAIN_SHIFT,
926 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
927 da7218_dmix_gain_tlv),
928
929 SOC_SINGLE_TLV("DMix In DAIL Out1 DAIL Volume",
930 DA7218_DMIX_OUTDAI_1L_INDAI_1L_GAIN,
931 DA7218_OUTDAI_1L_INDAI_1L_GAIN_SHIFT,
932 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
933 da7218_dmix_gain_tlv),
934 SOC_SINGLE_TLV("DMix In DAIL Out1 DAIR Volume",
935 DA7218_DMIX_OUTDAI_1R_INDAI_1L_GAIN,
936 DA7218_OUTDAI_1R_INDAI_1L_GAIN_SHIFT,
937 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
938 da7218_dmix_gain_tlv),
939 SOC_SINGLE_TLV("DMix In DAIL Out2 DAIL Volume",
940 DA7218_DMIX_OUTDAI_2L_INDAI_1L_GAIN,
941 DA7218_OUTDAI_2L_INDAI_1L_GAIN_SHIFT,
942 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
943 da7218_dmix_gain_tlv),
944 SOC_SINGLE_TLV("DMix In DAIL Out2 DAIR Volume",
945 DA7218_DMIX_OUTDAI_2R_INDAI_1L_GAIN,
946 DA7218_OUTDAI_2R_INDAI_1L_GAIN_SHIFT,
947 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
948 da7218_dmix_gain_tlv),
949
950 SOC_SINGLE_TLV("DMix In DAIR Out1 DAIL Volume",
951 DA7218_DMIX_OUTDAI_1L_INDAI_1R_GAIN,
952 DA7218_OUTDAI_1L_INDAI_1R_GAIN_SHIFT,
953 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
954 da7218_dmix_gain_tlv),
955 SOC_SINGLE_TLV("DMix In DAIR Out1 DAIR Volume",
956 DA7218_DMIX_OUTDAI_1R_INDAI_1R_GAIN,
957 DA7218_OUTDAI_1R_INDAI_1R_GAIN_SHIFT,
958 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
959 da7218_dmix_gain_tlv),
960 SOC_SINGLE_TLV("DMix In DAIR Out2 DAIL Volume",
961 DA7218_DMIX_OUTDAI_2L_INDAI_1R_GAIN,
962 DA7218_OUTDAI_2L_INDAI_1R_GAIN_SHIFT,
963 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
964 da7218_dmix_gain_tlv),
965 SOC_SINGLE_TLV("DMix In DAIR Out2 DAIR Volume",
966 DA7218_DMIX_OUTDAI_2R_INDAI_1R_GAIN,
967 DA7218_OUTDAI_2R_INDAI_1R_GAIN_SHIFT,
968 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
969 da7218_dmix_gain_tlv),
970
971 /* Digital Mixer (Output) */
972 SOC_SINGLE_TLV("DMix In Filter1L Out FilterL Volume",
973 DA7218_DMIX_OUTFILT_1L_INFILT_1L_GAIN,
974 DA7218_OUTFILT_1L_INFILT_1L_GAIN_SHIFT,
975 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
976 da7218_dmix_gain_tlv),
977 SOC_SINGLE_TLV("DMix In Filter1L Out FilterR Volume",
978 DA7218_DMIX_OUTFILT_1R_INFILT_1L_GAIN,
979 DA7218_OUTFILT_1R_INFILT_1L_GAIN_SHIFT,
980 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
981 da7218_dmix_gain_tlv),
982
983 SOC_SINGLE_TLV("DMix In Filter1R Out FilterL Volume",
984 DA7218_DMIX_OUTFILT_1L_INFILT_1R_GAIN,
985 DA7218_OUTFILT_1L_INFILT_1R_GAIN_SHIFT,
986 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
987 da7218_dmix_gain_tlv),
988 SOC_SINGLE_TLV("DMix In Filter1R Out FilterR Volume",
989 DA7218_DMIX_OUTFILT_1R_INFILT_1R_GAIN,
990 DA7218_OUTFILT_1R_INFILT_1R_GAIN_SHIFT,
991 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
992 da7218_dmix_gain_tlv),
993
994 SOC_SINGLE_TLV("DMix In Filter2L Out FilterL Volume",
995 DA7218_DMIX_OUTFILT_1L_INFILT_2L_GAIN,
996 DA7218_OUTFILT_1L_INFILT_2L_GAIN_SHIFT,
997 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
998 da7218_dmix_gain_tlv),
999 SOC_SINGLE_TLV("DMix In Filter2L Out FilterR Volume",
1000 DA7218_DMIX_OUTFILT_1R_INFILT_2L_GAIN,
1001 DA7218_OUTFILT_1R_INFILT_2L_GAIN_SHIFT,
1002 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
1003 da7218_dmix_gain_tlv),
1004
1005 SOC_SINGLE_TLV("DMix In Filter2R Out FilterL Volume",
1006 DA7218_DMIX_OUTFILT_1L_INFILT_2R_GAIN,
1007 DA7218_OUTFILT_1L_INFILT_2R_GAIN_SHIFT,
1008 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
1009 da7218_dmix_gain_tlv),
1010 SOC_SINGLE_TLV("DMix In Filter2R Out FilterR Volume",
1011 DA7218_DMIX_OUTFILT_1R_INFILT_2R_GAIN,
1012 DA7218_OUTFILT_1R_INFILT_2R_GAIN_SHIFT,
1013 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
1014 da7218_dmix_gain_tlv),
1015
1016 SOC_SINGLE_TLV("DMix ToneGen Out FilterL Volume",
1017 DA7218_DMIX_OUTFILT_1L_TONEGEN_GAIN,
1018 DA7218_OUTFILT_1L_TONEGEN_GAIN_SHIFT,
1019 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
1020 da7218_dmix_gain_tlv),
1021 SOC_SINGLE_TLV("DMix ToneGen Out FilterR Volume",
1022 DA7218_DMIX_OUTFILT_1R_TONEGEN_GAIN,
1023 DA7218_OUTFILT_1R_TONEGEN_GAIN_SHIFT,
1024 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
1025 da7218_dmix_gain_tlv),
1026
1027 SOC_SINGLE_TLV("DMix In DAIL Out FilterL Volume",
1028 DA7218_DMIX_OUTFILT_1L_INDAI_1L_GAIN,
1029 DA7218_OUTFILT_1L_INDAI_1L_GAIN_SHIFT,
1030 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
1031 da7218_dmix_gain_tlv),
1032 SOC_SINGLE_TLV("DMix In DAIL Out FilterR Volume",
1033 DA7218_DMIX_OUTFILT_1R_INDAI_1L_GAIN,
1034 DA7218_OUTFILT_1R_INDAI_1L_GAIN_SHIFT,
1035 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
1036 da7218_dmix_gain_tlv),
1037
1038 SOC_SINGLE_TLV("DMix In DAIR Out FilterL Volume",
1039 DA7218_DMIX_OUTFILT_1L_INDAI_1R_GAIN,
1040 DA7218_OUTFILT_1L_INDAI_1R_GAIN_SHIFT,
1041 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
1042 da7218_dmix_gain_tlv),
1043 SOC_SINGLE_TLV("DMix In DAIR Out FilterR Volume",
1044 DA7218_DMIX_OUTFILT_1R_INDAI_1R_GAIN,
1045 DA7218_OUTFILT_1R_INDAI_1R_GAIN_SHIFT,
1046 DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
1047 da7218_dmix_gain_tlv),
1048
1049 /* Sidetone Filter */
1050 SND_SOC_BYTES_EXT("Sidetone BiQuad Coefficients",
1051 DA7218_SIDETONE_BIQ_3STAGE_CFG_SIZE,
1052 da7218_biquad_coeff_get, da7218_biquad_coeff_put),
1053 SOC_SINGLE_TLV("Sidetone Volume", DA7218_SIDETONE_GAIN,
1054 DA7218_SIDETONE_GAIN_SHIFT, DA7218_DMIX_GAIN_MAX,
1055 DA7218_NO_INVERT, da7218_dmix_gain_tlv),
1056 SOC_SINGLE("Sidetone Switch", DA7218_SIDETONE_CTRL,
1057 DA7218_SIDETONE_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
1058 DA7218_INVERT),
1059
1060 /* Tone Generator */
1061 SOC_ENUM("ToneGen DTMF Key", da7218_tonegen_dtmf_key),
1062 SOC_SINGLE("ToneGen DTMF Switch", DA7218_TONE_GEN_CFG1,
1063 DA7218_DTMF_EN_SHIFT, DA7218_SWITCH_EN_MAX,
1064 DA7218_NO_INVERT),
1065 SOC_ENUM("ToneGen Sinewave Gen Type", da7218_tonegen_swg_sel),
1066 SOC_SINGLE_EXT("ToneGen Sinewave1 Freq", DA7218_TONE_GEN_FREQ1_L,
1067 DA7218_FREQ1_L_SHIFT, DA7218_FREQ_MAX, DA7218_NO_INVERT,
1068 da7218_tonegen_freq_get, da7218_tonegen_freq_put),
1069 SOC_SINGLE_EXT("ToneGen Sinewave2 Freq", DA7218_TONE_GEN_FREQ2_L,
1070 DA7218_FREQ2_L_SHIFT, DA7218_FREQ_MAX, DA7218_NO_INVERT,
1071 da7218_tonegen_freq_get, da7218_tonegen_freq_put),
1072 SOC_SINGLE("ToneGen On Time", DA7218_TONE_GEN_ON_PER,
1073 DA7218_BEEP_ON_PER_SHIFT, DA7218_BEEP_ON_OFF_MAX,
1074 DA7218_NO_INVERT),
1075 SOC_SINGLE("ToneGen Off Time", DA7218_TONE_GEN_OFF_PER,
1076 DA7218_BEEP_OFF_PER_SHIFT, DA7218_BEEP_ON_OFF_MAX,
1077 DA7218_NO_INVERT),
1078
1079 /* Gain ramping */
1080 SOC_ENUM("Gain Ramp Rate", da7218_gain_ramp_rate),
1081
1082 /* DGS */
1083 SOC_SINGLE_TLV("DGS Trigger", DA7218_DGS_TRIGGER,
1084 DA7218_DGS_TRIGGER_LVL_SHIFT, DA7218_DGS_TRIGGER_MAX,
1085 DA7218_INVERT, da7218_dgs_trigger_tlv),
1086 SOC_ENUM("DGS Rise Coefficient", da7218_dgs_rise_coeff),
1087 SOC_ENUM("DGS Fall Coefficient", da7218_dgs_fall_coeff),
1088 SOC_SINGLE("DGS Sync Delay", DA7218_DGS_SYNC_DELAY,
1089 DA7218_DGS_SYNC_DELAY_SHIFT, DA7218_DGS_SYNC_DELAY_MAX,
1090 DA7218_NO_INVERT),
1091 SOC_SINGLE("DGS Fast SR Sync Delay", DA7218_DGS_SYNC_DELAY2,
1092 DA7218_DGS_SYNC_DELAY2_SHIFT, DA7218_DGS_SYNC_DELAY_MAX,
1093 DA7218_NO_INVERT),
1094 SOC_SINGLE("DGS Voice Filter Sync Delay", DA7218_DGS_SYNC_DELAY3,
1095 DA7218_DGS_SYNC_DELAY3_SHIFT, DA7218_DGS_SYNC_DELAY3_MAX,
1096 DA7218_NO_INVERT),
1097 SOC_SINGLE_TLV("DGS Anticlip Level", DA7218_DGS_LEVELS,
1098 DA7218_DGS_ANTICLIP_LVL_SHIFT,
1099 DA7218_DGS_ANTICLIP_LVL_MAX, DA7218_INVERT,
1100 da7218_dgs_anticlip_tlv),
1101 SOC_SINGLE_TLV("DGS Signal Level", DA7218_DGS_LEVELS,
1102 DA7218_DGS_SIGNAL_LVL_SHIFT, DA7218_DGS_SIGNAL_LVL_MAX,
1103 DA7218_INVERT, da7218_dgs_signal_tlv),
1104 SOC_SINGLE("DGS Gain Subrange Switch", DA7218_DGS_GAIN_CTRL,
1105 DA7218_DGS_SUBR_EN_SHIFT, DA7218_SWITCH_EN_MAX,
1106 DA7218_NO_INVERT),
1107 SOC_SINGLE("DGS Gain Ramp Switch", DA7218_DGS_GAIN_CTRL,
1108 DA7218_DGS_RAMP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
1109 DA7218_NO_INVERT),
1110 SOC_SINGLE("DGS Gain Steps", DA7218_DGS_GAIN_CTRL,
1111 DA7218_DGS_STEPS_SHIFT, DA7218_DGS_STEPS_MAX,
1112 DA7218_NO_INVERT),
1113 SOC_DOUBLE("DGS Switch", DA7218_DGS_ENABLE, DA7218_DGS_ENABLE_L_SHIFT,
1114 DA7218_DGS_ENABLE_R_SHIFT, DA7218_SWITCH_EN_MAX,
1115 DA7218_NO_INVERT),
1116
1117 /* Output High-Pass Filter */
1118 SOC_ENUM("Out Filter HPF Mode", da7218_out1_hpf_mode),
1119 SOC_ENUM("Out Filter HPF Corner Audio", da7218_out1_audio_hpf_corner),
1120 SOC_ENUM("Out Filter HPF Corner Voice", da7218_out1_voice_hpf_corner),
1121
1122 /* 5-Band Equaliser */
1123 SOC_SINGLE_TLV("Out EQ Band1 Volume", DA7218_OUT_1_EQ_12_FILTER_CTRL,
1124 DA7218_OUT_1_EQ_BAND1_SHIFT, DA7218_OUT_EQ_BAND_MAX,
1125 DA7218_NO_INVERT, da7218_out_eq_band_tlv),
1126 SOC_SINGLE_TLV("Out EQ Band2 Volume", DA7218_OUT_1_EQ_12_FILTER_CTRL,
1127 DA7218_OUT_1_EQ_BAND2_SHIFT, DA7218_OUT_EQ_BAND_MAX,
1128 DA7218_NO_INVERT, da7218_out_eq_band_tlv),
1129 SOC_SINGLE_TLV("Out EQ Band3 Volume", DA7218_OUT_1_EQ_34_FILTER_CTRL,
1130 DA7218_OUT_1_EQ_BAND3_SHIFT, DA7218_OUT_EQ_BAND_MAX,
1131 DA7218_NO_INVERT, da7218_out_eq_band_tlv),
1132 SOC_SINGLE_TLV("Out EQ Band4 Volume", DA7218_OUT_1_EQ_34_FILTER_CTRL,
1133 DA7218_OUT_1_EQ_BAND4_SHIFT, DA7218_OUT_EQ_BAND_MAX,
1134 DA7218_NO_INVERT, da7218_out_eq_band_tlv),
1135 SOC_SINGLE_TLV("Out EQ Band5 Volume", DA7218_OUT_1_EQ_5_FILTER_CTRL,
1136 DA7218_OUT_1_EQ_BAND5_SHIFT, DA7218_OUT_EQ_BAND_MAX,
1137 DA7218_NO_INVERT, da7218_out_eq_band_tlv),
1138 SOC_SINGLE("Out EQ Switch", DA7218_OUT_1_EQ_5_FILTER_CTRL,
1139 DA7218_OUT_1_EQ_EN_SHIFT, DA7218_SWITCH_EN_MAX,
1140 DA7218_NO_INVERT),
1141
1142 /* BiQuad Filters */
1143 SND_SOC_BYTES_EXT("BiQuad Coefficients",
1144 DA7218_OUT_1_BIQ_5STAGE_CFG_SIZE,
1145 da7218_biquad_coeff_get, da7218_biquad_coeff_put),
1146 SOC_SINGLE("BiQuad Filter Switch", DA7218_OUT_1_BIQ_5STAGE_CTRL,
1147 DA7218_OUT_1_BIQ_5STAGE_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
1148 DA7218_INVERT),
1149
1150 /* Output Filters */
1151 SOC_DOUBLE_R_RANGE_TLV("Out Filter Volume", DA7218_OUT_1L_GAIN,
1152 DA7218_OUT_1R_GAIN,
1153 DA7218_OUT_1L_DIGITAL_GAIN_SHIFT,
1154 DA7218_OUT_DIGITAL_GAIN_MIN,
1155 DA7218_OUT_DIGITAL_GAIN_MAX, DA7218_NO_INVERT,
1156 da7218_out_dig_gain_tlv),
1157 SOC_DOUBLE_R("Out Filter Switch", DA7218_OUT_1L_FILTER_CTRL,
1158 DA7218_OUT_1R_FILTER_CTRL, DA7218_OUT_1L_MUTE_EN_SHIFT,
1159 DA7218_SWITCH_EN_MAX, DA7218_INVERT),
1160 SOC_DOUBLE_R("Out Filter Gain Subrange Switch",
1161 DA7218_OUT_1L_FILTER_CTRL, DA7218_OUT_1R_FILTER_CTRL,
1162 DA7218_OUT_1L_SUBRANGE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
1163 DA7218_NO_INVERT),
1164 SOC_DOUBLE_R("Out Filter Gain Ramp Switch", DA7218_OUT_1L_FILTER_CTRL,
1165 DA7218_OUT_1R_FILTER_CTRL, DA7218_OUT_1L_RAMP_EN_SHIFT,
1166 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
1167
1168 /* Mixer Output */
1169 SOC_DOUBLE_R_RANGE_TLV("Mixout Volume", DA7218_MIXOUT_L_GAIN,
1170 DA7218_MIXOUT_R_GAIN,
1171 DA7218_MIXOUT_L_AMP_GAIN_SHIFT,
1172 DA7218_MIXOUT_AMP_GAIN_MIN,
1173 DA7218_MIXOUT_AMP_GAIN_MAX, DA7218_NO_INVERT,
1174 da7218_mixout_gain_tlv),
1175
1176 /* DAC Noise Gate */
1177 SOC_ENUM("DAC NG Setup Time", da7218_dac_ng_setup_time),
1178 SOC_ENUM("DAC NG Rampup Rate", da7218_dac_ng_rampup_rate),
1179 SOC_ENUM("DAC NG Rampdown Rate", da7218_dac_ng_rampdown_rate),
1180 SOC_SINGLE_TLV("DAC NG Off Threshold", DA7218_DAC_NG_OFF_THRESH,
1181 DA7218_DAC_NG_OFF_THRESHOLD_SHIFT,
1182 DA7218_DAC_NG_THRESHOLD_MAX, DA7218_NO_INVERT,
1183 da7218_dac_ng_threshold_tlv),
1184 SOC_SINGLE_TLV("DAC NG On Threshold", DA7218_DAC_NG_ON_THRESH,
1185 DA7218_DAC_NG_ON_THRESHOLD_SHIFT,
1186 DA7218_DAC_NG_THRESHOLD_MAX, DA7218_NO_INVERT,
1187 da7218_dac_ng_threshold_tlv),
1188 SOC_SINGLE("DAC NG Switch", DA7218_DAC_NG_CTRL, DA7218_DAC_NG_EN_SHIFT,
1189 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
1190
1191 /* CP */
1192 SOC_ENUM("Charge Pump Track Mode", da7218_cp_mchange),
1193 SOC_ENUM("Charge Pump Frequency", da7218_cp_fcontrol),
1194 SOC_ENUM("Charge Pump Decay Rate", da7218_cp_tau_delay),
1195 SOC_SINGLE("Charge Pump Threshold", DA7218_CP_VOL_THRESHOLD1,
1196 DA7218_CP_THRESH_VDD2_SHIFT, DA7218_CP_THRESH_VDD2_MAX,
1197 DA7218_NO_INVERT),
1198
1199 /* Headphones */
1200 SOC_DOUBLE_R_RANGE_TLV("Headphone Volume", DA7218_HP_L_GAIN,
1201 DA7218_HP_R_GAIN, DA7218_HP_L_AMP_GAIN_SHIFT,
1202 DA7218_HP_AMP_GAIN_MIN, DA7218_HP_AMP_GAIN_MAX,
1203 DA7218_NO_INVERT, da7218_hp_gain_tlv),
1204 SOC_DOUBLE_R("Headphone Switch", DA7218_HP_L_CTRL, DA7218_HP_R_CTRL,
1205 DA7218_HP_L_AMP_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
1206 DA7218_INVERT),
1207 SOC_DOUBLE_R("Headphone Gain Ramp Switch", DA7218_HP_L_CTRL,
1208 DA7218_HP_R_CTRL, DA7218_HP_L_AMP_RAMP_EN_SHIFT,
1209 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
1210 SOC_DOUBLE_R("Headphone ZC Gain Switch", DA7218_HP_L_CTRL,
1211 DA7218_HP_R_CTRL, DA7218_HP_L_AMP_ZC_EN_SHIFT,
1212 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
1213};
1214
1215
1216/*
1217 * DAPM Mux Controls
1218 */
1219
1220static const char * const da7218_mic_sel_text[] = { "Analog", "Digital" };
1221
1222static const struct soc_enum da7218_mic1_sel =
1223 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(da7218_mic_sel_text),
1224 da7218_mic_sel_text);
1225
1226static const struct snd_kcontrol_new da7218_mic1_sel_mux =
1227 SOC_DAPM_ENUM("Mic1 Mux", da7218_mic1_sel);
1228
1229static const struct soc_enum da7218_mic2_sel =
1230 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(da7218_mic_sel_text),
1231 da7218_mic_sel_text);
1232
1233static const struct snd_kcontrol_new da7218_mic2_sel_mux =
1234 SOC_DAPM_ENUM("Mic2 Mux", da7218_mic2_sel);
1235
1236static const char * const da7218_sidetone_in_sel_txt[] = {
1237 "In Filter1L", "In Filter1R", "In Filter2L", "In Filter2R"
1238};
1239
1240static const struct soc_enum da7218_sidetone_in_sel =
1241 SOC_ENUM_SINGLE(DA7218_SIDETONE_IN_SELECT,
1242 DA7218_SIDETONE_IN_SELECT_SHIFT,
1243 DA7218_SIDETONE_IN_SELECT_MAX,
1244 da7218_sidetone_in_sel_txt);
1245
1246static const struct snd_kcontrol_new da7218_sidetone_in_sel_mux =
1247 SOC_DAPM_ENUM("Sidetone Mux", da7218_sidetone_in_sel);
1248
1249static const char * const da7218_out_filt_biq_sel_txt[] = {
1250 "Bypass", "Enabled"
1251};
1252
1253static const struct soc_enum da7218_out_filtl_biq_sel =
1254 SOC_ENUM_SINGLE(DA7218_OUT_1L_FILTER_CTRL,
1255 DA7218_OUT_1L_BIQ_5STAGE_SEL_SHIFT,
1256 DA7218_OUT_BIQ_5STAGE_SEL_MAX,
1257 da7218_out_filt_biq_sel_txt);
1258
1259static const struct snd_kcontrol_new da7218_out_filtl_biq_sel_mux =
1260 SOC_DAPM_ENUM("Out FilterL BiQuad Mux", da7218_out_filtl_biq_sel);
1261
1262static const struct soc_enum da7218_out_filtr_biq_sel =
1263 SOC_ENUM_SINGLE(DA7218_OUT_1R_FILTER_CTRL,
1264 DA7218_OUT_1R_BIQ_5STAGE_SEL_SHIFT,
1265 DA7218_OUT_BIQ_5STAGE_SEL_MAX,
1266 da7218_out_filt_biq_sel_txt);
1267
1268static const struct snd_kcontrol_new da7218_out_filtr_biq_sel_mux =
1269 SOC_DAPM_ENUM("Out FilterR BiQuad Mux", da7218_out_filtr_biq_sel);
1270
1271
1272/*
1273 * DAPM Mixer Controls
1274 */
1275
1276#define DA7218_DMIX_CTRLS(reg) \
1277 SOC_DAPM_SINGLE("In Filter1L Switch", reg, \
1278 DA7218_DMIX_SRC_INFILT1L, \
1279 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
1280 SOC_DAPM_SINGLE("In Filter1R Switch", reg, \
1281 DA7218_DMIX_SRC_INFILT1R, \
1282 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
1283 SOC_DAPM_SINGLE("In Filter2L Switch", reg, \
1284 DA7218_DMIX_SRC_INFILT2L, \
1285 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
1286 SOC_DAPM_SINGLE("In Filter2R Switch", reg, \
1287 DA7218_DMIX_SRC_INFILT2R, \
1288 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
1289 SOC_DAPM_SINGLE("ToneGen Switch", reg, \
1290 DA7218_DMIX_SRC_TONEGEN, \
1291 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
1292 SOC_DAPM_SINGLE("DAIL Switch", reg, DA7218_DMIX_SRC_DAIL, \
1293 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
1294 SOC_DAPM_SINGLE("DAIR Switch", reg, DA7218_DMIX_SRC_DAIR, \
1295 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT)
1296
1297static const struct snd_kcontrol_new da7218_out_dai1l_mix_controls[] = {
1298 DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTDAI_1L),
1299};
1300
1301static const struct snd_kcontrol_new da7218_out_dai1r_mix_controls[] = {
1302 DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTDAI_1R),
1303};
1304
1305static const struct snd_kcontrol_new da7218_out_dai2l_mix_controls[] = {
1306 DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTDAI_2L),
1307};
1308
1309static const struct snd_kcontrol_new da7218_out_dai2r_mix_controls[] = {
1310 DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTDAI_2R),
1311};
1312
1313static const struct snd_kcontrol_new da7218_out_filtl_mix_controls[] = {
1314 DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTFILT_1L),
1315};
1316
1317static const struct snd_kcontrol_new da7218_out_filtr_mix_controls[] = {
1318 DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTFILT_1R),
1319};
1320
1321#define DA7218_DMIX_ST_CTRLS(reg) \
1322 SOC_DAPM_SINGLE("Out FilterL Switch", reg, \
1323 DA7218_DMIX_ST_SRC_OUTFILT1L, \
1324 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
1325 SOC_DAPM_SINGLE("Out FilterR Switch", reg, \
1326 DA7218_DMIX_ST_SRC_OUTFILT1R, \
1327 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
1328 SOC_DAPM_SINGLE("Sidetone Switch", reg, \
1329 DA7218_DMIX_ST_SRC_SIDETONE, \
1330 DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT) \
1331
1332static const struct snd_kcontrol_new da7218_st_out_filtl_mix_controls[] = {
1333 DA7218_DMIX_ST_CTRLS(DA7218_DROUTING_ST_OUTFILT_1L),
1334};
1335
1336static const struct snd_kcontrol_new da7218_st_out_filtr_mix_controls[] = {
1337 DA7218_DMIX_ST_CTRLS(DA7218_DROUTING_ST_OUTFILT_1R),
1338};
1339
1340
1341/*
1342 * DAPM Events
1343 */
1344
1345/*
1346 * We keep track of which input filters are enabled. This is used in the logic
1347 * for controlling the mic level detect feature.
1348 */
1349static int da7218_in_filter_event(struct snd_soc_dapm_widget *w,
1350 struct snd_kcontrol *kcontrol, int event)
1351{
1352 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1353 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
1354 u8 mask;
1355
1356 switch (w->reg) {
1357 case DA7218_IN_1L_FILTER_CTRL:
1358 mask = (1 << DA7218_LVL_DET_EN_CHAN1L_SHIFT);
1359 break;
1360 case DA7218_IN_1R_FILTER_CTRL:
1361 mask = (1 << DA7218_LVL_DET_EN_CHAN1R_SHIFT);
1362 break;
1363 case DA7218_IN_2L_FILTER_CTRL:
1364 mask = (1 << DA7218_LVL_DET_EN_CHAN2L_SHIFT);
1365 break;
1366 case DA7218_IN_2R_FILTER_CTRL:
1367 mask = (1 << DA7218_LVL_DET_EN_CHAN2R_SHIFT);
1368 break;
1369 default:
1370 return -EINVAL;
1371 }
1372
1373 switch (event) {
1374 case SND_SOC_DAPM_POST_PMU:
1375 da7218->in_filt_en |= mask;
1376 /*
1377 * If we're enabling path for mic level detect, wait for path
1378 * to settle before enabling feature to avoid incorrect and
1379 * unwanted detect events.
1380 */
1381 if (mask & da7218->mic_lvl_det_en)
1382 msleep(DA7218_MIC_LVL_DET_DELAY);
1383 break;
1384 case SND_SOC_DAPM_PRE_PMD:
1385 da7218->in_filt_en &= ~mask;
1386 break;
1387 default:
1388 return -EINVAL;
1389 }
1390
1391 /* Enable configured level detection paths */
1392 snd_soc_write(codec, DA7218_LVL_DET_CTRL,
1393 (da7218->in_filt_en & da7218->mic_lvl_det_en));
1394
1395 return 0;
1396}
1397
1398static int da7218_dai_event(struct snd_soc_dapm_widget *w,
1399 struct snd_kcontrol *kcontrol, int event)
1400{
1401 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1402 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
1403 u8 pll_ctrl, pll_status, refosc_cal;
1404 int i;
1405 bool success;
1406
1407 switch (event) {
1408 case SND_SOC_DAPM_POST_PMU:
1409 if (da7218->master)
1410 /* Enable DAI clks for master mode */
1411 snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE,
1412 DA7218_DAI_CLK_EN_MASK,
1413 DA7218_DAI_CLK_EN_MASK);
1414
1415 /* Tune reference oscillator */
1416 snd_soc_write(codec, DA7218_PLL_REFOSC_CAL,
1417 DA7218_PLL_REFOSC_CAL_START_MASK);
1418 snd_soc_write(codec, DA7218_PLL_REFOSC_CAL,
1419 DA7218_PLL_REFOSC_CAL_START_MASK |
1420 DA7218_PLL_REFOSC_CAL_EN_MASK);
1421
1422 /* Check tuning complete */
1423 i = 0;
1424 success = false;
1425 do {
1426 refosc_cal = snd_soc_read(codec, DA7218_PLL_REFOSC_CAL);
1427 if (!(refosc_cal & DA7218_PLL_REFOSC_CAL_START_MASK)) {
1428 success = true;
1429 } else {
1430 ++i;
1431 usleep_range(DA7218_REF_OSC_CHECK_DELAY_MIN,
1432 DA7218_REF_OSC_CHECK_DELAY_MAX);
1433 }
1434 } while ((i < DA7218_REF_OSC_CHECK_TRIES) && (!success));
1435
1436 if (!success)
1437 dev_warn(codec->dev,
1438 "Reference oscillator failed calibration\n");
1439
1440 /* PC synchronised to DAI */
1441 snd_soc_write(codec, DA7218_PC_COUNT,
1442 DA7218_PC_RESYNC_AUTO_MASK);
1443
1444 /* If SRM not enabled, we don't need to check status */
1445 pll_ctrl = snd_soc_read(codec, DA7218_PLL_CTRL);
1446 if ((pll_ctrl & DA7218_PLL_MODE_MASK) != DA7218_PLL_MODE_SRM)
1447 return 0;
1448
1449 /* Check SRM has locked */
1450 i = 0;
1451 success = false;
1452 do {
1453 pll_status = snd_soc_read(codec, DA7218_PLL_STATUS);
1454 if (pll_status & DA7218_PLL_SRM_STATUS_SRM_LOCK) {
1455 success = true;
1456 } else {
1457 ++i;
1458 msleep(DA7218_SRM_CHECK_DELAY);
1459 }
1460 } while ((i < DA7218_SRM_CHECK_TRIES) & (!success));
1461
1462 if (!success)
1463 dev_warn(codec->dev, "SRM failed to lock\n");
1464
1465 return 0;
1466 case SND_SOC_DAPM_POST_PMD:
1467 /* PC free-running */
1468 snd_soc_write(codec, DA7218_PC_COUNT, DA7218_PC_FREERUN_MASK);
1469
1470 if (da7218->master)
1471 /* Disable DAI clks for master mode */
1472 snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE,
1473 DA7218_DAI_CLK_EN_MASK, 0);
1474
1475 return 0;
1476 default:
1477 return -EINVAL;
1478 }
1479}
1480
1481static int da7218_cp_event(struct snd_soc_dapm_widget *w,
1482 struct snd_kcontrol *kcontrol, int event)
1483{
1484 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1485 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
1486
1487 /*
1488 * If this is DA7217 and we're using single supply for differential
1489 * output, we really don't want to touch the charge pump.
1490 */
1491 if (da7218->hp_single_supply)
1492 return 0;
1493
1494 switch (event) {
1495 case SND_SOC_DAPM_PRE_PMU:
1496 snd_soc_update_bits(codec, DA7218_CP_CTRL, DA7218_CP_EN_MASK,
1497 DA7218_CP_EN_MASK);
1498 return 0;
1499 case SND_SOC_DAPM_PRE_PMD:
1500 snd_soc_update_bits(codec, DA7218_CP_CTRL, DA7218_CP_EN_MASK,
1501 0);
1502 return 0;
1503 default:
1504 return -EINVAL;
1505 }
1506}
1507
1508static int da7218_hp_pga_event(struct snd_soc_dapm_widget *w,
1509 struct snd_kcontrol *kcontrol, int event)
1510{
1511 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1512
1513 switch (event) {
1514 case SND_SOC_DAPM_POST_PMU:
1515 /* Enable headphone output */
1516 snd_soc_update_bits(codec, w->reg, DA7218_HP_AMP_OE_MASK,
1517 DA7218_HP_AMP_OE_MASK);
1518 return 0;
1519 case SND_SOC_DAPM_PRE_PMD:
1520 /* Headphone output high impedance */
1521 snd_soc_update_bits(codec, w->reg, DA7218_HP_AMP_OE_MASK, 0);
1522 return 0;
1523 default:
1524 return -EINVAL;
1525 }
1526}
1527
1528
1529/*
1530 * DAPM Widgets
1531 */
1532
1533static const struct snd_soc_dapm_widget da7218_dapm_widgets[] = {
1534 /* Input Supplies */
1535 SND_SOC_DAPM_SUPPLY("Mic Bias1", DA7218_MICBIAS_EN,
1536 DA7218_MICBIAS_1_EN_SHIFT, DA7218_NO_INVERT,
1537 NULL, 0),
1538 SND_SOC_DAPM_SUPPLY("Mic Bias2", DA7218_MICBIAS_EN,
1539 DA7218_MICBIAS_2_EN_SHIFT, DA7218_NO_INVERT,
1540 NULL, 0),
1541 SND_SOC_DAPM_SUPPLY("DMic1 Left", DA7218_DMIC_1_CTRL,
1542 DA7218_DMIC_1L_EN_SHIFT, DA7218_NO_INVERT,
1543 NULL, 0),
1544 SND_SOC_DAPM_SUPPLY("DMic1 Right", DA7218_DMIC_1_CTRL,
1545 DA7218_DMIC_1R_EN_SHIFT, DA7218_NO_INVERT,
1546 NULL, 0),
1547 SND_SOC_DAPM_SUPPLY("DMic2 Left", DA7218_DMIC_2_CTRL,
1548 DA7218_DMIC_2L_EN_SHIFT, DA7218_NO_INVERT,
1549 NULL, 0),
1550 SND_SOC_DAPM_SUPPLY("DMic2 Right", DA7218_DMIC_2_CTRL,
1551 DA7218_DMIC_2R_EN_SHIFT, DA7218_NO_INVERT,
1552 NULL, 0),
1553
1554 /* Inputs */
1555 SND_SOC_DAPM_INPUT("MIC1"),
1556 SND_SOC_DAPM_INPUT("MIC2"),
1557 SND_SOC_DAPM_INPUT("DMIC1L"),
1558 SND_SOC_DAPM_INPUT("DMIC1R"),
1559 SND_SOC_DAPM_INPUT("DMIC2L"),
1560 SND_SOC_DAPM_INPUT("DMIC2R"),
1561
1562 /* Input Mixer Supplies */
1563 SND_SOC_DAPM_SUPPLY("Mixin1 Supply", DA7218_MIXIN_1_CTRL,
1564 DA7218_MIXIN_1_MIX_SEL_SHIFT, DA7218_NO_INVERT,
1565 NULL, 0),
1566 SND_SOC_DAPM_SUPPLY("Mixin2 Supply", DA7218_MIXIN_2_CTRL,
1567 DA7218_MIXIN_2_MIX_SEL_SHIFT, DA7218_NO_INVERT,
1568 NULL, 0),
1569
1570 /* Input PGAs */
1571 SND_SOC_DAPM_PGA("Mic1 PGA", DA7218_MIC_1_CTRL,
1572 DA7218_MIC_1_AMP_EN_SHIFT, DA7218_NO_INVERT,
1573 NULL, 0),
1574 SND_SOC_DAPM_PGA("Mic2 PGA", DA7218_MIC_2_CTRL,
1575 DA7218_MIC_2_AMP_EN_SHIFT, DA7218_NO_INVERT,
1576 NULL, 0),
1577 SND_SOC_DAPM_PGA("Mixin1 PGA", DA7218_MIXIN_1_CTRL,
1578 DA7218_MIXIN_1_AMP_EN_SHIFT, DA7218_NO_INVERT,
1579 NULL, 0),
1580 SND_SOC_DAPM_PGA("Mixin2 PGA", DA7218_MIXIN_2_CTRL,
1581 DA7218_MIXIN_2_AMP_EN_SHIFT, DA7218_NO_INVERT,
1582 NULL, 0),
1583
1584 /* Mic/DMic Muxes */
1585 SND_SOC_DAPM_MUX("Mic1 Mux", SND_SOC_NOPM, 0, 0, &da7218_mic1_sel_mux),
1586 SND_SOC_DAPM_MUX("Mic2 Mux", SND_SOC_NOPM, 0, 0, &da7218_mic2_sel_mux),
1587
1588 /* Input Filters */
1589 SND_SOC_DAPM_ADC_E("In Filter1L", NULL, DA7218_IN_1L_FILTER_CTRL,
1590 DA7218_IN_1L_FILTER_EN_SHIFT, DA7218_NO_INVERT,
1591 da7218_in_filter_event,
1592 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1593 SND_SOC_DAPM_ADC_E("In Filter1R", NULL, DA7218_IN_1R_FILTER_CTRL,
1594 DA7218_IN_1R_FILTER_EN_SHIFT, DA7218_NO_INVERT,
1595 da7218_in_filter_event,
1596 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1597 SND_SOC_DAPM_ADC_E("In Filter2L", NULL, DA7218_IN_2L_FILTER_CTRL,
1598 DA7218_IN_2L_FILTER_EN_SHIFT, DA7218_NO_INVERT,
1599 da7218_in_filter_event,
1600 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1601 SND_SOC_DAPM_ADC_E("In Filter2R", NULL, DA7218_IN_2R_FILTER_CTRL,
1602 DA7218_IN_2R_FILTER_EN_SHIFT, DA7218_NO_INVERT,
1603 da7218_in_filter_event,
1604 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1605
1606 /* Tone Generator */
1607 SND_SOC_DAPM_SIGGEN("TONE"),
1608 SND_SOC_DAPM_PGA("Tone Generator", DA7218_TONE_GEN_CFG1,
1609 DA7218_START_STOPN_SHIFT, DA7218_NO_INVERT, NULL, 0),
1610
1611 /* Sidetone Input */
1612 SND_SOC_DAPM_MUX("Sidetone Mux", SND_SOC_NOPM, 0, 0,
1613 &da7218_sidetone_in_sel_mux),
1614 SND_SOC_DAPM_ADC("Sidetone Filter", NULL, DA7218_SIDETONE_CTRL,
1615 DA7218_SIDETONE_FILTER_EN_SHIFT, DA7218_NO_INVERT),
1616
1617 /* Input Mixers */
1618 SND_SOC_DAPM_MIXER("Mixer DAI1L", SND_SOC_NOPM, 0, 0,
1619 da7218_out_dai1l_mix_controls,
1620 ARRAY_SIZE(da7218_out_dai1l_mix_controls)),
1621 SND_SOC_DAPM_MIXER("Mixer DAI1R", SND_SOC_NOPM, 0, 0,
1622 da7218_out_dai1r_mix_controls,
1623 ARRAY_SIZE(da7218_out_dai1r_mix_controls)),
1624 SND_SOC_DAPM_MIXER("Mixer DAI2L", SND_SOC_NOPM, 0, 0,
1625 da7218_out_dai2l_mix_controls,
1626 ARRAY_SIZE(da7218_out_dai2l_mix_controls)),
1627 SND_SOC_DAPM_MIXER("Mixer DAI2R", SND_SOC_NOPM, 0, 0,
1628 da7218_out_dai2r_mix_controls,
1629 ARRAY_SIZE(da7218_out_dai2r_mix_controls)),
1630
1631 /* DAI Supply */
1632 SND_SOC_DAPM_SUPPLY("DAI", DA7218_DAI_CTRL, DA7218_DAI_EN_SHIFT,
1633 DA7218_NO_INVERT, da7218_dai_event,
1634 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
1635
1636 /* DAI */
1637 SND_SOC_DAPM_AIF_OUT("DAIOUT", "Capture", 0, SND_SOC_NOPM, 0, 0),
1638 SND_SOC_DAPM_AIF_IN("DAIIN", "Playback", 0, SND_SOC_NOPM, 0, 0),
1639
1640 /* Output Mixers */
1641 SND_SOC_DAPM_MIXER("Mixer Out FilterL", SND_SOC_NOPM, 0, 0,
1642 da7218_out_filtl_mix_controls,
1643 ARRAY_SIZE(da7218_out_filtl_mix_controls)),
1644 SND_SOC_DAPM_MIXER("Mixer Out FilterR", SND_SOC_NOPM, 0, 0,
1645 da7218_out_filtr_mix_controls,
1646 ARRAY_SIZE(da7218_out_filtr_mix_controls)),
1647
1648 /* BiQuad Filters */
1649 SND_SOC_DAPM_MUX("Out FilterL BiQuad Mux", SND_SOC_NOPM, 0, 0,
1650 &da7218_out_filtl_biq_sel_mux),
1651 SND_SOC_DAPM_MUX("Out FilterR BiQuad Mux", SND_SOC_NOPM, 0, 0,
1652 &da7218_out_filtr_biq_sel_mux),
1653 SND_SOC_DAPM_DAC("BiQuad Filter", NULL, DA7218_OUT_1_BIQ_5STAGE_CTRL,
1654 DA7218_OUT_1_BIQ_5STAGE_FILTER_EN_SHIFT,
1655 DA7218_NO_INVERT),
1656
1657 /* Sidetone Mixers */
1658 SND_SOC_DAPM_MIXER("ST Mixer Out FilterL", SND_SOC_NOPM, 0, 0,
1659 da7218_st_out_filtl_mix_controls,
1660 ARRAY_SIZE(da7218_st_out_filtl_mix_controls)),
1661 SND_SOC_DAPM_MIXER("ST Mixer Out FilterR", SND_SOC_NOPM, 0, 0,
1662 da7218_st_out_filtr_mix_controls,
1663 ARRAY_SIZE(da7218_st_out_filtr_mix_controls)),
1664
1665 /* Output Filters */
1666 SND_SOC_DAPM_DAC("Out FilterL", NULL, DA7218_OUT_1L_FILTER_CTRL,
1667 DA7218_OUT_1L_FILTER_EN_SHIFT, DA7218_NO_INVERT),
1668 SND_SOC_DAPM_DAC("Out FilterR", NULL, DA7218_OUT_1R_FILTER_CTRL,
1669 DA7218_IN_1R_FILTER_EN_SHIFT, DA7218_NO_INVERT),
1670
1671 /* Output PGAs */
1672 SND_SOC_DAPM_PGA("Mixout Left PGA", DA7218_MIXOUT_L_CTRL,
1673 DA7218_MIXOUT_L_AMP_EN_SHIFT, DA7218_NO_INVERT,
1674 NULL, 0),
1675 SND_SOC_DAPM_PGA("Mixout Right PGA", DA7218_MIXOUT_R_CTRL,
1676 DA7218_MIXOUT_R_AMP_EN_SHIFT, DA7218_NO_INVERT,
1677 NULL, 0),
1678 SND_SOC_DAPM_PGA_E("Headphone Left PGA", DA7218_HP_L_CTRL,
1679 DA7218_HP_L_AMP_EN_SHIFT, DA7218_NO_INVERT, NULL, 0,
1680 da7218_hp_pga_event,
1681 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1682 SND_SOC_DAPM_PGA_E("Headphone Right PGA", DA7218_HP_R_CTRL,
1683 DA7218_HP_R_AMP_EN_SHIFT, DA7218_NO_INVERT, NULL, 0,
1684 da7218_hp_pga_event,
1685 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1686
1687 /* Output Supplies */
1688 SND_SOC_DAPM_SUPPLY("Charge Pump", SND_SOC_NOPM, 0, 0, da7218_cp_event,
1689 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
1690
1691 /* Outputs */
1692 SND_SOC_DAPM_OUTPUT("HPL"),
1693 SND_SOC_DAPM_OUTPUT("HPR"),
1694};
1695
1696
1697/*
1698 * DAPM Mixer Routes
1699 */
1700
1701#define DA7218_DMIX_ROUTES(name) \
1702 {name, "In Filter1L Switch", "In Filter1L"}, \
1703 {name, "In Filter1R Switch", "In Filter1R"}, \
1704 {name, "In Filter2L Switch", "In Filter2L"}, \
1705 {name, "In Filter2R Switch", "In Filter2R"}, \
1706 {name, "ToneGen Switch", "Tone Generator"}, \
1707 {name, "DAIL Switch", "DAIIN"}, \
1708 {name, "DAIR Switch", "DAIIN"}
1709
1710#define DA7218_DMIX_ST_ROUTES(name) \
1711 {name, "Out FilterL Switch", "Out FilterL BiQuad Mux"}, \
1712 {name, "Out FilterR Switch", "Out FilterR BiQuad Mux"}, \
1713 {name, "Sidetone Switch", "Sidetone Filter"}
1714
1715
1716/*
1717 * DAPM audio route definition
1718 */
1719
1720static const struct snd_soc_dapm_route da7218_audio_map[] = {
1721 /* Input paths */
1722 {"MIC1", NULL, "Mic Bias1"},
1723 {"MIC2", NULL, "Mic Bias2"},
1724 {"DMIC1L", NULL, "Mic Bias1"},
1725 {"DMIC1L", NULL, "DMic1 Left"},
1726 {"DMIC1R", NULL, "Mic Bias1"},
1727 {"DMIC1R", NULL, "DMic1 Right"},
1728 {"DMIC2L", NULL, "Mic Bias2"},
1729 {"DMIC2L", NULL, "DMic2 Left"},
1730 {"DMIC2R", NULL, "Mic Bias2"},
1731 {"DMIC2R", NULL, "DMic2 Right"},
1732
1733 {"Mic1 PGA", NULL, "MIC1"},
1734 {"Mic2 PGA", NULL, "MIC2"},
1735
1736 {"Mixin1 PGA", NULL, "Mixin1 Supply"},
1737 {"Mixin2 PGA", NULL, "Mixin2 Supply"},
1738
1739 {"Mixin1 PGA", NULL, "Mic1 PGA"},
1740 {"Mixin2 PGA", NULL, "Mic2 PGA"},
1741
1742 {"Mic1 Mux", "Analog", "Mixin1 PGA"},
1743 {"Mic1 Mux", "Digital", "DMIC1L"},
1744 {"Mic1 Mux", "Digital", "DMIC1R"},
1745 {"Mic2 Mux", "Analog", "Mixin2 PGA"},
1746 {"Mic2 Mux", "Digital", "DMIC2L"},
1747 {"Mic2 Mux", "Digital", "DMIC2R"},
1748
1749 {"In Filter1L", NULL, "Mic1 Mux"},
1750 {"In Filter1R", NULL, "Mic1 Mux"},
1751 {"In Filter2L", NULL, "Mic2 Mux"},
1752 {"In Filter2R", NULL, "Mic2 Mux"},
1753
1754 {"Tone Generator", NULL, "TONE"},
1755
1756 {"Sidetone Mux", "In Filter1L", "In Filter1L"},
1757 {"Sidetone Mux", "In Filter1R", "In Filter1R"},
1758 {"Sidetone Mux", "In Filter2L", "In Filter2L"},
1759 {"Sidetone Mux", "In Filter2R", "In Filter2R"},
1760 {"Sidetone Filter", NULL, "Sidetone Mux"},
1761
1762 DA7218_DMIX_ROUTES("Mixer DAI1L"),
1763 DA7218_DMIX_ROUTES("Mixer DAI1R"),
1764 DA7218_DMIX_ROUTES("Mixer DAI2L"),
1765 DA7218_DMIX_ROUTES("Mixer DAI2R"),
1766
1767 {"DAIOUT", NULL, "Mixer DAI1L"},
1768 {"DAIOUT", NULL, "Mixer DAI1R"},
1769 {"DAIOUT", NULL, "Mixer DAI2L"},
1770 {"DAIOUT", NULL, "Mixer DAI2R"},
1771
1772 {"DAIOUT", NULL, "DAI"},
1773
1774 /* Output paths */
1775 {"DAIIN", NULL, "DAI"},
1776
1777 DA7218_DMIX_ROUTES("Mixer Out FilterL"),
1778 DA7218_DMIX_ROUTES("Mixer Out FilterR"),
1779
1780 {"BiQuad Filter", NULL, "Mixer Out FilterL"},
1781 {"BiQuad Filter", NULL, "Mixer Out FilterR"},
1782
1783 {"Out FilterL BiQuad Mux", "Bypass", "Mixer Out FilterL"},
1784 {"Out FilterL BiQuad Mux", "Enabled", "BiQuad Filter"},
1785 {"Out FilterR BiQuad Mux", "Bypass", "Mixer Out FilterR"},
1786 {"Out FilterR BiQuad Mux", "Enabled", "BiQuad Filter"},
1787
1788 DA7218_DMIX_ST_ROUTES("ST Mixer Out FilterL"),
1789 DA7218_DMIX_ST_ROUTES("ST Mixer Out FilterR"),
1790
1791 {"Out FilterL", NULL, "ST Mixer Out FilterL"},
1792 {"Out FilterR", NULL, "ST Mixer Out FilterR"},
1793
1794 {"Mixout Left PGA", NULL, "Out FilterL"},
1795 {"Mixout Right PGA", NULL, "Out FilterR"},
1796
1797 {"Headphone Left PGA", NULL, "Mixout Left PGA"},
1798 {"Headphone Right PGA", NULL, "Mixout Right PGA"},
1799
1800 {"HPL", NULL, "Headphone Left PGA"},
1801 {"HPR", NULL, "Headphone Right PGA"},
1802
1803 {"HPL", NULL, "Charge Pump"},
1804 {"HPR", NULL, "Charge Pump"},
1805};
1806
1807
1808/*
1809 * DAI operations
1810 */
1811
1812static int da7218_set_dai_sysclk(struct snd_soc_dai *codec_dai,
1813 int clk_id, unsigned int freq, int dir)
1814{
1815 struct snd_soc_codec *codec = codec_dai->codec;
1816 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
1817 int ret;
1818
1819 if (da7218->mclk_rate == freq)
1820 return 0;
1821
1822 if (((freq < 2000000) && (freq != 32768)) || (freq > 54000000)) {
1823 dev_err(codec_dai->dev, "Unsupported MCLK value %d\n",
1824 freq);
1825 return -EINVAL;
1826 }
1827
1828 switch (clk_id) {
1829 case DA7218_CLKSRC_MCLK_SQR:
1830 snd_soc_update_bits(codec, DA7218_PLL_CTRL,
1831 DA7218_PLL_MCLK_SQR_EN_MASK,
1832 DA7218_PLL_MCLK_SQR_EN_MASK);
1833 break;
1834 case DA7218_CLKSRC_MCLK:
1835 snd_soc_update_bits(codec, DA7218_PLL_CTRL,
1836 DA7218_PLL_MCLK_SQR_EN_MASK, 0);
1837 break;
1838 default:
1839 dev_err(codec_dai->dev, "Unknown clock source %d\n", clk_id);
1840 return -EINVAL;
1841 }
1842
1843 if (da7218->mclk) {
1844 freq = clk_round_rate(da7218->mclk, freq);
1845 ret = clk_set_rate(da7218->mclk, freq);
1846 if (ret) {
1847 dev_err(codec_dai->dev, "Failed to set clock rate %d\n",
1848 freq);
1849 return ret;
1850 }
1851 }
1852
1853 da7218->mclk_rate = freq;
1854
1855 return 0;
1856}
1857
1858static int da7218_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
1859 int source, unsigned int fref, unsigned int fout)
1860{
1861 struct snd_soc_codec *codec = codec_dai->codec;
1862 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
1863
1864 u8 pll_ctrl, indiv_bits, indiv;
1865 u8 pll_frac_top, pll_frac_bot, pll_integer;
1866 u32 freq_ref;
1867 u64 frac_div;
1868
1869 /* Verify 32KHz, 2MHz - 54MHz MCLK provided, and set input divider */
1870 if (da7218->mclk_rate == 32768) {
1871 indiv_bits = DA7218_PLL_INDIV_2_5_MHZ;
1872 indiv = DA7218_PLL_INDIV_2_10_MHZ_VAL;
1873 } else if (da7218->mclk_rate < 2000000) {
1874 dev_err(codec->dev, "PLL input clock %d below valid range\n",
1875 da7218->mclk_rate);
1876 return -EINVAL;
1877 } else if (da7218->mclk_rate <= 5000000) {
1878 indiv_bits = DA7218_PLL_INDIV_2_5_MHZ;
1879 indiv = DA7218_PLL_INDIV_2_10_MHZ_VAL;
1880 } else if (da7218->mclk_rate <= 10000000) {
1881 indiv_bits = DA7218_PLL_INDIV_5_10_MHZ;
1882 indiv = DA7218_PLL_INDIV_2_10_MHZ_VAL;
1883 } else if (da7218->mclk_rate <= 20000000) {
1884 indiv_bits = DA7218_PLL_INDIV_10_20_MHZ;
1885 indiv = DA7218_PLL_INDIV_10_20_MHZ_VAL;
1886 } else if (da7218->mclk_rate <= 40000000) {
1887 indiv_bits = DA7218_PLL_INDIV_20_40_MHZ;
1888 indiv = DA7218_PLL_INDIV_20_40_MHZ_VAL;
1889 } else if (da7218->mclk_rate <= 54000000) {
1890 indiv_bits = DA7218_PLL_INDIV_40_54_MHZ;
1891 indiv = DA7218_PLL_INDIV_40_54_MHZ_VAL;
1892 } else {
1893 dev_err(codec->dev, "PLL input clock %d above valid range\n",
1894 da7218->mclk_rate);
1895 return -EINVAL;
1896 }
1897 freq_ref = (da7218->mclk_rate / indiv);
1898 pll_ctrl = indiv_bits;
1899
1900 /* Configure PLL */
1901 switch (source) {
1902 case DA7218_SYSCLK_MCLK:
1903 pll_ctrl |= DA7218_PLL_MODE_BYPASS;
1904 snd_soc_update_bits(codec, DA7218_PLL_CTRL,
1905 DA7218_PLL_INDIV_MASK |
1906 DA7218_PLL_MODE_MASK, pll_ctrl);
1907 return 0;
1908 case DA7218_SYSCLK_PLL:
1909 pll_ctrl |= DA7218_PLL_MODE_NORMAL;
1910 break;
1911 case DA7218_SYSCLK_PLL_SRM:
1912 pll_ctrl |= DA7218_PLL_MODE_SRM;
1913 break;
1914 case DA7218_SYSCLK_PLL_32KHZ:
1915 pll_ctrl |= DA7218_PLL_MODE_32KHZ;
1916 break;
1917 default:
1918 dev_err(codec->dev, "Invalid PLL config\n");
1919 return -EINVAL;
1920 }
1921
1922 /* Calculate dividers for PLL */
1923 pll_integer = fout / freq_ref;
1924 frac_div = (u64)(fout % freq_ref) * 8192ULL;
1925 do_div(frac_div, freq_ref);
1926 pll_frac_top = (frac_div >> DA7218_BYTE_SHIFT) & DA7218_BYTE_MASK;
1927 pll_frac_bot = (frac_div) & DA7218_BYTE_MASK;
1928
1929 /* Write PLL config & dividers */
1930 snd_soc_write(codec, DA7218_PLL_FRAC_TOP, pll_frac_top);
1931 snd_soc_write(codec, DA7218_PLL_FRAC_BOT, pll_frac_bot);
1932 snd_soc_write(codec, DA7218_PLL_INTEGER, pll_integer);
1933 snd_soc_update_bits(codec, DA7218_PLL_CTRL,
1934 DA7218_PLL_MODE_MASK | DA7218_PLL_INDIV_MASK,
1935 pll_ctrl);
1936
1937 return 0;
1938}
1939
1940static int da7218_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
1941{
1942 struct snd_soc_codec *codec = codec_dai->codec;
1943 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
1944 u8 dai_clk_mode = 0, dai_ctrl = 0;
1945
1946 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1947 case SND_SOC_DAIFMT_CBM_CFM:
1948 da7218->master = true;
1949 break;
1950 case SND_SOC_DAIFMT_CBS_CFS:
1951 da7218->master = false;
1952 break;
1953 default:
1954 return -EINVAL;
1955 }
1956
1957 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1958 case SND_SOC_DAIFMT_I2S:
1959 case SND_SOC_DAIFMT_LEFT_J:
1960 case SND_SOC_DAIFMT_RIGHT_J:
1961 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1962 case SND_SOC_DAIFMT_NB_NF:
1963 break;
1964 case SND_SOC_DAIFMT_NB_IF:
1965 dai_clk_mode |= DA7218_DAI_WCLK_POL_INV;
1966 break;
1967 case SND_SOC_DAIFMT_IB_NF:
1968 dai_clk_mode |= DA7218_DAI_CLK_POL_INV;
1969 break;
1970 case SND_SOC_DAIFMT_IB_IF:
1971 dai_clk_mode |= DA7218_DAI_WCLK_POL_INV |
1972 DA7218_DAI_CLK_POL_INV;
1973 break;
1974 default:
1975 return -EINVAL;
1976 }
1977 break;
1978 case SND_SOC_DAIFMT_DSP_B:
1979 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1980 case SND_SOC_DAIFMT_NB_NF:
1981 dai_clk_mode |= DA7218_DAI_CLK_POL_INV;
1982 break;
1983 case SND_SOC_DAIFMT_NB_IF:
1984 dai_clk_mode |= DA7218_DAI_WCLK_POL_INV |
1985 DA7218_DAI_CLK_POL_INV;
1986 break;
1987 case SND_SOC_DAIFMT_IB_NF:
1988 break;
1989 case SND_SOC_DAIFMT_IB_IF:
1990 dai_clk_mode |= DA7218_DAI_WCLK_POL_INV;
1991 break;
1992 default:
1993 return -EINVAL;
1994 }
1995 break;
1996 default:
1997 return -EINVAL;
1998 }
1999
2000 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
2001 case SND_SOC_DAIFMT_I2S:
2002 dai_ctrl |= DA7218_DAI_FORMAT_I2S;
2003 break;
2004 case SND_SOC_DAIFMT_LEFT_J:
2005 dai_ctrl |= DA7218_DAI_FORMAT_LEFT_J;
2006 break;
2007 case SND_SOC_DAIFMT_RIGHT_J:
2008 dai_ctrl |= DA7218_DAI_FORMAT_RIGHT_J;
2009 break;
2010 case SND_SOC_DAIFMT_DSP_B:
2011 dai_ctrl |= DA7218_DAI_FORMAT_DSP;
2012 break;
2013 default:
2014 return -EINVAL;
2015 }
2016
2017 /* By default 64 BCLKs per WCLK is supported */
2018 dai_clk_mode |= DA7218_DAI_BCLKS_PER_WCLK_64;
2019
2020 snd_soc_write(codec, DA7218_DAI_CLK_MODE, dai_clk_mode);
2021 snd_soc_update_bits(codec, DA7218_DAI_CTRL, DA7218_DAI_FORMAT_MASK,
2022 dai_ctrl);
2023
2024 return 0;
2025}
2026
2027static int da7218_set_dai_tdm_slot(struct snd_soc_dai *dai,
2028 unsigned int tx_mask, unsigned int rx_mask,
2029 int slots, int slot_width)
2030{
2031 struct snd_soc_codec *codec = dai->codec;
2032 u8 dai_bclks_per_wclk;
2033 u32 frame_size;
2034
2035 /* No channels enabled so disable TDM, revert to 64-bit frames */
2036 if (!tx_mask) {
2037 snd_soc_update_bits(codec, DA7218_DAI_TDM_CTRL,
2038 DA7218_DAI_TDM_CH_EN_MASK |
2039 DA7218_DAI_TDM_MODE_EN_MASK, 0);
2040 snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE,
2041 DA7218_DAI_BCLKS_PER_WCLK_MASK,
2042 DA7218_DAI_BCLKS_PER_WCLK_64);
2043 return 0;
2044 }
2045
2046 /* Check we have valid slots */
2047 if (fls(tx_mask) > DA7218_DAI_TDM_MAX_SLOTS) {
2048 dev_err(codec->dev, "Invalid number of slots, max = %d\n",
2049 DA7218_DAI_TDM_MAX_SLOTS);
2050 return -EINVAL;
2051 }
2052
2053 /* Check we have a valid offset given (first 2 bytes of rx_mask) */
2054 if (rx_mask >> DA7218_2BYTE_SHIFT) {
2055 dev_err(codec->dev, "Invalid slot offset, max = %d\n",
2056 DA7218_2BYTE_MASK);
2057 return -EINVAL;
2058 }
2059
2060 /* Calculate & validate frame size based on slot info provided. */
2061 frame_size = slots * slot_width;
2062 switch (frame_size) {
2063 case 32:
2064 dai_bclks_per_wclk = DA7218_DAI_BCLKS_PER_WCLK_32;
2065 break;
2066 case 64:
2067 dai_bclks_per_wclk = DA7218_DAI_BCLKS_PER_WCLK_64;
2068 break;
2069 case 128:
2070 dai_bclks_per_wclk = DA7218_DAI_BCLKS_PER_WCLK_128;
2071 break;
2072 case 256:
2073 dai_bclks_per_wclk = DA7218_DAI_BCLKS_PER_WCLK_256;
2074 break;
2075 default:
2076 dev_err(codec->dev, "Invalid frame size\n");
2077 return -EINVAL;
2078 }
2079
2080 snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE,
2081 DA7218_DAI_BCLKS_PER_WCLK_MASK,
2082 dai_bclks_per_wclk);
2083 snd_soc_write(codec, DA7218_DAI_OFFSET_LOWER,
2084 (rx_mask & DA7218_BYTE_MASK));
2085 snd_soc_write(codec, DA7218_DAI_OFFSET_UPPER,
2086 ((rx_mask >> DA7218_BYTE_SHIFT) & DA7218_BYTE_MASK));
2087 snd_soc_update_bits(codec, DA7218_DAI_TDM_CTRL,
2088 DA7218_DAI_TDM_CH_EN_MASK |
2089 DA7218_DAI_TDM_MODE_EN_MASK,
2090 (tx_mask << DA7218_DAI_TDM_CH_EN_SHIFT) |
2091 DA7218_DAI_TDM_MODE_EN_MASK);
2092
2093 return 0;
2094}
2095
2096static int da7218_hw_params(struct snd_pcm_substream *substream,
2097 struct snd_pcm_hw_params *params,
2098 struct snd_soc_dai *dai)
2099{
2100 struct snd_soc_codec *codec = dai->codec;
2101 u8 dai_ctrl = 0, fs;
2102 unsigned int channels;
2103
2104 switch (params_width(params)) {
2105 case 16:
2106 dai_ctrl |= DA7218_DAI_WORD_LENGTH_S16_LE;
2107 break;
2108 case 20:
2109 dai_ctrl |= DA7218_DAI_WORD_LENGTH_S20_LE;
2110 break;
2111 case 24:
2112 dai_ctrl |= DA7218_DAI_WORD_LENGTH_S24_LE;
2113 break;
2114 case 32:
2115 dai_ctrl |= DA7218_DAI_WORD_LENGTH_S32_LE;
2116 break;
2117 default:
2118 return -EINVAL;
2119 }
2120
2121 channels = params_channels(params);
2122 if ((channels < 1) || (channels > DA7218_DAI_CH_NUM_MAX)) {
2123 dev_err(codec->dev,
2124 "Invalid number of channels, only 1 to %d supported\n",
2125 DA7218_DAI_CH_NUM_MAX);
2126 return -EINVAL;
2127 }
2128 dai_ctrl |= channels << DA7218_DAI_CH_NUM_SHIFT;
2129
2130 switch (params_rate(params)) {
2131 case 8000:
2132 fs = DA7218_SR_8000;
2133 break;
2134 case 11025:
2135 fs = DA7218_SR_11025;
2136 break;
2137 case 12000:
2138 fs = DA7218_SR_12000;
2139 break;
2140 case 16000:
2141 fs = DA7218_SR_16000;
2142 break;
2143 case 22050:
2144 fs = DA7218_SR_22050;
2145 break;
2146 case 24000:
2147 fs = DA7218_SR_24000;
2148 break;
2149 case 32000:
2150 fs = DA7218_SR_32000;
2151 break;
2152 case 44100:
2153 fs = DA7218_SR_44100;
2154 break;
2155 case 48000:
2156 fs = DA7218_SR_48000;
2157 break;
2158 case 88200:
2159 fs = DA7218_SR_88200;
2160 break;
2161 case 96000:
2162 fs = DA7218_SR_96000;
2163 break;
2164 default:
2165 return -EINVAL;
2166 }
2167
2168 snd_soc_update_bits(codec, DA7218_DAI_CTRL,
2169 DA7218_DAI_WORD_LENGTH_MASK | DA7218_DAI_CH_NUM_MASK,
2170 dai_ctrl);
2171 /* SRs tied for ADCs and DACs. */
2172 snd_soc_write(codec, DA7218_SR,
2173 (fs << DA7218_SR_DAC_SHIFT) | (fs << DA7218_SR_ADC_SHIFT));
2174
2175 return 0;
2176}
2177
2178static const struct snd_soc_dai_ops da7218_dai_ops = {
2179 .hw_params = da7218_hw_params,
2180 .set_sysclk = da7218_set_dai_sysclk,
2181 .set_pll = da7218_set_dai_pll,
2182 .set_fmt = da7218_set_dai_fmt,
2183 .set_tdm_slot = da7218_set_dai_tdm_slot,
2184};
2185
2186#define DA7218_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
2187 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
2188
2189static struct snd_soc_dai_driver da7218_dai = {
2190 .name = "da7218-hifi",
2191 .playback = {
2192 .stream_name = "Playback",
2193 .channels_min = 1,
2194 .channels_max = 4, /* Only 2 channels of data */
2195 .rates = SNDRV_PCM_RATE_8000_96000,
2196 .formats = DA7218_FORMATS,
2197 },
2198 .capture = {
2199 .stream_name = "Capture",
2200 .channels_min = 1,
2201 .channels_max = 4,
2202 .rates = SNDRV_PCM_RATE_8000_96000,
2203 .formats = DA7218_FORMATS,
2204 },
2205 .ops = &da7218_dai_ops,
2206 .symmetric_rates = 1,
2207 .symmetric_channels = 1,
2208 .symmetric_samplebits = 1,
2209};
2210
2211
2212/*
2213 * HP Detect
2214 */
2215
2216int da7218_hpldet(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
2217{
2218 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
2219
2220 if (da7218->dev_id == DA7217_DEV_ID)
2221 return -EINVAL;
2222
2223 da7218->jack = jack;
2224 snd_soc_update_bits(codec, DA7218_HPLDET_JACK,
2225 DA7218_HPLDET_JACK_EN_MASK,
2226 jack ? DA7218_HPLDET_JACK_EN_MASK : 0);
2227
2228 return 0;
2229}
2230EXPORT_SYMBOL_GPL(da7218_hpldet);
2231
2232static void da7218_micldet_irq(struct snd_soc_codec *codec)
2233{
2234 char *envp[] = {
2235 "EVENT=MIC_LEVEL_DETECT",
2236 NULL,
2237 };
2238
2239 kobject_uevent_env(&codec->dev->kobj, KOBJ_CHANGE, envp);
2240}
2241
2242static void da7218_hpldet_irq(struct snd_soc_codec *codec)
2243{
2244 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
2245 u8 jack_status;
2246 int report;
2247
2248 jack_status = snd_soc_read(codec, DA7218_EVENT_STATUS);
2249
2250 if (jack_status & DA7218_HPLDET_JACK_STS_MASK)
2251 report = SND_JACK_HEADPHONE;
2252 else
2253 report = 0;
2254
2255 snd_soc_jack_report(da7218->jack, report, SND_JACK_HEADPHONE);
2256}
2257
2258/*
2259 * IRQ
2260 */
2261
2262static irqreturn_t da7218_irq_thread(int irq, void *data)
2263{
2264 struct snd_soc_codec *codec = data;
2265 u8 status;
2266
2267 /* Read IRQ status reg */
2268 status = snd_soc_read(codec, DA7218_EVENT);
2269 if (!status)
2270 return IRQ_NONE;
2271
2272 /* Mic level detect */
2273 if (status & DA7218_LVL_DET_EVENT_MASK)
2274 da7218_micldet_irq(codec);
2275
2276 /* HP detect */
2277 if (status & DA7218_HPLDET_JACK_EVENT_MASK)
2278 da7218_hpldet_irq(codec);
2279
2280 /* Clear interrupts */
2281 snd_soc_write(codec, DA7218_EVENT, status);
2282
2283 return IRQ_HANDLED;
2284}
2285
2286/*
2287 * DT
2288 */
2289
2290static const struct of_device_id da7218_of_match[] = {
2291 { .compatible = "dlg,da7217", .data = (void *) DA7217_DEV_ID },
2292 { .compatible = "dlg,da7218", .data = (void *) DA7218_DEV_ID },
2293 { }
2294};
2295MODULE_DEVICE_TABLE(of, da7218_of_match);
2296
2297static inline int da7218_of_get_id(struct device *dev)
2298{
2299 const struct of_device_id *id = of_match_device(da7218_of_match, dev);
2300
2301 if (id)
2302 return (uintptr_t)id->data;
2303 else
2304 return -EINVAL;
2305}
2306
2307static enum da7218_micbias_voltage
2308 da7218_of_micbias_lvl(struct snd_soc_codec *codec, u32 val)
2309{
2310 switch (val) {
2311 case 1200:
2312 return DA7218_MICBIAS_1_2V;
2313 case 1600:
2314 return DA7218_MICBIAS_1_6V;
2315 case 1800:
2316 return DA7218_MICBIAS_1_8V;
2317 case 2000:
2318 return DA7218_MICBIAS_2_0V;
2319 case 2200:
2320 return DA7218_MICBIAS_2_2V;
2321 case 2400:
2322 return DA7218_MICBIAS_2_4V;
2323 case 2600:
2324 return DA7218_MICBIAS_2_6V;
2325 case 2800:
2326 return DA7218_MICBIAS_2_8V;
2327 case 3000:
2328 return DA7218_MICBIAS_3_0V;
2329 default:
2330 dev_warn(codec->dev, "Invalid micbias level");
2331 return DA7218_MICBIAS_1_6V;
2332 }
2333}
2334
2335static enum da7218_mic_amp_in_sel
2336 da7218_of_mic_amp_in_sel(struct snd_soc_codec *codec, const char *str)
2337{
2338 if (!strcmp(str, "diff")) {
2339 return DA7218_MIC_AMP_IN_SEL_DIFF;
2340 } else if (!strcmp(str, "se_p")) {
2341 return DA7218_MIC_AMP_IN_SEL_SE_P;
2342 } else if (!strcmp(str, "se_n")) {
2343 return DA7218_MIC_AMP_IN_SEL_SE_N;
2344 } else {
2345 dev_warn(codec->dev, "Invalid mic input type selection");
2346 return DA7218_MIC_AMP_IN_SEL_DIFF;
2347 }
2348}
2349
2350static enum da7218_dmic_data_sel
2351 da7218_of_dmic_data_sel(struct snd_soc_codec *codec, const char *str)
2352{
2353 if (!strcmp(str, "lrise_rfall")) {
2354 return DA7218_DMIC_DATA_LRISE_RFALL;
2355 } else if (!strcmp(str, "lfall_rrise")) {
2356 return DA7218_DMIC_DATA_LFALL_RRISE;
2357 } else {
2358 dev_warn(codec->dev, "Invalid DMIC data type selection");
2359 return DA7218_DMIC_DATA_LRISE_RFALL;
2360 }
2361}
2362
2363static enum da7218_dmic_samplephase
2364 da7218_of_dmic_samplephase(struct snd_soc_codec *codec, const char *str)
2365{
2366 if (!strcmp(str, "on_clkedge")) {
2367 return DA7218_DMIC_SAMPLE_ON_CLKEDGE;
2368 } else if (!strcmp(str, "between_clkedge")) {
2369 return DA7218_DMIC_SAMPLE_BETWEEN_CLKEDGE;
2370 } else {
2371 dev_warn(codec->dev, "Invalid DMIC sample phase");
2372 return DA7218_DMIC_SAMPLE_ON_CLKEDGE;
2373 }
2374}
2375
2376static enum da7218_dmic_clk_rate
2377 da7218_of_dmic_clkrate(struct snd_soc_codec *codec, u32 val)
2378{
2379 switch (val) {
2380 case 1500000:
2381 return DA7218_DMIC_CLK_1_5MHZ;
2382 case 3000000:
2383 return DA7218_DMIC_CLK_3_0MHZ;
2384 default:
2385 dev_warn(codec->dev, "Invalid DMIC clock rate");
2386 return DA7218_DMIC_CLK_3_0MHZ;
2387 }
2388}
2389
2390static enum da7218_hpldet_jack_rate
2391 da7218_of_jack_rate(struct snd_soc_codec *codec, u32 val)
2392{
2393 switch (val) {
2394 case 5:
2395 return DA7218_HPLDET_JACK_RATE_5US;
2396 case 10:
2397 return DA7218_HPLDET_JACK_RATE_10US;
2398 case 20:
2399 return DA7218_HPLDET_JACK_RATE_20US;
2400 case 40:
2401 return DA7218_HPLDET_JACK_RATE_40US;
2402 case 80:
2403 return DA7218_HPLDET_JACK_RATE_80US;
2404 case 160:
2405 return DA7218_HPLDET_JACK_RATE_160US;
2406 case 320:
2407 return DA7218_HPLDET_JACK_RATE_320US;
2408 case 640:
2409 return DA7218_HPLDET_JACK_RATE_640US;
2410 default:
2411 dev_warn(codec->dev, "Invalid jack detect rate");
2412 return DA7218_HPLDET_JACK_RATE_40US;
2413 }
2414}
2415
2416static enum da7218_hpldet_jack_debounce
2417 da7218_of_jack_debounce(struct snd_soc_codec *codec, u32 val)
2418{
2419 switch (val) {
2420 case 0:
2421 return DA7218_HPLDET_JACK_DEBOUNCE_OFF;
2422 case 2:
2423 return DA7218_HPLDET_JACK_DEBOUNCE_2;
2424 case 3:
2425 return DA7218_HPLDET_JACK_DEBOUNCE_3;
2426 case 4:
2427 return DA7218_HPLDET_JACK_DEBOUNCE_4;
2428 default:
2429 dev_warn(codec->dev, "Invalid jack debounce");
2430 return DA7218_HPLDET_JACK_DEBOUNCE_2;
2431 }
2432}
2433
2434static enum da7218_hpldet_jack_thr
2435 da7218_of_jack_thr(struct snd_soc_codec *codec, u32 val)
2436{
2437 switch (val) {
2438 case 84:
2439 return DA7218_HPLDET_JACK_THR_84PCT;
2440 case 88:
2441 return DA7218_HPLDET_JACK_THR_88PCT;
2442 case 92:
2443 return DA7218_HPLDET_JACK_THR_92PCT;
2444 case 96:
2445 return DA7218_HPLDET_JACK_THR_96PCT;
2446 default:
2447 dev_warn(codec->dev, "Invalid jack threshold level");
2448 return DA7218_HPLDET_JACK_THR_84PCT;
2449 }
2450}
2451
2452static struct da7218_pdata *da7218_of_to_pdata(struct snd_soc_codec *codec)
2453{
2454 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
2455 struct device_node *np = codec->dev->of_node;
2456 struct device_node *hpldet_np;
2457 struct da7218_pdata *pdata;
2458 struct da7218_hpldet_pdata *hpldet_pdata;
2459 const char *of_str;
2460 u32 of_val32;
2461
2462 pdata = devm_kzalloc(codec->dev, sizeof(*pdata), GFP_KERNEL);
2463 if (!pdata) {
2464 dev_warn(codec->dev, "Failed to allocate memory for pdata\n");
2465 return NULL;
2466 }
2467
2468 if (of_property_read_u32(np, "dlg,micbias1-lvl-millivolt", &of_val32) >= 0)
2469 pdata->micbias1_lvl = da7218_of_micbias_lvl(codec, of_val32);
2470 else
2471 pdata->micbias1_lvl = DA7218_MICBIAS_1_6V;
2472
2473 if (of_property_read_u32(np, "dlg,micbias2-lvl-millivolt", &of_val32) >= 0)
2474 pdata->micbias2_lvl = da7218_of_micbias_lvl(codec, of_val32);
2475 else
2476 pdata->micbias2_lvl = DA7218_MICBIAS_1_6V;
2477
2478 if (!of_property_read_string(np, "dlg,mic1-amp-in-sel", &of_str))
2479 pdata->mic1_amp_in_sel =
2480 da7218_of_mic_amp_in_sel(codec, of_str);
2481 else
2482 pdata->mic1_amp_in_sel = DA7218_MIC_AMP_IN_SEL_DIFF;
2483
2484 if (!of_property_read_string(np, "dlg,mic2-amp-in-sel", &of_str))
2485 pdata->mic2_amp_in_sel =
2486 da7218_of_mic_amp_in_sel(codec, of_str);
2487 else
2488 pdata->mic2_amp_in_sel = DA7218_MIC_AMP_IN_SEL_DIFF;
2489
2490 if (!of_property_read_string(np, "dlg,dmic1-data-sel", &of_str))
2491 pdata->dmic1_data_sel = da7218_of_dmic_data_sel(codec, of_str);
2492 else
2493 pdata->dmic1_data_sel = DA7218_DMIC_DATA_LRISE_RFALL;
2494
2495 if (!of_property_read_string(np, "dlg,dmic1-samplephase", &of_str))
2496 pdata->dmic1_samplephase =
2497 da7218_of_dmic_samplephase(codec, of_str);
2498 else
2499 pdata->dmic1_samplephase = DA7218_DMIC_SAMPLE_ON_CLKEDGE;
2500
2501 if (of_property_read_u32(np, "dlg,dmic1-clkrate-hz", &of_val32) >= 0)
2502 pdata->dmic1_clk_rate = da7218_of_dmic_clkrate(codec, of_val32);
2503 else
2504 pdata->dmic1_clk_rate = DA7218_DMIC_CLK_3_0MHZ;
2505
2506 if (!of_property_read_string(np, "dlg,dmic2-data-sel", &of_str))
2507 pdata->dmic2_data_sel = da7218_of_dmic_data_sel(codec, of_str);
2508 else
2509 pdata->dmic2_data_sel = DA7218_DMIC_DATA_LRISE_RFALL;
2510
2511 if (!of_property_read_string(np, "dlg,dmic2-samplephase", &of_str))
2512 pdata->dmic2_samplephase =
2513 da7218_of_dmic_samplephase(codec, of_str);
2514 else
2515 pdata->dmic2_samplephase = DA7218_DMIC_SAMPLE_ON_CLKEDGE;
2516
2517 if (of_property_read_u32(np, "dlg,dmic2-clkrate-hz", &of_val32) >= 0)
2518 pdata->dmic2_clk_rate = da7218_of_dmic_clkrate(codec, of_val32);
2519 else
2520 pdata->dmic2_clk_rate = DA7218_DMIC_CLK_3_0MHZ;
2521
2522 if (da7218->dev_id == DA7217_DEV_ID) {
2523 if (of_property_read_bool(np, "dlg,hp-diff-single-supply"))
2524 pdata->hp_diff_single_supply = true;
2525 }
2526
2527 if (da7218->dev_id == DA7218_DEV_ID) {
2528 hpldet_np = of_find_node_by_name(np, "da7218_hpldet");
2529 if (!hpldet_np)
2530 return pdata;
2531
2532 hpldet_pdata = devm_kzalloc(codec->dev, sizeof(*hpldet_pdata),
2533 GFP_KERNEL);
2534 if (!hpldet_pdata) {
2535 dev_warn(codec->dev,
2536 "Failed to allocate memory for hpldet pdata\n");
2537 of_node_put(hpldet_np);
2538 return pdata;
2539 }
2540 pdata->hpldet_pdata = hpldet_pdata;
2541
2542 if (of_property_read_u32(hpldet_np, "dlg,jack-rate-us",
2543 &of_val32) >= 0)
2544 hpldet_pdata->jack_rate =
2545 da7218_of_jack_rate(codec, of_val32);
2546 else
2547 hpldet_pdata->jack_rate = DA7218_HPLDET_JACK_RATE_40US;
2548
2549 if (of_property_read_u32(hpldet_np, "dlg,jack-debounce",
2550 &of_val32) >= 0)
2551 hpldet_pdata->jack_debounce =
2552 da7218_of_jack_debounce(codec, of_val32);
2553 else
2554 hpldet_pdata->jack_debounce =
2555 DA7218_HPLDET_JACK_DEBOUNCE_2;
2556
2557 if (of_property_read_u32(hpldet_np, "dlg,jack-threshold-pct",
2558 &of_val32) >= 0)
2559 hpldet_pdata->jack_thr =
2560 da7218_of_jack_thr(codec, of_val32);
2561 else
2562 hpldet_pdata->jack_thr = DA7218_HPLDET_JACK_THR_84PCT;
2563
2564 if (of_property_read_bool(hpldet_np, "dlg,comp-inv"))
2565 hpldet_pdata->comp_inv = true;
2566
2567 if (of_property_read_bool(hpldet_np, "dlg,hyst"))
2568 hpldet_pdata->hyst = true;
2569
2570 if (of_property_read_bool(hpldet_np, "dlg,discharge"))
2571 hpldet_pdata->discharge = true;
2572
2573 of_node_put(hpldet_np);
2574 }
2575
2576 return pdata;
2577}
2578
2579
2580/*
2581 * Codec driver functions
2582 */
2583
2584static int da7218_set_bias_level(struct snd_soc_codec *codec,
2585 enum snd_soc_bias_level level)
2586{
2587 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
2588 int ret;
2589
2590 switch (level) {
2591 case SND_SOC_BIAS_ON:
2592 case SND_SOC_BIAS_PREPARE:
2593 break;
2594 case SND_SOC_BIAS_STANDBY:
2595 if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
2596 /* MCLK */
2597 if (da7218->mclk) {
2598 ret = clk_prepare_enable(da7218->mclk);
2599 if (ret) {
2600 dev_err(codec->dev,
2601 "Failed to enable mclk\n");
2602 return ret;
2603 }
2604 }
2605
2606 /* Master bias */
2607 snd_soc_update_bits(codec, DA7218_REFERENCES,
2608 DA7218_BIAS_EN_MASK,
2609 DA7218_BIAS_EN_MASK);
2610
2611 /* Internal LDO */
2612 snd_soc_update_bits(codec, DA7218_LDO_CTRL,
2613 DA7218_LDO_EN_MASK,
2614 DA7218_LDO_EN_MASK);
2615 }
2616 break;
2617 case SND_SOC_BIAS_OFF:
2618 /* Only disable if jack detection disabled */
2619 if (!da7218->jack) {
2620 /* Internal LDO */
2621 snd_soc_update_bits(codec, DA7218_LDO_CTRL,
2622 DA7218_LDO_EN_MASK, 0);
2623
2624 /* Master bias */
2625 snd_soc_update_bits(codec, DA7218_REFERENCES,
2626 DA7218_BIAS_EN_MASK, 0);
2627 }
2628
2629 /* MCLK */
2630 if (da7218->mclk)
2631 clk_disable_unprepare(da7218->mclk);
2632 break;
2633 }
2634
2635 return 0;
2636}
2637
2638static const char *da7218_supply_names[DA7218_NUM_SUPPLIES] = {
2639 [DA7218_SUPPLY_VDD] = "VDD",
2640 [DA7218_SUPPLY_VDDMIC] = "VDDMIC",
2641 [DA7218_SUPPLY_VDDIO] = "VDDIO",
2642};
2643
2644static int da7218_handle_supplies(struct snd_soc_codec *codec)
2645{
2646 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
2647 struct regulator *vddio;
2648 u8 io_voltage_lvl = DA7218_IO_VOLTAGE_LEVEL_2_5V_3_6V;
2649 int i, ret;
2650
2651 /* Get required supplies */
2652 for (i = 0; i < DA7218_NUM_SUPPLIES; ++i)
2653 da7218->supplies[i].supply = da7218_supply_names[i];
2654
2655 ret = devm_regulator_bulk_get(codec->dev, DA7218_NUM_SUPPLIES,
2656 da7218->supplies);
2657 if (ret) {
2658 dev_err(codec->dev, "Failed to get supplies\n");
2659 return ret;
2660 }
2661
2662 /* Determine VDDIO voltage provided */
2663 vddio = da7218->supplies[DA7218_SUPPLY_VDDIO].consumer;
2664 ret = regulator_get_voltage(vddio);
2665 if (ret < 1500000)
2666 dev_warn(codec->dev, "Invalid VDDIO voltage\n");
2667 else if (ret < 2500000)
2668 io_voltage_lvl = DA7218_IO_VOLTAGE_LEVEL_1_5V_2_5V;
2669
2670 /* Enable main supplies */
2671 ret = regulator_bulk_enable(DA7218_NUM_SUPPLIES, da7218->supplies);
2672 if (ret) {
2673 dev_err(codec->dev, "Failed to enable supplies\n");
2674 return ret;
2675 }
2676
2677 /* Ensure device in active mode */
2678 snd_soc_write(codec, DA7218_SYSTEM_ACTIVE, DA7218_SYSTEM_ACTIVE_MASK);
2679
2680 /* Update IO voltage level range */
2681 snd_soc_write(codec, DA7218_IO_CTRL, io_voltage_lvl);
2682
2683 return 0;
2684}
2685
2686static void da7218_handle_pdata(struct snd_soc_codec *codec)
2687{
2688 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
2689 struct da7218_pdata *pdata = da7218->pdata;
2690
2691 if (pdata) {
2692 u8 micbias_lvl = 0, dmic_cfg = 0;
2693
2694 /* Mic Bias voltages */
2695 switch (pdata->micbias1_lvl) {
2696 case DA7218_MICBIAS_1_2V:
2697 micbias_lvl |= DA7218_MICBIAS_1_LP_MODE_MASK;
2698 break;
2699 case DA7218_MICBIAS_1_6V:
2700 case DA7218_MICBIAS_1_8V:
2701 case DA7218_MICBIAS_2_0V:
2702 case DA7218_MICBIAS_2_2V:
2703 case DA7218_MICBIAS_2_4V:
2704 case DA7218_MICBIAS_2_6V:
2705 case DA7218_MICBIAS_2_8V:
2706 case DA7218_MICBIAS_3_0V:
2707 micbias_lvl |= (pdata->micbias1_lvl <<
2708 DA7218_MICBIAS_1_LEVEL_SHIFT);
2709 break;
2710 }
2711
2712 switch (pdata->micbias2_lvl) {
2713 case DA7218_MICBIAS_1_2V:
2714 micbias_lvl |= DA7218_MICBIAS_2_LP_MODE_MASK;
2715 break;
2716 case DA7218_MICBIAS_1_6V:
2717 case DA7218_MICBIAS_1_8V:
2718 case DA7218_MICBIAS_2_0V:
2719 case DA7218_MICBIAS_2_2V:
2720 case DA7218_MICBIAS_2_4V:
2721 case DA7218_MICBIAS_2_6V:
2722 case DA7218_MICBIAS_2_8V:
2723 case DA7218_MICBIAS_3_0V:
2724 micbias_lvl |= (pdata->micbias2_lvl <<
2725 DA7218_MICBIAS_2_LEVEL_SHIFT);
2726 break;
2727 }
2728
2729 snd_soc_write(codec, DA7218_MICBIAS_CTRL, micbias_lvl);
2730
2731 /* Mic */
2732 switch (pdata->mic1_amp_in_sel) {
2733 case DA7218_MIC_AMP_IN_SEL_DIFF:
2734 case DA7218_MIC_AMP_IN_SEL_SE_P:
2735 case DA7218_MIC_AMP_IN_SEL_SE_N:
2736 snd_soc_write(codec, DA7218_MIC_1_SELECT,
2737 pdata->mic1_amp_in_sel);
2738 break;
2739 }
2740
2741 switch (pdata->mic2_amp_in_sel) {
2742 case DA7218_MIC_AMP_IN_SEL_DIFF:
2743 case DA7218_MIC_AMP_IN_SEL_SE_P:
2744 case DA7218_MIC_AMP_IN_SEL_SE_N:
2745 snd_soc_write(codec, DA7218_MIC_2_SELECT,
2746 pdata->mic2_amp_in_sel);
2747 break;
2748 }
2749
2750 /* DMic */
2751 switch (pdata->dmic1_data_sel) {
2752 case DA7218_DMIC_DATA_LFALL_RRISE:
2753 case DA7218_DMIC_DATA_LRISE_RFALL:
2754 dmic_cfg |= (pdata->dmic1_data_sel <<
2755 DA7218_DMIC_1_DATA_SEL_SHIFT);
2756 break;
2757 }
2758
2759 switch (pdata->dmic1_samplephase) {
2760 case DA7218_DMIC_SAMPLE_ON_CLKEDGE:
2761 case DA7218_DMIC_SAMPLE_BETWEEN_CLKEDGE:
2762 dmic_cfg |= (pdata->dmic1_samplephase <<
2763 DA7218_DMIC_1_SAMPLEPHASE_SHIFT);
2764 break;
2765 }
2766
2767 switch (pdata->dmic1_clk_rate) {
2768 case DA7218_DMIC_CLK_3_0MHZ:
2769 case DA7218_DMIC_CLK_1_5MHZ:
2770 dmic_cfg |= (pdata->dmic1_clk_rate <<
2771 DA7218_DMIC_1_CLK_RATE_SHIFT);
2772 break;
2773 }
2774
2775 snd_soc_update_bits(codec, DA7218_DMIC_1_CTRL,
2776 DA7218_DMIC_1_DATA_SEL_MASK |
2777 DA7218_DMIC_1_SAMPLEPHASE_MASK |
2778 DA7218_DMIC_1_CLK_RATE_MASK, dmic_cfg);
2779
2780 dmic_cfg = 0;
2781 switch (pdata->dmic2_data_sel) {
2782 case DA7218_DMIC_DATA_LFALL_RRISE:
2783 case DA7218_DMIC_DATA_LRISE_RFALL:
2784 dmic_cfg |= (pdata->dmic2_data_sel <<
2785 DA7218_DMIC_2_DATA_SEL_SHIFT);
2786 break;
2787 }
2788
2789 switch (pdata->dmic2_samplephase) {
2790 case DA7218_DMIC_SAMPLE_ON_CLKEDGE:
2791 case DA7218_DMIC_SAMPLE_BETWEEN_CLKEDGE:
2792 dmic_cfg |= (pdata->dmic2_samplephase <<
2793 DA7218_DMIC_2_SAMPLEPHASE_SHIFT);
2794 break;
2795 }
2796
2797 switch (pdata->dmic2_clk_rate) {
2798 case DA7218_DMIC_CLK_3_0MHZ:
2799 case DA7218_DMIC_CLK_1_5MHZ:
2800 dmic_cfg |= (pdata->dmic2_clk_rate <<
2801 DA7218_DMIC_2_CLK_RATE_SHIFT);
2802 break;
2803 }
2804
2805 snd_soc_update_bits(codec, DA7218_DMIC_2_CTRL,
2806 DA7218_DMIC_2_DATA_SEL_MASK |
2807 DA7218_DMIC_2_SAMPLEPHASE_MASK |
2808 DA7218_DMIC_2_CLK_RATE_MASK, dmic_cfg);
2809
2810 /* DA7217 Specific */
2811 if (da7218->dev_id == DA7217_DEV_ID) {
2812 da7218->hp_single_supply =
2813 pdata->hp_diff_single_supply;
2814
2815 if (da7218->hp_single_supply) {
2816 snd_soc_write(codec, DA7218_HP_DIFF_UNLOCK,
2817 DA7218_HP_DIFF_UNLOCK_VAL);
2818 snd_soc_update_bits(codec, DA7218_HP_DIFF_CTRL,
2819 DA7218_HP_AMP_SINGLE_SUPPLY_EN_MASK,
2820 DA7218_HP_AMP_SINGLE_SUPPLY_EN_MASK);
2821 }
2822 }
2823
2824 /* DA7218 Specific */
2825 if ((da7218->dev_id == DA7218_DEV_ID) &&
2826 (pdata->hpldet_pdata)) {
2827 struct da7218_hpldet_pdata *hpldet_pdata =
2828 pdata->hpldet_pdata;
2829 u8 hpldet_cfg = 0;
2830
2831 switch (hpldet_pdata->jack_rate) {
2832 case DA7218_HPLDET_JACK_RATE_5US:
2833 case DA7218_HPLDET_JACK_RATE_10US:
2834 case DA7218_HPLDET_JACK_RATE_20US:
2835 case DA7218_HPLDET_JACK_RATE_40US:
2836 case DA7218_HPLDET_JACK_RATE_80US:
2837 case DA7218_HPLDET_JACK_RATE_160US:
2838 case DA7218_HPLDET_JACK_RATE_320US:
2839 case DA7218_HPLDET_JACK_RATE_640US:
2840 hpldet_cfg |=
2841 (hpldet_pdata->jack_rate <<
2842 DA7218_HPLDET_JACK_RATE_SHIFT);
2843 break;
2844 }
2845
2846 switch (hpldet_pdata->jack_debounce) {
2847 case DA7218_HPLDET_JACK_DEBOUNCE_OFF:
2848 case DA7218_HPLDET_JACK_DEBOUNCE_2:
2849 case DA7218_HPLDET_JACK_DEBOUNCE_3:
2850 case DA7218_HPLDET_JACK_DEBOUNCE_4:
2851 hpldet_cfg |=
2852 (hpldet_pdata->jack_debounce <<
2853 DA7218_HPLDET_JACK_DEBOUNCE_SHIFT);
2854 break;
2855 }
2856
2857 switch (hpldet_pdata->jack_thr) {
2858 case DA7218_HPLDET_JACK_THR_84PCT:
2859 case DA7218_HPLDET_JACK_THR_88PCT:
2860 case DA7218_HPLDET_JACK_THR_92PCT:
2861 case DA7218_HPLDET_JACK_THR_96PCT:
2862 hpldet_cfg |=
2863 (hpldet_pdata->jack_thr <<
2864 DA7218_HPLDET_JACK_THR_SHIFT);
2865 break;
2866 }
2867 snd_soc_update_bits(codec, DA7218_HPLDET_JACK,
2868 DA7218_HPLDET_JACK_RATE_MASK |
2869 DA7218_HPLDET_JACK_DEBOUNCE_MASK |
2870 DA7218_HPLDET_JACK_THR_MASK,
2871 hpldet_cfg);
2872
2873 hpldet_cfg = 0;
2874 if (hpldet_pdata->comp_inv)
2875 hpldet_cfg |= DA7218_HPLDET_COMP_INV_MASK;
2876
2877 if (hpldet_pdata->hyst)
2878 hpldet_cfg |= DA7218_HPLDET_HYST_EN_MASK;
2879
2880 if (hpldet_pdata->discharge)
2881 hpldet_cfg |= DA7218_HPLDET_DISCHARGE_EN_MASK;
2882
2883 snd_soc_write(codec, DA7218_HPLDET_CTRL, hpldet_cfg);
2884 }
2885 }
2886}
2887
2888static int da7218_probe(struct snd_soc_codec *codec)
2889{
2890 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
2891 int ret;
2892
2893 /* Regulator configuration */
2894 ret = da7218_handle_supplies(codec);
2895 if (ret)
2896 return ret;
2897
2898 /* Handle DT/Platform data */
2899 if (codec->dev->of_node)
2900 da7218->pdata = da7218_of_to_pdata(codec);
2901 else
2902 da7218->pdata = dev_get_platdata(codec->dev);
2903
2904 da7218_handle_pdata(codec);
2905
2906 /* Check if MCLK provided, if not the clock is NULL */
2907 da7218->mclk = devm_clk_get(codec->dev, "mclk");
2908 if (IS_ERR(da7218->mclk)) {
2909 if (PTR_ERR(da7218->mclk) != -ENOENT) {
2910 ret = PTR_ERR(da7218->mclk);
2911 goto err_disable_reg;
2912 } else {
2913 da7218->mclk = NULL;
2914 }
2915 }
2916
2917 /* Default PC to free-running */
2918 snd_soc_write(codec, DA7218_PC_COUNT, DA7218_PC_FREERUN_MASK);
2919
2920 /*
2921 * Default Output Filter mixers to off otherwise DAPM will power
2922 * Mic to HP passthrough paths by default at startup.
2923 */
2924 snd_soc_write(codec, DA7218_DROUTING_OUTFILT_1L, 0);
2925 snd_soc_write(codec, DA7218_DROUTING_OUTFILT_1R, 0);
2926
2927 /* Default CP to normal load, power mode */
2928 snd_soc_update_bits(codec, DA7218_CP_CTRL,
2929 DA7218_CP_SMALL_SWITCH_FREQ_EN_MASK, 0);
2930
2931 /* Default gain ramping */
2932 snd_soc_update_bits(codec, DA7218_MIXIN_1_CTRL,
2933 DA7218_MIXIN_1_AMP_RAMP_EN_MASK,
2934 DA7218_MIXIN_1_AMP_RAMP_EN_MASK);
2935 snd_soc_update_bits(codec, DA7218_MIXIN_2_CTRL,
2936 DA7218_MIXIN_2_AMP_RAMP_EN_MASK,
2937 DA7218_MIXIN_2_AMP_RAMP_EN_MASK);
2938 snd_soc_update_bits(codec, DA7218_IN_1L_FILTER_CTRL,
2939 DA7218_IN_1L_RAMP_EN_MASK,
2940 DA7218_IN_1L_RAMP_EN_MASK);
2941 snd_soc_update_bits(codec, DA7218_IN_1R_FILTER_CTRL,
2942 DA7218_IN_1R_RAMP_EN_MASK,
2943 DA7218_IN_1R_RAMP_EN_MASK);
2944 snd_soc_update_bits(codec, DA7218_IN_2L_FILTER_CTRL,
2945 DA7218_IN_2L_RAMP_EN_MASK,
2946 DA7218_IN_2L_RAMP_EN_MASK);
2947 snd_soc_update_bits(codec, DA7218_IN_2R_FILTER_CTRL,
2948 DA7218_IN_2R_RAMP_EN_MASK,
2949 DA7218_IN_2R_RAMP_EN_MASK);
2950 snd_soc_update_bits(codec, DA7218_DGS_GAIN_CTRL,
2951 DA7218_DGS_RAMP_EN_MASK, DA7218_DGS_RAMP_EN_MASK);
2952 snd_soc_update_bits(codec, DA7218_OUT_1L_FILTER_CTRL,
2953 DA7218_OUT_1L_RAMP_EN_MASK,
2954 DA7218_OUT_1L_RAMP_EN_MASK);
2955 snd_soc_update_bits(codec, DA7218_OUT_1R_FILTER_CTRL,
2956 DA7218_OUT_1R_RAMP_EN_MASK,
2957 DA7218_OUT_1R_RAMP_EN_MASK);
2958 snd_soc_update_bits(codec, DA7218_HP_L_CTRL,
2959 DA7218_HP_L_AMP_RAMP_EN_MASK,
2960 DA7218_HP_L_AMP_RAMP_EN_MASK);
2961 snd_soc_update_bits(codec, DA7218_HP_R_CTRL,
2962 DA7218_HP_R_AMP_RAMP_EN_MASK,
2963 DA7218_HP_R_AMP_RAMP_EN_MASK);
2964
2965 /* Default infinite tone gen, start/stop by Kcontrol */
2966 snd_soc_write(codec, DA7218_TONE_GEN_CYCLES, DA7218_BEEP_CYCLES_MASK);
2967
2968 /* DA7217 specific config */
2969 if (da7218->dev_id == DA7217_DEV_ID) {
2970 snd_soc_update_bits(codec, DA7218_HP_DIFF_CTRL,
2971 DA7218_HP_AMP_DIFF_MODE_EN_MASK,
2972 DA7218_HP_AMP_DIFF_MODE_EN_MASK);
2973
2974 /* Only DA7218 supports HP detect, mask off for DA7217 */
2975 snd_soc_write(codec, DA7218_EVENT_MASK,
2976 DA7218_HPLDET_JACK_EVENT_IRQ_MSK_MASK);
2977 }
2978
2979 if (da7218->irq) {
2980 ret = devm_request_threaded_irq(codec->dev, da7218->irq, NULL,
2981 da7218_irq_thread,
2982 IRQF_TRIGGER_LOW | IRQF_ONESHOT,
2983 "da7218", codec);
2984 if (ret != 0) {
2985 dev_err(codec->dev, "Failed to request IRQ %d: %d\n",
2986 da7218->irq, ret);
2987 goto err_disable_reg;
2988 }
2989
2990 }
2991
2992 return 0;
2993
2994err_disable_reg:
2995 regulator_bulk_disable(DA7218_NUM_SUPPLIES, da7218->supplies);
2996
2997 return ret;
2998}
2999
3000static int da7218_remove(struct snd_soc_codec *codec)
3001{
3002 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
3003
3004 regulator_bulk_disable(DA7218_NUM_SUPPLIES, da7218->supplies);
3005
3006 return 0;
3007}
3008
3009#ifdef CONFIG_PM
3010static int da7218_suspend(struct snd_soc_codec *codec)
3011{
3012 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
3013
3014 da7218_set_bias_level(codec, SND_SOC_BIAS_OFF);
3015
3016 /* Put device into standby mode if jack detection disabled */
3017 if (!da7218->jack)
3018 snd_soc_write(codec, DA7218_SYSTEM_ACTIVE, 0);
3019
3020 return 0;
3021}
3022
3023static int da7218_resume(struct snd_soc_codec *codec)
3024{
3025 struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
3026
3027 /* Put device into active mode if previously moved to standby */
3028 if (!da7218->jack)
3029 snd_soc_write(codec, DA7218_SYSTEM_ACTIVE,
3030 DA7218_SYSTEM_ACTIVE_MASK);
3031
3032 da7218_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
3033
3034 return 0;
3035}
3036#else
3037#define da7218_suspend NULL
3038#define da7218_resume NULL
3039#endif
3040
3041static struct snd_soc_codec_driver soc_codec_dev_da7218 = {
3042 .probe = da7218_probe,
3043 .remove = da7218_remove,
3044 .suspend = da7218_suspend,
3045 .resume = da7218_resume,
3046 .set_bias_level = da7218_set_bias_level,
3047
3048 .controls = da7218_snd_controls,
3049 .num_controls = ARRAY_SIZE(da7218_snd_controls),
3050
3051 .dapm_widgets = da7218_dapm_widgets,
3052 .num_dapm_widgets = ARRAY_SIZE(da7218_dapm_widgets),
3053 .dapm_routes = da7218_audio_map,
3054 .num_dapm_routes = ARRAY_SIZE(da7218_audio_map),
3055};
3056
3057
3058/*
3059 * Regmap configs
3060 */
3061
3062static struct reg_default da7218_reg_defaults[] = {
3063 { DA7218_SYSTEM_ACTIVE, 0x00 },
3064 { DA7218_CIF_CTRL, 0x00 },
3065 { DA7218_SPARE1, 0x00 },
3066 { DA7218_SR, 0xAA },
3067 { DA7218_PC_COUNT, 0x02 },
3068 { DA7218_GAIN_RAMP_CTRL, 0x00 },
3069 { DA7218_CIF_TIMEOUT_CTRL, 0x01 },
3070 { DA7218_SYSTEM_MODES_INPUT, 0x00 },
3071 { DA7218_SYSTEM_MODES_OUTPUT, 0x00 },
3072 { DA7218_IN_1L_FILTER_CTRL, 0x00 },
3073 { DA7218_IN_1R_FILTER_CTRL, 0x00 },
3074 { DA7218_IN_2L_FILTER_CTRL, 0x00 },
3075 { DA7218_IN_2R_FILTER_CTRL, 0x00 },
3076 { DA7218_OUT_1L_FILTER_CTRL, 0x40 },
3077 { DA7218_OUT_1R_FILTER_CTRL, 0x40 },
3078 { DA7218_OUT_1_HPF_FILTER_CTRL, 0x80 },
3079 { DA7218_OUT_1_EQ_12_FILTER_CTRL, 0x77 },
3080 { DA7218_OUT_1_EQ_34_FILTER_CTRL, 0x77 },
3081 { DA7218_OUT_1_EQ_5_FILTER_CTRL, 0x07 },
3082 { DA7218_OUT_1_BIQ_5STAGE_CTRL, 0x40 },
3083 { DA7218_OUT_1_BIQ_5STAGE_DATA, 0x00 },
3084 { DA7218_OUT_1_BIQ_5STAGE_ADDR, 0x00 },
3085 { DA7218_MIXIN_1_CTRL, 0x48 },
3086 { DA7218_MIXIN_1_GAIN, 0x03 },
3087 { DA7218_MIXIN_2_CTRL, 0x48 },
3088 { DA7218_MIXIN_2_GAIN, 0x03 },
3089 { DA7218_ALC_CTRL1, 0x00 },
3090 { DA7218_ALC_CTRL2, 0x00 },
3091 { DA7218_ALC_CTRL3, 0x00 },
3092 { DA7218_ALC_NOISE, 0x3F },
3093 { DA7218_ALC_TARGET_MIN, 0x3F },
3094 { DA7218_ALC_TARGET_MAX, 0x00 },
3095 { DA7218_ALC_GAIN_LIMITS, 0xFF },
3096 { DA7218_ALC_ANA_GAIN_LIMITS, 0x71 },
3097 { DA7218_ALC_ANTICLIP_CTRL, 0x00 },
3098 { DA7218_AGS_ENABLE, 0x00 },
3099 { DA7218_AGS_TRIGGER, 0x09 },
3100 { DA7218_AGS_ATT_MAX, 0x00 },
3101 { DA7218_AGS_TIMEOUT, 0x00 },
3102 { DA7218_AGS_ANTICLIP_CTRL, 0x00 },
3103 { DA7218_ENV_TRACK_CTRL, 0x00 },
3104 { DA7218_LVL_DET_CTRL, 0x00 },
3105 { DA7218_LVL_DET_LEVEL, 0x7F },
3106 { DA7218_DGS_TRIGGER, 0x24 },
3107 { DA7218_DGS_ENABLE, 0x00 },
3108 { DA7218_DGS_RISE_FALL, 0x50 },
3109 { DA7218_DGS_SYNC_DELAY, 0xA3 },
3110 { DA7218_DGS_SYNC_DELAY2, 0x31 },
3111 { DA7218_DGS_SYNC_DELAY3, 0x11 },
3112 { DA7218_DGS_LEVELS, 0x01 },
3113 { DA7218_DGS_GAIN_CTRL, 0x74 },
3114 { DA7218_DROUTING_OUTDAI_1L, 0x01 },
3115 { DA7218_DMIX_OUTDAI_1L_INFILT_1L_GAIN, 0x1C },
3116 { DA7218_DMIX_OUTDAI_1L_INFILT_1R_GAIN, 0x1C },
3117 { DA7218_DMIX_OUTDAI_1L_INFILT_2L_GAIN, 0x1C },
3118 { DA7218_DMIX_OUTDAI_1L_INFILT_2R_GAIN, 0x1C },
3119 { DA7218_DMIX_OUTDAI_1L_TONEGEN_GAIN, 0x1C },
3120 { DA7218_DMIX_OUTDAI_1L_INDAI_1L_GAIN, 0x1C },
3121 { DA7218_DMIX_OUTDAI_1L_INDAI_1R_GAIN, 0x1C },
3122 { DA7218_DROUTING_OUTDAI_1R, 0x04 },
3123 { DA7218_DMIX_OUTDAI_1R_INFILT_1L_GAIN, 0x1C },
3124 { DA7218_DMIX_OUTDAI_1R_INFILT_1R_GAIN, 0x1C },
3125 { DA7218_DMIX_OUTDAI_1R_INFILT_2L_GAIN, 0x1C },
3126 { DA7218_DMIX_OUTDAI_1R_INFILT_2R_GAIN, 0x1C },
3127 { DA7218_DMIX_OUTDAI_1R_TONEGEN_GAIN, 0x1C },
3128 { DA7218_DMIX_OUTDAI_1R_INDAI_1L_GAIN, 0x1C },
3129 { DA7218_DMIX_OUTDAI_1R_INDAI_1R_GAIN, 0x1C },
3130 { DA7218_DROUTING_OUTFILT_1L, 0x01 },
3131 { DA7218_DMIX_OUTFILT_1L_INFILT_1L_GAIN, 0x1C },
3132 { DA7218_DMIX_OUTFILT_1L_INFILT_1R_GAIN, 0x1C },
3133 { DA7218_DMIX_OUTFILT_1L_INFILT_2L_GAIN, 0x1C },
3134 { DA7218_DMIX_OUTFILT_1L_INFILT_2R_GAIN, 0x1C },
3135 { DA7218_DMIX_OUTFILT_1L_TONEGEN_GAIN, 0x1C },
3136 { DA7218_DMIX_OUTFILT_1L_INDAI_1L_GAIN, 0x1C },
3137 { DA7218_DMIX_OUTFILT_1L_INDAI_1R_GAIN, 0x1C },
3138 { DA7218_DROUTING_OUTFILT_1R, 0x04 },
3139 { DA7218_DMIX_OUTFILT_1R_INFILT_1L_GAIN, 0x1C },
3140 { DA7218_DMIX_OUTFILT_1R_INFILT_1R_GAIN, 0x1C },
3141 { DA7218_DMIX_OUTFILT_1R_INFILT_2L_GAIN, 0x1C },
3142 { DA7218_DMIX_OUTFILT_1R_INFILT_2R_GAIN, 0x1C },
3143 { DA7218_DMIX_OUTFILT_1R_TONEGEN_GAIN, 0x1C },
3144 { DA7218_DMIX_OUTFILT_1R_INDAI_1L_GAIN, 0x1C },
3145 { DA7218_DMIX_OUTFILT_1R_INDAI_1R_GAIN, 0x1C },
3146 { DA7218_DROUTING_OUTDAI_2L, 0x04 },
3147 { DA7218_DMIX_OUTDAI_2L_INFILT_1L_GAIN, 0x1C },
3148 { DA7218_DMIX_OUTDAI_2L_INFILT_1R_GAIN, 0x1C },
3149 { DA7218_DMIX_OUTDAI_2L_INFILT_2L_GAIN, 0x1C },
3150 { DA7218_DMIX_OUTDAI_2L_INFILT_2R_GAIN, 0x1C },
3151 { DA7218_DMIX_OUTDAI_2L_TONEGEN_GAIN, 0x1C },
3152 { DA7218_DMIX_OUTDAI_2L_INDAI_1L_GAIN, 0x1C },
3153 { DA7218_DMIX_OUTDAI_2L_INDAI_1R_GAIN, 0x1C },
3154 { DA7218_DROUTING_OUTDAI_2R, 0x08 },
3155 { DA7218_DMIX_OUTDAI_2R_INFILT_1L_GAIN, 0x1C },
3156 { DA7218_DMIX_OUTDAI_2R_INFILT_1R_GAIN, 0x1C },
3157 { DA7218_DMIX_OUTDAI_2R_INFILT_2L_GAIN, 0x1C },
3158 { DA7218_DMIX_OUTDAI_2R_INFILT_2R_GAIN, 0x1C },
3159 { DA7218_DMIX_OUTDAI_2R_TONEGEN_GAIN, 0x1C },
3160 { DA7218_DMIX_OUTDAI_2R_INDAI_1L_GAIN, 0x1C },
3161 { DA7218_DMIX_OUTDAI_2R_INDAI_1R_GAIN, 0x1C },
3162 { DA7218_DAI_CTRL, 0x28 },
3163 { DA7218_DAI_TDM_CTRL, 0x40 },
3164 { DA7218_DAI_OFFSET_LOWER, 0x00 },
3165 { DA7218_DAI_OFFSET_UPPER, 0x00 },
3166 { DA7218_DAI_CLK_MODE, 0x01 },
3167 { DA7218_PLL_CTRL, 0x04 },
3168 { DA7218_PLL_FRAC_TOP, 0x00 },
3169 { DA7218_PLL_FRAC_BOT, 0x00 },
3170 { DA7218_PLL_INTEGER, 0x20 },
3171 { DA7218_DAC_NG_CTRL, 0x00 },
3172 { DA7218_DAC_NG_SETUP_TIME, 0x00 },
3173 { DA7218_DAC_NG_OFF_THRESH, 0x00 },
3174 { DA7218_DAC_NG_ON_THRESH, 0x00 },
3175 { DA7218_TONE_GEN_CFG2, 0x00 },
3176 { DA7218_TONE_GEN_FREQ1_L, 0x55 },
3177 { DA7218_TONE_GEN_FREQ1_U, 0x15 },
3178 { DA7218_TONE_GEN_FREQ2_L, 0x00 },
3179 { DA7218_TONE_GEN_FREQ2_U, 0x40 },
3180 { DA7218_TONE_GEN_CYCLES, 0x00 },
3181 { DA7218_TONE_GEN_ON_PER, 0x02 },
3182 { DA7218_TONE_GEN_OFF_PER, 0x01 },
3183 { DA7218_CP_CTRL, 0x60 },
3184 { DA7218_CP_DELAY, 0x11 },
3185 { DA7218_CP_VOL_THRESHOLD1, 0x0E },
3186 { DA7218_MIC_1_CTRL, 0x40 },
3187 { DA7218_MIC_1_GAIN, 0x01 },
3188 { DA7218_MIC_1_SELECT, 0x00 },
3189 { DA7218_MIC_2_CTRL, 0x40 },
3190 { DA7218_MIC_2_GAIN, 0x01 },
3191 { DA7218_MIC_2_SELECT, 0x00 },
3192 { DA7218_IN_1_HPF_FILTER_CTRL, 0x80 },
3193 { DA7218_IN_2_HPF_FILTER_CTRL, 0x80 },
3194 { DA7218_ADC_1_CTRL, 0x07 },
3195 { DA7218_ADC_2_CTRL, 0x07 },
3196 { DA7218_MIXOUT_L_CTRL, 0x00 },
3197 { DA7218_MIXOUT_L_GAIN, 0x03 },
3198 { DA7218_MIXOUT_R_CTRL, 0x00 },
3199 { DA7218_MIXOUT_R_GAIN, 0x03 },
3200 { DA7218_HP_L_CTRL, 0x40 },
3201 { DA7218_HP_L_GAIN, 0x3B },
3202 { DA7218_HP_R_CTRL, 0x40 },
3203 { DA7218_HP_R_GAIN, 0x3B },
3204 { DA7218_HP_DIFF_CTRL, 0x00 },
3205 { DA7218_HP_DIFF_UNLOCK, 0xC3 },
3206 { DA7218_HPLDET_JACK, 0x0B },
3207 { DA7218_HPLDET_CTRL, 0x00 },
3208 { DA7218_REFERENCES, 0x08 },
3209 { DA7218_IO_CTRL, 0x00 },
3210 { DA7218_LDO_CTRL, 0x00 },
3211 { DA7218_SIDETONE_CTRL, 0x40 },
3212 { DA7218_SIDETONE_IN_SELECT, 0x00 },
3213 { DA7218_SIDETONE_GAIN, 0x1C },
3214 { DA7218_DROUTING_ST_OUTFILT_1L, 0x01 },
3215 { DA7218_DROUTING_ST_OUTFILT_1R, 0x02 },
3216 { DA7218_SIDETONE_BIQ_3STAGE_DATA, 0x00 },
3217 { DA7218_SIDETONE_BIQ_3STAGE_ADDR, 0x00 },
3218 { DA7218_EVENT_MASK, 0x00 },
3219 { DA7218_DMIC_1_CTRL, 0x00 },
3220 { DA7218_DMIC_2_CTRL, 0x00 },
3221 { DA7218_IN_1L_GAIN, 0x6F },
3222 { DA7218_IN_1R_GAIN, 0x6F },
3223 { DA7218_IN_2L_GAIN, 0x6F },
3224 { DA7218_IN_2R_GAIN, 0x6F },
3225 { DA7218_OUT_1L_GAIN, 0x6F },
3226 { DA7218_OUT_1R_GAIN, 0x6F },
3227 { DA7218_MICBIAS_CTRL, 0x00 },
3228 { DA7218_MICBIAS_EN, 0x00 },
3229};
3230
3231static bool da7218_volatile_register(struct device *dev, unsigned int reg)
3232{
3233 switch (reg) {
3234 case DA7218_STATUS1:
3235 case DA7218_SOFT_RESET:
3236 case DA7218_SYSTEM_STATUS:
3237 case DA7218_CALIB_CTRL:
3238 case DA7218_CALIB_OFFSET_AUTO_M_1:
3239 case DA7218_CALIB_OFFSET_AUTO_U_1:
3240 case DA7218_CALIB_OFFSET_AUTO_M_2:
3241 case DA7218_CALIB_OFFSET_AUTO_U_2:
3242 case DA7218_PLL_STATUS:
3243 case DA7218_PLL_REFOSC_CAL:
3244 case DA7218_TONE_GEN_CFG1:
3245 case DA7218_ADC_MODE:
3246 case DA7218_HP_SNGL_CTRL:
3247 case DA7218_HPLDET_TEST:
3248 case DA7218_EVENT_STATUS:
3249 case DA7218_EVENT:
3250 return true;
3251 default:
3252 return false;
3253 }
3254}
3255
3256static const struct regmap_config da7218_regmap_config = {
3257 .reg_bits = 8,
3258 .val_bits = 8,
3259
3260 .max_register = DA7218_MICBIAS_EN,
3261 .reg_defaults = da7218_reg_defaults,
3262 .num_reg_defaults = ARRAY_SIZE(da7218_reg_defaults),
3263 .volatile_reg = da7218_volatile_register,
3264 .cache_type = REGCACHE_RBTREE,
3265};
3266
3267
3268/*
3269 * I2C layer
3270 */
3271
3272static int da7218_i2c_probe(struct i2c_client *i2c,
3273 const struct i2c_device_id *id)
3274{
3275 struct da7218_priv *da7218;
3276 int ret;
3277
3278 da7218 = devm_kzalloc(&i2c->dev, sizeof(struct da7218_priv),
3279 GFP_KERNEL);
3280 if (!da7218)
3281 return -ENOMEM;
3282
3283 i2c_set_clientdata(i2c, da7218);
3284
3285 if (i2c->dev.of_node)
3286 da7218->dev_id = da7218_of_get_id(&i2c->dev);
3287 else
3288 da7218->dev_id = id->driver_data;
3289
3290 if ((da7218->dev_id != DA7217_DEV_ID) &&
3291 (da7218->dev_id != DA7218_DEV_ID)) {
3292 dev_err(&i2c->dev, "Invalid device Id\n");
3293 return -EINVAL;
3294 }
3295
3296 da7218->irq = i2c->irq;
3297
3298 da7218->regmap = devm_regmap_init_i2c(i2c, &da7218_regmap_config);
3299 if (IS_ERR(da7218->regmap)) {
3300 ret = PTR_ERR(da7218->regmap);
3301 dev_err(&i2c->dev, "regmap_init() failed: %d\n", ret);
3302 return ret;
3303 }
3304
3305 ret = snd_soc_register_codec(&i2c->dev,
3306 &soc_codec_dev_da7218, &da7218_dai, 1);
3307 if (ret < 0) {
3308 dev_err(&i2c->dev, "Failed to register da7218 codec: %d\n",
3309 ret);
3310 }
3311 return ret;
3312}
3313
3314static int da7218_i2c_remove(struct i2c_client *client)
3315{
3316 snd_soc_unregister_codec(&client->dev);
3317 return 0;
3318}
3319
3320static const struct i2c_device_id da7218_i2c_id[] = {
3321 { "da7217", DA7217_DEV_ID },
3322 { "da7218", DA7218_DEV_ID },
3323 { }
3324};
3325MODULE_DEVICE_TABLE(i2c, da7218_i2c_id);
3326
3327static struct i2c_driver da7218_i2c_driver = {
3328 .driver = {
3329 .name = "da7218",
3330 .of_match_table = of_match_ptr(da7218_of_match),
3331 },
3332 .probe = da7218_i2c_probe,
3333 .remove = da7218_i2c_remove,
3334 .id_table = da7218_i2c_id,
3335};
3336
3337module_i2c_driver(da7218_i2c_driver);
3338
3339MODULE_DESCRIPTION("ASoC DA7218 Codec driver");
3340MODULE_AUTHOR("Adam Thomson <Adam.Thomson.Opensource@diasemi.com>");
3341MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/da7218.h b/sound/soc/codecs/da7218.h
new file mode 100644
index 000000000000..c2c59049a2ad
--- /dev/null
+++ b/sound/soc/codecs/da7218.h
@@ -0,0 +1,1414 @@
1/*
2 * da7218.h - DA7218 ALSA SoC Codec Driver
3 *
4 * Copyright (c) 2015 Dialog Semiconductor
5 *
6 * Author: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 */
13
14#ifndef _DA7218_H
15#define _DA7218_H
16
17#include <linux/regmap.h>
18#include <linux/regulator/consumer.h>
19#include <sound/da7218.h>
20
21
22/*
23 * Registers
24 */
25#define DA7218_SYSTEM_ACTIVE 0x0
26#define DA7218_CIF_CTRL 0x1
27#define DA7218_CHIP_ID1 0x4
28#define DA7218_CHIP_ID2 0x5
29#define DA7218_CHIP_REVISION 0x6
30#define DA7218_SPARE1 0x7
31#define DA7218_STATUS1 0x8
32#define DA7218_SOFT_RESET 0x9
33#define DA7218_SR 0xB
34#define DA7218_PC_COUNT 0xC
35#define DA7218_GAIN_RAMP_CTRL 0xD
36#define DA7218_CIF_TIMEOUT_CTRL 0x10
37#define DA7218_SYSTEM_MODES_INPUT 0x14
38#define DA7218_SYSTEM_MODES_OUTPUT 0x15
39#define DA7218_SYSTEM_STATUS 0x16
40#define DA7218_IN_1L_FILTER_CTRL 0x18
41#define DA7218_IN_1R_FILTER_CTRL 0x19
42#define DA7218_IN_2L_FILTER_CTRL 0x1A
43#define DA7218_IN_2R_FILTER_CTRL 0x1B
44#define DA7218_OUT_1L_FILTER_CTRL 0x20
45#define DA7218_OUT_1R_FILTER_CTRL 0x21
46#define DA7218_OUT_1_HPF_FILTER_CTRL 0x24
47#define DA7218_OUT_1_EQ_12_FILTER_CTRL 0x25
48#define DA7218_OUT_1_EQ_34_FILTER_CTRL 0x26
49#define DA7218_OUT_1_EQ_5_FILTER_CTRL 0x27
50#define DA7218_OUT_1_BIQ_5STAGE_CTRL 0x28
51#define DA7218_OUT_1_BIQ_5STAGE_DATA 0x29
52#define DA7218_OUT_1_BIQ_5STAGE_ADDR 0x2A
53#define DA7218_MIXIN_1_CTRL 0x2C
54#define DA7218_MIXIN_1_GAIN 0x2D
55#define DA7218_MIXIN_2_CTRL 0x2E
56#define DA7218_MIXIN_2_GAIN 0x2F
57#define DA7218_ALC_CTRL1 0x30
58#define DA7218_ALC_CTRL2 0x31
59#define DA7218_ALC_CTRL3 0x32
60#define DA7218_ALC_NOISE 0x33
61#define DA7218_ALC_TARGET_MIN 0x34
62#define DA7218_ALC_TARGET_MAX 0x35
63#define DA7218_ALC_GAIN_LIMITS 0x36
64#define DA7218_ALC_ANA_GAIN_LIMITS 0x37
65#define DA7218_ALC_ANTICLIP_CTRL 0x38
66#define DA7218_AGS_ENABLE 0x3C
67#define DA7218_AGS_TRIGGER 0x3D
68#define DA7218_AGS_ATT_MAX 0x3E
69#define DA7218_AGS_TIMEOUT 0x3F
70#define DA7218_AGS_ANTICLIP_CTRL 0x40
71#define DA7218_CALIB_CTRL 0x44
72#define DA7218_CALIB_OFFSET_AUTO_M_1 0x45
73#define DA7218_CALIB_OFFSET_AUTO_U_1 0x46
74#define DA7218_CALIB_OFFSET_AUTO_M_2 0x47
75#define DA7218_CALIB_OFFSET_AUTO_U_2 0x48
76#define DA7218_ENV_TRACK_CTRL 0x4C
77#define DA7218_LVL_DET_CTRL 0x50
78#define DA7218_LVL_DET_LEVEL 0x51
79#define DA7218_DGS_TRIGGER 0x54
80#define DA7218_DGS_ENABLE 0x55
81#define DA7218_DGS_RISE_FALL 0x56
82#define DA7218_DGS_SYNC_DELAY 0x57
83#define DA7218_DGS_SYNC_DELAY2 0x58
84#define DA7218_DGS_SYNC_DELAY3 0x59
85#define DA7218_DGS_LEVELS 0x5A
86#define DA7218_DGS_GAIN_CTRL 0x5B
87#define DA7218_DROUTING_OUTDAI_1L 0x5C
88#define DA7218_DMIX_OUTDAI_1L_INFILT_1L_GAIN 0x5D
89#define DA7218_DMIX_OUTDAI_1L_INFILT_1R_GAIN 0x5E
90#define DA7218_DMIX_OUTDAI_1L_INFILT_2L_GAIN 0x5F
91#define DA7218_DMIX_OUTDAI_1L_INFILT_2R_GAIN 0x60
92#define DA7218_DMIX_OUTDAI_1L_TONEGEN_GAIN 0x61
93#define DA7218_DMIX_OUTDAI_1L_INDAI_1L_GAIN 0x62
94#define DA7218_DMIX_OUTDAI_1L_INDAI_1R_GAIN 0x63
95#define DA7218_DROUTING_OUTDAI_1R 0x64
96#define DA7218_DMIX_OUTDAI_1R_INFILT_1L_GAIN 0x65
97#define DA7218_DMIX_OUTDAI_1R_INFILT_1R_GAIN 0x66
98#define DA7218_DMIX_OUTDAI_1R_INFILT_2L_GAIN 0x67
99#define DA7218_DMIX_OUTDAI_1R_INFILT_2R_GAIN 0x68
100#define DA7218_DMIX_OUTDAI_1R_TONEGEN_GAIN 0x69
101#define DA7218_DMIX_OUTDAI_1R_INDAI_1L_GAIN 0x6A
102#define DA7218_DMIX_OUTDAI_1R_INDAI_1R_GAIN 0x6B
103#define DA7218_DROUTING_OUTFILT_1L 0x6C
104#define DA7218_DMIX_OUTFILT_1L_INFILT_1L_GAIN 0x6D
105#define DA7218_DMIX_OUTFILT_1L_INFILT_1R_GAIN 0x6E
106#define DA7218_DMIX_OUTFILT_1L_INFILT_2L_GAIN 0x6F
107#define DA7218_DMIX_OUTFILT_1L_INFILT_2R_GAIN 0x70
108#define DA7218_DMIX_OUTFILT_1L_TONEGEN_GAIN 0x71
109#define DA7218_DMIX_OUTFILT_1L_INDAI_1L_GAIN 0x72
110#define DA7218_DMIX_OUTFILT_1L_INDAI_1R_GAIN 0x73
111#define DA7218_DROUTING_OUTFILT_1R 0x74
112#define DA7218_DMIX_OUTFILT_1R_INFILT_1L_GAIN 0x75
113#define DA7218_DMIX_OUTFILT_1R_INFILT_1R_GAIN 0x76
114#define DA7218_DMIX_OUTFILT_1R_INFILT_2L_GAIN 0x77
115#define DA7218_DMIX_OUTFILT_1R_INFILT_2R_GAIN 0x78
116#define DA7218_DMIX_OUTFILT_1R_TONEGEN_GAIN 0x79
117#define DA7218_DMIX_OUTFILT_1R_INDAI_1L_GAIN 0x7A
118#define DA7218_DMIX_OUTFILT_1R_INDAI_1R_GAIN 0x7B
119#define DA7218_DROUTING_OUTDAI_2L 0x7C
120#define DA7218_DMIX_OUTDAI_2L_INFILT_1L_GAIN 0x7D
121#define DA7218_DMIX_OUTDAI_2L_INFILT_1R_GAIN 0x7E
122#define DA7218_DMIX_OUTDAI_2L_INFILT_2L_GAIN 0x7F
123#define DA7218_DMIX_OUTDAI_2L_INFILT_2R_GAIN 0x80
124#define DA7218_DMIX_OUTDAI_2L_TONEGEN_GAIN 0x81
125#define DA7218_DMIX_OUTDAI_2L_INDAI_1L_GAIN 0x82
126#define DA7218_DMIX_OUTDAI_2L_INDAI_1R_GAIN 0x83
127#define DA7218_DROUTING_OUTDAI_2R 0x84
128#define DA7218_DMIX_OUTDAI_2R_INFILT_1L_GAIN 0x85
129#define DA7218_DMIX_OUTDAI_2R_INFILT_1R_GAIN 0x86
130#define DA7218_DMIX_OUTDAI_2R_INFILT_2L_GAIN 0x87
131#define DA7218_DMIX_OUTDAI_2R_INFILT_2R_GAIN 0x88
132#define DA7218_DMIX_OUTDAI_2R_TONEGEN_GAIN 0x89
133#define DA7218_DMIX_OUTDAI_2R_INDAI_1L_GAIN 0x8A
134#define DA7218_DMIX_OUTDAI_2R_INDAI_1R_GAIN 0x8B
135#define DA7218_DAI_CTRL 0x8C
136#define DA7218_DAI_TDM_CTRL 0x8D
137#define DA7218_DAI_OFFSET_LOWER 0x8E
138#define DA7218_DAI_OFFSET_UPPER 0x8F
139#define DA7218_DAI_CLK_MODE 0x90
140#define DA7218_PLL_CTRL 0x91
141#define DA7218_PLL_FRAC_TOP 0x92
142#define DA7218_PLL_FRAC_BOT 0x93
143#define DA7218_PLL_INTEGER 0x94
144#define DA7218_PLL_STATUS 0x95
145#define DA7218_PLL_REFOSC_CAL 0x98
146#define DA7218_DAC_NG_CTRL 0x9C
147#define DA7218_DAC_NG_SETUP_TIME 0x9D
148#define DA7218_DAC_NG_OFF_THRESH 0x9E
149#define DA7218_DAC_NG_ON_THRESH 0x9F
150#define DA7218_TONE_GEN_CFG1 0xA0
151#define DA7218_TONE_GEN_CFG2 0xA1
152#define DA7218_TONE_GEN_FREQ1_L 0xA2
153#define DA7218_TONE_GEN_FREQ1_U 0xA3
154#define DA7218_TONE_GEN_FREQ2_L 0xA4
155#define DA7218_TONE_GEN_FREQ2_U 0xA5
156#define DA7218_TONE_GEN_CYCLES 0xA6
157#define DA7218_TONE_GEN_ON_PER 0xA7
158#define DA7218_TONE_GEN_OFF_PER 0xA8
159#define DA7218_CP_CTRL 0xAC
160#define DA7218_CP_DELAY 0xAD
161#define DA7218_CP_VOL_THRESHOLD1 0xAE
162#define DA7218_MIC_1_CTRL 0xB4
163#define DA7218_MIC_1_GAIN 0xB5
164#define DA7218_MIC_1_SELECT 0xB7
165#define DA7218_MIC_2_CTRL 0xB8
166#define DA7218_MIC_2_GAIN 0xB9
167#define DA7218_MIC_2_SELECT 0xBB
168#define DA7218_IN_1_HPF_FILTER_CTRL 0xBC
169#define DA7218_IN_2_HPF_FILTER_CTRL 0xBD
170#define DA7218_ADC_1_CTRL 0xC0
171#define DA7218_ADC_2_CTRL 0xC1
172#define DA7218_ADC_MODE 0xC2
173#define DA7218_MIXOUT_L_CTRL 0xCC
174#define DA7218_MIXOUT_L_GAIN 0xCD
175#define DA7218_MIXOUT_R_CTRL 0xCE
176#define DA7218_MIXOUT_R_GAIN 0xCF
177#define DA7218_HP_L_CTRL 0xD0
178#define DA7218_HP_L_GAIN 0xD1
179#define DA7218_HP_R_CTRL 0xD2
180#define DA7218_HP_R_GAIN 0xD3
181#define DA7218_HP_SNGL_CTRL 0xD4
182#define DA7218_HP_DIFF_CTRL 0xD5
183#define DA7218_HP_DIFF_UNLOCK 0xD7
184#define DA7218_HPLDET_JACK 0xD8
185#define DA7218_HPLDET_CTRL 0xD9
186#define DA7218_HPLDET_TEST 0xDA
187#define DA7218_REFERENCES 0xDC
188#define DA7218_IO_CTRL 0xE0
189#define DA7218_LDO_CTRL 0xE1
190#define DA7218_SIDETONE_CTRL 0xE4
191#define DA7218_SIDETONE_IN_SELECT 0xE5
192#define DA7218_SIDETONE_GAIN 0xE6
193#define DA7218_DROUTING_ST_OUTFILT_1L 0xE8
194#define DA7218_DROUTING_ST_OUTFILT_1R 0xE9
195#define DA7218_SIDETONE_BIQ_3STAGE_DATA 0xEA
196#define DA7218_SIDETONE_BIQ_3STAGE_ADDR 0xEB
197#define DA7218_EVENT_STATUS 0xEC
198#define DA7218_EVENT 0xED
199#define DA7218_EVENT_MASK 0xEE
200#define DA7218_DMIC_1_CTRL 0xF0
201#define DA7218_DMIC_2_CTRL 0xF1
202#define DA7218_IN_1L_GAIN 0xF4
203#define DA7218_IN_1R_GAIN 0xF5
204#define DA7218_IN_2L_GAIN 0xF6
205#define DA7218_IN_2R_GAIN 0xF7
206#define DA7218_OUT_1L_GAIN 0xF8
207#define DA7218_OUT_1R_GAIN 0xF9
208#define DA7218_MICBIAS_CTRL 0xFC
209#define DA7218_MICBIAS_EN 0xFD
210
211
212/*
213 * Bit Fields
214 */
215
216#define DA7218_SWITCH_EN_MAX 0x1
217
218/* DA7218_SYSTEM_ACTIVE = 0x0 */
219#define DA7218_SYSTEM_ACTIVE_SHIFT 0
220#define DA7218_SYSTEM_ACTIVE_MASK (0x1 << 0)
221
222/* DA7218_CIF_CTRL = 0x1 */
223#define DA7218_CIF_I2C_WRITE_MODE_SHIFT 0
224#define DA7218_CIF_I2C_WRITE_MODE_MASK (0x1 << 0)
225
226/* DA7218_CHIP_ID1 = 0x4 */
227#define DA7218_CHIP_ID1_SHIFT 0
228#define DA7218_CHIP_ID1_MASK (0xFF << 0)
229
230/* DA7218_CHIP_ID2 = 0x5 */
231#define DA7218_CHIP_ID2_SHIFT 0
232#define DA7218_CHIP_ID2_MASK (0xFF << 0)
233
234/* DA7218_CHIP_REVISION = 0x6 */
235#define DA7218_CHIP_MINOR_SHIFT 0
236#define DA7218_CHIP_MINOR_MASK (0xF << 0)
237#define DA7218_CHIP_MAJOR_SHIFT 4
238#define DA7218_CHIP_MAJOR_MASK (0xF << 4)
239
240/* DA7218_SPARE1 = 0x7 */
241#define DA7218_SPARE1_SHIFT 0
242#define DA7218_SPARE1_MASK (0xFF << 0)
243
244/* DA7218_STATUS1 = 0x8 */
245#define DA7218_STATUS_SPARE1_SHIFT 0
246#define DA7218_STATUS_SPARE1_MASK (0xFF << 0)
247
248/* DA7218_SOFT_RESET = 0x9 */
249#define DA7218_CIF_REG_SOFT_RESET_SHIFT 7
250#define DA7218_CIF_REG_SOFT_RESET_MASK (0x1 << 7)
251
252/* DA7218_SR = 0xB */
253#define DA7218_SR_ADC_SHIFT 0
254#define DA7218_SR_ADC_MASK (0xF << 0)
255#define DA7218_SR_DAC_SHIFT 4
256#define DA7218_SR_DAC_MASK (0xF << 4)
257#define DA7218_SR_8000 0x01
258#define DA7218_SR_11025 0x02
259#define DA7218_SR_12000 0x03
260#define DA7218_SR_16000 0x05
261#define DA7218_SR_22050 0x06
262#define DA7218_SR_24000 0x07
263#define DA7218_SR_32000 0x09
264#define DA7218_SR_44100 0x0A
265#define DA7218_SR_48000 0x0B
266#define DA7218_SR_88200 0x0E
267#define DA7218_SR_96000 0x0F
268
269/* DA7218_PC_COUNT = 0xC */
270#define DA7218_PC_FREERUN_SHIFT 0
271#define DA7218_PC_FREERUN_MASK (0x1 << 0)
272#define DA7218_PC_RESYNC_AUTO_SHIFT 1
273#define DA7218_PC_RESYNC_AUTO_MASK (0x1 << 1)
274
275/* DA7218_GAIN_RAMP_CTRL = 0xD */
276#define DA7218_GAIN_RAMP_RATE_SHIFT 0
277#define DA7218_GAIN_RAMP_RATE_MASK (0x3 << 0)
278#define DA7218_GAIN_RAMP_RATE_MAX 4
279
280/* DA7218_CIF_TIMEOUT_CTRL = 0x10 */
281#define DA7218_I2C_TIMEOUT_EN_SHIFT 0
282#define DA7218_I2C_TIMEOUT_EN_MASK (0x1 << 0)
283
284/* DA7218_SYSTEM_MODES_INPUT = 0x14 */
285#define DA7218_MODE_SUBMIT_SHIFT 0
286#define DA7218_MODE_SUBMIT_MASK (0x1 << 0)
287#define DA7218_ADC_MODE_SHIFT 1
288#define DA7218_ADC_MODE_MASK (0x7F << 1)
289
290/* DA7218_SYSTEM_MODES_OUTPUT = 0x15 */
291#define DA7218_MODE_SUBMIT_SHIFT 0
292#define DA7218_MODE_SUBMIT_MASK (0x1 << 0)
293#define DA7218_DAC_MODE_SHIFT 1
294#define DA7218_DAC_MODE_MASK (0x7F << 1)
295
296/* DA7218_SYSTEM_STATUS = 0x16 */
297#define DA7218_SC1_BUSY_SHIFT 0
298#define DA7218_SC1_BUSY_MASK (0x1 << 0)
299#define DA7218_SC2_BUSY_SHIFT 1
300#define DA7218_SC2_BUSY_MASK (0x1 << 1)
301
302/* DA7218_IN_1L_FILTER_CTRL = 0x18 */
303#define DA7218_IN_1L_RAMP_EN_SHIFT 5
304#define DA7218_IN_1L_RAMP_EN_MASK (0x1 << 5)
305#define DA7218_IN_1L_MUTE_EN_SHIFT 6
306#define DA7218_IN_1L_MUTE_EN_MASK (0x1 << 6)
307#define DA7218_IN_1L_FILTER_EN_SHIFT 7
308#define DA7218_IN_1L_FILTER_EN_MASK (0x1 << 7)
309
310/* DA7218_IN_1R_FILTER_CTRL = 0x19 */
311#define DA7218_IN_1R_RAMP_EN_SHIFT 5
312#define DA7218_IN_1R_RAMP_EN_MASK (0x1 << 5)
313#define DA7218_IN_1R_MUTE_EN_SHIFT 6
314#define DA7218_IN_1R_MUTE_EN_MASK (0x1 << 6)
315#define DA7218_IN_1R_FILTER_EN_SHIFT 7
316#define DA7218_IN_1R_FILTER_EN_MASK (0x1 << 7)
317
318/* DA7218_IN_2L_FILTER_CTRL = 0x1A */
319#define DA7218_IN_2L_RAMP_EN_SHIFT 5
320#define DA7218_IN_2L_RAMP_EN_MASK (0x1 << 5)
321#define DA7218_IN_2L_MUTE_EN_SHIFT 6
322#define DA7218_IN_2L_MUTE_EN_MASK (0x1 << 6)
323#define DA7218_IN_2L_FILTER_EN_SHIFT 7
324#define DA7218_IN_2L_FILTER_EN_MASK (0x1 << 7)
325
326/* DA7218_IN_2R_FILTER_CTRL = 0x1B */
327#define DA7218_IN_2R_RAMP_EN_SHIFT 5
328#define DA7218_IN_2R_RAMP_EN_MASK (0x1 << 5)
329#define DA7218_IN_2R_MUTE_EN_SHIFT 6
330#define DA7218_IN_2R_MUTE_EN_MASK (0x1 << 6)
331#define DA7218_IN_2R_FILTER_EN_SHIFT 7
332#define DA7218_IN_2R_FILTER_EN_MASK (0x1 << 7)
333
334/* DA7218_OUT_1L_FILTER_CTRL = 0x20 */
335#define DA7218_OUT_1L_BIQ_5STAGE_SEL_SHIFT 3
336#define DA7218_OUT_1L_BIQ_5STAGE_SEL_MASK (0x1 << 3)
337#define DA7218_OUT_BIQ_5STAGE_SEL_MAX 2
338#define DA7218_OUT_1L_SUBRANGE_EN_SHIFT 4
339#define DA7218_OUT_1L_SUBRANGE_EN_MASK (0x1 << 4)
340#define DA7218_OUT_1L_RAMP_EN_SHIFT 5
341#define DA7218_OUT_1L_RAMP_EN_MASK (0x1 << 5)
342#define DA7218_OUT_1L_MUTE_EN_SHIFT 6
343#define DA7218_OUT_1L_MUTE_EN_MASK (0x1 << 6)
344#define DA7218_OUT_1L_FILTER_EN_SHIFT 7
345#define DA7218_OUT_1L_FILTER_EN_MASK (0x1 << 7)
346
347/* DA7218_OUT_1R_FILTER_CTRL = 0x21 */
348#define DA7218_OUT_1R_BIQ_5STAGE_SEL_SHIFT 3
349#define DA7218_OUT_1R_BIQ_5STAGE_SEL_MASK (0x1 << 3)
350#define DA7218_OUT_1R_SUBRANGE_EN_SHIFT 4
351#define DA7218_OUT_1R_SUBRANGE_EN_MASK (0x1 << 4)
352#define DA7218_OUT_1R_RAMP_EN_SHIFT 5
353#define DA7218_OUT_1R_RAMP_EN_MASK (0x1 << 5)
354#define DA7218_OUT_1R_MUTE_EN_SHIFT 6
355#define DA7218_OUT_1R_MUTE_EN_MASK (0x1 << 6)
356#define DA7218_OUT_1R_FILTER_EN_SHIFT 7
357#define DA7218_OUT_1R_FILTER_EN_MASK (0x1 << 7)
358
359/* DA7218_OUT_1_HPF_FILTER_CTRL = 0x24 */
360#define DA7218_OUT_1_VOICE_HPF_CORNER_SHIFT 0
361#define DA7218_OUT_1_VOICE_HPF_CORNER_MASK (0x7 << 0)
362#define DA7218_VOICE_HPF_CORNER_MAX 8
363#define DA7218_OUT_1_VOICE_EN_SHIFT 3
364#define DA7218_OUT_1_VOICE_EN_MASK (0x1 << 3)
365#define DA7218_OUT_1_AUDIO_HPF_CORNER_SHIFT 4
366#define DA7218_OUT_1_AUDIO_HPF_CORNER_MASK (0x3 << 4)
367#define DA7218_AUDIO_HPF_CORNER_MAX 4
368#define DA7218_OUT_1_HPF_EN_SHIFT 7
369#define DA7218_OUT_1_HPF_EN_MASK (0x1 << 7)
370#define DA7218_HPF_MODE_SHIFT 0
371#define DA7218_HPF_DISABLED ((0x0 << 3) | (0x0 << 7))
372#define DA7218_HPF_AUDIO_EN ((0x0 << 3) | (0x1 << 7))
373#define DA7218_HPF_VOICE_EN ((0x1 << 3) | (0x1 << 7))
374#define DA7218_HPF_MODE_MASK ((0x1 << 3) | (0x1 << 7))
375#define DA7218_HPF_MODE_MAX 3
376
377/* DA7218_OUT_1_EQ_12_FILTER_CTRL = 0x25 */
378#define DA7218_OUT_1_EQ_BAND1_SHIFT 0
379#define DA7218_OUT_1_EQ_BAND1_MASK (0xF << 0)
380#define DA7218_OUT_EQ_BAND_MAX 0xF
381#define DA7218_OUT_1_EQ_BAND2_SHIFT 4
382#define DA7218_OUT_1_EQ_BAND2_MASK (0xF << 4)
383
384/* DA7218_OUT_1_EQ_34_FILTER_CTRL = 0x26 */
385#define DA7218_OUT_1_EQ_BAND3_SHIFT 0
386#define DA7218_OUT_1_EQ_BAND3_MASK (0xF << 0)
387#define DA7218_OUT_1_EQ_BAND4_SHIFT 4
388#define DA7218_OUT_1_EQ_BAND4_MASK (0xF << 4)
389
390/* DA7218_OUT_1_EQ_5_FILTER_CTRL = 0x27 */
391#define DA7218_OUT_1_EQ_BAND5_SHIFT 0
392#define DA7218_OUT_1_EQ_BAND5_MASK (0xF << 0)
393#define DA7218_OUT_1_EQ_EN_SHIFT 7
394#define DA7218_OUT_1_EQ_EN_MASK (0x1 << 7)
395
396/* DA7218_OUT_1_BIQ_5STAGE_CTRL = 0x28 */
397#define DA7218_OUT_1_BIQ_5STAGE_MUTE_EN_SHIFT 6
398#define DA7218_OUT_1_BIQ_5STAGE_MUTE_EN_MASK (0x1 << 6)
399#define DA7218_OUT_1_BIQ_5STAGE_FILTER_EN_SHIFT 7
400#define DA7218_OUT_1_BIQ_5STAGE_FILTER_EN_MASK (0x1 << 7)
401
402/* DA7218_OUT_1_BIQ_5STAGE_DATA = 0x29 */
403#define DA7218_OUT_1_BIQ_5STAGE_DATA_SHIFT 0
404#define DA7218_OUT_1_BIQ_5STAGE_DATA_MASK (0xFF << 0)
405
406/* DA7218_OUT_1_BIQ_5STAGE_ADDR = 0x2A */
407#define DA7218_OUT_1_BIQ_5STAGE_ADDR_SHIFT 0
408#define DA7218_OUT_1_BIQ_5STAGE_ADDR_MASK (0x3F << 0)
409#define DA7218_OUT_1_BIQ_5STAGE_CFG_SIZE 50
410
411/* DA7218_MIXIN_1_CTRL = 0x2C */
412#define DA7218_MIXIN_1_MIX_SEL_SHIFT 3
413#define DA7218_MIXIN_1_MIX_SEL_MASK (0x1 << 3)
414#define DA7218_MIXIN_1_AMP_ZC_EN_SHIFT 4
415#define DA7218_MIXIN_1_AMP_ZC_EN_MASK (0x1 << 4)
416#define DA7218_MIXIN_1_AMP_RAMP_EN_SHIFT 5
417#define DA7218_MIXIN_1_AMP_RAMP_EN_MASK (0x1 << 5)
418#define DA7218_MIXIN_1_AMP_MUTE_EN_SHIFT 6
419#define DA7218_MIXIN_1_AMP_MUTE_EN_MASK (0x1 << 6)
420#define DA7218_MIXIN_1_AMP_EN_SHIFT 7
421#define DA7218_MIXIN_1_AMP_EN_MASK (0x1 << 7)
422
423/* DA7218_MIXIN_1_GAIN = 0x2D */
424#define DA7218_MIXIN_1_AMP_GAIN_SHIFT 0
425#define DA7218_MIXIN_1_AMP_GAIN_MASK (0xF << 0)
426#define DA7218_MIXIN_AMP_GAIN_MAX 0xF
427
428/* DA7218_MIXIN_2_CTRL = 0x2E */
429#define DA7218_MIXIN_2_MIX_SEL_SHIFT 3
430#define DA7218_MIXIN_2_MIX_SEL_MASK (0x1 << 3)
431#define DA7218_MIXIN_2_AMP_ZC_EN_SHIFT 4
432#define DA7218_MIXIN_2_AMP_ZC_EN_MASK (0x1 << 4)
433#define DA7218_MIXIN_2_AMP_RAMP_EN_SHIFT 5
434#define DA7218_MIXIN_2_AMP_RAMP_EN_MASK (0x1 << 5)
435#define DA7218_MIXIN_2_AMP_MUTE_EN_SHIFT 6
436#define DA7218_MIXIN_2_AMP_MUTE_EN_MASK (0x1 << 6)
437#define DA7218_MIXIN_2_AMP_EN_SHIFT 7
438#define DA7218_MIXIN_2_AMP_EN_MASK (0x1 << 7)
439
440/* DA7218_MIXIN_2_GAIN = 0x2F */
441#define DA7218_MIXIN_2_AMP_GAIN_SHIFT 0
442#define DA7218_MIXIN_2_AMP_GAIN_MASK (0xF << 0)
443
444/* DA7218_ALC_CTRL1 = 0x30 */
445#define DA7218_ALC_EN_SHIFT 0
446#define DA7218_ALC_EN_MASK (0xF << 0)
447#define DA7218_ALC_CHAN1_L_EN_SHIFT 0
448#define DA7218_ALC_CHAN1_R_EN_SHIFT 1
449#define DA7218_ALC_CHAN2_L_EN_SHIFT 2
450#define DA7218_ALC_CHAN2_R_EN_SHIFT 3
451#define DA7218_ALC_SYNC_MODE_SHIFT 4
452#define DA7218_ALC_SYNC_MODE_MASK (0xF << 4)
453#define DA7218_ALC_SYNC_MODE_CH1 (0x1 << 4)
454#define DA7218_ALC_SYNC_MODE_CH2 (0x4 << 4)
455
456/* DA7218_ALC_CTRL2 = 0x31 */
457#define DA7218_ALC_ATTACK_SHIFT 0
458#define DA7218_ALC_ATTACK_MASK (0xF << 0)
459#define DA7218_ALC_ATTACK_MAX 13
460#define DA7218_ALC_RELEASE_SHIFT 4
461#define DA7218_ALC_RELEASE_MASK (0xF << 4)
462#define DA7218_ALC_RELEASE_MAX 11
463
464/* DA7218_ALC_CTRL3 = 0x32 */
465#define DA7218_ALC_HOLD_SHIFT 0
466#define DA7218_ALC_HOLD_MASK (0xF << 0)
467#define DA7218_ALC_HOLD_MAX 16
468
469/* DA7218_ALC_NOISE = 0x33 */
470#define DA7218_ALC_NOISE_SHIFT 0
471#define DA7218_ALC_NOISE_MASK (0x3F << 0)
472#define DA7218_ALC_THRESHOLD_MAX 0x3F
473
474/* DA7218_ALC_TARGET_MIN = 0x34 */
475#define DA7218_ALC_THRESHOLD_MIN_SHIFT 0
476#define DA7218_ALC_THRESHOLD_MIN_MASK (0x3F << 0)
477
478/* DA7218_ALC_TARGET_MAX = 0x35 */
479#define DA7218_ALC_THRESHOLD_MAX_SHIFT 0
480#define DA7218_ALC_THRESHOLD_MAX_MASK (0x3F << 0)
481
482/* DA7218_ALC_GAIN_LIMITS = 0x36 */
483#define DA7218_ALC_ATTEN_MAX_SHIFT 0
484#define DA7218_ALC_ATTEN_MAX_MASK (0xF << 0)
485#define DA7218_ALC_ATTEN_GAIN_MAX 0xF
486#define DA7218_ALC_GAIN_MAX_SHIFT 4
487#define DA7218_ALC_GAIN_MAX_MASK (0xF << 4)
488
489/* DA7218_ALC_ANA_GAIN_LIMITS = 0x37 */
490#define DA7218_ALC_ANA_GAIN_MIN_SHIFT 0
491#define DA7218_ALC_ANA_GAIN_MIN_MASK (0x7 << 0)
492#define DA7218_ALC_ANA_GAIN_MIN 0x1
493#define DA7218_ALC_ANA_GAIN_MAX 0x7
494#define DA7218_ALC_ANA_GAIN_MAX_SHIFT 4
495#define DA7218_ALC_ANA_GAIN_MAX_MASK (0x7 << 4)
496
497/* DA7218_ALC_ANTICLIP_CTRL = 0x38 */
498#define DA7218_ALC_ANTICLIP_STEP_SHIFT 0
499#define DA7218_ALC_ANTICLIP_STEP_MASK (0x3 << 0)
500#define DA7218_ALC_ANTICLIP_STEP_MAX 4
501#define DA7218_ALC_ANTICLIP_EN_SHIFT 7
502#define DA7218_ALC_ANTICLIP_EN_MASK (0x1 << 7)
503
504/* DA7218_AGS_ENABLE = 0x3C */
505#define DA7218_AGS_ENABLE_SHIFT 0
506#define DA7218_AGS_ENABLE_MASK (0x3 << 0)
507#define DA7218_AGS_ENABLE_CHAN1_SHIFT 0
508#define DA7218_AGS_ENABLE_CHAN2_SHIFT 1
509
510/* DA7218_AGS_TRIGGER = 0x3D */
511#define DA7218_AGS_TRIGGER_SHIFT 0
512#define DA7218_AGS_TRIGGER_MASK (0xF << 0)
513#define DA7218_AGS_TRIGGER_MAX 0xF
514
515/* DA7218_AGS_ATT_MAX = 0x3E */
516#define DA7218_AGS_ATT_MAX_SHIFT 0
517#define DA7218_AGS_ATT_MAX_MASK (0x7 << 0)
518#define DA7218_AGS_ATT_MAX_MAX 0x7
519
520/* DA7218_AGS_TIMEOUT = 0x3F */
521#define DA7218_AGS_TIMEOUT_EN_SHIFT 0
522#define DA7218_AGS_TIMEOUT_EN_MASK (0x1 << 0)
523
524/* DA7218_AGS_ANTICLIP_CTRL = 0x40 */
525#define DA7218_AGS_ANTICLIP_EN_SHIFT 7
526#define DA7218_AGS_ANTICLIP_EN_MASK (0x1 << 7)
527
528/* DA7218_CALIB_CTRL = 0x44 */
529#define DA7218_CALIB_OFFSET_EN_SHIFT 0
530#define DA7218_CALIB_OFFSET_EN_MASK (0x1 << 0)
531#define DA7218_CALIB_AUTO_EN_SHIFT 2
532#define DA7218_CALIB_AUTO_EN_MASK (0x1 << 2)
533#define DA7218_CALIB_OVERFLOW_SHIFT 3
534#define DA7218_CALIB_OVERFLOW_MASK (0x1 << 3)
535
536/* DA7218_CALIB_OFFSET_AUTO_M_1 = 0x45 */
537#define DA7218_CALIB_OFFSET_AUTO_M_1_SHIFT 0
538#define DA7218_CALIB_OFFSET_AUTO_M_1_MASK (0xFF << 0)
539
540/* DA7218_CALIB_OFFSET_AUTO_U_1 = 0x46 */
541#define DA7218_CALIB_OFFSET_AUTO_U_1_SHIFT 0
542#define DA7218_CALIB_OFFSET_AUTO_U_1_MASK (0xF << 0)
543
544/* DA7218_CALIB_OFFSET_AUTO_M_2 = 0x47 */
545#define DA7218_CALIB_OFFSET_AUTO_M_2_SHIFT 0
546#define DA7218_CALIB_OFFSET_AUTO_M_2_MASK (0xFF << 0)
547
548/* DA7218_CALIB_OFFSET_AUTO_U_2 = 0x48 */
549#define DA7218_CALIB_OFFSET_AUTO_U_2_SHIFT 0
550#define DA7218_CALIB_OFFSET_AUTO_U_2_MASK (0xF << 0)
551
552/* DA7218_ENV_TRACK_CTRL = 0x4C */
553#define DA7218_INTEG_ATTACK_SHIFT 0
554#define DA7218_INTEG_ATTACK_MASK (0x3 << 0)
555#define DA7218_INTEG_RELEASE_SHIFT 4
556#define DA7218_INTEG_RELEASE_MASK (0x3 << 4)
557#define DA7218_INTEG_MAX 4
558
559/* DA7218_LVL_DET_CTRL = 0x50 */
560#define DA7218_LVL_DET_EN_SHIFT 0
561#define DA7218_LVL_DET_EN_MASK (0xF << 0)
562#define DA7218_LVL_DET_EN_CHAN1L_SHIFT 0
563#define DA7218_LVL_DET_EN_CHAN1R_SHIFT 1
564#define DA7218_LVL_DET_EN_CHAN2L_SHIFT 2
565#define DA7218_LVL_DET_EN_CHAN2R_SHIFT 3
566
567/* DA7218_LVL_DET_LEVEL = 0x51 */
568#define DA7218_LVL_DET_LEVEL_SHIFT 0
569#define DA7218_LVL_DET_LEVEL_MASK (0x7F << 0)
570#define DA7218_LVL_DET_LEVEL_MAX 0x7F
571
572/* DA7218_DGS_TRIGGER = 0x54 */
573#define DA7218_DGS_TRIGGER_LVL_SHIFT 0
574#define DA7218_DGS_TRIGGER_LVL_MASK (0x3F << 0)
575#define DA7218_DGS_TRIGGER_MAX 0x3F
576
577/* DA7218_DGS_ENABLE = 0x55 */
578#define DA7218_DGS_ENABLE_SHIFT 0
579#define DA7218_DGS_ENABLE_MASK (0x3 << 0)
580#define DA7218_DGS_ENABLE_L_SHIFT 0
581#define DA7218_DGS_ENABLE_R_SHIFT 1
582
583/* DA7218_DGS_RISE_FALL = 0x56 */
584#define DA7218_DGS_RISE_COEFF_SHIFT 0
585#define DA7218_DGS_RISE_COEFF_MASK (0x7 << 0)
586#define DA7218_DGS_RISE_COEFF_MAX 7
587#define DA7218_DGS_FALL_COEFF_SHIFT 4
588#define DA7218_DGS_FALL_COEFF_MASK (0x7 << 4)
589#define DA7218_DGS_FALL_COEFF_MAX 8
590
591/* DA7218_DGS_SYNC_DELAY = 0x57 */
592#define DA7218_DGS_SYNC_DELAY_SHIFT 0
593#define DA7218_DGS_SYNC_DELAY_MASK (0xFF << 0)
594#define DA7218_DGS_SYNC_DELAY_MAX 0xFF
595
596/* DA7218_DGS_SYNC_DELAY2 = 0x58 */
597#define DA7218_DGS_SYNC_DELAY2_SHIFT 0
598#define DA7218_DGS_SYNC_DELAY2_MASK (0xFF << 0)
599
600/* DA7218_DGS_SYNC_DELAY3 = 0x59 */
601#define DA7218_DGS_SYNC_DELAY3_SHIFT 0
602#define DA7218_DGS_SYNC_DELAY3_MASK (0x7F << 0)
603#define DA7218_DGS_SYNC_DELAY3_MAX 0x7F
604
605/* DA7218_DGS_LEVELS = 0x5A */
606#define DA7218_DGS_ANTICLIP_LVL_SHIFT 0
607#define DA7218_DGS_ANTICLIP_LVL_MASK (0x7 << 0)
608#define DA7218_DGS_ANTICLIP_LVL_MAX 0x7
609#define DA7218_DGS_SIGNAL_LVL_SHIFT 4
610#define DA7218_DGS_SIGNAL_LVL_MASK (0xF << 4)
611#define DA7218_DGS_SIGNAL_LVL_MAX 0xF
612
613/* DA7218_DGS_GAIN_CTRL = 0x5B */
614#define DA7218_DGS_STEPS_SHIFT 0
615#define DA7218_DGS_STEPS_MASK (0x1F << 0)
616#define DA7218_DGS_STEPS_MAX 0x1F
617#define DA7218_DGS_RAMP_EN_SHIFT 5
618#define DA7218_DGS_RAMP_EN_MASK (0x1 << 5)
619#define DA7218_DGS_SUBR_EN_SHIFT 6
620#define DA7218_DGS_SUBR_EN_MASK (0x1 << 6)
621
622/* DA7218_DROUTING_OUTDAI_1L = 0x5C */
623#define DA7218_OUTDAI_1L_SRC_SHIFT 0
624#define DA7218_OUTDAI_1L_SRC_MASK (0x7F << 0)
625#define DA7218_DMIX_SRC_INFILT1L 0
626#define DA7218_DMIX_SRC_INFILT1R 1
627#define DA7218_DMIX_SRC_INFILT2L 2
628#define DA7218_DMIX_SRC_INFILT2R 3
629#define DA7218_DMIX_SRC_TONEGEN 4
630#define DA7218_DMIX_SRC_DAIL 5
631#define DA7218_DMIX_SRC_DAIR 6
632
633/* DA7218_DMIX_OUTDAI_1L_INFILT_1L_GAIN = 0x5D */
634#define DA7218_OUTDAI_1L_INFILT_1L_GAIN_SHIFT 0
635#define DA7218_OUTDAI_1L_INFILT_1L_GAIN_MASK (0x1F << 0)
636#define DA7218_DMIX_GAIN_MAX 0x1F
637
638/* DA7218_DMIX_OUTDAI_1L_INFILT_1R_GAIN = 0x5E */
639#define DA7218_OUTDAI_1L_INFILT_1R_GAIN_SHIFT 0
640#define DA7218_OUTDAI_1L_INFILT_1R_GAIN_MASK (0x1F << 0)
641
642/* DA7218_DMIX_OUTDAI_1L_INFILT_2L_GAIN = 0x5F */
643#define DA7218_OUTDAI_1L_INFILT_2L_GAIN_SHIFT 0
644#define DA7218_OUTDAI_1L_INFILT_2L_GAIN_MASK (0x1F << 0)
645
646/* DA7218_DMIX_OUTDAI_1L_INFILT_2R_GAIN = 0x60 */
647#define DA7218_OUTDAI_1L_INFILT_2R_GAIN_SHIFT 0
648#define DA7218_OUTDAI_1L_INFILT_2R_GAIN_MASK (0x1F << 0)
649
650/* DA7218_DMIX_OUTDAI_1L_TONEGEN_GAIN = 0x61 */
651#define DA7218_OUTDAI_1L_TONEGEN_GAIN_SHIFT 0
652#define DA7218_OUTDAI_1L_TONEGEN_GAIN_MASK (0x1F << 0)
653
654/* DA7218_DMIX_OUTDAI_1L_INDAI_1L_GAIN = 0x62 */
655#define DA7218_OUTDAI_1L_INDAI_1L_GAIN_SHIFT 0
656#define DA7218_OUTDAI_1L_INDAI_1L_GAIN_MASK (0x1F << 0)
657
658/* DA7218_DMIX_OUTDAI_1L_INDAI_1R_GAIN = 0x63 */
659#define DA7218_OUTDAI_1L_INDAI_1R_GAIN_SHIFT 0
660#define DA7218_OUTDAI_1L_INDAI_1R_GAIN_MASK (0x1F << 0)
661
662/* DA7218_DROUTING_OUTDAI_1R = 0x64 */
663#define DA7218_OUTDAI_1R_SRC_SHIFT 0
664#define DA7218_OUTDAI_1R_SRC_MASK (0x7F << 0)
665
666/* DA7218_DMIX_OUTDAI_1R_INFILT_1L_GAIN = 0x65 */
667#define DA7218_OUTDAI_1R_INFILT_1L_GAIN_SHIFT 0
668#define DA7218_OUTDAI_1R_INFILT_1L_GAIN_MASK (0x1F << 0)
669
670/* DA7218_DMIX_OUTDAI_1R_INFILT_1R_GAIN = 0x66 */
671#define DA7218_OUTDAI_1R_INFILT_1R_GAIN_SHIFT 0
672#define DA7218_OUTDAI_1R_INFILT_1R_GAIN_MASK (0x1F << 0)
673
674/* DA7218_DMIX_OUTDAI_1R_INFILT_2L_GAIN = 0x67 */
675#define DA7218_OUTDAI_1R_INFILT_2L_GAIN_SHIFT 0
676#define DA7218_OUTDAI_1R_INFILT_2L_GAIN_MASK (0x1F << 0)
677
678/* DA7218_DMIX_OUTDAI_1R_INFILT_2R_GAIN = 0x68 */
679#define DA7218_OUTDAI_1R_INFILT_2R_GAIN_SHIFT 0
680#define DA7218_OUTDAI_1R_INFILT_2R_GAIN_MASK (0x1F << 0)
681
682/* DA7218_DMIX_OUTDAI_1R_TONEGEN_GAIN = 0x69 */
683#define DA7218_OUTDAI_1R_TONEGEN_GAIN_SHIFT 0
684#define DA7218_OUTDAI_1R_TONEGEN_GAIN_MASK (0x1F << 0)
685
686/* DA7218_DMIX_OUTDAI_1R_INDAI_1L_GAIN = 0x6A */
687#define DA7218_OUTDAI_1R_INDAI_1L_GAIN_SHIFT 0
688#define DA7218_OUTDAI_1R_INDAI_1L_GAIN_MASK (0x1F << 0)
689
690/* DA7218_DMIX_OUTDAI_1R_INDAI_1R_GAIN = 0x6B */
691#define DA7218_OUTDAI_1R_INDAI_1R_GAIN_SHIFT 0
692#define DA7218_OUTDAI_1R_INDAI_1R_GAIN_MASK (0x1F << 0)
693
694/* DA7218_DROUTING_OUTFILT_1L = 0x6C */
695#define DA7218_OUTFILT_1L_SRC_SHIFT 0
696#define DA7218_OUTFILT_1L_SRC_MASK (0x7F << 0)
697
698/* DA7218_DMIX_OUTFILT_1L_INFILT_1L_GAIN = 0x6D */
699#define DA7218_OUTFILT_1L_INFILT_1L_GAIN_SHIFT 0
700#define DA7218_OUTFILT_1L_INFILT_1L_GAIN_MASK (0x1F << 0)
701
702/* DA7218_DMIX_OUTFILT_1L_INFILT_1R_GAIN = 0x6E */
703#define DA7218_OUTFILT_1L_INFILT_1R_GAIN_SHIFT 0
704#define DA7218_OUTFILT_1L_INFILT_1R_GAIN_MASK (0x1F << 0)
705
706/* DA7218_DMIX_OUTFILT_1L_INFILT_2L_GAIN = 0x6F */
707#define DA7218_OUTFILT_1L_INFILT_2L_GAIN_SHIFT 0
708#define DA7218_OUTFILT_1L_INFILT_2L_GAIN_MASK (0x1F << 0)
709
710/* DA7218_DMIX_OUTFILT_1L_INFILT_2R_GAIN = 0x70 */
711#define DA7218_OUTFILT_1L_INFILT_2R_GAIN_SHIFT 0
712#define DA7218_OUTFILT_1L_INFILT_2R_GAIN_MASK (0x1F << 0)
713
714/* DA7218_DMIX_OUTFILT_1L_TONEGEN_GAIN = 0x71 */
715#define DA7218_OUTFILT_1L_TONEGEN_GAIN_SHIFT 0
716#define DA7218_OUTFILT_1L_TONEGEN_GAIN_MASK (0x1F << 0)
717
718/* DA7218_DMIX_OUTFILT_1L_INDAI_1L_GAIN = 0x72 */
719#define DA7218_OUTFILT_1L_INDAI_1L_GAIN_SHIFT 0
720#define DA7218_OUTFILT_1L_INDAI_1L_GAIN_MASK (0x1F << 0)
721
722/* DA7218_DMIX_OUTFILT_1L_INDAI_1R_GAIN = 0x73 */
723#define DA7218_OUTFILT_1L_INDAI_1R_GAIN_SHIFT 0
724#define DA7218_OUTFILT_1L_INDAI_1R_GAIN_MASK (0x1F << 0)
725
726/* DA7218_DROUTING_OUTFILT_1R = 0x74 */
727#define DA7218_OUTFILT_1R_SRC_SHIFT 0
728#define DA7218_OUTFILT_1R_SRC_MASK (0x7F << 0)
729
730/* DA7218_DMIX_OUTFILT_1R_INFILT_1L_GAIN = 0x75 */
731#define DA7218_OUTFILT_1R_INFILT_1L_GAIN_SHIFT 0
732#define DA7218_OUTFILT_1R_INFILT_1L_GAIN_MASK (0x1F << 0)
733
734/* DA7218_DMIX_OUTFILT_1R_INFILT_1R_GAIN = 0x76 */
735#define DA7218_OUTFILT_1R_INFILT_1R_GAIN_SHIFT 0
736#define DA7218_OUTFILT_1R_INFILT_1R_GAIN_MASK (0x1F << 0)
737
738/* DA7218_DMIX_OUTFILT_1R_INFILT_2L_GAIN = 0x77 */
739#define DA7218_OUTFILT_1R_INFILT_2L_GAIN_SHIFT 0
740#define DA7218_OUTFILT_1R_INFILT_2L_GAIN_MASK (0x1F << 0)
741
742/* DA7218_DMIX_OUTFILT_1R_INFILT_2R_GAIN = 0x78 */
743#define DA7218_OUTFILT_1R_INFILT_2R_GAIN_SHIFT 0
744#define DA7218_OUTFILT_1R_INFILT_2R_GAIN_MASK (0x1F << 0)
745
746/* DA7218_DMIX_OUTFILT_1R_TONEGEN_GAIN = 0x79 */
747#define DA7218_OUTFILT_1R_TONEGEN_GAIN_SHIFT 0
748#define DA7218_OUTFILT_1R_TONEGEN_GAIN_MASK (0x1F << 0)
749
750/* DA7218_DMIX_OUTFILT_1R_INDAI_1L_GAIN = 0x7A */
751#define DA7218_OUTFILT_1R_INDAI_1L_GAIN_SHIFT 0
752#define DA7218_OUTFILT_1R_INDAI_1L_GAIN_MASK (0x1F << 0)
753
754/* DA7218_DMIX_OUTFILT_1R_INDAI_1R_GAIN = 0x7B */
755#define DA7218_OUTFILT_1R_INDAI_1R_GAIN_SHIFT 0
756#define DA7218_OUTFILT_1R_INDAI_1R_GAIN_MASK (0x1F << 0)
757
758/* DA7218_DROUTING_OUTDAI_2L = 0x7C */
759#define DA7218_OUTDAI_2L_SRC_SHIFT 0
760#define DA7218_OUTDAI_2L_SRC_MASK (0x7F << 0)
761
762/* DA7218_DMIX_OUTDAI_2L_INFILT_1L_GAIN = 0x7D */
763#define DA7218_OUTDAI_2L_INFILT_1L_GAIN_SHIFT 0
764#define DA7218_OUTDAI_2L_INFILT_1L_GAIN_MASK (0x1F << 0)
765
766/* DA7218_DMIX_OUTDAI_2L_INFILT_1R_GAIN = 0x7E */
767#define DA7218_OUTDAI_2L_INFILT_1R_GAIN_SHIFT 0
768#define DA7218_OUTDAI_2L_INFILT_1R_GAIN_MASK (0x1F << 0)
769
770/* DA7218_DMIX_OUTDAI_2L_INFILT_2L_GAIN = 0x7F */
771#define DA7218_OUTDAI_2L_INFILT_2L_GAIN_SHIFT 0
772#define DA7218_OUTDAI_2L_INFILT_2L_GAIN_MASK (0x1F << 0)
773
774/* DA7218_DMIX_OUTDAI_2L_INFILT_2R_GAIN = 0x80 */
775#define DA7218_OUTDAI_2L_INFILT_2R_GAIN_SHIFT 0
776#define DA7218_OUTDAI_2L_INFILT_2R_GAIN_MASK (0x1F << 0)
777
778/* DA7218_DMIX_OUTDAI_2L_TONEGEN_GAIN = 0x81 */
779#define DA7218_OUTDAI_2L_TONEGEN_GAIN_SHIFT 0
780#define DA7218_OUTDAI_2L_TONEGEN_GAIN_MASK (0x1F << 0)
781
782/* DA7218_DMIX_OUTDAI_2L_INDAI_1L_GAIN = 0x82 */
783#define DA7218_OUTDAI_2L_INDAI_1L_GAIN_SHIFT 0
784#define DA7218_OUTDAI_2L_INDAI_1L_GAIN_MASK (0x1F << 0)
785
786/* DA7218_DMIX_OUTDAI_2L_INDAI_1R_GAIN = 0x83 */
787#define DA7218_OUTDAI_2L_INDAI_1R_GAIN_SHIFT 0
788#define DA7218_OUTDAI_2L_INDAI_1R_GAIN_MASK (0x1F << 0)
789
790/* DA7218_DROUTING_OUTDAI_2R = 0x84 */
791#define DA7218_OUTDAI_2R_SRC_SHIFT 0
792#define DA7218_OUTDAI_2R_SRC_MASK (0x7F << 0)
793
794/* DA7218_DMIX_OUTDAI_2R_INFILT_1L_GAIN = 0x85 */
795#define DA7218_OUTDAI_2R_INFILT_1L_GAIN_SHIFT 0
796#define DA7218_OUTDAI_2R_INFILT_1L_GAIN_MASK (0x1F << 0)
797
798/* DA7218_DMIX_OUTDAI_2R_INFILT_1R_GAIN = 0x86 */
799#define DA7218_OUTDAI_2R_INFILT_1R_GAIN_SHIFT 0
800#define DA7218_OUTDAI_2R_INFILT_1R_GAIN_MASK (0x1F << 0)
801
802/* DA7218_DMIX_OUTDAI_2R_INFILT_2L_GAIN = 0x87 */
803#define DA7218_OUTDAI_2R_INFILT_2L_GAIN_SHIFT 0
804#define DA7218_OUTDAI_2R_INFILT_2L_GAIN_MASK (0x1F << 0)
805
806/* DA7218_DMIX_OUTDAI_2R_INFILT_2R_GAIN = 0x88 */
807#define DA7218_OUTDAI_2R_INFILT_2R_GAIN_SHIFT 0
808#define DA7218_OUTDAI_2R_INFILT_2R_GAIN_MASK (0x1F << 0)
809
810/* DA7218_DMIX_OUTDAI_2R_TONEGEN_GAIN = 0x89 */
811#define DA7218_OUTDAI_2R_TONEGEN_GAIN_SHIFT 0
812#define DA7218_OUTDAI_2R_TONEGEN_GAIN_MASK (0x1F << 0)
813
814/* DA7218_DMIX_OUTDAI_2R_INDAI_1L_GAIN = 0x8A */
815#define DA7218_OUTDAI_2R_INDAI_1L_GAIN_SHIFT 0
816#define DA7218_OUTDAI_2R_INDAI_1L_GAIN_MASK (0x1F << 0)
817
818/* DA7218_DMIX_OUTDAI_2R_INDAI_1R_GAIN = 0x8B */
819#define DA7218_OUTDAI_2R_INDAI_1R_GAIN_SHIFT 0
820#define DA7218_OUTDAI_2R_INDAI_1R_GAIN_MASK (0x1F << 0)
821
822/* DA7218_DAI_CTRL = 0x8C */
823#define DA7218_DAI_FORMAT_SHIFT 0
824#define DA7218_DAI_FORMAT_MASK (0x3 << 0)
825#define DA7218_DAI_FORMAT_I2S (0x0 << 0)
826#define DA7218_DAI_FORMAT_LEFT_J (0x1 << 0)
827#define DA7218_DAI_FORMAT_RIGHT_J (0x2 << 0)
828#define DA7218_DAI_FORMAT_DSP (0x3 << 0)
829#define DA7218_DAI_WORD_LENGTH_SHIFT 2
830#define DA7218_DAI_WORD_LENGTH_MASK (0x3 << 2)
831#define DA7218_DAI_WORD_LENGTH_S16_LE (0x0 << 2)
832#define DA7218_DAI_WORD_LENGTH_S20_LE (0x1 << 2)
833#define DA7218_DAI_WORD_LENGTH_S24_LE (0x2 << 2)
834#define DA7218_DAI_WORD_LENGTH_S32_LE (0x3 << 2)
835#define DA7218_DAI_CH_NUM_SHIFT 4
836#define DA7218_DAI_CH_NUM_MASK (0x7 << 4)
837#define DA7218_DAI_CH_NUM_MAX 4
838#define DA7218_DAI_EN_SHIFT 7
839#define DA7218_DAI_EN_MASK (0x1 << 7)
840
841/* DA7218_DAI_TDM_CTRL = 0x8D */
842#define DA7218_DAI_TDM_CH_EN_SHIFT 0
843#define DA7218_DAI_TDM_CH_EN_MASK (0xF << 0)
844#define DA7218_DAI_TDM_MAX_SLOTS 4
845#define DA7218_DAI_OE_SHIFT 6
846#define DA7218_DAI_OE_MASK (0x1 << 6)
847#define DA7218_DAI_TDM_MODE_EN_SHIFT 7
848#define DA7218_DAI_TDM_MODE_EN_MASK (0x1 << 7)
849
850/* DA7218_DAI_OFFSET_LOWER = 0x8E */
851#define DA7218_DAI_OFFSET_LOWER_SHIFT 0
852#define DA7218_DAI_OFFSET_LOWER_MASK (0xFF << 0)
853
854/* DA7218_DAI_OFFSET_UPPER = 0x8F */
855#define DA7218_DAI_OFFSET_UPPER_SHIFT 0
856#define DA7218_DAI_OFFSET_UPPER_MASK (0x7 << 0)
857
858/* DA7218_DAI_CLK_MODE = 0x90 */
859#define DA7218_DAI_BCLKS_PER_WCLK_SHIFT 0
860#define DA7218_DAI_BCLKS_PER_WCLK_MASK (0x3 << 0)
861#define DA7218_DAI_BCLKS_PER_WCLK_32 (0x0 << 0)
862#define DA7218_DAI_BCLKS_PER_WCLK_64 (0x1 << 0)
863#define DA7218_DAI_BCLKS_PER_WCLK_128 (0x2 << 0)
864#define DA7218_DAI_BCLKS_PER_WCLK_256 (0x3 << 0)
865#define DA7218_DAI_CLK_POL_SHIFT 2
866#define DA7218_DAI_CLK_POL_MASK (0x1 << 2)
867#define DA7218_DAI_CLK_POL_INV (0x1 << 2)
868#define DA7218_DAI_WCLK_POL_SHIFT 3
869#define DA7218_DAI_WCLK_POL_MASK (0x1 << 3)
870#define DA7218_DAI_WCLK_POL_INV (0x1 << 3)
871#define DA7218_DAI_WCLK_TRI_STATE_SHIFT 4
872#define DA7218_DAI_WCLK_TRI_STATE_MASK (0x1 << 4)
873#define DA7218_DAI_CLK_EN_SHIFT 7
874#define DA7218_DAI_CLK_EN_MASK (0x1 << 7)
875
876/* DA7218_PLL_CTRL = 0x91 */
877#define DA7218_PLL_INDIV_SHIFT 0
878#define DA7218_PLL_INDIV_MASK (0x7 << 0)
879#define DA7218_PLL_INDIV_2_5_MHZ (0x0 << 0)
880#define DA7218_PLL_INDIV_5_10_MHZ (0x1 << 0)
881#define DA7218_PLL_INDIV_10_20_MHZ (0x2 << 0)
882#define DA7218_PLL_INDIV_20_40_MHZ (0x3 << 0)
883#define DA7218_PLL_INDIV_40_54_MHZ (0x4 << 0)
884#define DA7218_PLL_INDIV_2_10_MHZ_VAL 2
885#define DA7218_PLL_INDIV_10_20_MHZ_VAL 4
886#define DA7218_PLL_INDIV_20_40_MHZ_VAL 8
887#define DA7218_PLL_INDIV_40_54_MHZ_VAL 16
888#define DA7218_PLL_MCLK_SQR_EN_SHIFT 4
889#define DA7218_PLL_MCLK_SQR_EN_MASK (0x1 << 4)
890#define DA7218_PLL_MODE_SHIFT 6
891#define DA7218_PLL_MODE_MASK (0x3 << 6)
892#define DA7218_PLL_MODE_BYPASS (0x0 << 6)
893#define DA7218_PLL_MODE_NORMAL (0x1 << 6)
894#define DA7218_PLL_MODE_SRM (0x2 << 6)
895#define DA7218_PLL_MODE_32KHZ (0x3 << 6)
896
897/* DA7218_PLL_FRAC_TOP = 0x92 */
898#define DA7218_PLL_FBDIV_FRAC_TOP_SHIFT 0
899#define DA7218_PLL_FBDIV_FRAC_TOP_MASK (0x1F << 0)
900
901/* DA7218_PLL_FRAC_BOT = 0x93 */
902#define DA7218_PLL_FBDIV_FRAC_BOT_SHIFT 0
903#define DA7218_PLL_FBDIV_FRAC_BOT_MASK (0xFF << 0)
904
905/* DA7218_PLL_INTEGER = 0x94 */
906#define DA7218_PLL_FBDIV_INTEGER_SHIFT 0
907#define DA7218_PLL_FBDIV_INTEGER_MASK (0x7F << 0)
908
909/* DA7218_PLL_STATUS = 0x95 */
910#define DA7218_PLL_SRM_STATUS_SHIFT 0
911#define DA7218_PLL_SRM_STATUS_MASK (0xFF << 0)
912#define DA7218_PLL_SRM_STATUS_SRM_LOCK (0x1 << 7)
913
914/* DA7218_PLL_REFOSC_CAL = 0x98 */
915#define DA7218_PLL_REFOSC_CAL_CTRL_SHIFT 0
916#define DA7218_PLL_REFOSC_CAL_CTRL_MASK (0x1F << 0)
917#define DA7218_PLL_REFOSC_CAL_START_SHIFT 6
918#define DA7218_PLL_REFOSC_CAL_START_MASK (0x1 << 6)
919#define DA7218_PLL_REFOSC_CAL_EN_SHIFT 7
920#define DA7218_PLL_REFOSC_CAL_EN_MASK (0x1 << 7)
921
922/* DA7218_DAC_NG_CTRL = 0x9C */
923#define DA7218_DAC_NG_EN_SHIFT 7
924#define DA7218_DAC_NG_EN_MASK (0x1 << 7)
925
926/* DA7218_DAC_NG_SETUP_TIME = 0x9D */
927#define DA7218_DAC_NG_SETUP_TIME_SHIFT 0
928#define DA7218_DAC_NG_SETUP_TIME_MASK (0x3 << 0)
929#define DA7218_DAC_NG_SETUP_TIME_MAX 4
930#define DA7218_DAC_NG_RAMPUP_RATE_SHIFT 2
931#define DA7218_DAC_NG_RAMPUP_RATE_MASK (0x1 << 2)
932#define DA7218_DAC_NG_RAMPUP_RATE_MAX 2
933#define DA7218_DAC_NG_RAMPDN_RATE_SHIFT 3
934#define DA7218_DAC_NG_RAMPDN_RATE_MASK (0x1 << 3)
935#define DA7218_DAC_NG_RAMPDN_RATE_MAX 2
936
937/* DA7218_DAC_NG_OFF_THRESH = 0x9E */
938#define DA7218_DAC_NG_OFF_THRESHOLD_SHIFT 0
939#define DA7218_DAC_NG_OFF_THRESHOLD_MASK (0x7 << 0)
940#define DA7218_DAC_NG_THRESHOLD_MAX 0x7
941
942/* DA7218_DAC_NG_ON_THRESH = 0x9F */
943#define DA7218_DAC_NG_ON_THRESHOLD_SHIFT 0
944#define DA7218_DAC_NG_ON_THRESHOLD_MASK (0x7 << 0)
945
946/* DA7218_TONE_GEN_CFG1 = 0xA0 */
947#define DA7218_DTMF_REG_SHIFT 0
948#define DA7218_DTMF_REG_MASK (0xF << 0)
949#define DA7218_DTMF_REG_MAX 16
950#define DA7218_DTMF_EN_SHIFT 4
951#define DA7218_DTMF_EN_MASK (0x1 << 4)
952#define DA7218_START_STOPN_SHIFT 7
953#define DA7218_START_STOPN_MASK (0x1 << 7)
954
955/* DA7218_TONE_GEN_CFG2 = 0xA1 */
956#define DA7218_SWG_SEL_SHIFT 0
957#define DA7218_SWG_SEL_MASK (0x3 << 0)
958#define DA7218_SWG_SEL_MAX 4
959
960/* DA7218_TONE_GEN_FREQ1_L = 0xA2 */
961#define DA7218_FREQ1_L_SHIFT 0
962#define DA7218_FREQ1_L_MASK (0xFF << 0)
963#define DA7218_FREQ_MAX 0xFFFF
964
965/* DA7218_TONE_GEN_FREQ1_U = 0xA3 */
966#define DA7218_FREQ1_U_SHIFT 0
967#define DA7218_FREQ1_U_MASK (0xFF << 0)
968
969/* DA7218_TONE_GEN_FREQ2_L = 0xA4 */
970#define DA7218_FREQ2_L_SHIFT 0
971#define DA7218_FREQ2_L_MASK (0xFF << 0)
972
973/* DA7218_TONE_GEN_FREQ2_U = 0xA5 */
974#define DA7218_FREQ2_U_SHIFT 0
975#define DA7218_FREQ2_U_MASK (0xFF << 0)
976
977/* DA7218_TONE_GEN_CYCLES = 0xA6 */
978#define DA7218_BEEP_CYCLES_SHIFT 0
979#define DA7218_BEEP_CYCLES_MASK (0x7 << 0)
980
981/* DA7218_TONE_GEN_ON_PER = 0xA7 */
982#define DA7218_BEEP_ON_PER_SHIFT 0
983#define DA7218_BEEP_ON_PER_MASK (0x3F << 0)
984
985/* DA7218_TONE_GEN_OFF_PER = 0xA8 */
986#define DA7218_BEEP_OFF_PER_SHIFT 0
987#define DA7218_BEEP_OFF_PER_MASK (0x3F << 0)
988#define DA7218_BEEP_ON_OFF_MAX 0x3F
989
990/* DA7218_CP_CTRL = 0xAC */
991#define DA7218_CP_MOD_SHIFT 2
992#define DA7218_CP_MOD_MASK (0x3 << 2)
993#define DA7218_CP_MCHANGE_SHIFT 4
994#define DA7218_CP_MCHANGE_MASK (0x3 << 4)
995#define DA7218_CP_MCHANGE_REL_MASK 0x3
996#define DA7218_CP_MCHANGE_MAX 3
997#define DA7218_CP_MCHANGE_LARGEST_VOL 0x1
998#define DA7218_CP_MCHANGE_DAC_VOL 0x2
999#define DA7218_CP_MCHANGE_SIG_MAG 0x3
1000#define DA7218_CP_SMALL_SWITCH_FREQ_EN_SHIFT 6
1001#define DA7218_CP_SMALL_SWITCH_FREQ_EN_MASK (0x1 << 6)
1002#define DA7218_CP_EN_SHIFT 7
1003#define DA7218_CP_EN_MASK (0x1 << 7)
1004
1005/* DA7218_CP_DELAY = 0xAD */
1006#define DA7218_CP_FCONTROL_SHIFT 0
1007#define DA7218_CP_FCONTROL_MASK (0x7 << 0)
1008#define DA7218_CP_FCONTROL_MAX 6
1009#define DA7218_CP_TAU_DELAY_SHIFT 3
1010#define DA7218_CP_TAU_DELAY_MASK (0x7 << 3)
1011#define DA7218_CP_TAU_DELAY_MAX 8
1012
1013/* DA7218_CP_VOL_THRESHOLD1 = 0xAE */
1014#define DA7218_CP_THRESH_VDD2_SHIFT 0
1015#define DA7218_CP_THRESH_VDD2_MASK (0x3F << 0)
1016#define DA7218_CP_THRESH_VDD2_MAX 0x3F
1017
1018/* DA7218_MIC_1_CTRL = 0xB4 */
1019#define DA7218_MIC_1_AMP_MUTE_EN_SHIFT 6
1020#define DA7218_MIC_1_AMP_MUTE_EN_MASK (0x1 << 6)
1021#define DA7218_MIC_1_AMP_EN_SHIFT 7
1022#define DA7218_MIC_1_AMP_EN_MASK (0x1 << 7)
1023
1024/* DA7218_MIC_1_GAIN = 0xB5 */
1025#define DA7218_MIC_1_AMP_GAIN_SHIFT 0
1026#define DA7218_MIC_1_AMP_GAIN_MASK (0x7 << 0)
1027#define DA7218_MIC_AMP_GAIN_MAX 0x7
1028
1029/* DA7218_MIC_1_SELECT = 0xB7 */
1030#define DA7218_MIC_1_AMP_IN_SEL_SHIFT 0
1031#define DA7218_MIC_1_AMP_IN_SEL_MASK (0x3 << 0)
1032
1033/* DA7218_MIC_2_CTRL = 0xB8 */
1034#define DA7218_MIC_2_AMP_MUTE_EN_SHIFT 6
1035#define DA7218_MIC_2_AMP_MUTE_EN_MASK (0x1 << 6)
1036#define DA7218_MIC_2_AMP_EN_SHIFT 7
1037#define DA7218_MIC_2_AMP_EN_MASK (0x1 << 7)
1038
1039/* DA7218_MIC_2_GAIN = 0xB9 */
1040#define DA7218_MIC_2_AMP_GAIN_SHIFT 0
1041#define DA7218_MIC_2_AMP_GAIN_MASK (0x7 << 0)
1042
1043/* DA7218_MIC_2_SELECT = 0xBB */
1044#define DA7218_MIC_2_AMP_IN_SEL_SHIFT 0
1045#define DA7218_MIC_2_AMP_IN_SEL_MASK (0x3 << 0)
1046
1047/* DA7218_IN_1_HPF_FILTER_CTRL = 0xBC */
1048#define DA7218_IN_1_VOICE_HPF_CORNER_SHIFT 0
1049#define DA7218_IN_1_VOICE_HPF_CORNER_MASK (0x7 << 0)
1050#define DA7218_IN_VOICE_HPF_CORNER_MAX 8
1051#define DA7218_IN_1_VOICE_EN_SHIFT 3
1052#define DA7218_IN_1_VOICE_EN_MASK (0x1 << 3)
1053#define DA7218_IN_1_AUDIO_HPF_CORNER_SHIFT 4
1054#define DA7218_IN_1_AUDIO_HPF_CORNER_MASK (0x3 << 4)
1055#define DA7218_IN_1_HPF_EN_SHIFT 7
1056#define DA7218_IN_1_HPF_EN_MASK (0x1 << 7)
1057
1058/* DA7218_IN_2_HPF_FILTER_CTRL = 0xBD */
1059#define DA7218_IN_2_VOICE_HPF_CORNER_SHIFT 0
1060#define DA7218_IN_2_VOICE_HPF_CORNER_MASK (0x7 << 0)
1061#define DA7218_IN_2_VOICE_EN_SHIFT 3
1062#define DA7218_IN_2_VOICE_EN_MASK (0x1 << 3)
1063#define DA7218_IN_2_AUDIO_HPF_CORNER_SHIFT 4
1064#define DA7218_IN_2_AUDIO_HPF_CORNER_MASK (0x3 << 4)
1065#define DA7218_IN_2_HPF_EN_SHIFT 7
1066#define DA7218_IN_2_HPF_EN_MASK (0x1 << 7)
1067
1068/* DA7218_ADC_1_CTRL = 0xC0 */
1069#define DA7218_ADC_1_AAF_EN_SHIFT 2
1070#define DA7218_ADC_1_AAF_EN_MASK (0x1 << 2)
1071
1072/* DA7218_ADC_2_CTRL = 0xC1 */
1073#define DA7218_ADC_2_AAF_EN_SHIFT 2
1074#define DA7218_ADC_2_AAF_EN_MASK (0x1 << 2)
1075
1076/* DA7218_ADC_MODE = 0xC2 */
1077#define DA7218_ADC_LP_MODE_SHIFT 0
1078#define DA7218_ADC_LP_MODE_MASK (0x1 << 0)
1079#define DA7218_ADC_LVLDET_MODE_SHIFT 1
1080#define DA7218_ADC_LVLDET_MODE_MASK (0x1 << 1)
1081#define DA7218_ADC_LVLDET_AUTO_EXIT_SHIFT 2
1082#define DA7218_ADC_LVLDET_AUTO_EXIT_MASK (0x1 << 2)
1083
1084/* DA7218_MIXOUT_L_CTRL = 0xCC */
1085#define DA7218_MIXOUT_L_AMP_EN_SHIFT 7
1086#define DA7218_MIXOUT_L_AMP_EN_MASK (0x1 << 7)
1087
1088/* DA7218_MIXOUT_L_GAIN = 0xCD */
1089#define DA7218_MIXOUT_L_AMP_GAIN_SHIFT 0
1090#define DA7218_MIXOUT_L_AMP_GAIN_MASK (0x3 << 0)
1091#define DA7218_MIXOUT_AMP_GAIN_MIN 0x1
1092#define DA7218_MIXOUT_AMP_GAIN_MAX 0x3
1093
1094/* DA7218_MIXOUT_R_CTRL = 0xCE */
1095#define DA7218_MIXOUT_R_AMP_EN_SHIFT 7
1096#define DA7218_MIXOUT_R_AMP_EN_MASK (0x1 << 7)
1097
1098/* DA7218_MIXOUT_R_GAIN = 0xCF */
1099#define DA7218_MIXOUT_R_AMP_GAIN_SHIFT 0
1100#define DA7218_MIXOUT_R_AMP_GAIN_MASK (0x3 << 0)
1101
1102/* DA7218_HP_L_CTRL = 0xD0 */
1103#define DA7218_HP_L_AMP_MIN_GAIN_EN_SHIFT 2
1104#define DA7218_HP_L_AMP_MIN_GAIN_EN_MASK (0x1 << 2)
1105#define DA7218_HP_L_AMP_OE_SHIFT 3
1106#define DA7218_HP_L_AMP_OE_MASK (0x1 << 3)
1107#define DA7218_HP_L_AMP_ZC_EN_SHIFT 4
1108#define DA7218_HP_L_AMP_ZC_EN_MASK (0x1 << 4)
1109#define DA7218_HP_L_AMP_RAMP_EN_SHIFT 5
1110#define DA7218_HP_L_AMP_RAMP_EN_MASK (0x1 << 5)
1111#define DA7218_HP_L_AMP_MUTE_EN_SHIFT 6
1112#define DA7218_HP_L_AMP_MUTE_EN_MASK (0x1 << 6)
1113#define DA7218_HP_L_AMP_EN_SHIFT 7
1114#define DA7218_HP_L_AMP_EN_MASK (0x1 << 7)
1115#define DA7218_HP_AMP_OE_MASK (0x1 << 3)
1116
1117/* DA7218_HP_L_GAIN = 0xD1 */
1118#define DA7218_HP_L_AMP_GAIN_SHIFT 0
1119#define DA7218_HP_L_AMP_GAIN_MASK (0x3F << 0)
1120#define DA7218_HP_AMP_GAIN_MIN 0x15
1121#define DA7218_HP_AMP_GAIN_MAX 0x3F
1122
1123/* DA7218_HP_R_CTRL = 0xD2 */
1124#define DA7218_HP_R_AMP_MIN_GAIN_EN_SHIFT 2
1125#define DA7218_HP_R_AMP_MIN_GAIN_EN_MASK (0x1 << 2)
1126#define DA7218_HP_R_AMP_OE_SHIFT 3
1127#define DA7218_HP_R_AMP_OE_MASK (0x1 << 3)
1128#define DA7218_HP_R_AMP_ZC_EN_SHIFT 4
1129#define DA7218_HP_R_AMP_ZC_EN_MASK (0x1 << 4)
1130#define DA7218_HP_R_AMP_RAMP_EN_SHIFT 5
1131#define DA7218_HP_R_AMP_RAMP_EN_MASK (0x1 << 5)
1132#define DA7218_HP_R_AMP_MUTE_EN_SHIFT 6
1133#define DA7218_HP_R_AMP_MUTE_EN_MASK (0x1 << 6)
1134#define DA7218_HP_R_AMP_EN_SHIFT 7
1135#define DA7218_HP_R_AMP_EN_MASK (0x1 << 7)
1136
1137/* DA7218_HP_R_GAIN = 0xD3 */
1138#define DA7218_HP_R_AMP_GAIN_SHIFT 0
1139#define DA7218_HP_R_AMP_GAIN_MASK (0x3F << 0)
1140
1141/* DA7218_HP_SNGL_CTRL = 0xD4 */
1142#define DA7218_HP_AMP_STEREO_DETECT_STATUS_SHIFT 0
1143#define DA7218_HP_AMP_STEREO_DETECT_STATUS_MASK (0x1 << 0)
1144#define DA7218_HPL_AMP_LOAD_DETECT_STATUS_SHIFT 1
1145#define DA7218_HPL_AMP_LOAD_DETECT_STATUS_MASK (0x1 << 1)
1146#define DA7218_HPR_AMP_LOAD_DETECT_STATUS_SHIFT 2
1147#define DA7218_HPR_AMP_LOAD_DETECT_STATUS_MASK (0x1 << 2)
1148#define DA7218_HP_AMP_LOAD_DETECT_EN_SHIFT 6
1149#define DA7218_HP_AMP_LOAD_DETECT_EN_MASK (0x1 << 6)
1150#define DA7218_HP_AMP_STEREO_DETECT_EN_SHIFT 7
1151#define DA7218_HP_AMP_STEREO_DETECT_EN_MASK (0x1 << 7)
1152
1153/* DA7218_HP_DIFF_CTRL = 0xD5 */
1154#define DA7218_HP_AMP_DIFF_MODE_EN_SHIFT 0
1155#define DA7218_HP_AMP_DIFF_MODE_EN_MASK (0x1 << 0)
1156#define DA7218_HP_AMP_SINGLE_SUPPLY_EN_SHIFT 4
1157#define DA7218_HP_AMP_SINGLE_SUPPLY_EN_MASK (0x1 << 4)
1158
1159/* DA7218_HP_DIFF_UNLOCK = 0xD7 */
1160#define DA7218_HP_DIFF_UNLOCK_SHIFT 0
1161#define DA7218_HP_DIFF_UNLOCK_MASK (0x1 << 0)
1162#define DA7218_HP_DIFF_UNLOCK_VAL 0xC3
1163
1164/* DA7218_HPLDET_JACK = 0xD8 */
1165#define DA7218_HPLDET_JACK_RATE_SHIFT 0
1166#define DA7218_HPLDET_JACK_RATE_MASK (0x7 << 0)
1167#define DA7218_HPLDET_JACK_DEBOUNCE_SHIFT 3
1168#define DA7218_HPLDET_JACK_DEBOUNCE_MASK (0x3 << 3)
1169#define DA7218_HPLDET_JACK_THR_SHIFT 5
1170#define DA7218_HPLDET_JACK_THR_MASK (0x3 << 5)
1171#define DA7218_HPLDET_JACK_EN_SHIFT 7
1172#define DA7218_HPLDET_JACK_EN_MASK (0x1 << 7)
1173
1174/* DA7218_HPLDET_CTRL = 0xD9 */
1175#define DA7218_HPLDET_COMP_INV_SHIFT 0
1176#define DA7218_HPLDET_COMP_INV_MASK (0x1 << 0)
1177#define DA7218_HPLDET_HYST_EN_SHIFT 1
1178#define DA7218_HPLDET_HYST_EN_MASK (0x1 << 1)
1179#define DA7218_HPLDET_DISCHARGE_EN_SHIFT 7
1180#define DA7218_HPLDET_DISCHARGE_EN_MASK (0x1 << 7)
1181
1182/* DA7218_HPLDET_TEST = 0xDA */
1183#define DA7218_HPLDET_COMP_STS_SHIFT 4
1184#define DA7218_HPLDET_COMP_STS_MASK (0x1 << 4)
1185
1186/* DA7218_REFERENCES = 0xDC */
1187#define DA7218_BIAS_EN_SHIFT 3
1188#define DA7218_BIAS_EN_MASK (0x1 << 3)
1189
1190/* DA7218_IO_CTRL = 0xE0 */
1191#define DA7218_IO_VOLTAGE_LEVEL_SHIFT 0
1192#define DA7218_IO_VOLTAGE_LEVEL_MASK (0x1 << 0)
1193#define DA7218_IO_VOLTAGE_LEVEL_2_5V_3_6V 0
1194#define DA7218_IO_VOLTAGE_LEVEL_1_5V_2_5V 1
1195
1196/* DA7218_LDO_CTRL = 0xE1 */
1197#define DA7218_LDO_LEVEL_SELECT_SHIFT 4
1198#define DA7218_LDO_LEVEL_SELECT_MASK (0x3 << 4)
1199#define DA7218_LDO_EN_SHIFT 7
1200#define DA7218_LDO_EN_MASK (0x1 << 7)
1201
1202/* DA7218_SIDETONE_CTRL = 0xE4 */
1203#define DA7218_SIDETONE_MUTE_EN_SHIFT 6
1204#define DA7218_SIDETONE_MUTE_EN_MASK (0x1 << 6)
1205#define DA7218_SIDETONE_FILTER_EN_SHIFT 7
1206#define DA7218_SIDETONE_FILTER_EN_MASK (0x1 << 7)
1207
1208/* DA7218_SIDETONE_IN_SELECT = 0xE5 */
1209#define DA7218_SIDETONE_IN_SELECT_SHIFT 0
1210#define DA7218_SIDETONE_IN_SELECT_MASK (0x3 << 0)
1211#define DA7218_SIDETONE_IN_SELECT_MAX 4
1212
1213/* DA7218_SIDETONE_GAIN = 0xE6 */
1214#define DA7218_SIDETONE_GAIN_SHIFT 0
1215#define DA7218_SIDETONE_GAIN_MASK (0x1F << 0)
1216
1217/* DA7218_DROUTING_ST_OUTFILT_1L = 0xE8 */
1218#define DA7218_OUTFILT_ST_1L_SRC_SHIFT 0
1219#define DA7218_OUTFILT_ST_1L_SRC_MASK (0x7 << 0)
1220#define DA7218_DMIX_ST_SRC_OUTFILT1L 0
1221#define DA7218_DMIX_ST_SRC_OUTFILT1R 1
1222#define DA7218_DMIX_ST_SRC_SIDETONE 2
1223
1224/* DA7218_DROUTING_ST_OUTFILT_1R = 0xE9 */
1225#define DA7218_OUTFILT_ST_1R_SRC_SHIFT 0
1226#define DA7218_OUTFILT_ST_1R_SRC_MASK (0x7 << 0)
1227
1228/* DA7218_SIDETONE_BIQ_3STAGE_DATA = 0xEA */
1229#define DA7218_SIDETONE_BIQ_3STAGE_DATA_SHIFT 0
1230#define DA7218_SIDETONE_BIQ_3STAGE_DATA_MASK (0xFF << 0)
1231
1232/* DA7218_SIDETONE_BIQ_3STAGE_ADDR = 0xEB */
1233#define DA7218_SIDETONE_BIQ_3STAGE_ADDR_SHIFT 0
1234#define DA7218_SIDETONE_BIQ_3STAGE_ADDR_MASK (0x1F << 0)
1235#define DA7218_SIDETONE_BIQ_3STAGE_CFG_SIZE 30
1236
1237/* DA7218_EVENT_STATUS = 0xEC */
1238#define DA7218_HPLDET_JACK_STS_SHIFT 7
1239#define DA7218_HPLDET_JACK_STS_MASK (0x1 << 7)
1240
1241/* DA7218_EVENT = 0xED */
1242#define DA7218_LVL_DET_EVENT_SHIFT 0
1243#define DA7218_LVL_DET_EVENT_MASK (0x1 << 0)
1244#define DA7218_HPLDET_JACK_EVENT_SHIFT 7
1245#define DA7218_HPLDET_JACK_EVENT_MASK (0x1 << 7)
1246
1247/* DA7218_EVENT_MASK = 0xEE */
1248#define DA7218_LVL_DET_EVENT_MSK_SHIFT 0
1249#define DA7218_LVL_DET_EVENT_MSK_MASK (0x1 << 0)
1250#define DA7218_HPLDET_JACK_EVENT_IRQ_MSK_SHIFT 7
1251#define DA7218_HPLDET_JACK_EVENT_IRQ_MSK_MASK (0x1 << 7)
1252
1253/* DA7218_DMIC_1_CTRL = 0xF0 */
1254#define DA7218_DMIC_1_DATA_SEL_SHIFT 0
1255#define DA7218_DMIC_1_DATA_SEL_MASK (0x1 << 0)
1256#define DA7218_DMIC_1_SAMPLEPHASE_SHIFT 1
1257#define DA7218_DMIC_1_SAMPLEPHASE_MASK (0x1 << 1)
1258#define DA7218_DMIC_1_CLK_RATE_SHIFT 2
1259#define DA7218_DMIC_1_CLK_RATE_MASK (0x1 << 2)
1260#define DA7218_DMIC_1L_EN_SHIFT 6
1261#define DA7218_DMIC_1L_EN_MASK (0x1 << 6)
1262#define DA7218_DMIC_1R_EN_SHIFT 7
1263#define DA7218_DMIC_1R_EN_MASK (0x1 << 7)
1264
1265/* DA7218_DMIC_2_CTRL = 0xF1 */
1266#define DA7218_DMIC_2_DATA_SEL_SHIFT 0
1267#define DA7218_DMIC_2_DATA_SEL_MASK (0x1 << 0)
1268#define DA7218_DMIC_2_SAMPLEPHASE_SHIFT 1
1269#define DA7218_DMIC_2_SAMPLEPHASE_MASK (0x1 << 1)
1270#define DA7218_DMIC_2_CLK_RATE_SHIFT 2
1271#define DA7218_DMIC_2_CLK_RATE_MASK (0x1 << 2)
1272#define DA7218_DMIC_2L_EN_SHIFT 6
1273#define DA7218_DMIC_2L_EN_MASK (0x1 << 6)
1274#define DA7218_DMIC_2R_EN_SHIFT 7
1275#define DA7218_DMIC_2R_EN_MASK (0x1 << 7)
1276
1277/* DA7218_IN_1L_GAIN = 0xF4 */
1278#define DA7218_IN_1L_DIGITAL_GAIN_SHIFT 0
1279#define DA7218_IN_1L_DIGITAL_GAIN_MASK (0x7F << 0)
1280#define DA7218_IN_DIGITAL_GAIN_MAX 0x7F
1281
1282/* DA7218_IN_1R_GAIN = 0xF5 */
1283#define DA7218_IN_1R_DIGITAL_GAIN_SHIFT 0
1284#define DA7218_IN_1R_DIGITAL_GAIN_MASK (0x7F << 0)
1285
1286/* DA7218_IN_2L_GAIN = 0xF6 */
1287#define DA7218_IN_2L_DIGITAL_GAIN_SHIFT 0
1288#define DA7218_IN_2L_DIGITAL_GAIN_MASK (0x7F << 0)
1289
1290/* DA7218_IN_2R_GAIN = 0xF7 */
1291#define DA7218_IN_2R_DIGITAL_GAIN_SHIFT 0
1292#define DA7218_IN_2R_DIGITAL_GAIN_MASK (0x7F << 0)
1293
1294/* DA7218_OUT_1L_GAIN = 0xF8 */
1295#define DA7218_OUT_1L_DIGITAL_GAIN_SHIFT 0
1296#define DA7218_OUT_1L_DIGITAL_GAIN_MASK (0xFF << 0)
1297#define DA7218_OUT_DIGITAL_GAIN_MIN 0x0
1298#define DA7218_OUT_DIGITAL_GAIN_MAX 0x97
1299
1300/* DA7218_OUT_1R_GAIN = 0xF9 */
1301#define DA7218_OUT_1R_DIGITAL_GAIN_SHIFT 0
1302#define DA7218_OUT_1R_DIGITAL_GAIN_MASK (0xFF << 0)
1303
1304/* DA7218_MICBIAS_CTRL = 0xFC */
1305#define DA7218_MICBIAS_1_LEVEL_SHIFT 0
1306#define DA7218_MICBIAS_1_LEVEL_MASK (0x7 << 0)
1307#define DA7218_MICBIAS_1_LP_MODE_SHIFT 3
1308#define DA7218_MICBIAS_1_LP_MODE_MASK (0x1 << 3)
1309#define DA7218_MICBIAS_2_LEVEL_SHIFT 4
1310#define DA7218_MICBIAS_2_LEVEL_MASK (0x7 << 4)
1311#define DA7218_MICBIAS_2_LP_MODE_SHIFT 7
1312#define DA7218_MICBIAS_2_LP_MODE_MASK (0x1 << 7)
1313
1314/* DA7218_MICBIAS_EN = 0xFD */
1315#define DA7218_MICBIAS_1_EN_SHIFT 0
1316#define DA7218_MICBIAS_1_EN_MASK (0x1 << 0)
1317#define DA7218_MICBIAS_2_EN_SHIFT 4
1318#define DA7218_MICBIAS_2_EN_MASK (0x1 << 4)
1319
1320
1321/*
1322 * General defines & data
1323 */
1324
1325/* Register inversion */
1326#define DA7218_NO_INVERT 0
1327#define DA7218_INVERT 1
1328
1329/* Byte related defines */
1330#define DA7218_BYTE_SHIFT 8
1331#define DA7218_BYTE_MASK 0xFF
1332#define DA7218_2BYTE_SHIFT 16
1333#define DA7218_2BYTE_MASK 0xFFFF
1334
1335/* PLL Output Frequencies */
1336#define DA7218_PLL_FREQ_OUT_90316 90316800
1337#define DA7218_PLL_FREQ_OUT_98304 98304000
1338
1339/* ALC Calibration */
1340#define DA7218_ALC_CALIB_DELAY_MIN 2500
1341#define DA7218_ALC_CALIB_DELAY_MAX 5000
1342#define DA7218_ALC_CALIB_MAX_TRIES 5
1343
1344/* Ref Oscillator */
1345#define DA7218_REF_OSC_CHECK_DELAY_MIN 5000
1346#define DA7218_REF_OSC_CHECK_DELAY_MAX 10000
1347#define DA7218_REF_OSC_CHECK_TRIES 4
1348
1349/* SRM */
1350#define DA7218_SRM_CHECK_DELAY 50
1351#define DA7218_SRM_CHECK_TRIES 8
1352
1353/* Mic Level Detect */
1354#define DA7218_MIC_LVL_DET_DELAY 50
1355
1356enum da7218_biq_cfg {
1357 DA7218_BIQ_CFG_DATA = 0,
1358 DA7218_BIQ_CFG_ADDR,
1359 DA7218_BIQ_CFG_SIZE,
1360};
1361
1362enum da7218_clk_src {
1363 DA7218_CLKSRC_MCLK = 0,
1364 DA7218_CLKSRC_MCLK_SQR,
1365};
1366
1367enum da7218_sys_clk {
1368 DA7218_SYSCLK_MCLK = 0,
1369 DA7218_SYSCLK_PLL,
1370 DA7218_SYSCLK_PLL_SRM,
1371 DA7218_SYSCLK_PLL_32KHZ
1372};
1373
1374enum da7218_dev_id {
1375 DA7217_DEV_ID = 0,
1376 DA7218_DEV_ID,
1377};
1378
1379/* Regulators */
1380enum da7218_supplies {
1381 DA7218_SUPPLY_VDD = 0,
1382 DA7218_SUPPLY_VDDMIC,
1383 DA7218_SUPPLY_VDDIO,
1384 DA7218_NUM_SUPPLIES,
1385};
1386
1387/* Private data */
1388struct da7218_priv {
1389 struct da7218_pdata *pdata;
1390
1391 struct regulator_bulk_data supplies[DA7218_NUM_SUPPLIES];
1392 struct regmap *regmap;
1393 int dev_id;
1394
1395 struct snd_soc_jack *jack;
1396 int irq;
1397
1398 struct clk *mclk;
1399 unsigned int mclk_rate;
1400
1401 bool hp_single_supply;
1402 bool master;
1403 u8 alc_en;
1404 u8 in_filt_en;
1405 u8 mic_lvl_det_en;
1406
1407 u8 biq_5stage_coeff[DA7218_OUT_1_BIQ_5STAGE_CFG_SIZE];
1408 u8 stbiq_3stage_coeff[DA7218_SIDETONE_BIQ_3STAGE_CFG_SIZE];
1409};
1410
1411/* HP detect control */
1412int da7218_hpldet(struct snd_soc_codec *codec, struct snd_soc_jack *jack);
1413
1414#endif /* _DA7218_H */
diff --git a/sound/soc/codecs/da7219.c b/sound/soc/codecs/da7219.c
index f238c1e8a69c..81c0708b85c1 100644
--- a/sound/soc/codecs/da7219.c
+++ b/sound/soc/codecs/da7219.c
@@ -968,10 +968,11 @@ static const struct snd_soc_dapm_route da7219_audio_map[] = {
968 {"Mixin PGA", NULL, "Mic PGA"}, 968 {"Mixin PGA", NULL, "Mic PGA"},
969 {"ADC", NULL, "Mixin PGA"}, 969 {"ADC", NULL, "Mixin PGA"},
970 970
971 {"Sidetone Filter", NULL, "ADC"},
972 {"Mixer In", NULL, "Mixer In Supply"}, 971 {"Mixer In", NULL, "Mixer In Supply"},
973 {"Mixer In", "Mic Switch", "ADC"}, 972 {"Mixer In", "Mic Switch", "ADC"},
974 973
974 {"Sidetone Filter", NULL, "Mixer In"},
975
975 {"Tone Generator", NULL, "TONE"}, 976 {"Tone Generator", NULL, "TONE"},
976 977
977 DA7219_OUT_DAI_MUX_ROUTES("Out DAIL Mux"), 978 DA7219_OUT_DAI_MUX_ROUTES("Out DAIL Mux"),
@@ -1073,11 +1074,8 @@ static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
1073 u32 freq_ref; 1074 u32 freq_ref;
1074 u64 frac_div; 1075 u64 frac_div;
1075 1076
1076 /* Verify 32KHz, 2MHz - 54MHz MCLK provided, and set input divider */ 1077 /* Verify 2MHz - 54MHz MCLK provided, and set input divider */
1077 if (da7219->mclk_rate == 32768) { 1078 if (da7219->mclk_rate < 2000000) {
1078 indiv_bits = DA7219_PLL_INDIV_2_5_MHZ;
1079 indiv = DA7219_PLL_INDIV_2_5_MHZ_VAL;
1080 } else if (da7219->mclk_rate < 2000000) {
1081 dev_err(codec->dev, "PLL input clock %d below valid range\n", 1079 dev_err(codec->dev, "PLL input clock %d below valid range\n",
1082 da7219->mclk_rate); 1080 da7219->mclk_rate);
1083 return -EINVAL; 1081 return -EINVAL;
@@ -1118,9 +1116,6 @@ static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
1118 case DA7219_SYSCLK_PLL_SRM: 1116 case DA7219_SYSCLK_PLL_SRM:
1119 pll_ctrl |= DA7219_PLL_MODE_SRM; 1117 pll_ctrl |= DA7219_PLL_MODE_SRM;
1120 break; 1118 break;
1121 case DA7219_SYSCLK_PLL_32KHZ:
1122 pll_ctrl |= DA7219_PLL_MODE_32KHZ;
1123 break;
1124 default: 1119 default:
1125 dev_err(codec->dev, "Invalid PLL config\n"); 1120 dev_err(codec->dev, "Invalid PLL config\n");
1126 return -EINVAL; 1121 return -EINVAL;
@@ -1161,18 +1156,44 @@ static int da7219_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
1161 return -EINVAL; 1156 return -EINVAL;
1162 } 1157 }
1163 1158
1164 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 1159 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1165 case SND_SOC_DAIFMT_NB_NF: 1160 case SND_SOC_DAIFMT_I2S:
1166 break; 1161 case SND_SOC_DAIFMT_LEFT_J:
1167 case SND_SOC_DAIFMT_NB_IF: 1162 case SND_SOC_DAIFMT_RIGHT_J:
1168 dai_clk_mode |= DA7219_DAI_WCLK_POL_INV; 1163 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1169 break; 1164 case SND_SOC_DAIFMT_NB_NF:
1170 case SND_SOC_DAIFMT_IB_NF: 1165 break;
1171 dai_clk_mode |= DA7219_DAI_CLK_POL_INV; 1166 case SND_SOC_DAIFMT_NB_IF:
1167 dai_clk_mode |= DA7219_DAI_WCLK_POL_INV;
1168 break;
1169 case SND_SOC_DAIFMT_IB_NF:
1170 dai_clk_mode |= DA7219_DAI_CLK_POL_INV;
1171 break;
1172 case SND_SOC_DAIFMT_IB_IF:
1173 dai_clk_mode |= DA7219_DAI_WCLK_POL_INV |
1174 DA7219_DAI_CLK_POL_INV;
1175 break;
1176 default:
1177 return -EINVAL;
1178 }
1172 break; 1179 break;
1173 case SND_SOC_DAIFMT_IB_IF: 1180 case SND_SOC_DAIFMT_DSP_B:
1174 dai_clk_mode |= DA7219_DAI_WCLK_POL_INV | 1181 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1175 DA7219_DAI_CLK_POL_INV; 1182 case SND_SOC_DAIFMT_NB_NF:
1183 dai_clk_mode |= DA7219_DAI_CLK_POL_INV;
1184 break;
1185 case SND_SOC_DAIFMT_NB_IF:
1186 dai_clk_mode |= DA7219_DAI_WCLK_POL_INV |
1187 DA7219_DAI_CLK_POL_INV;
1188 break;
1189 case SND_SOC_DAIFMT_IB_NF:
1190 break;
1191 case SND_SOC_DAIFMT_IB_IF:
1192 dai_clk_mode |= DA7219_DAI_WCLK_POL_INV;
1193 break;
1194 default:
1195 return -EINVAL;
1196 }
1176 break; 1197 break;
1177 default: 1198 default:
1178 return -EINVAL; 1199 return -EINVAL;
@@ -1306,7 +1327,7 @@ static int da7219_hw_params(struct snd_pcm_substream *substream,
1306 } 1327 }
1307 1328
1308 channels = params_channels(params); 1329 channels = params_channels(params);
1309 if ((channels < 1) | (channels > DA7219_DAI_CH_NUM_MAX)) { 1330 if ((channels < 1) || (channels > DA7219_DAI_CH_NUM_MAX)) {
1310 dev_err(codec->dev, 1331 dev_err(codec->dev,
1311 "Invalid number of channels, only 1 to %d supported\n", 1332 "Invalid number of channels, only 1 to %d supported\n",
1312 DA7219_DAI_CH_NUM_MAX); 1333 DA7219_DAI_CH_NUM_MAX);
@@ -1405,28 +1426,12 @@ static const struct of_device_id da7219_of_match[] = {
1405}; 1426};
1406MODULE_DEVICE_TABLE(of, da7219_of_match); 1427MODULE_DEVICE_TABLE(of, da7219_of_match);
1407 1428
1408static enum da7219_ldo_lvl_sel da7219_of_ldo_lvl(struct snd_soc_codec *codec,
1409 u32 val)
1410{
1411 switch (val) {
1412 case 1050:
1413 return DA7219_LDO_LVL_SEL_1_05V;
1414 case 1100:
1415 return DA7219_LDO_LVL_SEL_1_10V;
1416 case 1200:
1417 return DA7219_LDO_LVL_SEL_1_20V;
1418 case 1400:
1419 return DA7219_LDO_LVL_SEL_1_40V;
1420 default:
1421 dev_warn(codec->dev, "Invalid LDO level");
1422 return DA7219_LDO_LVL_SEL_1_05V;
1423 }
1424}
1425
1426static enum da7219_micbias_voltage 1429static enum da7219_micbias_voltage
1427 da7219_of_micbias_lvl(struct snd_soc_codec *codec, u32 val) 1430 da7219_of_micbias_lvl(struct snd_soc_codec *codec, u32 val)
1428{ 1431{
1429 switch (val) { 1432 switch (val) {
1433 case 1600:
1434 return DA7219_MICBIAS_1_6V;
1430 case 1800: 1435 case 1800:
1431 return DA7219_MICBIAS_1_8V; 1436 return DA7219_MICBIAS_1_8V;
1432 case 2000: 1437 case 2000:
@@ -1469,9 +1474,6 @@ static struct da7219_pdata *da7219_of_to_pdata(struct snd_soc_codec *codec)
1469 if (!pdata) 1474 if (!pdata)
1470 return NULL; 1475 return NULL;
1471 1476
1472 if (of_property_read_u32(np, "dlg,ldo-lvl", &of_val32) >= 0)
1473 pdata->ldo_lvl_sel = da7219_of_ldo_lvl(codec, of_val32);
1474
1475 if (of_property_read_u32(np, "dlg,micbias-lvl", &of_val32) >= 0) 1477 if (of_property_read_u32(np, "dlg,micbias-lvl", &of_val32) >= 0)
1476 pdata->micbias_lvl = da7219_of_micbias_lvl(codec, of_val32); 1478 pdata->micbias_lvl = da7219_of_micbias_lvl(codec, of_val32);
1477 else 1479 else
@@ -1516,24 +1518,13 @@ static int da7219_set_bias_level(struct snd_soc_codec *codec,
1516 snd_soc_update_bits(codec, DA7219_REFERENCES, 1518 snd_soc_update_bits(codec, DA7219_REFERENCES,
1517 DA7219_BIAS_EN_MASK, 1519 DA7219_BIAS_EN_MASK,
1518 DA7219_BIAS_EN_MASK); 1520 DA7219_BIAS_EN_MASK);
1519
1520 /* Enable Internal Digital LDO */
1521 snd_soc_update_bits(codec, DA7219_LDO_CTRL,
1522 DA7219_LDO_EN_MASK,
1523 DA7219_LDO_EN_MASK);
1524 } 1521 }
1525 break; 1522 break;
1526 case SND_SOC_BIAS_OFF: 1523 case SND_SOC_BIAS_OFF:
1527 /* Only disable if jack detection not active */ 1524 /* Only disable master bias if jack detection not active */
1528 if (!da7219->aad->jack) { 1525 if (!da7219->aad->jack)
1529 /* Bypass Internal Digital LDO */
1530 snd_soc_update_bits(codec, DA7219_LDO_CTRL,
1531 DA7219_LDO_EN_MASK, 0);
1532
1533 /* Master bias */
1534 snd_soc_update_bits(codec, DA7219_REFERENCES, 1526 snd_soc_update_bits(codec, DA7219_REFERENCES,
1535 DA7219_BIAS_EN_MASK, 0); 1527 DA7219_BIAS_EN_MASK, 0);
1536 }
1537 1528
1538 /* MCLK */ 1529 /* MCLK */
1539 if (da7219->mclk) 1530 if (da7219->mclk)
@@ -1600,21 +1591,9 @@ static void da7219_handle_pdata(struct snd_soc_codec *codec)
1600 if (pdata) { 1591 if (pdata) {
1601 u8 micbias_lvl = 0; 1592 u8 micbias_lvl = 0;
1602 1593
1603 /* Internal LDO */
1604 switch (pdata->ldo_lvl_sel) {
1605 case DA7219_LDO_LVL_SEL_1_05V:
1606 case DA7219_LDO_LVL_SEL_1_10V:
1607 case DA7219_LDO_LVL_SEL_1_20V:
1608 case DA7219_LDO_LVL_SEL_1_40V:
1609 snd_soc_update_bits(codec, DA7219_LDO_CTRL,
1610 DA7219_LDO_LEVEL_SELECT_MASK,
1611 (pdata->ldo_lvl_sel <<
1612 DA7219_LDO_LEVEL_SELECT_SHIFT));
1613 break;
1614 }
1615
1616 /* Mic Bias voltages */ 1594 /* Mic Bias voltages */
1617 switch (pdata->micbias_lvl) { 1595 switch (pdata->micbias_lvl) {
1596 case DA7219_MICBIAS_1_6V:
1618 case DA7219_MICBIAS_1_8V: 1597 case DA7219_MICBIAS_1_8V:
1619 case DA7219_MICBIAS_2_0V: 1598 case DA7219_MICBIAS_2_0V:
1620 case DA7219_MICBIAS_2_2V: 1599 case DA7219_MICBIAS_2_2V:
@@ -1639,9 +1618,14 @@ static void da7219_handle_pdata(struct snd_soc_codec *codec)
1639 } 1618 }
1640} 1619}
1641 1620
1621static struct reg_sequence da7219_rev_aa_patch[] = {
1622 { DA7219_REFERENCES, 0x08 },
1623};
1624
1642static int da7219_probe(struct snd_soc_codec *codec) 1625static int da7219_probe(struct snd_soc_codec *codec)
1643{ 1626{
1644 struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); 1627 struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec);
1628 unsigned int rev;
1645 int ret; 1629 int ret;
1646 1630
1647 mutex_init(&da7219->lock); 1631 mutex_init(&da7219->lock);
@@ -1651,6 +1635,26 @@ static int da7219_probe(struct snd_soc_codec *codec)
1651 if (ret) 1635 if (ret)
1652 return ret; 1636 return ret;
1653 1637
1638 ret = regmap_read(da7219->regmap, DA7219_CHIP_REVISION, &rev);
1639 if (ret) {
1640 dev_err(codec->dev, "Failed to read chip revision: %d\n", ret);
1641 goto err_disable_reg;
1642 }
1643
1644 switch (rev & DA7219_CHIP_MINOR_MASK) {
1645 case 0:
1646 ret = regmap_register_patch(da7219->regmap, da7219_rev_aa_patch,
1647 ARRAY_SIZE(da7219_rev_aa_patch));
1648 if (ret) {
1649 dev_err(codec->dev, "Failed to register AA patch: %d\n",
1650 ret);
1651 goto err_disable_reg;
1652 }
1653 break;
1654 default:
1655 break;
1656 }
1657
1654 /* Handle DT/Platform data */ 1658 /* Handle DT/Platform data */
1655 if (codec->dev->of_node) 1659 if (codec->dev->of_node)
1656 da7219->pdata = da7219_of_to_pdata(codec); 1660 da7219->pdata = da7219_of_to_pdata(codec);
@@ -1662,10 +1666,12 @@ static int da7219_probe(struct snd_soc_codec *codec)
1662 /* Check if MCLK provided */ 1666 /* Check if MCLK provided */
1663 da7219->mclk = devm_clk_get(codec->dev, "mclk"); 1667 da7219->mclk = devm_clk_get(codec->dev, "mclk");
1664 if (IS_ERR(da7219->mclk)) { 1668 if (IS_ERR(da7219->mclk)) {
1665 if (PTR_ERR(da7219->mclk) != -ENOENT) 1669 if (PTR_ERR(da7219->mclk) != -ENOENT) {
1666 return PTR_ERR(da7219->mclk); 1670 ret = PTR_ERR(da7219->mclk);
1667 else 1671 goto err_disable_reg;
1672 } else {
1668 da7219->mclk = NULL; 1673 da7219->mclk = NULL;
1674 }
1669 } 1675 }
1670 1676
1671 /* Default PC counter to free-running */ 1677 /* Default PC counter to free-running */
@@ -1693,7 +1699,16 @@ static int da7219_probe(struct snd_soc_codec *codec)
1693 snd_soc_write(codec, DA7219_TONE_GEN_CYCLES, DA7219_BEEP_CYCLES_MASK); 1699 snd_soc_write(codec, DA7219_TONE_GEN_CYCLES, DA7219_BEEP_CYCLES_MASK);
1694 1700
1695 /* Initialise AAD block */ 1701 /* Initialise AAD block */
1696 return da7219_aad_init(codec); 1702 ret = da7219_aad_init(codec);
1703 if (ret)
1704 goto err_disable_reg;
1705
1706 return 0;
1707
1708err_disable_reg:
1709 regulator_bulk_disable(DA7219_NUM_SUPPLIES, da7219->supplies);
1710
1711 return ret;
1697} 1712}
1698 1713
1699static int da7219_remove(struct snd_soc_codec *codec) 1714static int da7219_remove(struct snd_soc_codec *codec)
@@ -1776,7 +1791,7 @@ static struct reg_default da7219_reg_defaults[] = {
1776 { DA7219_DIG_ROUTING_DAC, 0x32 }, 1791 { DA7219_DIG_ROUTING_DAC, 0x32 },
1777 { DA7219_DAI_OFFSET_LOWER, 0x00 }, 1792 { DA7219_DAI_OFFSET_LOWER, 0x00 },
1778 { DA7219_DAI_OFFSET_UPPER, 0x00 }, 1793 { DA7219_DAI_OFFSET_UPPER, 0x00 },
1779 { DA7219_REFERENCES, 0x00 }, 1794 { DA7219_REFERENCES, 0x08 },
1780 { DA7219_MIXIN_L_SELECT, 0x00 }, 1795 { DA7219_MIXIN_L_SELECT, 0x00 },
1781 { DA7219_MIXIN_L_GAIN, 0x03 }, 1796 { DA7219_MIXIN_L_GAIN, 0x03 },
1782 { DA7219_ADC_L_GAIN, 0x6F }, 1797 { DA7219_ADC_L_GAIN, 0x6F },
@@ -1810,8 +1825,6 @@ static struct reg_default da7219_reg_defaults[] = {
1810 { DA7219_MIXOUT_R_CTRL, 0x10 }, 1825 { DA7219_MIXOUT_R_CTRL, 0x10 },
1811 { DA7219_CHIP_ID1, 0x23 }, 1826 { DA7219_CHIP_ID1, 0x23 },
1812 { DA7219_CHIP_ID2, 0x93 }, 1827 { DA7219_CHIP_ID2, 0x93 },
1813 { DA7219_CHIP_REVISION, 0x00 },
1814 { DA7219_LDO_CTRL, 0x00 },
1815 { DA7219_IO_CTRL, 0x00 }, 1828 { DA7219_IO_CTRL, 0x00 },
1816 { DA7219_GAIN_RAMP_CTRL, 0x00 }, 1829 { DA7219_GAIN_RAMP_CTRL, 0x00 },
1817 { DA7219_PC_COUNT, 0x02 }, 1830 { DA7219_PC_COUNT, 0x02 },
diff --git a/sound/soc/codecs/da7219.h b/sound/soc/codecs/da7219.h
index b514268c6c56..5a787e738084 100644
--- a/sound/soc/codecs/da7219.h
+++ b/sound/soc/codecs/da7219.h
@@ -85,7 +85,6 @@
85#define DA7219_CHIP_ID1 0x81 85#define DA7219_CHIP_ID1 0x81
86#define DA7219_CHIP_ID2 0x82 86#define DA7219_CHIP_ID2 0x82
87#define DA7219_CHIP_REVISION 0x83 87#define DA7219_CHIP_REVISION 0x83
88#define DA7219_LDO_CTRL 0x90
89#define DA7219_IO_CTRL 0x91 88#define DA7219_IO_CTRL 0x91
90#define DA7219_GAIN_RAMP_CTRL 0x92 89#define DA7219_GAIN_RAMP_CTRL 0x92
91#define DA7219_PC_COUNT 0x94 90#define DA7219_PC_COUNT 0x94
@@ -207,7 +206,6 @@
207#define DA7219_PLL_MODE_BYPASS (0x0 << 6) 206#define DA7219_PLL_MODE_BYPASS (0x0 << 6)
208#define DA7219_PLL_MODE_NORMAL (0x1 << 6) 207#define DA7219_PLL_MODE_NORMAL (0x1 << 6)
209#define DA7219_PLL_MODE_SRM (0x2 << 6) 208#define DA7219_PLL_MODE_SRM (0x2 << 6)
210#define DA7219_PLL_MODE_32KHZ (0x3 << 6)
211 209
212/* DA7219_PLL_FRAC_TOP = 0x22 */ 210/* DA7219_PLL_FRAC_TOP = 0x22 */
213#define DA7219_PLL_FBDIV_FRAC_TOP_SHIFT 0 211#define DA7219_PLL_FBDIV_FRAC_TOP_SHIFT 0
@@ -569,12 +567,6 @@
569#define DA7219_CHIP_MAJOR_SHIFT 4 567#define DA7219_CHIP_MAJOR_SHIFT 4
570#define DA7219_CHIP_MAJOR_MASK (0xF << 4) 568#define DA7219_CHIP_MAJOR_MASK (0xF << 4)
571 569
572/* DA7219_LDO_CTRL = 0x90 */
573#define DA7219_LDO_LEVEL_SELECT_SHIFT 4
574#define DA7219_LDO_LEVEL_SELECT_MASK (0x3 << 4)
575#define DA7219_LDO_EN_SHIFT 7
576#define DA7219_LDO_EN_MASK (0x1 << 7)
577
578/* DA7219_IO_CTRL = 0x91 */ 570/* DA7219_IO_CTRL = 0x91 */
579#define DA7219_IO_VOLTAGE_LEVEL_SHIFT 0 571#define DA7219_IO_VOLTAGE_LEVEL_SHIFT 0
580#define DA7219_IO_VOLTAGE_LEVEL_MASK (0x1 << 0) 572#define DA7219_IO_VOLTAGE_LEVEL_MASK (0x1 << 0)
@@ -787,7 +779,6 @@ enum da7219_sys_clk {
787 DA7219_SYSCLK_MCLK = 0, 779 DA7219_SYSCLK_MCLK = 0,
788 DA7219_SYSCLK_PLL, 780 DA7219_SYSCLK_PLL,
789 DA7219_SYSCLK_PLL_SRM, 781 DA7219_SYSCLK_PLL_SRM,
790 DA7219_SYSCLK_PLL_32KHZ
791}; 782};
792 783
793/* Regulators */ 784/* Regulators */
diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c
new file mode 100644
index 000000000000..5a1ec0f7a1a6
--- /dev/null
+++ b/sound/soc/codecs/hdac_hdmi.c
@@ -0,0 +1,697 @@
1/*
2 * hdac_hdmi.c - ASoc HDA-HDMI codec driver for Intel platforms
3 *
4 * Copyright (C) 2014-2015 Intel Corp
5 * Author: Samreen Nilofer <samreen.nilofer@intel.com>
6 * Subhransu S. Prusty <subhransu.s.prusty@intel.com>
7 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; version 2 of the License.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19 */
20#include <linux/init.h>
21#include <linux/delay.h>
22#include <linux/module.h>
23#include <linux/pm_runtime.h>
24#include <linux/hdmi.h>
25#include <sound/pcm_params.h>
26#include <sound/soc.h>
27#include <sound/hdaudio_ext.h>
28#include <sound/hda_i915.h>
29#include "../../hda/local.h"
30
31#define AMP_OUT_MUTE 0xb080
32#define AMP_OUT_UNMUTE 0xb000
33#define PIN_OUT (AC_PINCTL_OUT_EN)
34
35#define HDA_MAX_CONNECTIONS 32
36
37struct hdac_hdmi_cvt_params {
38 unsigned int channels_min;
39 unsigned int channels_max;
40 u32 rates;
41 u64 formats;
42 unsigned int maxbps;
43};
44
45struct hdac_hdmi_cvt {
46 struct list_head head;
47 hda_nid_t nid;
48 struct hdac_hdmi_cvt_params params;
49};
50
51struct hdac_hdmi_pin {
52 struct list_head head;
53 hda_nid_t nid;
54 int num_mux_nids;
55 hda_nid_t mux_nids[HDA_MAX_CONNECTIONS];
56};
57
58struct hdac_hdmi_dai_pin_map {
59 int dai_id;
60 struct hdac_hdmi_pin *pin;
61 struct hdac_hdmi_cvt *cvt;
62};
63
64struct hdac_hdmi_priv {
65 struct hdac_hdmi_dai_pin_map dai_map[3];
66 struct list_head pin_list;
67 struct list_head cvt_list;
68 int num_pin;
69 int num_cvt;
70};
71
72static inline struct hdac_ext_device *to_hda_ext_device(struct device *dev)
73{
74 struct hdac_device *hdac = dev_to_hdac_dev(dev);
75
76 return to_ehdac_device(hdac);
77}
78
79static int hdac_hdmi_setup_stream(struct hdac_ext_device *hdac,
80 hda_nid_t cvt_nid, hda_nid_t pin_nid,
81 u32 stream_tag, int format)
82{
83 unsigned int val;
84
85 dev_dbg(&hdac->hdac.dev, "cvt nid %d pnid %d stream %d format 0x%x\n",
86 cvt_nid, pin_nid, stream_tag, format);
87
88 val = (stream_tag << 4);
89
90 snd_hdac_codec_write(&hdac->hdac, cvt_nid, 0,
91 AC_VERB_SET_CHANNEL_STREAMID, val);
92 snd_hdac_codec_write(&hdac->hdac, cvt_nid, 0,
93 AC_VERB_SET_STREAM_FORMAT, format);
94
95 return 0;
96}
97
98static void
99hdac_hdmi_set_dip_index(struct hdac_ext_device *hdac, hda_nid_t pin_nid,
100 int packet_index, int byte_index)
101{
102 int val;
103
104 val = (packet_index << 5) | (byte_index & 0x1f);
105
106 snd_hdac_codec_write(&hdac->hdac, pin_nid, 0,
107 AC_VERB_SET_HDMI_DIP_INDEX, val);
108}
109
110static int hdac_hdmi_setup_audio_infoframe(struct hdac_ext_device *hdac,
111 hda_nid_t cvt_nid, hda_nid_t pin_nid)
112{
113 uint8_t buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AUDIO_INFOFRAME_SIZE];
114 struct hdmi_audio_infoframe frame;
115 u8 *dip = (u8 *)&frame;
116 int ret;
117 int i;
118
119 hdmi_audio_infoframe_init(&frame);
120
121 /* Default stereo for now */
122 frame.channels = 2;
123
124 /* setup channel count */
125 snd_hdac_codec_write(&hdac->hdac, cvt_nid, 0,
126 AC_VERB_SET_CVT_CHAN_COUNT, frame.channels - 1);
127
128 ret = hdmi_audio_infoframe_pack(&frame, buffer, sizeof(buffer));
129 if (ret < 0)
130 return ret;
131
132 /* stop infoframe transmission */
133 hdac_hdmi_set_dip_index(hdac, pin_nid, 0x0, 0x0);
134 snd_hdac_codec_write(&hdac->hdac, pin_nid, 0,
135 AC_VERB_SET_HDMI_DIP_XMIT, AC_DIPXMIT_DISABLE);
136
137
138 /* Fill infoframe. Index auto-incremented */
139 hdac_hdmi_set_dip_index(hdac, pin_nid, 0x0, 0x0);
140 for (i = 0; i < sizeof(frame); i++)
141 snd_hdac_codec_write(&hdac->hdac, pin_nid, 0,
142 AC_VERB_SET_HDMI_DIP_DATA, dip[i]);
143
144 /* Start infoframe */
145 hdac_hdmi_set_dip_index(hdac, pin_nid, 0x0, 0x0);
146 snd_hdac_codec_write(&hdac->hdac, pin_nid, 0,
147 AC_VERB_SET_HDMI_DIP_XMIT, AC_DIPXMIT_BEST);
148
149 return 0;
150}
151
152static void hdac_hdmi_set_power_state(struct hdac_ext_device *edev,
153 struct hdac_hdmi_dai_pin_map *dai_map, unsigned int pwr_state)
154{
155 /* Power up pin widget */
156 if (!snd_hdac_check_power_state(&edev->hdac, dai_map->pin->nid,
157 pwr_state))
158 snd_hdac_codec_write(&edev->hdac, dai_map->pin->nid, 0,
159 AC_VERB_SET_POWER_STATE, pwr_state);
160
161 /* Power up converter */
162 if (!snd_hdac_check_power_state(&edev->hdac, dai_map->cvt->nid,
163 pwr_state))
164 snd_hdac_codec_write(&edev->hdac, dai_map->cvt->nid, 0,
165 AC_VERB_SET_POWER_STATE, pwr_state);
166}
167
168static int hdac_hdmi_playback_prepare(struct snd_pcm_substream *substream,
169 struct snd_soc_dai *dai)
170{
171 struct hdac_ext_device *hdac = snd_soc_dai_get_drvdata(dai);
172 struct hdac_hdmi_priv *hdmi = hdac->private_data;
173 struct hdac_hdmi_dai_pin_map *dai_map;
174 struct hdac_ext_dma_params *dd;
175 int ret;
176
177 if (dai->id > 0) {
178 dev_err(&hdac->hdac.dev, "Only one dai supported as of now\n");
179 return -ENODEV;
180 }
181
182 dai_map = &hdmi->dai_map[dai->id];
183
184 dd = (struct hdac_ext_dma_params *)snd_soc_dai_get_dma_data(dai, substream);
185 dev_dbg(&hdac->hdac.dev, "stream tag from cpu dai %d format in cvt 0x%x\n",
186 dd->stream_tag, dd->format);
187
188 ret = hdac_hdmi_setup_audio_infoframe(hdac, dai_map->cvt->nid,
189 dai_map->pin->nid);
190 if (ret < 0)
191 return ret;
192
193 return hdac_hdmi_setup_stream(hdac, dai_map->cvt->nid,
194 dai_map->pin->nid, dd->stream_tag, dd->format);
195}
196
197static int hdac_hdmi_set_hw_params(struct snd_pcm_substream *substream,
198 struct snd_pcm_hw_params *hparams, struct snd_soc_dai *dai)
199{
200 struct hdac_ext_device *hdac = snd_soc_dai_get_drvdata(dai);
201 struct hdac_ext_dma_params *dd;
202
203 if (dai->id > 0) {
204 dev_err(&hdac->hdac.dev, "Only one dai supported as of now\n");
205 return -ENODEV;
206 }
207
208 dd = kzalloc(sizeof(*dd), GFP_KERNEL);
209 if (!dd)
210 return -ENOMEM;
211 dd->format = snd_hdac_calc_stream_format(params_rate(hparams),
212 params_channels(hparams), params_format(hparams),
213 24, 0);
214
215 snd_soc_dai_set_dma_data(dai, substream, (void *)dd);
216
217 return 0;
218}
219
220static int hdac_hdmi_playback_cleanup(struct snd_pcm_substream *substream,
221 struct snd_soc_dai *dai)
222{
223 struct hdac_ext_device *edev = snd_soc_dai_get_drvdata(dai);
224 struct hdac_ext_dma_params *dd;
225 struct hdac_hdmi_priv *hdmi = edev->private_data;
226 struct hdac_hdmi_dai_pin_map *dai_map;
227
228 dai_map = &hdmi->dai_map[dai->id];
229
230 snd_hdac_codec_write(&edev->hdac, dai_map->cvt->nid, 0,
231 AC_VERB_SET_CHANNEL_STREAMID, 0);
232 snd_hdac_codec_write(&edev->hdac, dai_map->cvt->nid, 0,
233 AC_VERB_SET_STREAM_FORMAT, 0);
234
235 dd = (struct hdac_ext_dma_params *)snd_soc_dai_get_dma_data(dai, substream);
236 snd_soc_dai_set_dma_data(dai, substream, NULL);
237
238 kfree(dd);
239
240 return 0;
241}
242
243static int hdac_hdmi_pcm_open(struct snd_pcm_substream *substream,
244 struct snd_soc_dai *dai)
245{
246 struct hdac_ext_device *hdac = snd_soc_dai_get_drvdata(dai);
247 struct hdac_hdmi_priv *hdmi = hdac->private_data;
248 struct hdac_hdmi_dai_pin_map *dai_map;
249 int val;
250
251 if (dai->id > 0) {
252 dev_err(&hdac->hdac.dev, "Only one dai supported as of now\n");
253 return -ENODEV;
254 }
255
256 dai_map = &hdmi->dai_map[dai->id];
257
258 val = snd_hdac_codec_read(&hdac->hdac, dai_map->pin->nid, 0,
259 AC_VERB_GET_PIN_SENSE, 0);
260 dev_info(&hdac->hdac.dev, "Val for AC_VERB_GET_PIN_SENSE: %x\n", val);
261
262 if ((!(val & AC_PINSENSE_PRESENCE)) || (!(val & AC_PINSENSE_ELDV))) {
263 dev_err(&hdac->hdac.dev, "Monitor presence invalid with val: %x\n", val);
264 return -ENODEV;
265 }
266
267 hdac_hdmi_set_power_state(hdac, dai_map, AC_PWRST_D0);
268
269 snd_hdac_codec_write(&hdac->hdac, dai_map->pin->nid, 0,
270 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
271
272 snd_pcm_hw_constraint_step(substream->runtime, 0,
273 SNDRV_PCM_HW_PARAM_CHANNELS, 2);
274
275 return 0;
276}
277
278static void hdac_hdmi_pcm_close(struct snd_pcm_substream *substream,
279 struct snd_soc_dai *dai)
280{
281 struct hdac_ext_device *hdac = snd_soc_dai_get_drvdata(dai);
282 struct hdac_hdmi_priv *hdmi = hdac->private_data;
283 struct hdac_hdmi_dai_pin_map *dai_map;
284
285 dai_map = &hdmi->dai_map[dai->id];
286
287 hdac_hdmi_set_power_state(hdac, dai_map, AC_PWRST_D3);
288
289 snd_hdac_codec_write(&hdac->hdac, dai_map->pin->nid, 0,
290 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
291}
292
293static int
294hdac_hdmi_query_cvt_params(struct hdac_device *hdac, struct hdac_hdmi_cvt *cvt)
295{
296 int err;
297
298 /* Only stereo supported as of now */
299 cvt->params.channels_min = cvt->params.channels_max = 2;
300
301 err = snd_hdac_query_supported_pcm(hdac, cvt->nid,
302 &cvt->params.rates,
303 &cvt->params.formats,
304 &cvt->params.maxbps);
305 if (err < 0)
306 dev_err(&hdac->dev,
307 "Failed to query pcm params for nid %d: %d\n",
308 cvt->nid, err);
309
310 return err;
311}
312
313static void hdac_hdmi_fill_widget_info(struct snd_soc_dapm_widget *w,
314 enum snd_soc_dapm_type id,
315 const char *wname, const char *stream)
316{
317 w->id = id;
318 w->name = wname;
319 w->sname = stream;
320 w->reg = SND_SOC_NOPM;
321 w->shift = 0;
322 w->kcontrol_news = NULL;
323 w->num_kcontrols = 0;
324 w->priv = NULL;
325}
326
327static void hdac_hdmi_fill_route(struct snd_soc_dapm_route *route,
328 const char *sink, const char *control, const char *src)
329{
330 route->sink = sink;
331 route->source = src;
332 route->control = control;
333 route->connected = NULL;
334}
335
336static void create_fill_widget_route_map(struct snd_soc_dapm_context *dapm,
337 struct hdac_hdmi_dai_pin_map *dai_map)
338{
339 struct snd_soc_dapm_route route[1];
340 struct snd_soc_dapm_widget widgets[2] = { {0} };
341
342 memset(&route, 0, sizeof(route));
343
344 hdac_hdmi_fill_widget_info(&widgets[0], snd_soc_dapm_output,
345 "hif1 Output", NULL);
346 hdac_hdmi_fill_widget_info(&widgets[1], snd_soc_dapm_aif_in,
347 "Coverter 1", "hif1");
348
349 hdac_hdmi_fill_route(&route[0], "hif1 Output", NULL, "Coverter 1");
350
351 snd_soc_dapm_new_controls(dapm, widgets, ARRAY_SIZE(widgets));
352 snd_soc_dapm_add_routes(dapm, route, ARRAY_SIZE(route));
353}
354
355static int hdac_hdmi_init_dai_map(struct hdac_ext_device *edev)
356{
357 struct hdac_hdmi_priv *hdmi = edev->private_data;
358 struct hdac_hdmi_dai_pin_map *dai_map = &hdmi->dai_map[0];
359 struct hdac_hdmi_cvt *cvt;
360 struct hdac_hdmi_pin *pin;
361
362 if (list_empty(&hdmi->cvt_list) || list_empty(&hdmi->pin_list))
363 return -EINVAL;
364
365 /*
366 * Currently on board only 1 pin and 1 converter is enabled for
367 * simplification, more will be added eventually
368 * So using fixed map for dai_id:pin:cvt
369 */
370 cvt = list_first_entry(&hdmi->cvt_list, struct hdac_hdmi_cvt, head);
371 pin = list_first_entry(&hdmi->pin_list, struct hdac_hdmi_pin, head);
372
373 dai_map->dai_id = 0;
374 dai_map->pin = pin;
375
376 dai_map->cvt = cvt;
377
378 /* Enable out path for this pin widget */
379 snd_hdac_codec_write(&edev->hdac, pin->nid, 0,
380 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
381
382 /* Enable transmission */
383 snd_hdac_codec_write(&edev->hdac, cvt->nid, 0,
384 AC_VERB_SET_DIGI_CONVERT_1, 1);
385
386 /* Category Code (CC) to zero */
387 snd_hdac_codec_write(&edev->hdac, cvt->nid, 0,
388 AC_VERB_SET_DIGI_CONVERT_2, 0);
389
390 snd_hdac_codec_write(&edev->hdac, pin->nid, 0,
391 AC_VERB_SET_CONNECT_SEL, 0);
392
393 return 0;
394}
395
396static int hdac_hdmi_add_cvt(struct hdac_ext_device *edev, hda_nid_t nid)
397{
398 struct hdac_hdmi_priv *hdmi = edev->private_data;
399 struct hdac_hdmi_cvt *cvt;
400
401 cvt = kzalloc(sizeof(*cvt), GFP_KERNEL);
402 if (!cvt)
403 return -ENOMEM;
404
405 cvt->nid = nid;
406
407 list_add_tail(&cvt->head, &hdmi->cvt_list);
408 hdmi->num_cvt++;
409
410 return hdac_hdmi_query_cvt_params(&edev->hdac, cvt);
411}
412
413static int hdac_hdmi_add_pin(struct hdac_ext_device *edev, hda_nid_t nid)
414{
415 struct hdac_hdmi_priv *hdmi = edev->private_data;
416 struct hdac_hdmi_pin *pin;
417
418 pin = kzalloc(sizeof(*pin), GFP_KERNEL);
419 if (!pin)
420 return -ENOMEM;
421
422 pin->nid = nid;
423
424 list_add_tail(&pin->head, &hdmi->pin_list);
425 hdmi->num_pin++;
426
427 return 0;
428}
429
430/*
431 * Parse all nodes and store the cvt/pin nids in array
432 * Add one time initialization for pin and cvt widgets
433 */
434static int hdac_hdmi_parse_and_map_nid(struct hdac_ext_device *edev)
435{
436 hda_nid_t nid;
437 int i, num_nodes;
438 struct hdac_device *hdac = &edev->hdac;
439 struct hdac_hdmi_priv *hdmi = edev->private_data;
440 int ret;
441
442 num_nodes = snd_hdac_get_sub_nodes(hdac, hdac->afg, &nid);
443 if (!nid || num_nodes <= 0) {
444 dev_warn(&hdac->dev, "HDMI: failed to get afg sub nodes\n");
445 return -EINVAL;
446 }
447
448 hdac->num_nodes = num_nodes;
449 hdac->start_nid = nid;
450
451 for (i = 0; i < hdac->num_nodes; i++, nid++) {
452 unsigned int caps;
453 unsigned int type;
454
455 caps = get_wcaps(hdac, nid);
456 type = get_wcaps_type(caps);
457
458 if (!(caps & AC_WCAP_DIGITAL))
459 continue;
460
461 switch (type) {
462
463 case AC_WID_AUD_OUT:
464 ret = hdac_hdmi_add_cvt(edev, nid);
465 if (ret < 0)
466 return ret;
467 break;
468
469 case AC_WID_PIN:
470 ret = hdac_hdmi_add_pin(edev, nid);
471 if (ret < 0)
472 return ret;
473 break;
474 }
475 }
476
477 hdac->end_nid = nid;
478
479 if (!hdmi->num_pin || !hdmi->num_cvt)
480 return -EIO;
481
482 return hdac_hdmi_init_dai_map(edev);
483}
484
485static int hdmi_codec_probe(struct snd_soc_codec *codec)
486{
487 struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
488 struct hdac_hdmi_priv *hdmi = edev->private_data;
489 struct snd_soc_dapm_context *dapm =
490 snd_soc_component_get_dapm(&codec->component);
491
492 edev->scodec = codec;
493
494 create_fill_widget_route_map(dapm, &hdmi->dai_map[0]);
495
496 /* Imp: Store the card pointer in hda_codec */
497 edev->card = dapm->card->snd_card;
498
499 /*
500 * hdac_device core already sets the state to active and calls
501 * get_noresume. So enable runtime and set the device to suspend.
502 */
503 pm_runtime_enable(&edev->hdac.dev);
504 pm_runtime_put(&edev->hdac.dev);
505 pm_runtime_suspend(&edev->hdac.dev);
506
507 return 0;
508}
509
510static int hdmi_codec_remove(struct snd_soc_codec *codec)
511{
512 struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec);
513
514 pm_runtime_disable(&edev->hdac.dev);
515 return 0;
516}
517
518static struct snd_soc_codec_driver hdmi_hda_codec = {
519 .probe = hdmi_codec_probe,
520 .remove = hdmi_codec_remove,
521 .idle_bias_off = true,
522};
523
524static struct snd_soc_dai_ops hdmi_dai_ops = {
525 .startup = hdac_hdmi_pcm_open,
526 .shutdown = hdac_hdmi_pcm_close,
527 .hw_params = hdac_hdmi_set_hw_params,
528 .prepare = hdac_hdmi_playback_prepare,
529 .hw_free = hdac_hdmi_playback_cleanup,
530};
531
532static struct snd_soc_dai_driver hdmi_dais[] = {
533 { .name = "intel-hdmi-hif1",
534 .playback = {
535 .stream_name = "hif1",
536 .channels_min = 2,
537 .channels_max = 2,
538 .rates = SNDRV_PCM_RATE_32000 |
539 SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
540 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
541 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000,
542 .formats = SNDRV_PCM_FMTBIT_S16_LE |
543 SNDRV_PCM_FMTBIT_S20_3LE |
544 SNDRV_PCM_FMTBIT_S24_LE |
545 SNDRV_PCM_FMTBIT_S32_LE,
546
547 },
548 .ops = &hdmi_dai_ops,
549 },
550};
551
552static int hdac_hdmi_dev_probe(struct hdac_ext_device *edev)
553{
554 struct hdac_device *codec = &edev->hdac;
555 struct hdac_hdmi_priv *hdmi_priv;
556 int ret = 0;
557
558 hdmi_priv = devm_kzalloc(&codec->dev, sizeof(*hdmi_priv), GFP_KERNEL);
559 if (hdmi_priv == NULL)
560 return -ENOMEM;
561
562 edev->private_data = hdmi_priv;
563
564 dev_set_drvdata(&codec->dev, edev);
565
566 INIT_LIST_HEAD(&hdmi_priv->pin_list);
567 INIT_LIST_HEAD(&hdmi_priv->cvt_list);
568
569 ret = hdac_hdmi_parse_and_map_nid(edev);
570 if (ret < 0)
571 return ret;
572
573 /* ASoC specific initialization */
574 return snd_soc_register_codec(&codec->dev, &hdmi_hda_codec,
575 hdmi_dais, ARRAY_SIZE(hdmi_dais));
576}
577
578static int hdac_hdmi_dev_remove(struct hdac_ext_device *edev)
579{
580 struct hdac_hdmi_priv *hdmi = edev->private_data;
581 struct hdac_hdmi_pin *pin, *pin_next;
582 struct hdac_hdmi_cvt *cvt, *cvt_next;
583
584 snd_soc_unregister_codec(&edev->hdac.dev);
585
586 list_for_each_entry_safe(cvt, cvt_next, &hdmi->cvt_list, head) {
587 list_del(&cvt->head);
588 kfree(cvt);
589 }
590
591 list_for_each_entry_safe(pin, pin_next, &hdmi->pin_list, head) {
592 list_del(&pin->head);
593 kfree(pin);
594 }
595
596 return 0;
597}
598
599#ifdef CONFIG_PM
600static int hdac_hdmi_runtime_suspend(struct device *dev)
601{
602 struct hdac_ext_device *edev = to_hda_ext_device(dev);
603 struct hdac_device *hdac = &edev->hdac;
604 struct hdac_bus *bus = hdac->bus;
605 int err;
606
607 dev_dbg(dev, "Enter: %s\n", __func__);
608
609 /* controller may not have been initialized for the first time */
610 if (!bus)
611 return 0;
612
613 /* Power down afg */
614 if (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D3))
615 snd_hdac_codec_write(hdac, hdac->afg, 0,
616 AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
617
618 err = snd_hdac_display_power(bus, false);
619 if (err < 0) {
620 dev_err(bus->dev, "Cannot turn on display power on i915\n");
621 return err;
622 }
623
624 return 0;
625}
626
627static int hdac_hdmi_runtime_resume(struct device *dev)
628{
629 struct hdac_ext_device *edev = to_hda_ext_device(dev);
630 struct hdac_device *hdac = &edev->hdac;
631 struct hdac_bus *bus = hdac->bus;
632 int err;
633
634 dev_dbg(dev, "Enter: %s\n", __func__);
635
636 /* controller may not have been initialized for the first time */
637 if (!bus)
638 return 0;
639
640 err = snd_hdac_display_power(bus, true);
641 if (err < 0) {
642 dev_err(bus->dev, "Cannot turn on display power on i915\n");
643 return err;
644 }
645
646 /* Power up afg */
647 if (!snd_hdac_check_power_state(hdac, hdac->afg, AC_PWRST_D0))
648 snd_hdac_codec_write(hdac, hdac->afg, 0,
649 AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
650
651 return 0;
652}
653#else
654#define hdac_hdmi_runtime_suspend NULL
655#define hdac_hdmi_runtime_resume NULL
656#endif
657
658static const struct dev_pm_ops hdac_hdmi_pm = {
659 SET_RUNTIME_PM_OPS(hdac_hdmi_runtime_suspend, hdac_hdmi_runtime_resume, NULL)
660};
661
662static const struct hda_device_id hdmi_list[] = {
663 HDA_CODEC_EXT_ENTRY(0x80862809, 0x100000, "Skylake HDMI", 0),
664 {}
665};
666
667MODULE_DEVICE_TABLE(hdaudio, hdmi_list);
668
669static struct hdac_ext_driver hdmi_driver = {
670 . hdac = {
671 .driver = {
672 .name = "HDMI HDA Codec",
673 .pm = &hdac_hdmi_pm,
674 },
675 .id_table = hdmi_list,
676 },
677 .probe = hdac_hdmi_dev_probe,
678 .remove = hdac_hdmi_dev_remove,
679};
680
681static int __init hdmi_init(void)
682{
683 return snd_hda_ext_driver_register(&hdmi_driver);
684}
685
686static void __exit hdmi_exit(void)
687{
688 snd_hda_ext_driver_unregister(&hdmi_driver);
689}
690
691module_init(hdmi_init);
692module_exit(hdmi_exit);
693
694MODULE_LICENSE("GPL v2");
695MODULE_DESCRIPTION("HDMI HD codec");
696MODULE_AUTHOR("Samreen Nilofer<samreen.nilofer@intel.com>");
697MODULE_AUTHOR("Subhransu S. Prusty<subhransu.s.prusty@intel.com>");
diff --git a/sound/soc/codecs/inno_rk3036.c b/sound/soc/codecs/inno_rk3036.c
new file mode 100644
index 000000000000..9b6e8840a1b5
--- /dev/null
+++ b/sound/soc/codecs/inno_rk3036.c
@@ -0,0 +1,490 @@
1/*
2 * Driver of Inno codec for rk3036 by Rockchip Inc.
3 *
4 * Author: Rockchip Inc.
5 * Author: Zheng ShunQian<zhengsq@rock-chips.com>
6 */
7
8#include <sound/soc.h>
9#include <sound/tlv.h>
10#include <sound/soc-dapm.h>
11#include <sound/soc-dai.h>
12#include <sound/pcm.h>
13#include <sound/pcm_params.h>
14
15#include <linux/platform_device.h>
16#include <linux/of.h>
17#include <linux/clk.h>
18#include <linux/regmap.h>
19#include <linux/device.h>
20#include <linux/mfd/syscon.h>
21#include <linux/module.h>
22#include <linux/io.h>
23
24#include "inno_rk3036.h"
25
26struct rk3036_codec_priv {
27 void __iomem *base;
28 struct clk *pclk;
29 struct regmap *regmap;
30 struct device *dev;
31};
32
33static const DECLARE_TLV_DB_MINMAX(rk3036_codec_hp_tlv, -39, 0);
34
35static int rk3036_codec_antipop_info(struct snd_kcontrol *kcontrol,
36 struct snd_ctl_elem_info *uinfo)
37{
38 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
39 uinfo->count = 2;
40 uinfo->value.integer.min = 0;
41 uinfo->value.integer.max = 1;
42
43 return 0;
44}
45
46static int rk3036_codec_antipop_get(struct snd_kcontrol *kcontrol,
47 struct snd_ctl_elem_value *ucontrol)
48{
49 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
50 int val, ret, regval;
51
52 ret = snd_soc_component_read(component, INNO_R09, &regval);
53 if (ret)
54 return ret;
55 val = ((regval >> INNO_R09_HPL_ANITPOP_SHIFT) &
56 INNO_R09_HP_ANTIPOP_MSK) == INNO_R09_HP_ANTIPOP_ON;
57 ucontrol->value.integer.value[0] = val;
58
59 val = ((regval >> INNO_R09_HPR_ANITPOP_SHIFT) &
60 INNO_R09_HP_ANTIPOP_MSK) == INNO_R09_HP_ANTIPOP_ON;
61 ucontrol->value.integer.value[1] = val;
62
63 return 0;
64}
65
66static int rk3036_codec_antipop_put(struct snd_kcontrol *kcontrol,
67 struct snd_ctl_elem_value *ucontrol)
68{
69 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
70 int val, ret, regmsk;
71
72 val = (ucontrol->value.integer.value[0] ?
73 INNO_R09_HP_ANTIPOP_ON : INNO_R09_HP_ANTIPOP_OFF) <<
74 INNO_R09_HPL_ANITPOP_SHIFT;
75 val |= (ucontrol->value.integer.value[1] ?
76 INNO_R09_HP_ANTIPOP_ON : INNO_R09_HP_ANTIPOP_OFF) <<
77 INNO_R09_HPR_ANITPOP_SHIFT;
78
79 regmsk = INNO_R09_HP_ANTIPOP_MSK << INNO_R09_HPL_ANITPOP_SHIFT |
80 INNO_R09_HP_ANTIPOP_MSK << INNO_R09_HPR_ANITPOP_SHIFT;
81
82 ret = snd_soc_component_update_bits(component, INNO_R09,
83 regmsk, val);
84 if (ret < 0)
85 return ret;
86
87 return 0;
88}
89
90#define SOC_RK3036_CODEC_ANTIPOP_DECL(xname) \
91{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
92 .info = rk3036_codec_antipop_info, .get = rk3036_codec_antipop_get, \
93 .put = rk3036_codec_antipop_put, }
94
95static const struct snd_kcontrol_new rk3036_codec_dapm_controls[] = {
96 SOC_DOUBLE_R_RANGE_TLV("Headphone Volume", INNO_R07, INNO_R08,
97 INNO_HP_GAIN_SHIFT, INNO_HP_GAIN_N39DB,
98 INNO_HP_GAIN_0DB, 0, rk3036_codec_hp_tlv),
99 SOC_DOUBLE("Zero Cross Switch", INNO_R06, INNO_R06_VOUTL_CZ_SHIFT,
100 INNO_R06_VOUTR_CZ_SHIFT, 1, 0),
101 SOC_DOUBLE("Headphone Switch", INNO_R09, INNO_R09_HPL_MUTE_SHIFT,
102 INNO_R09_HPR_MUTE_SHIFT, 1, 0),
103 SOC_RK3036_CODEC_ANTIPOP_DECL("Anti-pop Switch"),
104};
105
106static const struct snd_kcontrol_new rk3036_codec_hpl_mixer_controls[] = {
107 SOC_DAPM_SINGLE("DAC Left Out Switch", INNO_R09,
108 INNO_R09_DACL_SWITCH_SHIFT, 1, 0),
109};
110
111static const struct snd_kcontrol_new rk3036_codec_hpr_mixer_controls[] = {
112 SOC_DAPM_SINGLE("DAC Right Out Switch", INNO_R09,
113 INNO_R09_DACR_SWITCH_SHIFT, 1, 0),
114};
115
116static const struct snd_kcontrol_new rk3036_codec_hpl_switch_controls[] = {
117 SOC_DAPM_SINGLE("HP Left Out Switch", INNO_R05,
118 INNO_R05_HPL_WORK_SHIFT, 1, 0),
119};
120
121static const struct snd_kcontrol_new rk3036_codec_hpr_switch_controls[] = {
122 SOC_DAPM_SINGLE("HP Right Out Switch", INNO_R05,
123 INNO_R05_HPR_WORK_SHIFT, 1, 0),
124};
125
126static const struct snd_soc_dapm_widget rk3036_codec_dapm_widgets[] = {
127 SND_SOC_DAPM_SUPPLY_S("DAC PWR", 1, INNO_R06,
128 INNO_R06_DAC_EN_SHIFT, 0, NULL, 0),
129 SND_SOC_DAPM_SUPPLY_S("DACL VREF", 2, INNO_R04,
130 INNO_R04_DACL_VREF_SHIFT, 0, NULL, 0),
131 SND_SOC_DAPM_SUPPLY_S("DACR VREF", 2, INNO_R04,
132 INNO_R04_DACR_VREF_SHIFT, 0, NULL, 0),
133 SND_SOC_DAPM_SUPPLY_S("DACL HiLo VREF", 3, INNO_R06,
134 INNO_R06_DACL_HILO_VREF_SHIFT, 0, NULL, 0),
135 SND_SOC_DAPM_SUPPLY_S("DACR HiLo VREF", 3, INNO_R06,
136 INNO_R06_DACR_HILO_VREF_SHIFT, 0, NULL, 0),
137 SND_SOC_DAPM_SUPPLY_S("DACR CLK", 3, INNO_R04,
138 INNO_R04_DACR_CLK_SHIFT, 0, NULL, 0),
139 SND_SOC_DAPM_SUPPLY_S("DACL CLK", 3, INNO_R04,
140 INNO_R04_DACL_CLK_SHIFT, 0, NULL, 0),
141
142 SND_SOC_DAPM_DAC("DACL", "Left Playback", INNO_R04,
143 INNO_R04_DACL_SW_SHIFT, 0),
144 SND_SOC_DAPM_DAC("DACR", "Right Playback", INNO_R04,
145 INNO_R04_DACR_SW_SHIFT, 0),
146
147 SND_SOC_DAPM_MIXER("Left Headphone Mixer", SND_SOC_NOPM, 0, 0,
148 rk3036_codec_hpl_mixer_controls,
149 ARRAY_SIZE(rk3036_codec_hpl_mixer_controls)),
150 SND_SOC_DAPM_MIXER("Right Headphone Mixer", SND_SOC_NOPM, 0, 0,
151 rk3036_codec_hpr_mixer_controls,
152 ARRAY_SIZE(rk3036_codec_hpr_mixer_controls)),
153
154 SND_SOC_DAPM_PGA("HP Left Out", INNO_R05,
155 INNO_R05_HPL_EN_SHIFT, 0, NULL, 0),
156 SND_SOC_DAPM_PGA("HP Right Out", INNO_R05,
157 INNO_R05_HPR_EN_SHIFT, 0, NULL, 0),
158
159 SND_SOC_DAPM_MIXER("HP Left Switch", SND_SOC_NOPM, 0, 0,
160 rk3036_codec_hpl_switch_controls,
161 ARRAY_SIZE(rk3036_codec_hpl_switch_controls)),
162 SND_SOC_DAPM_MIXER("HP Right Switch", SND_SOC_NOPM, 0, 0,
163 rk3036_codec_hpr_switch_controls,
164 ARRAY_SIZE(rk3036_codec_hpr_switch_controls)),
165
166 SND_SOC_DAPM_OUTPUT("HPL"),
167 SND_SOC_DAPM_OUTPUT("HPR"),
168};
169
170static const struct snd_soc_dapm_route rk3036_codec_dapm_routes[] = {
171 {"DACL VREF", NULL, "DAC PWR"},
172 {"DACR VREF", NULL, "DAC PWR"},
173 {"DACL HiLo VREF", NULL, "DAC PWR"},
174 {"DACR HiLo VREF", NULL, "DAC PWR"},
175 {"DACL CLK", NULL, "DAC PWR"},
176 {"DACR CLK", NULL, "DAC PWR"},
177
178 {"DACL", NULL, "DACL VREF"},
179 {"DACL", NULL, "DACL HiLo VREF"},
180 {"DACL", NULL, "DACL CLK"},
181 {"DACR", NULL, "DACR VREF"},
182 {"DACR", NULL, "DACR HiLo VREF"},
183 {"DACR", NULL, "DACR CLK"},
184
185 {"Left Headphone Mixer", "DAC Left Out Switch", "DACL"},
186 {"Right Headphone Mixer", "DAC Right Out Switch", "DACR"},
187 {"HP Left Out", NULL, "Left Headphone Mixer"},
188 {"HP Right Out", NULL, "Right Headphone Mixer"},
189
190 {"HP Left Switch", "HP Left Out Switch", "HP Left Out"},
191 {"HP Right Switch", "HP Right Out Switch", "HP Right Out"},
192
193 {"HPL", NULL, "HP Left Switch"},
194 {"HPR", NULL, "HP Right Switch"},
195};
196
197static int rk3036_codec_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
198{
199 struct snd_soc_codec *codec = dai->codec;
200 unsigned int reg01_val = 0, reg02_val = 0, reg03_val = 0;
201
202 dev_dbg(codec->dev, "rk3036_codec dai set fmt : %08x\n", fmt);
203
204 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
205 case SND_SOC_DAIFMT_CBS_CFS:
206 reg01_val |= INNO_R01_PINDIR_IN_SLAVE |
207 INNO_R01_I2SMODE_SLAVE;
208 break;
209 case SND_SOC_DAIFMT_CBM_CFM:
210 reg01_val |= INNO_R01_PINDIR_OUT_MASTER |
211 INNO_R01_I2SMODE_MASTER;
212 break;
213 default:
214 dev_err(codec->dev, "invalid fmt\n");
215 return -EINVAL;
216 }
217
218 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
219 case SND_SOC_DAIFMT_DSP_A:
220 reg02_val |= INNO_R02_DACM_PCM;
221 break;
222 case SND_SOC_DAIFMT_I2S:
223 reg02_val |= INNO_R02_DACM_I2S;
224 break;
225 case SND_SOC_DAIFMT_RIGHT_J:
226 reg02_val |= INNO_R02_DACM_RJM;
227 break;
228 case SND_SOC_DAIFMT_LEFT_J:
229 reg02_val |= INNO_R02_DACM_LJM;
230 break;
231 default:
232 dev_err(codec->dev, "set dai format failed\n");
233 return -EINVAL;
234 }
235
236 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
237 case SND_SOC_DAIFMT_NB_NF:
238 reg02_val |= INNO_R02_LRCP_NORMAL;
239 reg03_val |= INNO_R03_BCP_NORMAL;
240 break;
241 case SND_SOC_DAIFMT_IB_IF:
242 reg02_val |= INNO_R02_LRCP_REVERSAL;
243 reg03_val |= INNO_R03_BCP_REVERSAL;
244 break;
245 case SND_SOC_DAIFMT_IB_NF:
246 reg02_val |= INNO_R02_LRCP_REVERSAL;
247 reg03_val |= INNO_R03_BCP_NORMAL;
248 break;
249 case SND_SOC_DAIFMT_NB_IF:
250 reg02_val |= INNO_R02_LRCP_NORMAL;
251 reg03_val |= INNO_R03_BCP_REVERSAL;
252 break;
253 default:
254 dev_err(codec->dev, "set dai format failed\n");
255 return -EINVAL;
256 }
257
258 snd_soc_update_bits(codec, INNO_R01, INNO_R01_I2SMODE_MSK |
259 INNO_R01_PINDIR_MSK, reg01_val);
260 snd_soc_update_bits(codec, INNO_R02, INNO_R02_LRCP_MSK |
261 INNO_R02_DACM_MSK, reg02_val);
262 snd_soc_update_bits(codec, INNO_R03, INNO_R03_BCP_MSK, reg03_val);
263
264 return 0;
265}
266
267static int rk3036_codec_dai_hw_params(struct snd_pcm_substream *substream,
268 struct snd_pcm_hw_params *hw_params,
269 struct snd_soc_dai *dai)
270{
271 struct snd_soc_codec *codec = dai->codec;
272 unsigned int reg02_val = 0, reg03_val = 0;
273
274 switch (params_format(hw_params)) {
275 case SNDRV_PCM_FORMAT_S16_LE:
276 reg02_val |= INNO_R02_VWL_16BIT;
277 break;
278 case SNDRV_PCM_FORMAT_S20_3LE:
279 reg02_val |= INNO_R02_VWL_20BIT;
280 break;
281 case SNDRV_PCM_FORMAT_S24_LE:
282 reg02_val |= INNO_R02_VWL_24BIT;
283 break;
284 case SNDRV_PCM_FORMAT_S32_LE:
285 reg02_val |= INNO_R02_VWL_32BIT;
286 break;
287 default:
288 return -EINVAL;
289 }
290
291 reg02_val |= INNO_R02_LRCP_NORMAL;
292 reg03_val |= INNO_R03_FWL_32BIT | INNO_R03_DACR_WORK;
293
294 snd_soc_update_bits(codec, INNO_R02, INNO_R02_LRCP_MSK |
295 INNO_R02_VWL_MSK, reg02_val);
296 snd_soc_update_bits(codec, INNO_R03, INNO_R03_DACR_MSK |
297 INNO_R03_FWL_MSK, reg03_val);
298 return 0;
299}
300
301#define RK3036_CODEC_RATES (SNDRV_PCM_RATE_8000 | \
302 SNDRV_PCM_RATE_16000 | \
303 SNDRV_PCM_RATE_32000 | \
304 SNDRV_PCM_RATE_44100 | \
305 SNDRV_PCM_RATE_48000 | \
306 SNDRV_PCM_RATE_96000)
307
308#define RK3036_CODEC_FMTS (SNDRV_PCM_FMTBIT_S16_LE | \
309 SNDRV_PCM_FMTBIT_S20_3LE | \
310 SNDRV_PCM_FMTBIT_S24_LE | \
311 SNDRV_PCM_FMTBIT_S32_LE)
312
313static struct snd_soc_dai_ops rk3036_codec_dai_ops = {
314 .set_fmt = rk3036_codec_dai_set_fmt,
315 .hw_params = rk3036_codec_dai_hw_params,
316};
317
318static struct snd_soc_dai_driver rk3036_codec_dai_driver[] = {
319 {
320 .name = "rk3036-codec-dai",
321 .playback = {
322 .stream_name = "Playback",
323 .channels_min = 1,
324 .channels_max = 2,
325 .rates = RK3036_CODEC_RATES,
326 .formats = RK3036_CODEC_FMTS,
327 },
328 .ops = &rk3036_codec_dai_ops,
329 .symmetric_rates = 1,
330 },
331};
332
333static void rk3036_codec_reset(struct snd_soc_codec *codec)
334{
335 snd_soc_write(codec, INNO_R00,
336 INNO_R00_CSR_RESET | INNO_R00_CDCR_RESET);
337 snd_soc_write(codec, INNO_R00,
338 INNO_R00_CSR_WORK | INNO_R00_CDCR_WORK);
339}
340
341static int rk3036_codec_probe(struct snd_soc_codec *codec)
342{
343 rk3036_codec_reset(codec);
344 return 0;
345}
346
347static int rk3036_codec_remove(struct snd_soc_codec *codec)
348{
349 rk3036_codec_reset(codec);
350 return 0;
351}
352
353static int rk3036_codec_set_bias_level(struct snd_soc_codec *codec,
354 enum snd_soc_bias_level level)
355{
356 switch (level) {
357 case SND_SOC_BIAS_STANDBY:
358 /* set a big current for capacitor charging. */
359 snd_soc_write(codec, INNO_R10, INNO_R10_MAX_CUR);
360 /* start precharge */
361 snd_soc_write(codec, INNO_R06, INNO_R06_DAC_PRECHARGE);
362
363 break;
364
365 case SND_SOC_BIAS_OFF:
366 /* set a big current for capacitor discharging. */
367 snd_soc_write(codec, INNO_R10, INNO_R10_MAX_CUR);
368 /* start discharge. */
369 snd_soc_write(codec, INNO_R06, INNO_R06_DAC_DISCHARGE);
370
371 break;
372 default:
373 break;
374 }
375
376 return 0;
377}
378
379static struct snd_soc_codec_driver rk3036_codec_driver = {
380 .probe = rk3036_codec_probe,
381 .remove = rk3036_codec_remove,
382 .set_bias_level = rk3036_codec_set_bias_level,
383 .controls = rk3036_codec_dapm_controls,
384 .num_controls = ARRAY_SIZE(rk3036_codec_dapm_controls),
385 .dapm_routes = rk3036_codec_dapm_routes,
386 .num_dapm_routes = ARRAY_SIZE(rk3036_codec_dapm_routes),
387 .dapm_widgets = rk3036_codec_dapm_widgets,
388 .num_dapm_widgets = ARRAY_SIZE(rk3036_codec_dapm_widgets),
389};
390
391static const struct regmap_config rk3036_codec_regmap_config = {
392 .reg_bits = 32,
393 .reg_stride = 4,
394 .val_bits = 32,
395};
396
397#define GRF_SOC_CON0 0x00140
398#define GRF_ACODEC_SEL (BIT(10) | BIT(16 + 10))
399
400static int rk3036_codec_platform_probe(struct platform_device *pdev)
401{
402 struct rk3036_codec_priv *priv;
403 struct device_node *of_node = pdev->dev.of_node;
404 struct resource *res;
405 void __iomem *base;
406 struct regmap *grf;
407 int ret;
408
409 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
410 if (!priv)
411 return -ENOMEM;
412
413 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
414 base = devm_ioremap_resource(&pdev->dev, res);
415 if (IS_ERR(base))
416 return PTR_ERR(base);
417
418 priv->base = base;
419 priv->regmap = devm_regmap_init_mmio(&pdev->dev, priv->base,
420 &rk3036_codec_regmap_config);
421 if (IS_ERR(priv->regmap)) {
422 dev_err(&pdev->dev, "init regmap failed\n");
423 return PTR_ERR(priv->regmap);
424 }
425
426 grf = syscon_regmap_lookup_by_phandle(of_node, "rockchip,grf");
427 if (IS_ERR(grf)) {
428 dev_err(&pdev->dev, "needs 'rockchip,grf' property\n");
429 return PTR_ERR(grf);
430 }
431 ret = regmap_write(grf, GRF_SOC_CON0, GRF_ACODEC_SEL);
432 if (ret) {
433 dev_err(&pdev->dev, "Could not write to GRF: %d\n", ret);
434 return ret;
435 }
436
437 priv->pclk = devm_clk_get(&pdev->dev, "acodec_pclk");
438 if (IS_ERR(priv->pclk))
439 return PTR_ERR(priv->pclk);
440
441 ret = clk_prepare_enable(priv->pclk);
442 if (ret < 0) {
443 dev_err(&pdev->dev, "failed to enable clk\n");
444 return ret;
445 }
446
447 priv->dev = &pdev->dev;
448 dev_set_drvdata(&pdev->dev, priv);
449
450 ret = snd_soc_register_codec(&pdev->dev, &rk3036_codec_driver,
451 rk3036_codec_dai_driver,
452 ARRAY_SIZE(rk3036_codec_dai_driver));
453 if (ret) {
454 clk_disable_unprepare(priv->pclk);
455 dev_set_drvdata(&pdev->dev, NULL);
456 }
457
458 return ret;
459}
460
461static int rk3036_codec_platform_remove(struct platform_device *pdev)
462{
463 struct rk3036_codec_priv *priv = dev_get_drvdata(&pdev->dev);
464
465 snd_soc_unregister_codec(&pdev->dev);
466 clk_disable_unprepare(priv->pclk);
467
468 return 0;
469}
470
471static const struct of_device_id rk3036_codec_of_match[] = {
472 { .compatible = "rockchip,rk3036-codec", },
473 {}
474};
475MODULE_DEVICE_TABLE(of, rk3036_codec_of_match);
476
477static struct platform_driver rk3036_codec_platform_driver = {
478 .driver = {
479 .name = "rk3036-codec-platform",
480 .of_match_table = of_match_ptr(rk3036_codec_of_match),
481 },
482 .probe = rk3036_codec_platform_probe,
483 .remove = rk3036_codec_platform_remove,
484};
485
486module_platform_driver(rk3036_codec_platform_driver);
487
488MODULE_AUTHOR("Rockchip Inc.");
489MODULE_DESCRIPTION("Rockchip rk3036 codec driver");
490MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/inno_rk3036.h b/sound/soc/codecs/inno_rk3036.h
new file mode 100644
index 000000000000..da759c6c7501
--- /dev/null
+++ b/sound/soc/codecs/inno_rk3036.h
@@ -0,0 +1,123 @@
1/*
2 * Driver of Inno Codec for rk3036 by Rockchip Inc.
3 *
4 * Author: Zheng ShunQian<zhengsq@rock-chips.com>
5 */
6
7#ifndef _INNO_RK3036_CODEC_H
8#define _INNO_RK3036_CODEC_H
9
10/* codec registers */
11#define INNO_R00 0x00
12#define INNO_R01 0x0c
13#define INNO_R02 0x10
14#define INNO_R03 0x14
15#define INNO_R04 0x88
16#define INNO_R05 0x8c
17#define INNO_R06 0x90
18#define INNO_R07 0x94
19#define INNO_R08 0x98
20#define INNO_R09 0x9c
21#define INNO_R10 0xa0
22
23/* register bit filed */
24#define INNO_R00_CSR_RESET (0x0 << 0) /*codec system reset*/
25#define INNO_R00_CSR_WORK (0x1 << 0)
26#define INNO_R00_CDCR_RESET (0x0 << 1) /*codec digital core reset*/
27#define INNO_R00_CDCR_WORK (0x1 << 1)
28#define INNO_R00_PRB_DISABLE (0x0 << 6) /*power reset bypass*/
29#define INNO_R00_PRB_ENABLE (0x1 << 6)
30
31#define INNO_R01_I2SMODE_MSK (0x1 << 4)
32#define INNO_R01_I2SMODE_SLAVE (0x0 << 4)
33#define INNO_R01_I2SMODE_MASTER (0x1 << 4)
34#define INNO_R01_PINDIR_MSK (0x1 << 5)
35#define INNO_R01_PINDIR_IN_SLAVE (0x0 << 5) /*direction of pin*/
36#define INNO_R01_PINDIR_OUT_MASTER (0x1 << 5)
37
38#define INNO_R02_LRS_MSK (0x1 << 2)
39#define INNO_R02_LRS_NORMAL (0x0 << 2) /*DAC Left Right Swap*/
40#define INNO_R02_LRS_SWAP (0x1 << 2)
41#define INNO_R02_DACM_MSK (0x3 << 3)
42#define INNO_R02_DACM_PCM (0x3 << 3) /*DAC Mode*/
43#define INNO_R02_DACM_I2S (0x2 << 3)
44#define INNO_R02_DACM_LJM (0x1 << 3)
45#define INNO_R02_DACM_RJM (0x0 << 3)
46#define INNO_R02_VWL_MSK (0x3 << 5)
47#define INNO_R02_VWL_32BIT (0x3 << 5) /*1/2Frame Valid Word Len*/
48#define INNO_R02_VWL_24BIT (0x2 << 5)
49#define INNO_R02_VWL_20BIT (0x1 << 5)
50#define INNO_R02_VWL_16BIT (0x0 << 5)
51#define INNO_R02_LRCP_MSK (0x1 << 7)
52#define INNO_R02_LRCP_NORMAL (0x0 << 7) /*Left Right Polarity*/
53#define INNO_R02_LRCP_REVERSAL (0x1 << 7)
54
55#define INNO_R03_BCP_MSK (0x1 << 0)
56#define INNO_R03_BCP_NORMAL (0x0 << 0) /*DAC bit clock polarity*/
57#define INNO_R03_BCP_REVERSAL (0x1 << 0)
58#define INNO_R03_DACR_MSK (0x1 << 1)
59#define INNO_R03_DACR_RESET (0x0 << 1) /*DAC Reset*/
60#define INNO_R03_DACR_WORK (0x1 << 1)
61#define INNO_R03_FWL_MSK (0x3 << 2)
62#define INNO_R03_FWL_32BIT (0x3 << 2) /*1/2Frame Word Length*/
63#define INNO_R03_FWL_24BIT (0x2 << 2)
64#define INNO_R03_FWL_20BIT (0x1 << 2)
65#define INNO_R03_FWL_16BIT (0x0 << 2)
66
67#define INNO_R04_DACR_SW_SHIFT 0
68#define INNO_R04_DACL_SW_SHIFT 1
69#define INNO_R04_DACR_CLK_SHIFT 2
70#define INNO_R04_DACL_CLK_SHIFT 3
71#define INNO_R04_DACR_VREF_SHIFT 4
72#define INNO_R04_DACL_VREF_SHIFT 5
73
74#define INNO_R05_HPR_EN_SHIFT 0
75#define INNO_R05_HPL_EN_SHIFT 1
76#define INNO_R05_HPR_WORK_SHIFT 2
77#define INNO_R05_HPL_WORK_SHIFT 3
78
79#define INNO_R06_VOUTR_CZ_SHIFT 0
80#define INNO_R06_VOUTL_CZ_SHIFT 1
81#define INNO_R06_DACR_HILO_VREF_SHIFT 2
82#define INNO_R06_DACL_HILO_VREF_SHIFT 3
83#define INNO_R06_DAC_EN_SHIFT 5
84
85#define INNO_R06_DAC_PRECHARGE (0x0 << 4) /*PreCharge control for DAC*/
86#define INNO_R06_DAC_DISCHARGE (0x1 << 4)
87
88#define INNO_HP_GAIN_SHIFT 0
89/* Gain of output, 1.5db step: -39db(0x0) ~ 0db(0x1a) ~ 6db(0x1f) */
90#define INNO_HP_GAIN_0DB 0x1a
91#define INNO_HP_GAIN_N39DB 0x0
92
93#define INNO_R09_HP_ANTIPOP_MSK 0x3
94#define INNO_R09_HP_ANTIPOP_OFF 0x1
95#define INNO_R09_HP_ANTIPOP_ON 0x2
96#define INNO_R09_HPR_ANITPOP_SHIFT 0
97#define INNO_R09_HPL_ANITPOP_SHIFT 2
98#define INNO_R09_HPR_MUTE_SHIFT 4
99#define INNO_R09_HPL_MUTE_SHIFT 5
100#define INNO_R09_DACR_SWITCH_SHIFT 6
101#define INNO_R09_DACL_SWITCH_SHIFT 7
102
103#define INNO_R10_CHARGE_SEL_CUR_400I_YES (0x0 << 0)
104#define INNO_R10_CHARGE_SEL_CUR_400I_NO (0x1 << 0)
105#define INNO_R10_CHARGE_SEL_CUR_260I_YES (0x0 << 1)
106#define INNO_R10_CHARGE_SEL_CUR_260I_NO (0x1 << 1)
107#define INNO_R10_CHARGE_SEL_CUR_130I_YES (0x0 << 2)
108#define INNO_R10_CHARGE_SEL_CUR_130I_NO (0x1 << 2)
109#define INNO_R10_CHARGE_SEL_CUR_100I_YES (0x0 << 3)
110#define INNO_R10_CHARGE_SEL_CUR_100I_NO (0x1 << 3)
111#define INNO_R10_CHARGE_SEL_CUR_050I_YES (0x0 << 4)
112#define INNO_R10_CHARGE_SEL_CUR_050I_NO (0x1 << 4)
113#define INNO_R10_CHARGE_SEL_CUR_027I_YES (0x0 << 5)
114#define INNO_R10_CHARGE_SEL_CUR_027I_NO (0x1 << 5)
115
116#define INNO_R10_MAX_CUR (INNO_R10_CHARGE_SEL_CUR_400I_YES | \
117 INNO_R10_CHARGE_SEL_CUR_260I_YES | \
118 INNO_R10_CHARGE_SEL_CUR_130I_YES | \
119 INNO_R10_CHARGE_SEL_CUR_100I_YES | \
120 INNO_R10_CHARGE_SEL_CUR_050I_YES | \
121 INNO_R10_CHARGE_SEL_CUR_027I_YES)
122
123#endif
diff --git a/sound/soc/codecs/max98357a.c b/sound/soc/codecs/max98357a.c
index f5e3dce2633a..5b1dfb1518fb 100644
--- a/sound/soc/codecs/max98357a.c
+++ b/sound/soc/codecs/max98357a.c
@@ -12,6 +12,7 @@
12 * max98357a.c -- MAX98357A ALSA SoC Codec driver 12 * max98357a.c -- MAX98357A ALSA SoC Codec driver
13 */ 13 */
14 14
15#include <linux/acpi.h>
15#include <linux/device.h> 16#include <linux/device.h>
16#include <linux/err.h> 17#include <linux/err.h>
17#include <linux/gpio.h> 18#include <linux/gpio.h>
@@ -123,10 +124,19 @@ static const struct of_device_id max98357a_device_id[] = {
123MODULE_DEVICE_TABLE(of, max98357a_device_id); 124MODULE_DEVICE_TABLE(of, max98357a_device_id);
124#endif 125#endif
125 126
127#ifdef CONFIG_ACPI
128static const struct acpi_device_id max98357a_acpi_match[] = {
129 { "MX98357A", 0 },
130 {},
131};
132MODULE_DEVICE_TABLE(acpi, max98357a_acpi_match);
133#endif
134
126static struct platform_driver max98357a_platform_driver = { 135static struct platform_driver max98357a_platform_driver = {
127 .driver = { 136 .driver = {
128 .name = "max98357a", 137 .name = "max98357a",
129 .of_match_table = of_match_ptr(max98357a_device_id), 138 .of_match_table = of_match_ptr(max98357a_device_id),
139 .acpi_match_table = ACPI_PTR(max98357a_acpi_match),
130 }, 140 },
131 .probe = max98357a_platform_probe, 141 .probe = max98357a_platform_probe,
132 .remove = max98357a_platform_remove, 142 .remove = max98357a_platform_remove,
diff --git a/sound/soc/codecs/pcm1792a.c b/sound/soc/codecs/pcm1792a.c
deleted file mode 100644
index 08bb4863e96f..000000000000
--- a/sound/soc/codecs/pcm1792a.c
+++ /dev/null
@@ -1,271 +0,0 @@
1/*
2 * PCM1792A ASoC codec driver
3 *
4 * Copyright (c) Amarula Solutions B.V. 2013
5 *
6 * Michael Trimarchi <michael@amarulasolutions.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 */
18
19#include <linux/module.h>
20#include <linux/slab.h>
21#include <linux/kernel.h>
22#include <linux/device.h>
23#include <linux/spi/spi.h>
24
25#include <sound/core.h>
26#include <sound/pcm.h>
27#include <sound/pcm_params.h>
28#include <sound/initval.h>
29#include <sound/soc.h>
30#include <sound/tlv.h>
31#include <linux/of.h>
32#include <linux/of_device.h>
33
34#include "pcm1792a.h"
35
36#define PCM1792A_DAC_VOL_LEFT 0x10
37#define PCM1792A_DAC_VOL_RIGHT 0x11
38#define PCM1792A_FMT_CONTROL 0x12
39#define PCM1792A_MODE_CONTROL 0x13
40#define PCM1792A_SOFT_MUTE PCM1792A_FMT_CONTROL
41
42#define PCM1792A_FMT_MASK 0x70
43#define PCM1792A_FMT_SHIFT 4
44#define PCM1792A_MUTE_MASK 0x01
45#define PCM1792A_MUTE_SHIFT 0
46#define PCM1792A_ATLD_ENABLE (1 << 7)
47
48static const struct reg_default pcm1792a_reg_defaults[] = {
49 { 0x10, 0xff },
50 { 0x11, 0xff },
51 { 0x12, 0x50 },
52 { 0x13, 0x00 },
53 { 0x14, 0x00 },
54 { 0x15, 0x01 },
55 { 0x16, 0x00 },
56 { 0x17, 0x00 },
57};
58
59static bool pcm1792a_accessible_reg(struct device *dev, unsigned int reg)
60{
61 return reg >= 0x10 && reg <= 0x17;
62}
63
64static bool pcm1792a_writeable_reg(struct device *dev, unsigned register reg)
65{
66 bool accessible;
67
68 accessible = pcm1792a_accessible_reg(dev, reg);
69
70 return accessible && reg != 0x16 && reg != 0x17;
71}
72
73struct pcm1792a_private {
74 struct regmap *regmap;
75 unsigned int format;
76 unsigned int rate;
77};
78
79static int pcm1792a_set_dai_fmt(struct snd_soc_dai *codec_dai,
80 unsigned int format)
81{
82 struct snd_soc_codec *codec = codec_dai->codec;
83 struct pcm1792a_private *priv = snd_soc_codec_get_drvdata(codec);
84
85 priv->format = format;
86
87 return 0;
88}
89
90static int pcm1792a_digital_mute(struct snd_soc_dai *dai, int mute)
91{
92 struct snd_soc_codec *codec = dai->codec;
93 struct pcm1792a_private *priv = snd_soc_codec_get_drvdata(codec);
94 int ret;
95
96 ret = regmap_update_bits(priv->regmap, PCM1792A_SOFT_MUTE,
97 PCM1792A_MUTE_MASK, !!mute);
98 if (ret < 0)
99 return ret;
100
101 return 0;
102}
103
104static int pcm1792a_hw_params(struct snd_pcm_substream *substream,
105 struct snd_pcm_hw_params *params,
106 struct snd_soc_dai *dai)
107{
108 struct snd_soc_codec *codec = dai->codec;
109 struct pcm1792a_private *priv = snd_soc_codec_get_drvdata(codec);
110 int val = 0, ret;
111
112 priv->rate = params_rate(params);
113
114 switch (priv->format & SND_SOC_DAIFMT_FORMAT_MASK) {
115 case SND_SOC_DAIFMT_RIGHT_J:
116 switch (params_width(params)) {
117 case 24:
118 case 32:
119 val = 2;
120 break;
121 case 16:
122 val = 0;
123 break;
124 default:
125 return -EINVAL;
126 }
127 break;
128 case SND_SOC_DAIFMT_I2S:
129 switch (params_width(params)) {
130 case 24:
131 case 32:
132 val = 5;
133 break;
134 case 16:
135 val = 4;
136 break;
137 default:
138 return -EINVAL;
139 }
140 break;
141 default:
142 dev_err(codec->dev, "Invalid DAI format\n");
143 return -EINVAL;
144 }
145
146 val = val << PCM1792A_FMT_SHIFT | PCM1792A_ATLD_ENABLE;
147
148 ret = regmap_update_bits(priv->regmap, PCM1792A_FMT_CONTROL,
149 PCM1792A_FMT_MASK | PCM1792A_ATLD_ENABLE, val);
150 if (ret < 0)
151 return ret;
152
153 return 0;
154}
155
156static const struct snd_soc_dai_ops pcm1792a_dai_ops = {
157 .set_fmt = pcm1792a_set_dai_fmt,
158 .hw_params = pcm1792a_hw_params,
159 .digital_mute = pcm1792a_digital_mute,
160};
161
162static const DECLARE_TLV_DB_SCALE(pcm1792a_dac_tlv, -12000, 50, 1);
163
164static const struct snd_kcontrol_new pcm1792a_controls[] = {
165 SOC_DOUBLE_R_RANGE_TLV("DAC Playback Volume", PCM1792A_DAC_VOL_LEFT,
166 PCM1792A_DAC_VOL_RIGHT, 0, 0xf, 0xff, 0,
167 pcm1792a_dac_tlv),
168 SOC_SINGLE("DAC Invert Output Switch", PCM1792A_MODE_CONTROL, 7, 1, 0),
169 SOC_SINGLE("DAC Rolloff Filter Switch", PCM1792A_MODE_CONTROL, 1, 1, 0),
170};
171
172static const struct snd_soc_dapm_widget pcm1792a_dapm_widgets[] = {
173SND_SOC_DAPM_OUTPUT("IOUTL+"),
174SND_SOC_DAPM_OUTPUT("IOUTL-"),
175SND_SOC_DAPM_OUTPUT("IOUTR+"),
176SND_SOC_DAPM_OUTPUT("IOUTR-"),
177};
178
179static const struct snd_soc_dapm_route pcm1792a_dapm_routes[] = {
180 { "IOUTL+", NULL, "Playback" },
181 { "IOUTL-", NULL, "Playback" },
182 { "IOUTR+", NULL, "Playback" },
183 { "IOUTR-", NULL, "Playback" },
184};
185
186static struct snd_soc_dai_driver pcm1792a_dai = {
187 .name = "pcm1792a-hifi",
188 .playback = {
189 .stream_name = "Playback",
190 .channels_min = 2,
191 .channels_max = 2,
192 .rates = PCM1792A_RATES,
193 .formats = PCM1792A_FORMATS, },
194 .ops = &pcm1792a_dai_ops,
195};
196
197static const struct of_device_id pcm1792a_of_match[] = {
198 { .compatible = "ti,pcm1792a", },
199 { }
200};
201MODULE_DEVICE_TABLE(of, pcm1792a_of_match);
202
203static const struct regmap_config pcm1792a_regmap = {
204 .reg_bits = 8,
205 .val_bits = 8,
206 .max_register = 23,
207 .reg_defaults = pcm1792a_reg_defaults,
208 .num_reg_defaults = ARRAY_SIZE(pcm1792a_reg_defaults),
209 .writeable_reg = pcm1792a_writeable_reg,
210 .readable_reg = pcm1792a_accessible_reg,
211};
212
213static struct snd_soc_codec_driver soc_codec_dev_pcm1792a = {
214 .controls = pcm1792a_controls,
215 .num_controls = ARRAY_SIZE(pcm1792a_controls),
216 .dapm_widgets = pcm1792a_dapm_widgets,
217 .num_dapm_widgets = ARRAY_SIZE(pcm1792a_dapm_widgets),
218 .dapm_routes = pcm1792a_dapm_routes,
219 .num_dapm_routes = ARRAY_SIZE(pcm1792a_dapm_routes),
220};
221
222static int pcm1792a_spi_probe(struct spi_device *spi)
223{
224 struct pcm1792a_private *pcm1792a;
225 int ret;
226
227 pcm1792a = devm_kzalloc(&spi->dev, sizeof(struct pcm1792a_private),
228 GFP_KERNEL);
229 if (!pcm1792a)
230 return -ENOMEM;
231
232 spi_set_drvdata(spi, pcm1792a);
233
234 pcm1792a->regmap = devm_regmap_init_spi(spi, &pcm1792a_regmap);
235 if (IS_ERR(pcm1792a->regmap)) {
236 ret = PTR_ERR(pcm1792a->regmap);
237 dev_err(&spi->dev, "Failed to register regmap: %d\n", ret);
238 return ret;
239 }
240
241 return snd_soc_register_codec(&spi->dev,
242 &soc_codec_dev_pcm1792a, &pcm1792a_dai, 1);
243}
244
245static int pcm1792a_spi_remove(struct spi_device *spi)
246{
247 snd_soc_unregister_codec(&spi->dev);
248 return 0;
249}
250
251static const struct spi_device_id pcm1792a_spi_ids[] = {
252 { "pcm1792a", 0 },
253 { },
254};
255MODULE_DEVICE_TABLE(spi, pcm1792a_spi_ids);
256
257static struct spi_driver pcm1792a_codec_driver = {
258 .driver = {
259 .name = "pcm1792a",
260 .of_match_table = of_match_ptr(pcm1792a_of_match),
261 },
262 .id_table = pcm1792a_spi_ids,
263 .probe = pcm1792a_spi_probe,
264 .remove = pcm1792a_spi_remove,
265};
266
267module_spi_driver(pcm1792a_codec_driver);
268
269MODULE_DESCRIPTION("ASoC PCM1792A driver");
270MODULE_AUTHOR("Michael Trimarchi <michael@amarulasolutions.com>");
271MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/pcm179x.c b/sound/soc/codecs/pcm179x.c
new file mode 100644
index 000000000000..a56c7b767d90
--- /dev/null
+++ b/sound/soc/codecs/pcm179x.c
@@ -0,0 +1,271 @@
1/*
2 * PCM179X ASoC codec driver
3 *
4 * Copyright (c) Amarula Solutions B.V. 2013
5 *
6 * Michael Trimarchi <michael@amarulasolutions.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 */
18
19#include <linux/module.h>
20#include <linux/slab.h>
21#include <linux/kernel.h>
22#include <linux/device.h>
23#include <linux/spi/spi.h>
24
25#include <sound/core.h>
26#include <sound/pcm.h>
27#include <sound/pcm_params.h>
28#include <sound/initval.h>
29#include <sound/soc.h>
30#include <sound/tlv.h>
31#include <linux/of.h>
32#include <linux/of_device.h>
33
34#include "pcm179x.h"
35
36#define PCM179X_DAC_VOL_LEFT 0x10
37#define PCM179X_DAC_VOL_RIGHT 0x11
38#define PCM179X_FMT_CONTROL 0x12
39#define PCM179X_MODE_CONTROL 0x13
40#define PCM179X_SOFT_MUTE PCM179X_FMT_CONTROL
41
42#define PCM179X_FMT_MASK 0x70
43#define PCM179X_FMT_SHIFT 4
44#define PCM179X_MUTE_MASK 0x01
45#define PCM179X_MUTE_SHIFT 0
46#define PCM179X_ATLD_ENABLE (1 << 7)
47
48static const struct reg_default pcm179x_reg_defaults[] = {
49 { 0x10, 0xff },
50 { 0x11, 0xff },
51 { 0x12, 0x50 },
52 { 0x13, 0x00 },
53 { 0x14, 0x00 },
54 { 0x15, 0x01 },
55 { 0x16, 0x00 },
56 { 0x17, 0x00 },
57};
58
59static bool pcm179x_accessible_reg(struct device *dev, unsigned int reg)
60{
61 return reg >= 0x10 && reg <= 0x17;
62}
63
64static bool pcm179x_writeable_reg(struct device *dev, unsigned register reg)
65{
66 bool accessible;
67
68 accessible = pcm179x_accessible_reg(dev, reg);
69
70 return accessible && reg != 0x16 && reg != 0x17;
71}
72
73struct pcm179x_private {
74 struct regmap *regmap;
75 unsigned int format;
76 unsigned int rate;
77};
78
79static int pcm179x_set_dai_fmt(struct snd_soc_dai *codec_dai,
80 unsigned int format)
81{
82 struct snd_soc_codec *codec = codec_dai->codec;
83 struct pcm179x_private *priv = snd_soc_codec_get_drvdata(codec);
84
85 priv->format = format;
86
87 return 0;
88}
89
90static int pcm179x_digital_mute(struct snd_soc_dai *dai, int mute)
91{
92 struct snd_soc_codec *codec = dai->codec;
93 struct pcm179x_private *priv = snd_soc_codec_get_drvdata(codec);
94 int ret;
95
96 ret = regmap_update_bits(priv->regmap, PCM179X_SOFT_MUTE,
97 PCM179X_MUTE_MASK, !!mute);
98 if (ret < 0)
99 return ret;
100
101 return 0;
102}
103
104static int pcm179x_hw_params(struct snd_pcm_substream *substream,
105 struct snd_pcm_hw_params *params,
106 struct snd_soc_dai *dai)
107{
108 struct snd_soc_codec *codec = dai->codec;
109 struct pcm179x_private *priv = snd_soc_codec_get_drvdata(codec);
110 int val = 0, ret;
111
112 priv->rate = params_rate(params);
113
114 switch (priv->format & SND_SOC_DAIFMT_FORMAT_MASK) {
115 case SND_SOC_DAIFMT_RIGHT_J:
116 switch (params_width(params)) {
117 case 24:
118 case 32:
119 val = 2;
120 break;
121 case 16:
122 val = 0;
123 break;
124 default:
125 return -EINVAL;
126 }
127 break;
128 case SND_SOC_DAIFMT_I2S:
129 switch (params_width(params)) {
130 case 24:
131 case 32:
132 val = 5;
133 break;
134 case 16:
135 val = 4;
136 break;
137 default:
138 return -EINVAL;
139 }
140 break;
141 default:
142 dev_err(codec->dev, "Invalid DAI format\n");
143 return -EINVAL;
144 }
145
146 val = val << PCM179X_FMT_SHIFT | PCM179X_ATLD_ENABLE;
147
148 ret = regmap_update_bits(priv->regmap, PCM179X_FMT_CONTROL,
149 PCM179X_FMT_MASK | PCM179X_ATLD_ENABLE, val);
150 if (ret < 0)
151 return ret;
152
153 return 0;
154}
155
156static const struct snd_soc_dai_ops pcm179x_dai_ops = {
157 .set_fmt = pcm179x_set_dai_fmt,
158 .hw_params = pcm179x_hw_params,
159 .digital_mute = pcm179x_digital_mute,
160};
161
162static const DECLARE_TLV_DB_SCALE(pcm179x_dac_tlv, -12000, 50, 1);
163
164static const struct snd_kcontrol_new pcm179x_controls[] = {
165 SOC_DOUBLE_R_RANGE_TLV("DAC Playback Volume", PCM179X_DAC_VOL_LEFT,
166 PCM179X_DAC_VOL_RIGHT, 0, 0xf, 0xff, 0,
167 pcm179x_dac_tlv),
168 SOC_SINGLE("DAC Invert Output Switch", PCM179X_MODE_CONTROL, 7, 1, 0),
169 SOC_SINGLE("DAC Rolloff Filter Switch", PCM179X_MODE_CONTROL, 1, 1, 0),
170};
171
172static const struct snd_soc_dapm_widget pcm179x_dapm_widgets[] = {
173SND_SOC_DAPM_OUTPUT("IOUTL+"),
174SND_SOC_DAPM_OUTPUT("IOUTL-"),
175SND_SOC_DAPM_OUTPUT("IOUTR+"),
176SND_SOC_DAPM_OUTPUT("IOUTR-"),
177};
178
179static const struct snd_soc_dapm_route pcm179x_dapm_routes[] = {
180 { "IOUTL+", NULL, "Playback" },
181 { "IOUTL-", NULL, "Playback" },
182 { "IOUTR+", NULL, "Playback" },
183 { "IOUTR-", NULL, "Playback" },
184};
185
186static struct snd_soc_dai_driver pcm179x_dai = {
187 .name = "pcm179x-hifi",
188 .playback = {
189 .stream_name = "Playback",
190 .channels_min = 2,
191 .channels_max = 2,
192 .rates = PCM1792A_RATES,
193 .formats = PCM1792A_FORMATS, },
194 .ops = &pcm179x_dai_ops,
195};
196
197static const struct of_device_id pcm179x_of_match[] = {
198 { .compatible = "ti,pcm1792a", },
199 { }
200};
201MODULE_DEVICE_TABLE(of, pcm179x_of_match);
202
203static const struct regmap_config pcm179x_regmap = {
204 .reg_bits = 8,
205 .val_bits = 8,
206 .max_register = 23,
207 .reg_defaults = pcm179x_reg_defaults,
208 .num_reg_defaults = ARRAY_SIZE(pcm179x_reg_defaults),
209 .writeable_reg = pcm179x_writeable_reg,
210 .readable_reg = pcm179x_accessible_reg,
211};
212
213static struct snd_soc_codec_driver soc_codec_dev_pcm179x = {
214 .controls = pcm179x_controls,
215 .num_controls = ARRAY_SIZE(pcm179x_controls),
216 .dapm_widgets = pcm179x_dapm_widgets,
217 .num_dapm_widgets = ARRAY_SIZE(pcm179x_dapm_widgets),
218 .dapm_routes = pcm179x_dapm_routes,
219 .num_dapm_routes = ARRAY_SIZE(pcm179x_dapm_routes),
220};
221
222static int pcm179x_spi_probe(struct spi_device *spi)
223{
224 struct pcm179x_private *pcm179x;
225 int ret;
226
227 pcm179x = devm_kzalloc(&spi->dev, sizeof(struct pcm179x_private),
228 GFP_KERNEL);
229 if (!pcm179x)
230 return -ENOMEM;
231
232 spi_set_drvdata(spi, pcm179x);
233
234 pcm179x->regmap = devm_regmap_init_spi(spi, &pcm179x_regmap);
235 if (IS_ERR(pcm179x->regmap)) {
236 ret = PTR_ERR(pcm179x->regmap);
237 dev_err(&spi->dev, "Failed to register regmap: %d\n", ret);
238 return ret;
239 }
240
241 return snd_soc_register_codec(&spi->dev,
242 &soc_codec_dev_pcm179x, &pcm179x_dai, 1);
243}
244
245static int pcm179x_spi_remove(struct spi_device *spi)
246{
247 snd_soc_unregister_codec(&spi->dev);
248 return 0;
249}
250
251static const struct spi_device_id pcm179x_spi_ids[] = {
252 { "pcm179x", 0 },
253 { },
254};
255MODULE_DEVICE_TABLE(spi, pcm179x_spi_ids);
256
257static struct spi_driver pcm179x_codec_driver = {
258 .driver = {
259 .name = "pcm179x",
260 .of_match_table = of_match_ptr(pcm179x_of_match),
261 },
262 .id_table = pcm179x_spi_ids,
263 .probe = pcm179x_spi_probe,
264 .remove = pcm179x_spi_remove,
265};
266
267module_spi_driver(pcm179x_codec_driver);
268
269MODULE_DESCRIPTION("ASoC PCM179X driver");
270MODULE_AUTHOR("Michael Trimarchi <michael@amarulasolutions.com>");
271MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/pcm1792a.h b/sound/soc/codecs/pcm179x.h
index 51d5470fee16..c6fdc062a497 100644
--- a/sound/soc/codecs/pcm1792a.h
+++ b/sound/soc/codecs/pcm179x.h
@@ -1,5 +1,5 @@
1/* 1/*
2 * definitions for PCM1792A 2 * definitions for PCM179X
3 * 3 *
4 * Copyright 2013 Amarula Solutions 4 * Copyright 2013 Amarula Solutions
5 * 5 *
@@ -14,8 +14,8 @@
14 * GNU General Public License for more details. 14 * GNU General Public License for more details.
15 */ 15 */
16 16
17#ifndef __PCM1792A_H__ 17#ifndef __PCM179X_H__
18#define __PCM1792A_H__ 18#define __PCM179X_H__
19 19
20#define PCM1792A_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_8000_48000 | \ 20#define PCM1792A_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_8000_48000 | \
21 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \ 21 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \
diff --git a/sound/soc/codecs/pcm3168a-i2c.c b/sound/soc/codecs/pcm3168a-i2c.c
new file mode 100644
index 000000000000..6feb0901dfeb
--- /dev/null
+++ b/sound/soc/codecs/pcm3168a-i2c.c
@@ -0,0 +1,66 @@
1/*
2 * PCM3168A codec i2c driver
3 *
4 * Copyright (C) 2015 Imagination Technologies Ltd.
5 *
6 * Author: Damien Horsley <Damien.Horsley@imgtec.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
11 */
12
13#include <linux/i2c.h>
14#include <linux/init.h>
15#include <linux/module.h>
16
17#include <sound/soc.h>
18
19#include "pcm3168a.h"
20
21static int pcm3168a_i2c_probe(struct i2c_client *i2c,
22 const struct i2c_device_id *id)
23{
24 struct regmap *regmap;
25
26 regmap = devm_regmap_init_i2c(i2c, &pcm3168a_regmap);
27 if (IS_ERR(regmap))
28 return PTR_ERR(regmap);
29
30 return pcm3168a_probe(&i2c->dev, regmap);
31}
32
33static int pcm3168a_i2c_remove(struct i2c_client *i2c)
34{
35 pcm3168a_remove(&i2c->dev);
36
37 return 0;
38}
39
40static const struct i2c_device_id pcm3168a_i2c_id[] = {
41 { "pcm3168a", },
42 { }
43};
44MODULE_DEVICE_TABLE(i2c, pcm3168a_i2c_id);
45
46static const struct of_device_id pcm3168a_of_match[] = {
47 { .compatible = "ti,pcm3168a", },
48 { }
49};
50MODULE_DEVICE_TABLE(of, pcm3168a_of_match);
51
52static struct i2c_driver pcm3168a_i2c_driver = {
53 .probe = pcm3168a_i2c_probe,
54 .remove = pcm3168a_i2c_remove,
55 .id_table = pcm3168a_i2c_id,
56 .driver = {
57 .name = "pcm3168a",
58 .of_match_table = pcm3168a_of_match,
59 .pm = &pcm3168a_pm_ops,
60 },
61};
62module_i2c_driver(pcm3168a_i2c_driver);
63
64MODULE_DESCRIPTION("PCM3168A I2C codec driver");
65MODULE_AUTHOR("Damien Horsley <Damien.Horsley@imgtec.com>");
66MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/codecs/pcm3168a-spi.c b/sound/soc/codecs/pcm3168a-spi.c
new file mode 100644
index 000000000000..03945a27ae40
--- /dev/null
+++ b/sound/soc/codecs/pcm3168a-spi.c
@@ -0,0 +1,65 @@
1/*
2 * PCM3168A codec spi driver
3 *
4 * Copyright (C) 2015 Imagination Technologies Ltd.
5 *
6 * Author: Damien Horsley <Damien.Horsley@imgtec.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
11 */
12
13#include <linux/init.h>
14#include <linux/module.h>
15#include <linux/spi/spi.h>
16
17#include <sound/soc.h>
18
19#include "pcm3168a.h"
20
21static int pcm3168a_spi_probe(struct spi_device *spi)
22{
23 struct regmap *regmap;
24
25 regmap = devm_regmap_init_spi(spi, &pcm3168a_regmap);
26 if (IS_ERR(regmap))
27 return PTR_ERR(regmap);
28
29 return pcm3168a_probe(&spi->dev, regmap);
30}
31
32static int pcm3168a_spi_remove(struct spi_device *spi)
33{
34 pcm3168a_remove(&spi->dev);
35
36 return 0;
37}
38
39static const struct spi_device_id pcm3168a_spi_id[] = {
40 { "pcm3168a", },
41 { },
42};
43MODULE_DEVICE_TABLE(spi, pcm3168a_spi_id);
44
45static const struct of_device_id pcm3168a_of_match[] = {
46 { .compatible = "ti,pcm3168a", },
47 { }
48};
49MODULE_DEVICE_TABLE(of, pcm3168a_of_match);
50
51static struct spi_driver pcm3168a_spi_driver = {
52 .probe = pcm3168a_spi_probe,
53 .remove = pcm3168a_spi_remove,
54 .id_table = pcm3168a_spi_id,
55 .driver = {
56 .name = "pcm3168a",
57 .of_match_table = pcm3168a_of_match,
58 .pm = &pcm3168a_pm_ops,
59 },
60};
61module_spi_driver(pcm3168a_spi_driver);
62
63MODULE_DESCRIPTION("PCM3168A SPI codec driver");
64MODULE_AUTHOR("Damien Horsley <Damien.Horsley@imgtec.com>");
65MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/codecs/pcm3168a.c b/sound/soc/codecs/pcm3168a.c
new file mode 100644
index 000000000000..44b268aa4dd8
--- /dev/null
+++ b/sound/soc/codecs/pcm3168a.c
@@ -0,0 +1,767 @@
1/*
2 * PCM3168A codec driver
3 *
4 * Copyright (C) 2015 Imagination Technologies Ltd.
5 *
6 * Author: Damien Horsley <Damien.Horsley@imgtec.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
11 */
12
13#include <linux/clk.h>
14#include <linux/delay.h>
15#include <linux/module.h>
16#include <linux/pm_runtime.h>
17#include <linux/regulator/consumer.h>
18
19#include <sound/pcm_params.h>
20#include <sound/soc.h>
21#include <sound/tlv.h>
22
23#include "pcm3168a.h"
24
25#define PCM3168A_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
26 SNDRV_PCM_FMTBIT_S24_3LE | \
27 SNDRV_PCM_FMTBIT_S24_LE | \
28 SNDRV_PCM_FMTBIT_S32_LE)
29
30#define PCM3168A_FMT_I2S 0x0
31#define PCM3168A_FMT_LEFT_J 0x1
32#define PCM3168A_FMT_RIGHT_J 0x2
33#define PCM3168A_FMT_RIGHT_J_16 0x3
34#define PCM3168A_FMT_DSP_A 0x4
35#define PCM3168A_FMT_DSP_B 0x5
36#define PCM3168A_FMT_DSP_MASK 0x4
37
38#define PCM3168A_NUM_SUPPLIES 6
39static const char *const pcm3168a_supply_names[PCM3168A_NUM_SUPPLIES] = {
40 "VDD1",
41 "VDD2",
42 "VCCAD1",
43 "VCCAD2",
44 "VCCDA1",
45 "VCCDA2"
46};
47
48struct pcm3168a_priv {
49 struct regulator_bulk_data supplies[PCM3168A_NUM_SUPPLIES];
50 struct regmap *regmap;
51 struct clk *scki;
52 bool adc_master_mode;
53 bool dac_master_mode;
54 unsigned long sysclk;
55 unsigned int adc_fmt;
56 unsigned int dac_fmt;
57};
58
59static const char *const pcm3168a_roll_off[] = { "Sharp", "Slow" };
60
61static SOC_ENUM_SINGLE_DECL(pcm3168a_d1_roll_off, PCM3168A_DAC_OP_FLT,
62 PCM3168A_DAC_FLT_SHIFT, pcm3168a_roll_off);
63static SOC_ENUM_SINGLE_DECL(pcm3168a_d2_roll_off, PCM3168A_DAC_OP_FLT,
64 PCM3168A_DAC_FLT_SHIFT + 1, pcm3168a_roll_off);
65static SOC_ENUM_SINGLE_DECL(pcm3168a_d3_roll_off, PCM3168A_DAC_OP_FLT,
66 PCM3168A_DAC_FLT_SHIFT + 2, pcm3168a_roll_off);
67static SOC_ENUM_SINGLE_DECL(pcm3168a_d4_roll_off, PCM3168A_DAC_OP_FLT,
68 PCM3168A_DAC_FLT_SHIFT + 3, pcm3168a_roll_off);
69
70static const char *const pcm3168a_volume_type[] = {
71 "Individual", "Master + Individual" };
72
73static SOC_ENUM_SINGLE_DECL(pcm3168a_dac_volume_type, PCM3168A_DAC_ATT_DEMP_ZF,
74 PCM3168A_DAC_ATMDDA_SHIFT, pcm3168a_volume_type);
75
76static const char *const pcm3168a_att_speed_mult[] = { "2048", "4096" };
77
78static SOC_ENUM_SINGLE_DECL(pcm3168a_dac_att_mult, PCM3168A_DAC_ATT_DEMP_ZF,
79 PCM3168A_DAC_ATSPDA_SHIFT, pcm3168a_att_speed_mult);
80
81static const char *const pcm3168a_demp[] = {
82 "Disabled", "48khz", "44.1khz", "32khz" };
83
84static SOC_ENUM_SINGLE_DECL(pcm3168a_dac_demp, PCM3168A_DAC_ATT_DEMP_ZF,
85 PCM3168A_DAC_DEMP_SHIFT, pcm3168a_demp);
86
87static const char *const pcm3168a_zf_func[] = {
88 "DAC 1/2/3/4 AND", "DAC 1/2/3/4 OR", "DAC 1/2/3 AND",
89 "DAC 1/2/3 OR", "DAC 4 AND", "DAC 4 OR" };
90
91static SOC_ENUM_SINGLE_DECL(pcm3168a_dac_zf_func, PCM3168A_DAC_ATT_DEMP_ZF,
92 PCM3168A_DAC_AZRO_SHIFT, pcm3168a_zf_func);
93
94static const char *const pcm3168a_pol[] = { "Active High", "Active Low" };
95
96static SOC_ENUM_SINGLE_DECL(pcm3168a_dac_zf_pol, PCM3168A_DAC_ATT_DEMP_ZF,
97 PCM3168A_DAC_ATSPDA_SHIFT, pcm3168a_pol);
98
99static const char *const pcm3168a_con[] = { "Differential", "Single-Ended" };
100
101static SOC_ENUM_DOUBLE_DECL(pcm3168a_adc1_con, PCM3168A_ADC_SEAD,
102 0, 1, pcm3168a_con);
103static SOC_ENUM_DOUBLE_DECL(pcm3168a_adc2_con, PCM3168A_ADC_SEAD,
104 2, 3, pcm3168a_con);
105static SOC_ENUM_DOUBLE_DECL(pcm3168a_adc3_con, PCM3168A_ADC_SEAD,
106 4, 5, pcm3168a_con);
107
108static SOC_ENUM_SINGLE_DECL(pcm3168a_adc_volume_type, PCM3168A_ADC_ATT_OVF,
109 PCM3168A_ADC_ATMDAD_SHIFT, pcm3168a_volume_type);
110
111static SOC_ENUM_SINGLE_DECL(pcm3168a_adc_att_mult, PCM3168A_ADC_ATT_OVF,
112 PCM3168A_ADC_ATSPAD_SHIFT, pcm3168a_att_speed_mult);
113
114static SOC_ENUM_SINGLE_DECL(pcm3168a_adc_ov_pol, PCM3168A_ADC_ATT_OVF,
115 PCM3168A_ADC_OVFP_SHIFT, pcm3168a_pol);
116
117/* -100db to 0db, register values 0-54 cause mute */
118static const DECLARE_TLV_DB_SCALE(pcm3168a_dac_tlv, -10050, 50, 1);
119
120/* -100db to 20db, register values 0-14 cause mute */
121static const DECLARE_TLV_DB_SCALE(pcm3168a_adc_tlv, -10050, 50, 1);
122
123static const struct snd_kcontrol_new pcm3168a_snd_controls[] = {
124 SOC_SINGLE("DAC Power-Save Switch", PCM3168A_DAC_PWR_MST_FMT,
125 PCM3168A_DAC_PSMDA_SHIFT, 1, 1),
126 SOC_ENUM("DAC1 Digital Filter roll-off", pcm3168a_d1_roll_off),
127 SOC_ENUM("DAC2 Digital Filter roll-off", pcm3168a_d2_roll_off),
128 SOC_ENUM("DAC3 Digital Filter roll-off", pcm3168a_d3_roll_off),
129 SOC_ENUM("DAC4 Digital Filter roll-off", pcm3168a_d4_roll_off),
130 SOC_DOUBLE("DAC1 Invert Switch", PCM3168A_DAC_INV, 0, 1, 1, 0),
131 SOC_DOUBLE("DAC2 Invert Switch", PCM3168A_DAC_INV, 2, 3, 1, 0),
132 SOC_DOUBLE("DAC3 Invert Switch", PCM3168A_DAC_INV, 4, 5, 1, 0),
133 SOC_DOUBLE("DAC4 Invert Switch", PCM3168A_DAC_INV, 6, 7, 1, 0),
134 SOC_DOUBLE_STS("DAC1 Zero Flag", PCM3168A_DAC_ZERO, 0, 1, 1, 0),
135 SOC_DOUBLE_STS("DAC2 Zero Flag", PCM3168A_DAC_ZERO, 2, 3, 1, 0),
136 SOC_DOUBLE_STS("DAC3 Zero Flag", PCM3168A_DAC_ZERO, 4, 5, 1, 0),
137 SOC_DOUBLE_STS("DAC4 Zero Flag", PCM3168A_DAC_ZERO, 6, 7, 1, 0),
138 SOC_ENUM("DAC Volume Control Type", pcm3168a_dac_volume_type),
139 SOC_ENUM("DAC Volume Rate Multiplier", pcm3168a_dac_att_mult),
140 SOC_ENUM("DAC De-Emphasis", pcm3168a_dac_demp),
141 SOC_ENUM("DAC Zero Flag Function", pcm3168a_dac_zf_func),
142 SOC_ENUM("DAC Zero Flag Polarity", pcm3168a_dac_zf_pol),
143 SOC_SINGLE_RANGE_TLV("Master Playback Volume",
144 PCM3168A_DAC_VOL_MASTER, 0, 54, 255, 0,
145 pcm3168a_dac_tlv),
146 SOC_DOUBLE_R_RANGE_TLV("DAC1 Playback Volume",
147 PCM3168A_DAC_VOL_CHAN_START,
148 PCM3168A_DAC_VOL_CHAN_START + 1,
149 0, 54, 255, 0, pcm3168a_dac_tlv),
150 SOC_DOUBLE_R_RANGE_TLV("DAC2 Playback Volume",
151 PCM3168A_DAC_VOL_CHAN_START + 2,
152 PCM3168A_DAC_VOL_CHAN_START + 3,
153 0, 54, 255, 0, pcm3168a_dac_tlv),
154 SOC_DOUBLE_R_RANGE_TLV("DAC3 Playback Volume",
155 PCM3168A_DAC_VOL_CHAN_START + 4,
156 PCM3168A_DAC_VOL_CHAN_START + 5,
157 0, 54, 255, 0, pcm3168a_dac_tlv),
158 SOC_DOUBLE_R_RANGE_TLV("DAC4 Playback Volume",
159 PCM3168A_DAC_VOL_CHAN_START + 6,
160 PCM3168A_DAC_VOL_CHAN_START + 7,
161 0, 54, 255, 0, pcm3168a_dac_tlv),
162 SOC_SINGLE("ADC1 High-Pass Filter Switch", PCM3168A_ADC_PWR_HPFB,
163 PCM3168A_ADC_BYP_SHIFT, 1, 1),
164 SOC_SINGLE("ADC2 High-Pass Filter Switch", PCM3168A_ADC_PWR_HPFB,
165 PCM3168A_ADC_BYP_SHIFT + 1, 1, 1),
166 SOC_SINGLE("ADC3 High-Pass Filter Switch", PCM3168A_ADC_PWR_HPFB,
167 PCM3168A_ADC_BYP_SHIFT + 2, 1, 1),
168 SOC_ENUM("ADC1 Connection Type", pcm3168a_adc1_con),
169 SOC_ENUM("ADC2 Connection Type", pcm3168a_adc2_con),
170 SOC_ENUM("ADC3 Connection Type", pcm3168a_adc3_con),
171 SOC_DOUBLE("ADC1 Invert Switch", PCM3168A_ADC_INV, 0, 1, 1, 0),
172 SOC_DOUBLE("ADC2 Invert Switch", PCM3168A_ADC_INV, 2, 3, 1, 0),
173 SOC_DOUBLE("ADC3 Invert Switch", PCM3168A_ADC_INV, 4, 5, 1, 0),
174 SOC_DOUBLE("ADC1 Mute Switch", PCM3168A_ADC_MUTE, 0, 1, 1, 0),
175 SOC_DOUBLE("ADC2 Mute Switch", PCM3168A_ADC_MUTE, 2, 3, 1, 0),
176 SOC_DOUBLE("ADC3 Mute Switch", PCM3168A_ADC_MUTE, 4, 5, 1, 0),
177 SOC_DOUBLE_STS("ADC1 Overflow Flag", PCM3168A_ADC_OV, 0, 1, 1, 0),
178 SOC_DOUBLE_STS("ADC2 Overflow Flag", PCM3168A_ADC_OV, 2, 3, 1, 0),
179 SOC_DOUBLE_STS("ADC3 Overflow Flag", PCM3168A_ADC_OV, 4, 5, 1, 0),
180 SOC_ENUM("ADC Volume Control Type", pcm3168a_adc_volume_type),
181 SOC_ENUM("ADC Volume Rate Multiplier", pcm3168a_adc_att_mult),
182 SOC_ENUM("ADC Overflow Flag Polarity", pcm3168a_adc_ov_pol),
183 SOC_SINGLE_RANGE_TLV("Master Capture Volume",
184 PCM3168A_ADC_VOL_MASTER, 0, 14, 255, 0,
185 pcm3168a_adc_tlv),
186 SOC_DOUBLE_R_RANGE_TLV("ADC1 Capture Volume",
187 PCM3168A_ADC_VOL_CHAN_START,
188 PCM3168A_ADC_VOL_CHAN_START + 1,
189 0, 14, 255, 0, pcm3168a_adc_tlv),
190 SOC_DOUBLE_R_RANGE_TLV("ADC2 Capture Volume",
191 PCM3168A_ADC_VOL_CHAN_START + 2,
192 PCM3168A_ADC_VOL_CHAN_START + 3,
193 0, 14, 255, 0, pcm3168a_adc_tlv),
194 SOC_DOUBLE_R_RANGE_TLV("ADC3 Capture Volume",
195 PCM3168A_ADC_VOL_CHAN_START + 4,
196 PCM3168A_ADC_VOL_CHAN_START + 5,
197 0, 14, 255, 0, pcm3168a_adc_tlv)
198};
199
200static const struct snd_soc_dapm_widget pcm3168a_dapm_widgets[] = {
201 SND_SOC_DAPM_DAC("DAC1", "Playback", PCM3168A_DAC_OP_FLT,
202 PCM3168A_DAC_OPEDA_SHIFT, 1),
203 SND_SOC_DAPM_DAC("DAC2", "Playback", PCM3168A_DAC_OP_FLT,
204 PCM3168A_DAC_OPEDA_SHIFT + 1, 1),
205 SND_SOC_DAPM_DAC("DAC3", "Playback", PCM3168A_DAC_OP_FLT,
206 PCM3168A_DAC_OPEDA_SHIFT + 2, 1),
207 SND_SOC_DAPM_DAC("DAC4", "Playback", PCM3168A_DAC_OP_FLT,
208 PCM3168A_DAC_OPEDA_SHIFT + 3, 1),
209
210 SND_SOC_DAPM_OUTPUT("AOUT1L"),
211 SND_SOC_DAPM_OUTPUT("AOUT1R"),
212 SND_SOC_DAPM_OUTPUT("AOUT2L"),
213 SND_SOC_DAPM_OUTPUT("AOUT2R"),
214 SND_SOC_DAPM_OUTPUT("AOUT3L"),
215 SND_SOC_DAPM_OUTPUT("AOUT3R"),
216 SND_SOC_DAPM_OUTPUT("AOUT4L"),
217 SND_SOC_DAPM_OUTPUT("AOUT4R"),
218
219 SND_SOC_DAPM_ADC("ADC1", "Capture", PCM3168A_ADC_PWR_HPFB,
220 PCM3168A_ADC_PSVAD_SHIFT, 1),
221 SND_SOC_DAPM_ADC("ADC2", "Capture", PCM3168A_ADC_PWR_HPFB,
222 PCM3168A_ADC_PSVAD_SHIFT + 1, 1),
223 SND_SOC_DAPM_ADC("ADC3", "Capture", PCM3168A_ADC_PWR_HPFB,
224 PCM3168A_ADC_PSVAD_SHIFT + 2, 1),
225
226 SND_SOC_DAPM_INPUT("AIN1L"),
227 SND_SOC_DAPM_INPUT("AIN1R"),
228 SND_SOC_DAPM_INPUT("AIN2L"),
229 SND_SOC_DAPM_INPUT("AIN2R"),
230 SND_SOC_DAPM_INPUT("AIN3L"),
231 SND_SOC_DAPM_INPUT("AIN3R")
232};
233
234static const struct snd_soc_dapm_route pcm3168a_dapm_routes[] = {
235 /* Playback */
236 { "AOUT1L", NULL, "DAC1" },
237 { "AOUT1R", NULL, "DAC1" },
238
239 { "AOUT2L", NULL, "DAC2" },
240 { "AOUT2R", NULL, "DAC2" },
241
242 { "AOUT3L", NULL, "DAC3" },
243 { "AOUT3R", NULL, "DAC3" },
244
245 { "AOUT4L", NULL, "DAC4" },
246 { "AOUT4R", NULL, "DAC4" },
247
248 /* Capture */
249 { "ADC1", NULL, "AIN1L" },
250 { "ADC1", NULL, "AIN1R" },
251
252 { "ADC2", NULL, "AIN2L" },
253 { "ADC2", NULL, "AIN2R" },
254
255 { "ADC3", NULL, "AIN3L" },
256 { "ADC3", NULL, "AIN3R" }
257};
258
259static unsigned int pcm3168a_scki_ratios[] = {
260 768,
261 512,
262 384,
263 256,
264 192,
265 128
266};
267
268#define PCM3168A_NUM_SCKI_RATIOS_DAC ARRAY_SIZE(pcm3168a_scki_ratios)
269#define PCM3168A_NUM_SCKI_RATIOS_ADC (ARRAY_SIZE(pcm3168a_scki_ratios) - 2)
270
271#define PCM1368A_MAX_SYSCLK 36864000
272
273static int pcm3168a_reset(struct pcm3168a_priv *pcm3168a)
274{
275 int ret;
276
277 ret = regmap_write(pcm3168a->regmap, PCM3168A_RST_SMODE, 0);
278 if (ret)
279 return ret;
280
281 /* Internal reset is de-asserted after 3846 SCKI cycles */
282 msleep(DIV_ROUND_UP(3846 * 1000, pcm3168a->sysclk));
283
284 return regmap_write(pcm3168a->regmap, PCM3168A_RST_SMODE,
285 PCM3168A_MRST_MASK | PCM3168A_SRST_MASK);
286}
287
288static int pcm3168a_digital_mute(struct snd_soc_dai *dai, int mute)
289{
290 struct snd_soc_codec *codec = dai->codec;
291 struct pcm3168a_priv *pcm3168a = snd_soc_codec_get_drvdata(codec);
292
293 regmap_write(pcm3168a->regmap, PCM3168A_DAC_MUTE, mute ? 0xff : 0);
294
295 return 0;
296}
297
298static int pcm3168a_set_dai_sysclk(struct snd_soc_dai *dai,
299 int clk_id, unsigned int freq, int dir)
300{
301 struct pcm3168a_priv *pcm3168a = snd_soc_codec_get_drvdata(dai->codec);
302
303 if (freq > PCM1368A_MAX_SYSCLK)
304 return -EINVAL;
305
306 pcm3168a->sysclk = freq;
307
308 return 0;
309}
310
311static int pcm3168a_set_dai_fmt(struct snd_soc_dai *dai,
312 unsigned int format, bool dac)
313{
314 struct snd_soc_codec *codec = dai->codec;
315 struct pcm3168a_priv *pcm3168a = snd_soc_codec_get_drvdata(codec);
316 u32 fmt, reg, mask, shift;
317 bool master_mode;
318
319 switch (format & SND_SOC_DAIFMT_FORMAT_MASK) {
320 case SND_SOC_DAIFMT_LEFT_J:
321 fmt = PCM3168A_FMT_LEFT_J;
322 break;
323 case SND_SOC_DAIFMT_I2S:
324 fmt = PCM3168A_FMT_I2S;
325 break;
326 case SND_SOC_DAIFMT_RIGHT_J:
327 fmt = PCM3168A_FMT_RIGHT_J;
328 break;
329 case SND_SOC_DAIFMT_DSP_A:
330 fmt = PCM3168A_FMT_DSP_A;
331 break;
332 case SND_SOC_DAIFMT_DSP_B:
333 fmt = PCM3168A_FMT_DSP_B;
334 break;
335 default:
336 dev_err(codec->dev, "unsupported dai format\n");
337 return -EINVAL;
338 }
339
340 switch (format & SND_SOC_DAIFMT_MASTER_MASK) {
341 case SND_SOC_DAIFMT_CBS_CFS:
342 master_mode = false;
343 break;
344 case SND_SOC_DAIFMT_CBM_CFM:
345 master_mode = true;
346 break;
347 default:
348 dev_err(codec->dev, "unsupported master/slave mode\n");
349 return -EINVAL;
350 }
351
352 switch (format & SND_SOC_DAIFMT_INV_MASK) {
353 case SND_SOC_DAIFMT_NB_NF:
354 break;
355 default:
356 return -EINVAL;
357 }
358
359 if (dac) {
360 reg = PCM3168A_DAC_PWR_MST_FMT;
361 mask = PCM3168A_DAC_FMT_MASK;
362 shift = PCM3168A_DAC_FMT_SHIFT;
363 pcm3168a->dac_master_mode = master_mode;
364 pcm3168a->dac_fmt = fmt;
365 } else {
366 reg = PCM3168A_ADC_MST_FMT;
367 mask = PCM3168A_ADC_FMTAD_MASK;
368 shift = PCM3168A_ADC_FMTAD_SHIFT;
369 pcm3168a->adc_master_mode = master_mode;
370 pcm3168a->adc_fmt = fmt;
371 }
372
373 regmap_update_bits(pcm3168a->regmap, reg, mask, fmt << shift);
374
375 return 0;
376}
377
378static int pcm3168a_set_dai_fmt_dac(struct snd_soc_dai *dai,
379 unsigned int format)
380{
381 return pcm3168a_set_dai_fmt(dai, format, true);
382}
383
384static int pcm3168a_set_dai_fmt_adc(struct snd_soc_dai *dai,
385 unsigned int format)
386{
387 return pcm3168a_set_dai_fmt(dai, format, false);
388}
389
390static int pcm3168a_hw_params(struct snd_pcm_substream *substream,
391 struct snd_pcm_hw_params *params,
392 struct snd_soc_dai *dai)
393{
394 struct snd_soc_codec *codec = dai->codec;
395 struct pcm3168a_priv *pcm3168a = snd_soc_codec_get_drvdata(codec);
396 bool tx, master_mode;
397 u32 val, mask, shift, reg;
398 unsigned int rate, channels, fmt, ratio, max_ratio;
399 int i, min_frame_size;
400 snd_pcm_format_t format;
401
402 rate = params_rate(params);
403 format = params_format(params);
404 channels = params_channels(params);
405
406 ratio = pcm3168a->sysclk / rate;
407
408 tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
409 if (tx) {
410 max_ratio = PCM3168A_NUM_SCKI_RATIOS_DAC;
411 reg = PCM3168A_DAC_PWR_MST_FMT;
412 mask = PCM3168A_DAC_MSDA_MASK;
413 shift = PCM3168A_DAC_MSDA_SHIFT;
414 master_mode = pcm3168a->dac_master_mode;
415 fmt = pcm3168a->dac_fmt;
416 } else {
417 max_ratio = PCM3168A_NUM_SCKI_RATIOS_ADC;
418 reg = PCM3168A_ADC_MST_FMT;
419 mask = PCM3168A_ADC_MSAD_MASK;
420 shift = PCM3168A_ADC_MSAD_SHIFT;
421 master_mode = pcm3168a->adc_master_mode;
422 fmt = pcm3168a->adc_fmt;
423 }
424
425 for (i = 0; i < max_ratio; i++) {
426 if (pcm3168a_scki_ratios[i] == ratio)
427 break;
428 }
429
430 if (i == max_ratio) {
431 dev_err(codec->dev, "unsupported sysclk ratio\n");
432 return -EINVAL;
433 }
434
435 min_frame_size = params_width(params) * 2;
436 switch (min_frame_size) {
437 case 32:
438 if (master_mode || (fmt != PCM3168A_FMT_RIGHT_J)) {
439 dev_err(codec->dev, "32-bit frames are supported only for slave mode using right justified\n");
440 return -EINVAL;
441 }
442 fmt = PCM3168A_FMT_RIGHT_J_16;
443 break;
444 case 48:
445 if (master_mode || (fmt & PCM3168A_FMT_DSP_MASK)) {
446 dev_err(codec->dev, "48-bit frames not supported in master mode, or slave mode using DSP\n");
447 return -EINVAL;
448 }
449 break;
450 case 64:
451 break;
452 default:
453 dev_err(codec->dev, "unsupported frame size: %d\n", min_frame_size);
454 return -EINVAL;
455 }
456
457 if (master_mode)
458 val = ((i + 1) << shift);
459 else
460 val = 0;
461
462 regmap_update_bits(pcm3168a->regmap, reg, mask, val);
463
464 if (tx) {
465 mask = PCM3168A_DAC_FMT_MASK;
466 shift = PCM3168A_DAC_FMT_SHIFT;
467 } else {
468 mask = PCM3168A_ADC_FMTAD_MASK;
469 shift = PCM3168A_ADC_FMTAD_SHIFT;
470 }
471
472 regmap_update_bits(pcm3168a->regmap, reg, mask, fmt << shift);
473
474 return 0;
475}
476
477static const struct snd_soc_dai_ops pcm3168a_dac_dai_ops = {
478 .set_fmt = pcm3168a_set_dai_fmt_dac,
479 .set_sysclk = pcm3168a_set_dai_sysclk,
480 .hw_params = pcm3168a_hw_params,
481 .digital_mute = pcm3168a_digital_mute
482};
483
484static const struct snd_soc_dai_ops pcm3168a_adc_dai_ops = {
485 .set_fmt = pcm3168a_set_dai_fmt_adc,
486 .set_sysclk = pcm3168a_set_dai_sysclk,
487 .hw_params = pcm3168a_hw_params
488};
489
490static struct snd_soc_dai_driver pcm3168a_dais[] = {
491 {
492 .name = "pcm3168a-dac",
493 .playback = {
494 .stream_name = "Playback",
495 .channels_min = 1,
496 .channels_max = 8,
497 .rates = SNDRV_PCM_RATE_8000_192000,
498 .formats = PCM3168A_FORMATS
499 },
500 .ops = &pcm3168a_dac_dai_ops
501 },
502 {
503 .name = "pcm3168a-adc",
504 .capture = {
505 .stream_name = "Capture",
506 .channels_min = 1,
507 .channels_max = 6,
508 .rates = SNDRV_PCM_RATE_8000_96000,
509 .formats = PCM3168A_FORMATS
510 },
511 .ops = &pcm3168a_adc_dai_ops
512 },
513};
514
515static const struct reg_default pcm3168a_reg_default[] = {
516 { PCM3168A_RST_SMODE, PCM3168A_MRST_MASK | PCM3168A_SRST_MASK },
517 { PCM3168A_DAC_PWR_MST_FMT, 0x00 },
518 { PCM3168A_DAC_OP_FLT, 0x00 },
519 { PCM3168A_DAC_INV, 0x00 },
520 { PCM3168A_DAC_MUTE, 0x00 },
521 { PCM3168A_DAC_ZERO, 0x00 },
522 { PCM3168A_DAC_ATT_DEMP_ZF, 0x00 },
523 { PCM3168A_DAC_VOL_MASTER, 0xff },
524 { PCM3168A_DAC_VOL_CHAN_START, 0xff },
525 { PCM3168A_DAC_VOL_CHAN_START + 1, 0xff },
526 { PCM3168A_DAC_VOL_CHAN_START + 2, 0xff },
527 { PCM3168A_DAC_VOL_CHAN_START + 3, 0xff },
528 { PCM3168A_DAC_VOL_CHAN_START + 4, 0xff },
529 { PCM3168A_DAC_VOL_CHAN_START + 5, 0xff },
530 { PCM3168A_DAC_VOL_CHAN_START + 6, 0xff },
531 { PCM3168A_DAC_VOL_CHAN_START + 7, 0xff },
532 { PCM3168A_ADC_SMODE, 0x00 },
533 { PCM3168A_ADC_MST_FMT, 0x00 },
534 { PCM3168A_ADC_PWR_HPFB, 0x00 },
535 { PCM3168A_ADC_SEAD, 0x00 },
536 { PCM3168A_ADC_INV, 0x00 },
537 { PCM3168A_ADC_MUTE, 0x00 },
538 { PCM3168A_ADC_OV, 0x00 },
539 { PCM3168A_ADC_ATT_OVF, 0x00 },
540 { PCM3168A_ADC_VOL_MASTER, 0xd3 },
541 { PCM3168A_ADC_VOL_CHAN_START, 0xd3 },
542 { PCM3168A_ADC_VOL_CHAN_START + 1, 0xd3 },
543 { PCM3168A_ADC_VOL_CHAN_START + 2, 0xd3 },
544 { PCM3168A_ADC_VOL_CHAN_START + 3, 0xd3 },
545 { PCM3168A_ADC_VOL_CHAN_START + 4, 0xd3 },
546 { PCM3168A_ADC_VOL_CHAN_START + 5, 0xd3 }
547};
548
549static bool pcm3168a_readable_register(struct device *dev, unsigned int reg)
550{
551 if (reg >= PCM3168A_RST_SMODE)
552 return true;
553 else
554 return false;
555}
556
557static bool pcm3168a_volatile_register(struct device *dev, unsigned int reg)
558{
559 switch (reg) {
560 case PCM3168A_DAC_ZERO:
561 case PCM3168A_ADC_OV:
562 return true;
563 default:
564 return false;
565 }
566}
567
568static bool pcm3168a_writeable_register(struct device *dev, unsigned int reg)
569{
570 if (reg < PCM3168A_RST_SMODE)
571 return false;
572
573 switch (reg) {
574 case PCM3168A_DAC_ZERO:
575 case PCM3168A_ADC_OV:
576 return false;
577 default:
578 return true;
579 }
580}
581
582const struct regmap_config pcm3168a_regmap = {
583 .reg_bits = 8,
584 .val_bits = 8,
585
586 .max_register = PCM3168A_ADC_VOL_CHAN_START + 5,
587 .reg_defaults = pcm3168a_reg_default,
588 .num_reg_defaults = ARRAY_SIZE(pcm3168a_reg_default),
589 .readable_reg = pcm3168a_readable_register,
590 .volatile_reg = pcm3168a_volatile_register,
591 .writeable_reg = pcm3168a_writeable_register,
592 .cache_type = REGCACHE_FLAT
593};
594EXPORT_SYMBOL_GPL(pcm3168a_regmap);
595
596static const struct snd_soc_codec_driver pcm3168a_driver = {
597 .idle_bias_off = true,
598 .controls = pcm3168a_snd_controls,
599 .num_controls = ARRAY_SIZE(pcm3168a_snd_controls),
600 .dapm_widgets = pcm3168a_dapm_widgets,
601 .num_dapm_widgets = ARRAY_SIZE(pcm3168a_dapm_widgets),
602 .dapm_routes = pcm3168a_dapm_routes,
603 .num_dapm_routes = ARRAY_SIZE(pcm3168a_dapm_routes)
604};
605
606int pcm3168a_probe(struct device *dev, struct regmap *regmap)
607{
608 struct pcm3168a_priv *pcm3168a;
609 int ret, i;
610
611 pcm3168a = devm_kzalloc(dev, sizeof(*pcm3168a), GFP_KERNEL);
612 if (pcm3168a == NULL)
613 return -ENOMEM;
614
615 dev_set_drvdata(dev, pcm3168a);
616
617 pcm3168a->scki = devm_clk_get(dev, "scki");
618 if (IS_ERR(pcm3168a->scki)) {
619 ret = PTR_ERR(pcm3168a->scki);
620 if (ret != -EPROBE_DEFER)
621 dev_err(dev, "failed to acquire clock 'scki': %d\n", ret);
622 return ret;
623 }
624
625 ret = clk_prepare_enable(pcm3168a->scki);
626 if (ret) {
627 dev_err(dev, "Failed to enable mclk: %d\n", ret);
628 return ret;
629 }
630
631 pcm3168a->sysclk = clk_get_rate(pcm3168a->scki);
632
633 for (i = 0; i < ARRAY_SIZE(pcm3168a->supplies); i++)
634 pcm3168a->supplies[i].supply = pcm3168a_supply_names[i];
635
636 ret = devm_regulator_bulk_get(dev,
637 ARRAY_SIZE(pcm3168a->supplies), pcm3168a->supplies);
638 if (ret) {
639 if (ret != -EPROBE_DEFER)
640 dev_err(dev, "failed to request supplies: %d\n", ret);
641 goto err_clk;
642 }
643
644 ret = regulator_bulk_enable(ARRAY_SIZE(pcm3168a->supplies),
645 pcm3168a->supplies);
646 if (ret) {
647 dev_err(dev, "failed to enable supplies: %d\n", ret);
648 goto err_clk;
649 }
650
651 pcm3168a->regmap = regmap;
652 if (IS_ERR(pcm3168a->regmap)) {
653 ret = PTR_ERR(pcm3168a->regmap);
654 dev_err(dev, "failed to allocate regmap: %d\n", ret);
655 goto err_regulator;
656 }
657
658 ret = pcm3168a_reset(pcm3168a);
659 if (ret) {
660 dev_err(dev, "Failed to reset device: %d\n", ret);
661 goto err_regulator;
662 }
663
664 pm_runtime_set_active(dev);
665 pm_runtime_enable(dev);
666 pm_runtime_idle(dev);
667
668 ret = snd_soc_register_codec(dev, &pcm3168a_driver, pcm3168a_dais,
669 ARRAY_SIZE(pcm3168a_dais));
670 if (ret) {
671 dev_err(dev, "failed to register codec: %d\n", ret);
672 goto err_regulator;
673 }
674
675 return 0;
676
677err_regulator:
678 regulator_bulk_disable(ARRAY_SIZE(pcm3168a->supplies),
679 pcm3168a->supplies);
680err_clk:
681 clk_disable_unprepare(pcm3168a->scki);
682
683 return ret;
684}
685EXPORT_SYMBOL_GPL(pcm3168a_probe);
686
687void pcm3168a_remove(struct device *dev)
688{
689 struct pcm3168a_priv *pcm3168a = dev_get_drvdata(dev);
690
691 snd_soc_unregister_codec(dev);
692 pm_runtime_disable(dev);
693 regulator_bulk_disable(ARRAY_SIZE(pcm3168a->supplies),
694 pcm3168a->supplies);
695 clk_disable_unprepare(pcm3168a->scki);
696}
697EXPORT_SYMBOL_GPL(pcm3168a_remove);
698
699#ifdef CONFIG_PM
700static int pcm3168a_rt_resume(struct device *dev)
701{
702 struct pcm3168a_priv *pcm3168a = dev_get_drvdata(dev);
703 int ret;
704
705 ret = clk_prepare_enable(pcm3168a->scki);
706 if (ret) {
707 dev_err(dev, "Failed to enable mclk: %d\n", ret);
708 return ret;
709 }
710
711 ret = regulator_bulk_enable(ARRAY_SIZE(pcm3168a->supplies),
712 pcm3168a->supplies);
713 if (ret) {
714 dev_err(dev, "Failed to enable supplies: %d\n", ret);
715 goto err_clk;
716 }
717
718 ret = pcm3168a_reset(pcm3168a);
719 if (ret) {
720 dev_err(dev, "Failed to reset device: %d\n", ret);
721 goto err_regulator;
722 }
723
724 regcache_cache_only(pcm3168a->regmap, false);
725
726 regcache_mark_dirty(pcm3168a->regmap);
727
728 ret = regcache_sync(pcm3168a->regmap);
729 if (ret) {
730 dev_err(dev, "Failed to sync regmap: %d\n", ret);
731 goto err_regulator;
732 }
733
734 return 0;
735
736err_regulator:
737 regulator_bulk_disable(ARRAY_SIZE(pcm3168a->supplies),
738 pcm3168a->supplies);
739err_clk:
740 clk_disable_unprepare(pcm3168a->scki);
741
742 return ret;
743}
744
745static int pcm3168a_rt_suspend(struct device *dev)
746{
747 struct pcm3168a_priv *pcm3168a = dev_get_drvdata(dev);
748
749 regcache_cache_only(pcm3168a->regmap, true);
750
751 regulator_bulk_disable(ARRAY_SIZE(pcm3168a->supplies),
752 pcm3168a->supplies);
753
754 clk_disable_unprepare(pcm3168a->scki);
755
756 return 0;
757}
758#endif
759
760const struct dev_pm_ops pcm3168a_pm_ops = {
761 SET_RUNTIME_PM_OPS(pcm3168a_rt_suspend, pcm3168a_rt_resume, NULL)
762};
763EXPORT_SYMBOL_GPL(pcm3168a_pm_ops);
764
765MODULE_DESCRIPTION("PCM3168A codec driver");
766MODULE_AUTHOR("Damien Horsley <Damien.Horsley@imgtec.com>");
767MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/codecs/pcm3168a.h b/sound/soc/codecs/pcm3168a.h
new file mode 100644
index 000000000000..56c8332d82fb
--- /dev/null
+++ b/sound/soc/codecs/pcm3168a.h
@@ -0,0 +1,100 @@
1/*
2 * PCM3168A codec driver header
3 *
4 * Copyright (C) 2015 Imagination Technologies Ltd.
5 *
6 * Author: Damien Horsley <Damien.Horsley@imgtec.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
11 */
12
13#ifndef __PCM3168A_H__
14#define __PCM3168A_H__
15
16extern const struct dev_pm_ops pcm3168a_pm_ops;
17extern const struct regmap_config pcm3168a_regmap;
18
19extern int pcm3168a_probe(struct device *dev, struct regmap *regmap);
20extern void pcm3168a_remove(struct device *dev);
21
22#define PCM3168A_RST_SMODE 0x40
23#define PCM3168A_MRST_MASK 0x80
24#define PCM3168A_SRST_MASK 0x40
25#define PCM3168A_DAC_SRDA_SHIFT 0
26#define PCM3168A_DAC_SRDA_MASK 0x3
27
28#define PCM3168A_DAC_PWR_MST_FMT 0x41
29#define PCM3168A_DAC_PSMDA_SHIFT 7
30#define PCM3168A_DAC_PSMDA_MASK 0x80
31#define PCM3168A_DAC_MSDA_SHIFT 4
32#define PCM3168A_DAC_MSDA_MASK 0x70
33#define PCM3168A_DAC_FMT_SHIFT 0
34#define PCM3168A_DAC_FMT_MASK 0xf
35
36#define PCM3168A_DAC_OP_FLT 0x42
37#define PCM3168A_DAC_OPEDA_SHIFT 4
38#define PCM3168A_DAC_OPEDA_MASK 0xf0
39#define PCM3168A_DAC_FLT_SHIFT 0
40#define PCM3168A_DAC_FLT_MASK 0xf
41
42#define PCM3168A_DAC_INV 0x43
43
44#define PCM3168A_DAC_MUTE 0x44
45
46#define PCM3168A_DAC_ZERO 0x45
47
48#define PCM3168A_DAC_ATT_DEMP_ZF 0x46
49#define PCM3168A_DAC_ATMDDA_MASK 0x80
50#define PCM3168A_DAC_ATMDDA_SHIFT 7
51#define PCM3168A_DAC_ATSPDA_MASK 0x40
52#define PCM3168A_DAC_ATSPDA_SHIFT 6
53#define PCM3168A_DAC_DEMP_SHIFT 4
54#define PCM3168A_DAC_DEMP_MASK 0x30
55#define PCM3168A_DAC_AZRO_SHIFT 1
56#define PCM3168A_DAC_AZRO_MASK 0xe
57#define PCM3168A_DAC_ZREV_MASK 0x1
58#define PCM3168A_DAC_ZREV_SHIFT 0
59
60#define PCM3168A_DAC_VOL_MASTER 0x47
61
62#define PCM3168A_DAC_VOL_CHAN_START 0x48
63
64#define PCM3168A_ADC_SMODE 0x50
65#define PCM3168A_ADC_SRAD_SHIFT 0
66#define PCM3168A_ADC_SRAD_MASK 0x3
67
68#define PCM3168A_ADC_MST_FMT 0x51
69#define PCM3168A_ADC_MSAD_SHIFT 4
70#define PCM3168A_ADC_MSAD_MASK 0x70
71#define PCM3168A_ADC_FMTAD_SHIFT 0
72#define PCM3168A_ADC_FMTAD_MASK 0x7
73
74#define PCM3168A_ADC_PWR_HPFB 0x52
75#define PCM3168A_ADC_PSVAD_SHIFT 4
76#define PCM3168A_ADC_PSVAD_MASK 0x70
77#define PCM3168A_ADC_BYP_SHIFT 0
78#define PCM3168A_ADC_BYP_MASK 0x7
79
80#define PCM3168A_ADC_SEAD 0x53
81
82#define PCM3168A_ADC_INV 0x54
83
84#define PCM3168A_ADC_MUTE 0x55
85
86#define PCM3168A_ADC_OV 0x56
87
88#define PCM3168A_ADC_ATT_OVF 0x57
89#define PCM3168A_ADC_ATMDAD_MASK 0x80
90#define PCM3168A_ADC_ATMDAD_SHIFT 7
91#define PCM3168A_ADC_ATSPAD_MASK 0x40
92#define PCM3168A_ADC_ATSPAD_SHIFT 6
93#define PCM3168A_ADC_OVFP_MASK 0x1
94#define PCM3168A_ADC_OVFP_SHIFT 0
95
96#define PCM3168A_ADC_VOL_MASTER 0x58
97
98#define PCM3168A_ADC_VOL_CHAN_START 0x59
99
100#endif
diff --git a/sound/soc/codecs/rt286.c b/sound/soc/codecs/rt286.c
index af2ed774b552..bc08f0c5a5f6 100644
--- a/sound/soc/codecs/rt286.c
+++ b/sound/soc/codecs/rt286.c
@@ -1114,6 +1114,12 @@ static const struct dmi_system_id force_combo_jack_table[] = {
1114 DMI_MATCH(DMI_BOARD_NAME, "Wilson Beach SDS") 1114 DMI_MATCH(DMI_BOARD_NAME, "Wilson Beach SDS")
1115 } 1115 }
1116 }, 1116 },
1117 {
1118 .ident = "Intel Skylake RVP",
1119 .matches = {
1120 DMI_MATCH(DMI_PRODUCT_NAME, "Skylake Client platform")
1121 }
1122 },
1117 { } 1123 { }
1118}; 1124};
1119 1125
diff --git a/sound/soc/codecs/rt298.c b/sound/soc/codecs/rt298.c
index b3f795c60749..30c6de62ae6c 100644
--- a/sound/soc/codecs/rt298.c
+++ b/sound/soc/codecs/rt298.c
@@ -855,8 +855,6 @@ static int rt298_set_dai_sysclk(struct snd_soc_dai *dai,
855 snd_soc_update_bits(codec, 855 snd_soc_update_bits(codec,
856 RT298_I2S_CTRL2, 0x0100, 0x0100); 856 RT298_I2S_CTRL2, 0x0100, 0x0100);
857 snd_soc_update_bits(codec, 857 snd_soc_update_bits(codec,
858 RT298_PLL_CTRL, 0x4, 0x4);
859 snd_soc_update_bits(codec,
860 RT298_PLL_CTRL1, 0x20, 0x0); 858 RT298_PLL_CTRL1, 0x20, 0x0);
861 } 859 }
862 860
diff --git a/sound/soc/codecs/rt5616.c b/sound/soc/codecs/rt5616.c
new file mode 100644
index 000000000000..1c10d8ed39d2
--- /dev/null
+++ b/sound/soc/codecs/rt5616.c
@@ -0,0 +1,1381 @@
1/*
2 * rt5616.c -- RT5616 ALSA SoC audio codec driver
3 *
4 * Copyright 2015 Realtek Semiconductor Corp.
5 * Author: Bard Liao <bardliao@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#include <linux/module.h>
13#include <linux/moduleparam.h>
14#include <linux/init.h>
15#include <linux/delay.h>
16#include <linux/pm.h>
17#include <linux/i2c.h>
18#include <linux/platform_device.h>
19#include <linux/spi/spi.h>
20#include <sound/core.h>
21#include <sound/pcm.h>
22#include <sound/pcm_params.h>
23#include <sound/soc.h>
24#include <sound/soc-dapm.h>
25#include <sound/initval.h>
26#include <sound/tlv.h>
27
28#include "rl6231.h"
29#include "rt5616.h"
30
31#define RT5616_PR_RANGE_BASE (0xff + 1)
32#define RT5616_PR_SPACING 0x100
33
34#define RT5616_PR_BASE (RT5616_PR_RANGE_BASE + (0 * RT5616_PR_SPACING))
35
36static const struct regmap_range_cfg rt5616_ranges[] = {
37 {
38 .name = "PR",
39 .range_min = RT5616_PR_BASE,
40 .range_max = RT5616_PR_BASE + 0xf8,
41 .selector_reg = RT5616_PRIV_INDEX,
42 .selector_mask = 0xff,
43 .selector_shift = 0x0,
44 .window_start = RT5616_PRIV_DATA,
45 .window_len = 0x1,
46 },
47};
48
49static const struct reg_sequence init_list[] = {
50 {RT5616_PR_BASE + 0x3d, 0x3e00},
51 {RT5616_PR_BASE + 0x25, 0x6110},
52 {RT5616_PR_BASE + 0x20, 0x611f},
53 {RT5616_PR_BASE + 0x21, 0x4040},
54 {RT5616_PR_BASE + 0x23, 0x0004},
55};
56#define RT5616_INIT_REG_LEN ARRAY_SIZE(init_list)
57
58static const struct reg_default rt5616_reg[] = {
59 { 0x00, 0x0021 },
60 { 0x02, 0xc8c8 },
61 { 0x03, 0xc8c8 },
62 { 0x05, 0x0000 },
63 { 0x0d, 0x0000 },
64 { 0x0f, 0x0808 },
65 { 0x19, 0xafaf },
66 { 0x1c, 0x2f2f },
67 { 0x1e, 0x0000 },
68 { 0x27, 0x7860 },
69 { 0x29, 0x8080 },
70 { 0x2a, 0x5252 },
71 { 0x3b, 0x0000 },
72 { 0x3c, 0x006f },
73 { 0x3d, 0x0000 },
74 { 0x3e, 0x006f },
75 { 0x45, 0x6000 },
76 { 0x4d, 0x0000 },
77 { 0x4e, 0x0000 },
78 { 0x4f, 0x0279 },
79 { 0x50, 0x0000 },
80 { 0x51, 0x0000 },
81 { 0x52, 0x0279 },
82 { 0x53, 0xf000 },
83 { 0x61, 0x0000 },
84 { 0x62, 0x0000 },
85 { 0x63, 0x00c0 },
86 { 0x64, 0x0000 },
87 { 0x65, 0x0000 },
88 { 0x66, 0x0000 },
89 { 0x70, 0x8000 },
90 { 0x73, 0x1104 },
91 { 0x74, 0x0c00 },
92 { 0x80, 0x0000 },
93 { 0x81, 0x0000 },
94 { 0x82, 0x0000 },
95 { 0x8b, 0x0600 },
96 { 0x8e, 0x0004 },
97 { 0x8f, 0x1100 },
98 { 0x90, 0x0000 },
99 { 0x91, 0x0000 },
100 { 0x92, 0x0000 },
101 { 0x93, 0x2000 },
102 { 0x94, 0x0200 },
103 { 0x95, 0x0000 },
104 { 0xb0, 0x2080 },
105 { 0xb1, 0x0000 },
106 { 0xb2, 0x0000 },
107 { 0xb4, 0x2206 },
108 { 0xb5, 0x1f00 },
109 { 0xb6, 0x0000 },
110 { 0xb7, 0x0000 },
111 { 0xbb, 0x0000 },
112 { 0xbc, 0x0000 },
113 { 0xbd, 0x0000 },
114 { 0xbe, 0x0000 },
115 { 0xbf, 0x0000 },
116 { 0xc0, 0x0100 },
117 { 0xc1, 0x0000 },
118 { 0xc2, 0x0000 },
119 { 0xc8, 0x0000 },
120 { 0xc9, 0x0000 },
121 { 0xca, 0x0000 },
122 { 0xcb, 0x0000 },
123 { 0xcc, 0x0000 },
124 { 0xcd, 0x0000 },
125 { 0xce, 0x0000 },
126 { 0xcf, 0x0013 },
127 { 0xd0, 0x0680 },
128 { 0xd1, 0x1c17 },
129 { 0xd3, 0xb320 },
130 { 0xd4, 0x0000 },
131 { 0xd6, 0x0000 },
132 { 0xd7, 0x0000 },
133 { 0xd9, 0x0809 },
134 { 0xda, 0x0000 },
135 { 0xfa, 0x0010 },
136 { 0xfb, 0x0000 },
137 { 0xfc, 0x0000 },
138 { 0xfe, 0x10ec },
139 { 0xff, 0x6281 },
140};
141
142struct rt5616_priv {
143 struct snd_soc_codec *codec;
144 struct delayed_work patch_work;
145 struct regmap *regmap;
146
147 int sysclk;
148 int sysclk_src;
149 int lrck[RT5616_AIFS];
150 int bclk[RT5616_AIFS];
151 int master[RT5616_AIFS];
152
153 int pll_src;
154 int pll_in;
155 int pll_out;
156
157};
158
159static bool rt5616_volatile_register(struct device *dev, unsigned int reg)
160{
161 int i;
162
163 for (i = 0; i < ARRAY_SIZE(rt5616_ranges); i++) {
164 if (reg >= rt5616_ranges[i].range_min &&
165 reg <= rt5616_ranges[i].range_max) {
166 return true;
167 }
168 }
169
170 switch (reg) {
171 case RT5616_RESET:
172 case RT5616_PRIV_DATA:
173 case RT5616_EQ_CTRL1:
174 case RT5616_DRC_AGC_1:
175 case RT5616_IRQ_CTRL2:
176 case RT5616_INT_IRQ_ST:
177 case RT5616_PGM_REG_ARR1:
178 case RT5616_PGM_REG_ARR3:
179 case RT5616_VENDOR_ID:
180 case RT5616_DEVICE_ID:
181 return true;
182 default:
183 return false;
184 }
185}
186
187static bool rt5616_readable_register(struct device *dev, unsigned int reg)
188{
189 int i;
190
191 for (i = 0; i < ARRAY_SIZE(rt5616_ranges); i++) {
192 if (reg >= rt5616_ranges[i].range_min &&
193 reg <= rt5616_ranges[i].range_max) {
194 return true;
195 }
196 }
197
198 switch (reg) {
199 case RT5616_RESET:
200 case RT5616_VERSION_ID:
201 case RT5616_VENDOR_ID:
202 case RT5616_DEVICE_ID:
203 case RT5616_HP_VOL:
204 case RT5616_LOUT_CTRL1:
205 case RT5616_LOUT_CTRL2:
206 case RT5616_IN1_IN2:
207 case RT5616_INL1_INR1_VOL:
208 case RT5616_DAC1_DIG_VOL:
209 case RT5616_ADC_DIG_VOL:
210 case RT5616_ADC_BST_VOL:
211 case RT5616_STO1_ADC_MIXER:
212 case RT5616_AD_DA_MIXER:
213 case RT5616_STO_DAC_MIXER:
214 case RT5616_REC_L1_MIXER:
215 case RT5616_REC_L2_MIXER:
216 case RT5616_REC_R1_MIXER:
217 case RT5616_REC_R2_MIXER:
218 case RT5616_HPO_MIXER:
219 case RT5616_OUT_L1_MIXER:
220 case RT5616_OUT_L2_MIXER:
221 case RT5616_OUT_L3_MIXER:
222 case RT5616_OUT_R1_MIXER:
223 case RT5616_OUT_R2_MIXER:
224 case RT5616_OUT_R3_MIXER:
225 case RT5616_LOUT_MIXER:
226 case RT5616_PWR_DIG1:
227 case RT5616_PWR_DIG2:
228 case RT5616_PWR_ANLG1:
229 case RT5616_PWR_ANLG2:
230 case RT5616_PWR_MIXER:
231 case RT5616_PWR_VOL:
232 case RT5616_PRIV_INDEX:
233 case RT5616_PRIV_DATA:
234 case RT5616_I2S1_SDP:
235 case RT5616_ADDA_CLK1:
236 case RT5616_ADDA_CLK2:
237 case RT5616_GLB_CLK:
238 case RT5616_PLL_CTRL1:
239 case RT5616_PLL_CTRL2:
240 case RT5616_HP_OVCD:
241 case RT5616_DEPOP_M1:
242 case RT5616_DEPOP_M2:
243 case RT5616_DEPOP_M3:
244 case RT5616_CHARGE_PUMP:
245 case RT5616_PV_DET_SPK_G:
246 case RT5616_MICBIAS:
247 case RT5616_A_JD_CTL1:
248 case RT5616_A_JD_CTL2:
249 case RT5616_EQ_CTRL1:
250 case RT5616_EQ_CTRL2:
251 case RT5616_WIND_FILTER:
252 case RT5616_DRC_AGC_1:
253 case RT5616_DRC_AGC_2:
254 case RT5616_DRC_AGC_3:
255 case RT5616_SVOL_ZC:
256 case RT5616_JD_CTRL1:
257 case RT5616_JD_CTRL2:
258 case RT5616_IRQ_CTRL1:
259 case RT5616_IRQ_CTRL2:
260 case RT5616_INT_IRQ_ST:
261 case RT5616_GPIO_CTRL1:
262 case RT5616_GPIO_CTRL2:
263 case RT5616_GPIO_CTRL3:
264 case RT5616_PGM_REG_ARR1:
265 case RT5616_PGM_REG_ARR2:
266 case RT5616_PGM_REG_ARR3:
267 case RT5616_PGM_REG_ARR4:
268 case RT5616_PGM_REG_ARR5:
269 case RT5616_SCB_FUNC:
270 case RT5616_SCB_CTRL:
271 case RT5616_BASE_BACK:
272 case RT5616_MP3_PLUS1:
273 case RT5616_MP3_PLUS2:
274 case RT5616_ADJ_HPF_CTRL1:
275 case RT5616_ADJ_HPF_CTRL2:
276 case RT5616_HP_CALIB_AMP_DET:
277 case RT5616_HP_CALIB2:
278 case RT5616_SV_ZCD1:
279 case RT5616_SV_ZCD2:
280 case RT5616_D_MISC:
281 case RT5616_DUMMY2:
282 case RT5616_DUMMY3:
283 return true;
284 default:
285 return false;
286 }
287}
288
289static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
290static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
291static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
292static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0);
293static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
294
295/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
296static unsigned int bst_tlv[] = {
297 TLV_DB_RANGE_HEAD(7),
298 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
299 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
300 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
301 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
302 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
303 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
304 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0),
305};
306
307static const struct snd_kcontrol_new rt5616_snd_controls[] = {
308 /* Headphone Output Volume */
309 SOC_DOUBLE("HP Playback Switch", RT5616_HP_VOL,
310 RT5616_L_MUTE_SFT, RT5616_R_MUTE_SFT, 1, 1),
311 SOC_DOUBLE_TLV("HP Playback Volume", RT5616_HP_VOL,
312 RT5616_L_VOL_SFT, RT5616_R_VOL_SFT, 39, 1, out_vol_tlv),
313 /* OUTPUT Control */
314 SOC_DOUBLE("OUT Playback Switch", RT5616_LOUT_CTRL1,
315 RT5616_L_MUTE_SFT, RT5616_R_MUTE_SFT, 1, 1),
316 SOC_DOUBLE("OUT Channel Switch", RT5616_LOUT_CTRL1,
317 RT5616_VOL_L_SFT, RT5616_VOL_R_SFT, 1, 1),
318 SOC_DOUBLE_TLV("OUT Playback Volume", RT5616_LOUT_CTRL1,
319 RT5616_L_VOL_SFT, RT5616_R_VOL_SFT, 39, 1, out_vol_tlv),
320
321 /* DAC Digital Volume */
322 SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5616_DAC1_DIG_VOL,
323 RT5616_L_VOL_SFT, RT5616_R_VOL_SFT,
324 175, 0, dac_vol_tlv),
325 /* IN1/IN2 Control */
326 SOC_SINGLE_TLV("IN1 Boost Volume", RT5616_IN1_IN2,
327 RT5616_BST_SFT1, 8, 0, bst_tlv),
328 SOC_SINGLE_TLV("IN2 Boost Volume", RT5616_IN1_IN2,
329 RT5616_BST_SFT2, 8, 0, bst_tlv),
330 /* INL/INR Volume Control */
331 SOC_DOUBLE_TLV("IN Capture Volume", RT5616_INL1_INR1_VOL,
332 RT5616_INL_VOL_SFT, RT5616_INR_VOL_SFT,
333 31, 1, in_vol_tlv),
334 /* ADC Digital Volume Control */
335 SOC_DOUBLE("ADC Capture Switch", RT5616_ADC_DIG_VOL,
336 RT5616_L_MUTE_SFT, RT5616_R_MUTE_SFT, 1, 1),
337 SOC_DOUBLE_TLV("ADC Capture Volume", RT5616_ADC_DIG_VOL,
338 RT5616_L_VOL_SFT, RT5616_R_VOL_SFT,
339 127, 0, adc_vol_tlv),
340
341 /* ADC Boost Volume Control */
342 SOC_DOUBLE_TLV("ADC Boost Volume", RT5616_ADC_BST_VOL,
343 RT5616_ADC_L_BST_SFT, RT5616_ADC_R_BST_SFT,
344 3, 0, adc_bst_tlv),
345};
346
347static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
348 struct snd_soc_dapm_widget *sink)
349{
350 unsigned int val;
351
352 val = snd_soc_read(snd_soc_dapm_to_codec(source->dapm), RT5616_GLB_CLK);
353 val &= RT5616_SCLK_SRC_MASK;
354 if (val == RT5616_SCLK_SRC_PLL1)
355 return 1;
356 else
357 return 0;
358}
359
360/* Digital Mixer */
361static const struct snd_kcontrol_new rt5616_sto1_adc_l_mix[] = {
362 SOC_DAPM_SINGLE("ADC1 Switch", RT5616_STO1_ADC_MIXER,
363 RT5616_M_STO1_ADC_L1_SFT, 1, 1),
364};
365
366static const struct snd_kcontrol_new rt5616_sto1_adc_r_mix[] = {
367 SOC_DAPM_SINGLE("ADC1 Switch", RT5616_STO1_ADC_MIXER,
368 RT5616_M_STO1_ADC_R1_SFT, 1, 1),
369};
370
371static const struct snd_kcontrol_new rt5616_dac_l_mix[] = {
372 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5616_AD_DA_MIXER,
373 RT5616_M_ADCMIX_L_SFT, 1, 1),
374 SOC_DAPM_SINGLE("INF1 Switch", RT5616_AD_DA_MIXER,
375 RT5616_M_IF1_DAC_L_SFT, 1, 1),
376};
377
378static const struct snd_kcontrol_new rt5616_dac_r_mix[] = {
379 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5616_AD_DA_MIXER,
380 RT5616_M_ADCMIX_R_SFT, 1, 1),
381 SOC_DAPM_SINGLE("INF1 Switch", RT5616_AD_DA_MIXER,
382 RT5616_M_IF1_DAC_R_SFT, 1, 1),
383};
384
385static const struct snd_kcontrol_new rt5616_sto_dac_l_mix[] = {
386 SOC_DAPM_SINGLE("DAC L1 Switch", RT5616_STO_DAC_MIXER,
387 RT5616_M_DAC_L1_MIXL_SFT, 1, 1),
388 SOC_DAPM_SINGLE("DAC R1 Switch", RT5616_STO_DAC_MIXER,
389 RT5616_M_DAC_R1_MIXL_SFT, 1, 1),
390};
391
392static const struct snd_kcontrol_new rt5616_sto_dac_r_mix[] = {
393 SOC_DAPM_SINGLE("DAC R1 Switch", RT5616_STO_DAC_MIXER,
394 RT5616_M_DAC_R1_MIXR_SFT, 1, 1),
395 SOC_DAPM_SINGLE("DAC L1 Switch", RT5616_STO_DAC_MIXER,
396 RT5616_M_DAC_L1_MIXR_SFT, 1, 1),
397};
398
399/* Analog Input Mixer */
400static const struct snd_kcontrol_new rt5616_rec_l_mix[] = {
401 SOC_DAPM_SINGLE("INL1 Switch", RT5616_REC_L2_MIXER,
402 RT5616_M_IN1_L_RM_L_SFT, 1, 1),
403 SOC_DAPM_SINGLE("BST2 Switch", RT5616_REC_L2_MIXER,
404 RT5616_M_BST2_RM_L_SFT, 1, 1),
405 SOC_DAPM_SINGLE("BST1 Switch", RT5616_REC_L2_MIXER,
406 RT5616_M_BST1_RM_L_SFT, 1, 1),
407};
408
409static const struct snd_kcontrol_new rt5616_rec_r_mix[] = {
410 SOC_DAPM_SINGLE("INR1 Switch", RT5616_REC_R2_MIXER,
411 RT5616_M_IN1_R_RM_R_SFT, 1, 1),
412 SOC_DAPM_SINGLE("BST2 Switch", RT5616_REC_R2_MIXER,
413 RT5616_M_BST2_RM_R_SFT, 1, 1),
414 SOC_DAPM_SINGLE("BST1 Switch", RT5616_REC_R2_MIXER,
415 RT5616_M_BST1_RM_R_SFT, 1, 1),
416};
417
418/* Analog Output Mixer */
419
420static const struct snd_kcontrol_new rt5616_out_l_mix[] = {
421 SOC_DAPM_SINGLE("BST1 Switch", RT5616_OUT_L3_MIXER,
422 RT5616_M_BST1_OM_L_SFT, 1, 1),
423 SOC_DAPM_SINGLE("BST2 Switch", RT5616_OUT_L3_MIXER,
424 RT5616_M_BST2_OM_L_SFT, 1, 1),
425 SOC_DAPM_SINGLE("INL1 Switch", RT5616_OUT_L3_MIXER,
426 RT5616_M_IN1_L_OM_L_SFT, 1, 1),
427 SOC_DAPM_SINGLE("REC MIXL Switch", RT5616_OUT_L3_MIXER,
428 RT5616_M_RM_L_OM_L_SFT, 1, 1),
429 SOC_DAPM_SINGLE("DAC L1 Switch", RT5616_OUT_L3_MIXER,
430 RT5616_M_DAC_L1_OM_L_SFT, 1, 1),
431};
432
433static const struct snd_kcontrol_new rt5616_out_r_mix[] = {
434 SOC_DAPM_SINGLE("BST2 Switch", RT5616_OUT_R3_MIXER,
435 RT5616_M_BST2_OM_R_SFT, 1, 1),
436 SOC_DAPM_SINGLE("BST1 Switch", RT5616_OUT_R3_MIXER,
437 RT5616_M_BST1_OM_R_SFT, 1, 1),
438 SOC_DAPM_SINGLE("INR1 Switch", RT5616_OUT_R3_MIXER,
439 RT5616_M_IN1_R_OM_R_SFT, 1, 1),
440 SOC_DAPM_SINGLE("REC MIXR Switch", RT5616_OUT_R3_MIXER,
441 RT5616_M_RM_R_OM_R_SFT, 1, 1),
442 SOC_DAPM_SINGLE("DAC R1 Switch", RT5616_OUT_R3_MIXER,
443 RT5616_M_DAC_R1_OM_R_SFT, 1, 1),
444};
445
446static const struct snd_kcontrol_new rt5616_hpo_mix[] = {
447 SOC_DAPM_SINGLE("DAC1 Switch", RT5616_HPO_MIXER,
448 RT5616_M_DAC1_HM_SFT, 1, 1),
449 SOC_DAPM_SINGLE("HPVOL Switch", RT5616_HPO_MIXER,
450 RT5616_M_HPVOL_HM_SFT, 1, 1),
451};
452
453static const struct snd_kcontrol_new rt5616_lout_mix[] = {
454 SOC_DAPM_SINGLE("DAC L1 Switch", RT5616_LOUT_MIXER,
455 RT5616_M_DAC_L1_LM_SFT, 1, 1),
456 SOC_DAPM_SINGLE("DAC R1 Switch", RT5616_LOUT_MIXER,
457 RT5616_M_DAC_R1_LM_SFT, 1, 1),
458 SOC_DAPM_SINGLE("OUTVOL L Switch", RT5616_LOUT_MIXER,
459 RT5616_M_OV_L_LM_SFT, 1, 1),
460 SOC_DAPM_SINGLE("OUTVOL R Switch", RT5616_LOUT_MIXER,
461 RT5616_M_OV_R_LM_SFT, 1, 1),
462};
463
464static int rt5616_adc_event(struct snd_soc_dapm_widget *w,
465 struct snd_kcontrol *kcontrol, int event)
466{
467 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
468
469 switch (event) {
470 case SND_SOC_DAPM_POST_PMU:
471 snd_soc_update_bits(codec, RT5616_ADC_DIG_VOL,
472 RT5616_L_MUTE | RT5616_R_MUTE, 0);
473 break;
474
475 case SND_SOC_DAPM_POST_PMD:
476 snd_soc_update_bits(codec, RT5616_ADC_DIG_VOL,
477 RT5616_L_MUTE | RT5616_R_MUTE,
478 RT5616_L_MUTE | RT5616_R_MUTE);
479 break;
480
481 default:
482 return 0;
483 }
484
485 return 0;
486}
487
488static int rt5616_charge_pump_event(struct snd_soc_dapm_widget *w,
489 struct snd_kcontrol *kcontrol, int event)
490{
491 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
492
493 switch (event) {
494 case SND_SOC_DAPM_POST_PMU:
495 /* depop parameters */
496 snd_soc_update_bits(codec, RT5616_DEPOP_M2,
497 RT5616_DEPOP_MASK, RT5616_DEPOP_MAN);
498 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
499 RT5616_HP_CP_MASK | RT5616_HP_SG_MASK |
500 RT5616_HP_CB_MASK, RT5616_HP_CP_PU |
501 RT5616_HP_SG_DIS | RT5616_HP_CB_PU);
502 snd_soc_write(codec, RT5616_PR_BASE +
503 RT5616_HP_DCC_INT1, 0x9f00);
504 /* headphone amp power on */
505 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
506 RT5616_PWR_FV1 | RT5616_PWR_FV2, 0);
507 snd_soc_update_bits(codec, RT5616_PWR_VOL,
508 RT5616_PWR_HV_L | RT5616_PWR_HV_R,
509 RT5616_PWR_HV_L | RT5616_PWR_HV_R);
510 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
511 RT5616_PWR_HP_L | RT5616_PWR_HP_R |
512 RT5616_PWR_HA, RT5616_PWR_HP_L |
513 RT5616_PWR_HP_R | RT5616_PWR_HA);
514 msleep(50);
515 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
516 RT5616_PWR_FV1 | RT5616_PWR_FV2,
517 RT5616_PWR_FV1 | RT5616_PWR_FV2);
518
519 snd_soc_update_bits(codec, RT5616_CHARGE_PUMP,
520 RT5616_PM_HP_MASK, RT5616_PM_HP_HV);
521 snd_soc_update_bits(codec, RT5616_PR_BASE +
522 RT5616_CHOP_DAC_ADC, 0x0200, 0x0200);
523 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
524 RT5616_HP_CO_MASK | RT5616_HP_SG_MASK,
525 RT5616_HP_CO_EN | RT5616_HP_SG_EN);
526 break;
527 case SND_SOC_DAPM_PRE_PMD:
528 snd_soc_update_bits(codec, RT5616_PR_BASE +
529 RT5616_CHOP_DAC_ADC, 0x0200, 0x0);
530 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
531 RT5616_HP_SG_MASK | RT5616_HP_L_SMT_MASK |
532 RT5616_HP_R_SMT_MASK, RT5616_HP_SG_DIS |
533 RT5616_HP_L_SMT_DIS | RT5616_HP_R_SMT_DIS);
534 /* headphone amp power down */
535 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
536 RT5616_SMT_TRIG_MASK | RT5616_HP_CD_PD_MASK |
537 RT5616_HP_CO_MASK | RT5616_HP_CP_MASK |
538 RT5616_HP_SG_MASK | RT5616_HP_CB_MASK,
539 RT5616_SMT_TRIG_DIS | RT5616_HP_CD_PD_EN |
540 RT5616_HP_CO_DIS | RT5616_HP_CP_PD |
541 RT5616_HP_SG_EN | RT5616_HP_CB_PD);
542 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
543 RT5616_PWR_HP_L | RT5616_PWR_HP_R |
544 RT5616_PWR_HA, 0);
545 break;
546 default:
547 return 0;
548 }
549
550 return 0;
551}
552
553static int rt5616_hp_event(struct snd_soc_dapm_widget *w,
554 struct snd_kcontrol *kcontrol, int event)
555{
556 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
557
558 switch (event) {
559 case SND_SOC_DAPM_POST_PMU:
560 /* headphone unmute sequence */
561 snd_soc_update_bits(codec, RT5616_DEPOP_M3,
562 RT5616_CP_FQ1_MASK | RT5616_CP_FQ2_MASK |
563 RT5616_CP_FQ3_MASK,
564 (RT5616_CP_FQ_192_KHZ << RT5616_CP_FQ1_SFT) |
565 (RT5616_CP_FQ_12_KHZ << RT5616_CP_FQ2_SFT) |
566 (RT5616_CP_FQ_192_KHZ << RT5616_CP_FQ3_SFT));
567 snd_soc_write(codec, RT5616_PR_BASE +
568 RT5616_MAMP_INT_REG2, 0xfc00);
569 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
570 RT5616_SMT_TRIG_MASK, RT5616_SMT_TRIG_EN);
571 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
572 RT5616_RSTN_MASK, RT5616_RSTN_EN);
573 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
574 RT5616_RSTN_MASK | RT5616_HP_L_SMT_MASK |
575 RT5616_HP_R_SMT_MASK, RT5616_RSTN_DIS |
576 RT5616_HP_L_SMT_EN | RT5616_HP_R_SMT_EN);
577 snd_soc_update_bits(codec, RT5616_HP_VOL,
578 RT5616_L_MUTE | RT5616_R_MUTE, 0);
579 msleep(100);
580 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
581 RT5616_HP_SG_MASK | RT5616_HP_L_SMT_MASK |
582 RT5616_HP_R_SMT_MASK, RT5616_HP_SG_DIS |
583 RT5616_HP_L_SMT_DIS | RT5616_HP_R_SMT_DIS);
584 msleep(20);
585 snd_soc_update_bits(codec, RT5616_HP_CALIB_AMP_DET,
586 RT5616_HPD_PS_MASK, RT5616_HPD_PS_EN);
587 break;
588
589 case SND_SOC_DAPM_PRE_PMD:
590 /* headphone mute sequence */
591 snd_soc_update_bits(codec, RT5616_DEPOP_M3,
592 RT5616_CP_FQ1_MASK | RT5616_CP_FQ2_MASK |
593 RT5616_CP_FQ3_MASK,
594 (RT5616_CP_FQ_96_KHZ << RT5616_CP_FQ1_SFT) |
595 (RT5616_CP_FQ_12_KHZ << RT5616_CP_FQ2_SFT) |
596 (RT5616_CP_FQ_96_KHZ << RT5616_CP_FQ3_SFT));
597 snd_soc_write(codec, RT5616_PR_BASE +
598 RT5616_MAMP_INT_REG2, 0xfc00);
599 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
600 RT5616_HP_SG_MASK, RT5616_HP_SG_EN);
601 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
602 RT5616_RSTP_MASK, RT5616_RSTP_EN);
603 snd_soc_update_bits(codec, RT5616_DEPOP_M1,
604 RT5616_RSTP_MASK | RT5616_HP_L_SMT_MASK |
605 RT5616_HP_R_SMT_MASK, RT5616_RSTP_DIS |
606 RT5616_HP_L_SMT_EN | RT5616_HP_R_SMT_EN);
607 snd_soc_update_bits(codec, RT5616_HP_CALIB_AMP_DET,
608 RT5616_HPD_PS_MASK, RT5616_HPD_PS_DIS);
609 msleep(90);
610 snd_soc_update_bits(codec, RT5616_HP_VOL,
611 RT5616_L_MUTE | RT5616_R_MUTE,
612 RT5616_L_MUTE | RT5616_R_MUTE);
613 msleep(30);
614 break;
615
616 default:
617 return 0;
618 }
619
620 return 0;
621}
622
623static int rt5616_lout_event(struct snd_soc_dapm_widget *w,
624 struct snd_kcontrol *kcontrol, int event)
625{
626 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
627
628 switch (event) {
629 case SND_SOC_DAPM_POST_PMU:
630 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
631 RT5616_PWR_LM, RT5616_PWR_LM);
632 snd_soc_update_bits(codec, RT5616_LOUT_CTRL1,
633 RT5616_L_MUTE | RT5616_R_MUTE, 0);
634 break;
635
636 case SND_SOC_DAPM_PRE_PMD:
637 snd_soc_update_bits(codec, RT5616_LOUT_CTRL1,
638 RT5616_L_MUTE | RT5616_R_MUTE,
639 RT5616_L_MUTE | RT5616_R_MUTE);
640 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
641 RT5616_PWR_LM, 0);
642 break;
643
644 default:
645 return 0;
646 }
647
648 return 0;
649}
650
651static int rt5616_bst1_event(struct snd_soc_dapm_widget *w,
652 struct snd_kcontrol *kcontrol, int event)
653{
654 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
655
656 switch (event) {
657 case SND_SOC_DAPM_POST_PMU:
658 snd_soc_update_bits(codec, RT5616_PWR_ANLG2,
659 RT5616_PWR_BST1_OP2, RT5616_PWR_BST1_OP2);
660 break;
661
662 case SND_SOC_DAPM_PRE_PMD:
663 snd_soc_update_bits(codec, RT5616_PWR_ANLG2,
664 RT5616_PWR_BST1_OP2, 0);
665 break;
666
667 default:
668 return 0;
669 }
670
671 return 0;
672}
673
674static int rt5616_bst2_event(struct snd_soc_dapm_widget *w,
675 struct snd_kcontrol *kcontrol, int event)
676{
677 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
678
679 switch (event) {
680 case SND_SOC_DAPM_POST_PMU:
681 snd_soc_update_bits(codec, RT5616_PWR_ANLG2,
682 RT5616_PWR_BST2_OP2, RT5616_PWR_BST2_OP2);
683 break;
684
685 case SND_SOC_DAPM_PRE_PMD:
686 snd_soc_update_bits(codec, RT5616_PWR_ANLG2,
687 RT5616_PWR_BST2_OP2, 0);
688 break;
689
690 default:
691 return 0;
692 }
693
694 return 0;
695}
696
697static const struct snd_soc_dapm_widget rt5616_dapm_widgets[] = {
698 SND_SOC_DAPM_SUPPLY("PLL1", RT5616_PWR_ANLG2,
699 RT5616_PWR_PLL_BIT, 0, NULL, 0),
700 /* Input Side */
701 /* micbias */
702 SND_SOC_DAPM_SUPPLY("LDO", RT5616_PWR_ANLG1,
703 RT5616_PWR_LDO_BIT, 0, NULL, 0),
704 SND_SOC_DAPM_SUPPLY("micbias1", RT5616_PWR_ANLG2,
705 RT5616_PWR_MB1_BIT, 0, NULL, 0),
706
707 /* Input Lines */
708 SND_SOC_DAPM_INPUT("MIC1"),
709 SND_SOC_DAPM_INPUT("MIC2"),
710
711 SND_SOC_DAPM_INPUT("IN1P"),
712 SND_SOC_DAPM_INPUT("IN2P"),
713 SND_SOC_DAPM_INPUT("IN2N"),
714
715 /* Boost */
716 SND_SOC_DAPM_PGA_E("BST1", RT5616_PWR_ANLG2,
717 RT5616_PWR_BST1_BIT, 0, NULL, 0, rt5616_bst1_event,
718 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
719 SND_SOC_DAPM_PGA_E("BST2", RT5616_PWR_ANLG2,
720 RT5616_PWR_BST2_BIT, 0, NULL, 0, rt5616_bst2_event,
721 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
722 /* Input Volume */
723 SND_SOC_DAPM_PGA("INL1 VOL", RT5616_PWR_VOL,
724 RT5616_PWR_IN1_L_BIT, 0, NULL, 0),
725 SND_SOC_DAPM_PGA("INR1 VOL", RT5616_PWR_VOL,
726 RT5616_PWR_IN1_R_BIT, 0, NULL, 0),
727 SND_SOC_DAPM_PGA("INL2 VOL", RT5616_PWR_VOL,
728 RT5616_PWR_IN2_L_BIT, 0, NULL, 0),
729 SND_SOC_DAPM_PGA("INR2 VOL", RT5616_PWR_VOL,
730 RT5616_PWR_IN2_R_BIT, 0, NULL, 0),
731
732 /* REC Mixer */
733 SND_SOC_DAPM_MIXER("RECMIXL", RT5616_PWR_MIXER, RT5616_PWR_RM_L_BIT, 0,
734 rt5616_rec_l_mix, ARRAY_SIZE(rt5616_rec_l_mix)),
735 SND_SOC_DAPM_MIXER("RECMIXR", RT5616_PWR_MIXER, RT5616_PWR_RM_R_BIT, 0,
736 rt5616_rec_r_mix, ARRAY_SIZE(rt5616_rec_r_mix)),
737 /* ADCs */
738 SND_SOC_DAPM_ADC_E("ADC L", NULL, RT5616_PWR_DIG1,
739 RT5616_PWR_ADC_L_BIT, 0, rt5616_adc_event,
740 SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU),
741 SND_SOC_DAPM_ADC_E("ADC R", NULL, RT5616_PWR_DIG1,
742 RT5616_PWR_ADC_R_BIT, 0, rt5616_adc_event,
743 SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU),
744
745 /* ADC Mixer */
746 SND_SOC_DAPM_SUPPLY("stereo1 filter", RT5616_PWR_DIG2,
747 RT5616_PWR_ADC_STO1_F_BIT, 0, NULL, 0),
748 SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0,
749 rt5616_sto1_adc_l_mix, ARRAY_SIZE(rt5616_sto1_adc_l_mix)),
750 SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", SND_SOC_NOPM, 0, 0,
751 rt5616_sto1_adc_r_mix, ARRAY_SIZE(rt5616_sto1_adc_r_mix)),
752
753 /* Digital Interface */
754 SND_SOC_DAPM_SUPPLY("I2S1", RT5616_PWR_DIG1,
755 RT5616_PWR_I2S1_BIT, 0, NULL, 0),
756 SND_SOC_DAPM_PGA("IF1 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
757 SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
758 SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
759 SND_SOC_DAPM_PGA("IF1 ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
760
761 /* Digital Interface Select */
762
763 /* Audio Interface */
764 SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
765 SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
766
767 /* Audio DSP */
768 SND_SOC_DAPM_PGA("Audio DSP", SND_SOC_NOPM, 0, 0, NULL, 0),
769
770 /* Output Side */
771 /* DAC mixer before sound effect */
772 SND_SOC_DAPM_MIXER("DAC MIXL", SND_SOC_NOPM, 0, 0,
773 rt5616_dac_l_mix, ARRAY_SIZE(rt5616_dac_l_mix)),
774 SND_SOC_DAPM_MIXER("DAC MIXR", SND_SOC_NOPM, 0, 0,
775 rt5616_dac_r_mix, ARRAY_SIZE(rt5616_dac_r_mix)),
776
777 SND_SOC_DAPM_SUPPLY("Stero1 DAC Power", RT5616_PWR_DIG2,
778 RT5616_PWR_DAC_STO1_F_BIT, 0, NULL, 0),
779
780 /* DAC Mixer */
781 SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
782 rt5616_sto_dac_l_mix, ARRAY_SIZE(rt5616_sto_dac_l_mix)),
783 SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
784 rt5616_sto_dac_r_mix, ARRAY_SIZE(rt5616_sto_dac_r_mix)),
785
786 /* DACs */
787 SND_SOC_DAPM_DAC("DAC L1", NULL, RT5616_PWR_DIG1,
788 RT5616_PWR_DAC_L1_BIT, 0),
789 SND_SOC_DAPM_DAC("DAC R1", NULL, RT5616_PWR_DIG1,
790 RT5616_PWR_DAC_R1_BIT, 0),
791 /* OUT Mixer */
792 SND_SOC_DAPM_MIXER("OUT MIXL", RT5616_PWR_MIXER, RT5616_PWR_OM_L_BIT,
793 0, rt5616_out_l_mix, ARRAY_SIZE(rt5616_out_l_mix)),
794 SND_SOC_DAPM_MIXER("OUT MIXR", RT5616_PWR_MIXER, RT5616_PWR_OM_R_BIT,
795 0, rt5616_out_r_mix, ARRAY_SIZE(rt5616_out_r_mix)),
796 /* Output Volume */
797 SND_SOC_DAPM_PGA("OUTVOL L", RT5616_PWR_VOL,
798 RT5616_PWR_OV_L_BIT, 0, NULL, 0),
799 SND_SOC_DAPM_PGA("OUTVOL R", RT5616_PWR_VOL,
800 RT5616_PWR_OV_R_BIT, 0, NULL, 0),
801 SND_SOC_DAPM_PGA("HPOVOL L", RT5616_PWR_VOL,
802 RT5616_PWR_HV_L_BIT, 0, NULL, 0),
803 SND_SOC_DAPM_PGA("HPOVOL R", RT5616_PWR_VOL,
804 RT5616_PWR_HV_R_BIT, 0, NULL, 0),
805 SND_SOC_DAPM_PGA("DAC 1", SND_SOC_NOPM,
806 0, 0, NULL, 0),
807 SND_SOC_DAPM_PGA("DAC 2", SND_SOC_NOPM,
808 0, 0, NULL, 0),
809 SND_SOC_DAPM_PGA("HPOVOL", SND_SOC_NOPM,
810 0, 0, NULL, 0),
811 SND_SOC_DAPM_PGA("INL1", RT5616_PWR_VOL,
812 RT5616_PWR_IN1_L_BIT, 0, NULL, 0),
813 SND_SOC_DAPM_PGA("INR1", RT5616_PWR_VOL,
814 RT5616_PWR_IN1_R_BIT, 0, NULL, 0),
815 SND_SOC_DAPM_PGA("INL2", RT5616_PWR_VOL,
816 RT5616_PWR_IN2_L_BIT, 0, NULL, 0),
817 SND_SOC_DAPM_PGA("INR2", RT5616_PWR_VOL,
818 RT5616_PWR_IN2_R_BIT, 0, NULL, 0),
819 /* HPO/LOUT/Mono Mixer */
820 SND_SOC_DAPM_MIXER("HPO MIX", SND_SOC_NOPM, 0, 0,
821 rt5616_hpo_mix, ARRAY_SIZE(rt5616_hpo_mix)),
822 SND_SOC_DAPM_MIXER("LOUT MIX", SND_SOC_NOPM, 0, 0,
823 rt5616_lout_mix, ARRAY_SIZE(rt5616_lout_mix)),
824
825 SND_SOC_DAPM_PGA_S("HP amp", 1, SND_SOC_NOPM, 0, 0,
826 rt5616_hp_event, SND_SOC_DAPM_PRE_PMD |
827 SND_SOC_DAPM_POST_PMU),
828 SND_SOC_DAPM_PGA_S("LOUT amp", 1, SND_SOC_NOPM, 0, 0,
829 rt5616_lout_event, SND_SOC_DAPM_PRE_PMD |
830 SND_SOC_DAPM_POST_PMU),
831
832 SND_SOC_DAPM_SUPPLY_S("Charge Pump", 1, SND_SOC_NOPM, 0, 0,
833 rt5616_charge_pump_event, SND_SOC_DAPM_POST_PMU |
834 SND_SOC_DAPM_PRE_PMD),
835
836 /* Output Lines */
837 SND_SOC_DAPM_OUTPUT("HPOL"),
838 SND_SOC_DAPM_OUTPUT("HPOR"),
839 SND_SOC_DAPM_OUTPUT("LOUTL"),
840 SND_SOC_DAPM_OUTPUT("LOUTR"),
841};
842
843static const struct snd_soc_dapm_route rt5616_dapm_routes[] = {
844 {"IN1P", NULL, "LDO"},
845 {"IN2P", NULL, "LDO"},
846
847 {"IN1P", NULL, "MIC1"},
848 {"IN2P", NULL, "MIC2"},
849 {"IN2N", NULL, "MIC2"},
850
851 {"BST1", NULL, "IN1P"},
852 {"BST2", NULL, "IN2P"},
853 {"BST2", NULL, "IN2N"},
854 {"BST1", NULL, "micbias1"},
855 {"BST2", NULL, "micbias1"},
856
857 {"INL1 VOL", NULL, "IN2P"},
858 {"INR1 VOL", NULL, "IN2N"},
859
860 {"RECMIXL", "INL1 Switch", "INL1 VOL"},
861 {"RECMIXL", "BST2 Switch", "BST2"},
862 {"RECMIXL", "BST1 Switch", "BST1"},
863
864 {"RECMIXR", "INR1 Switch", "INR1 VOL"},
865 {"RECMIXR", "BST2 Switch", "BST2"},
866 {"RECMIXR", "BST1 Switch", "BST1"},
867
868 {"ADC L", NULL, "RECMIXL"},
869 {"ADC R", NULL, "RECMIXR"},
870
871 {"Stereo1 ADC MIXL", "ADC1 Switch", "ADC L"},
872 {"Stereo1 ADC MIXL", NULL, "stereo1 filter"},
873 {"stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll},
874
875 {"Stereo1 ADC MIXR", "ADC1 Switch", "ADC R"},
876 {"Stereo1 ADC MIXR", NULL, "stereo1 filter"},
877 {"stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll},
878
879 {"IF1 ADC1", NULL, "Stereo1 ADC MIXL"},
880 {"IF1 ADC1", NULL, "Stereo1 ADC MIXR"},
881 {"IF1 ADC1", NULL, "I2S1"},
882
883 {"AIF1TX", NULL, "IF1 ADC1"},
884
885 {"IF1 DAC", NULL, "AIF1RX"},
886 {"IF1 DAC", NULL, "I2S1"},
887
888 {"IF1 DAC1 L", NULL, "IF1 DAC"},
889 {"IF1 DAC1 R", NULL, "IF1 DAC"},
890
891 {"DAC MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"},
892 {"DAC MIXL", "INF1 Switch", "IF1 DAC1 L"},
893 {"DAC MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"},
894 {"DAC MIXR", "INF1 Switch", "IF1 DAC1 R"},
895
896 {"Audio DSP", NULL, "DAC MIXL"},
897 {"Audio DSP", NULL, "DAC MIXR"},
898
899 {"Stereo DAC MIXL", "DAC L1 Switch", "Audio DSP"},
900 {"Stereo DAC MIXL", "DAC R1 Switch", "DAC MIXR"},
901 {"Stereo DAC MIXL", NULL, "Stero1 DAC Power"},
902 {"Stereo DAC MIXR", "DAC R1 Switch", "Audio DSP"},
903 {"Stereo DAC MIXR", "DAC L1 Switch", "DAC MIXL"},
904 {"Stereo DAC MIXR", NULL, "Stero1 DAC Power"},
905
906 {"DAC L1", NULL, "Stereo DAC MIXL"},
907 {"DAC L1", NULL, "PLL1", is_sys_clk_from_pll},
908 {"DAC R1", NULL, "Stereo DAC MIXR"},
909 {"DAC R1", NULL, "PLL1", is_sys_clk_from_pll},
910
911 {"OUT MIXL", "BST1 Switch", "BST1"},
912 {"OUT MIXL", "BST2 Switch", "BST2"},
913 {"OUT MIXL", "INL1 Switch", "INL1 VOL"},
914 {"OUT MIXL", "REC MIXL Switch", "RECMIXL"},
915 {"OUT MIXL", "DAC L1 Switch", "DAC L1"},
916
917 {"OUT MIXR", "BST2 Switch", "BST2"},
918 {"OUT MIXR", "BST1 Switch", "BST1"},
919 {"OUT MIXR", "INR1 Switch", "INR1 VOL"},
920 {"OUT MIXR", "REC MIXR Switch", "RECMIXR"},
921 {"OUT MIXR", "DAC R1 Switch", "DAC R1"},
922
923 {"HPOVOL L", NULL, "OUT MIXL"},
924 {"HPOVOL R", NULL, "OUT MIXR"},
925 {"OUTVOL L", NULL, "OUT MIXL"},
926 {"OUTVOL R", NULL, "OUT MIXR"},
927
928 {"DAC 1", NULL, "DAC L1"},
929 {"DAC 1", NULL, "DAC R1"},
930 {"HPOVOL", NULL, "HPOVOL L"},
931 {"HPOVOL", NULL, "HPOVOL R"},
932 {"HPO MIX", "DAC1 Switch", "DAC 1"},
933 {"HPO MIX", "HPVOL Switch", "HPOVOL"},
934
935 {"LOUT MIX", "DAC L1 Switch", "DAC L1"},
936 {"LOUT MIX", "DAC R1 Switch", "DAC R1"},
937 {"LOUT MIX", "OUTVOL L Switch", "OUTVOL L"},
938 {"LOUT MIX", "OUTVOL R Switch", "OUTVOL R"},
939
940 {"HP amp", NULL, "HPO MIX"},
941 {"HP amp", NULL, "Charge Pump"},
942 {"HPOL", NULL, "HP amp"},
943 {"HPOR", NULL, "HP amp"},
944
945 {"LOUT amp", NULL, "LOUT MIX"},
946 {"LOUT amp", NULL, "Charge Pump"},
947 {"LOUTL", NULL, "LOUT amp"},
948 {"LOUTR", NULL, "LOUT amp"},
949
950};
951
952static int rt5616_hw_params(struct snd_pcm_substream *substream,
953 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
954{
955 struct snd_soc_pcm_runtime *rtd = substream->private_data;
956 struct snd_soc_codec *codec = rtd->codec;
957 struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
958 unsigned int val_len = 0, val_clk, mask_clk;
959 int pre_div, bclk_ms, frame_size;
960
961 rt5616->lrck[dai->id] = params_rate(params);
962
963 pre_div = rl6231_get_clk_info(rt5616->sysclk, rt5616->lrck[dai->id]);
964
965 if (pre_div < 0) {
966 dev_err(codec->dev, "Unsupported clock setting\n");
967 return -EINVAL;
968 }
969 frame_size = snd_soc_params_to_frame_size(params);
970 if (frame_size < 0) {
971 dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size);
972 return -EINVAL;
973 }
974 bclk_ms = frame_size > 32 ? 1 : 0;
975 rt5616->bclk[dai->id] = rt5616->lrck[dai->id] * (32 << bclk_ms);
976
977 dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n",
978 rt5616->bclk[dai->id], rt5616->lrck[dai->id]);
979 dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n",
980 bclk_ms, pre_div, dai->id);
981
982 switch (params_format(params)) {
983 case SNDRV_PCM_FORMAT_S16_LE:
984 break;
985 case SNDRV_PCM_FORMAT_S20_3LE:
986 val_len |= RT5616_I2S_DL_20;
987 break;
988 case SNDRV_PCM_FORMAT_S24_LE:
989 val_len |= RT5616_I2S_DL_24;
990 break;
991 case SNDRV_PCM_FORMAT_S8:
992 val_len |= RT5616_I2S_DL_8;
993 break;
994 default:
995 return -EINVAL;
996 }
997
998 mask_clk = RT5616_I2S_PD1_MASK;
999 val_clk = pre_div << RT5616_I2S_PD1_SFT;
1000 snd_soc_update_bits(codec, RT5616_I2S1_SDP,
1001 RT5616_I2S_DL_MASK, val_len);
1002 snd_soc_update_bits(codec, RT5616_ADDA_CLK1, mask_clk, val_clk);
1003
1004
1005 return 0;
1006}
1007
1008static int rt5616_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
1009{
1010 struct snd_soc_codec *codec = dai->codec;
1011 struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1012 unsigned int reg_val = 0;
1013
1014 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1015 case SND_SOC_DAIFMT_CBM_CFM:
1016 rt5616->master[dai->id] = 1;
1017 break;
1018 case SND_SOC_DAIFMT_CBS_CFS:
1019 reg_val |= RT5616_I2S_MS_S;
1020 rt5616->master[dai->id] = 0;
1021 break;
1022 default:
1023 return -EINVAL;
1024 }
1025
1026 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1027 case SND_SOC_DAIFMT_NB_NF:
1028 break;
1029 case SND_SOC_DAIFMT_IB_NF:
1030 reg_val |= RT5616_I2S_BP_INV;
1031 break;
1032 default:
1033 return -EINVAL;
1034 }
1035
1036 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1037 case SND_SOC_DAIFMT_I2S:
1038 break;
1039 case SND_SOC_DAIFMT_LEFT_J:
1040 reg_val |= RT5616_I2S_DF_LEFT;
1041 break;
1042 case SND_SOC_DAIFMT_DSP_A:
1043 reg_val |= RT5616_I2S_DF_PCM_A;
1044 break;
1045 case SND_SOC_DAIFMT_DSP_B:
1046 reg_val |= RT5616_I2S_DF_PCM_B;
1047 break;
1048 default:
1049 return -EINVAL;
1050 }
1051
1052 snd_soc_update_bits(codec, RT5616_I2S1_SDP,
1053 RT5616_I2S_MS_MASK | RT5616_I2S_BP_MASK |
1054 RT5616_I2S_DF_MASK, reg_val);
1055
1056
1057 return 0;
1058}
1059
1060static int rt5616_set_dai_sysclk(struct snd_soc_dai *dai,
1061 int clk_id, unsigned int freq, int dir)
1062{
1063 struct snd_soc_codec *codec = dai->codec;
1064 struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1065 unsigned int reg_val = 0;
1066
1067 if (freq == rt5616->sysclk && clk_id == rt5616->sysclk_src)
1068 return 0;
1069
1070 switch (clk_id) {
1071 case RT5616_SCLK_S_MCLK:
1072 reg_val |= RT5616_SCLK_SRC_MCLK;
1073 break;
1074 case RT5616_SCLK_S_PLL1:
1075 reg_val |= RT5616_SCLK_SRC_PLL1;
1076 break;
1077 default:
1078 dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id);
1079 return -EINVAL;
1080 }
1081 snd_soc_update_bits(codec, RT5616_GLB_CLK,
1082 RT5616_SCLK_SRC_MASK, reg_val);
1083 rt5616->sysclk = freq;
1084 rt5616->sysclk_src = clk_id;
1085
1086 dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
1087
1088 return 0;
1089}
1090
1091static int rt5616_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
1092 unsigned int freq_in, unsigned int freq_out)
1093{
1094 struct snd_soc_codec *codec = dai->codec;
1095 struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1096 struct rl6231_pll_code pll_code;
1097 int ret;
1098
1099 if (source == rt5616->pll_src && freq_in == rt5616->pll_in &&
1100 freq_out == rt5616->pll_out)
1101 return 0;
1102
1103 if (!freq_in || !freq_out) {
1104 dev_dbg(codec->dev, "PLL disabled\n");
1105
1106 rt5616->pll_in = 0;
1107 rt5616->pll_out = 0;
1108 snd_soc_update_bits(codec, RT5616_GLB_CLK,
1109 RT5616_SCLK_SRC_MASK, RT5616_SCLK_SRC_MCLK);
1110 return 0;
1111 }
1112
1113 switch (source) {
1114 case RT5616_PLL1_S_MCLK:
1115 snd_soc_update_bits(codec, RT5616_GLB_CLK,
1116 RT5616_PLL1_SRC_MASK, RT5616_PLL1_SRC_MCLK);
1117 break;
1118 case RT5616_PLL1_S_BCLK1:
1119 case RT5616_PLL1_S_BCLK2:
1120 snd_soc_update_bits(codec, RT5616_GLB_CLK,
1121 RT5616_PLL1_SRC_MASK, RT5616_PLL1_SRC_BCLK1);
1122 break;
1123 default:
1124 dev_err(codec->dev, "Unknown PLL source %d\n", source);
1125 return -EINVAL;
1126 }
1127
1128 ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
1129 if (ret < 0) {
1130 dev_err(codec->dev, "Unsupport input clock %d\n", freq_in);
1131 return ret;
1132 }
1133
1134 dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n",
1135 pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
1136 pll_code.n_code, pll_code.k_code);
1137
1138 snd_soc_write(codec, RT5616_PLL_CTRL1,
1139 pll_code.n_code << RT5616_PLL_N_SFT | pll_code.k_code);
1140 snd_soc_write(codec, RT5616_PLL_CTRL2,
1141 (pll_code.m_bp ? 0 : pll_code.m_code) << RT5616_PLL_M_SFT |
1142 pll_code.m_bp << RT5616_PLL_M_BP_SFT);
1143
1144 rt5616->pll_in = freq_in;
1145 rt5616->pll_out = freq_out;
1146 rt5616->pll_src = source;
1147
1148 return 0;
1149}
1150
1151static int rt5616_set_bias_level(struct snd_soc_codec *codec,
1152 enum snd_soc_bias_level level)
1153{
1154 switch (level) {
1155 case SND_SOC_BIAS_STANDBY:
1156 if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
1157 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
1158 RT5616_PWR_VREF1 | RT5616_PWR_MB |
1159 RT5616_PWR_BG | RT5616_PWR_VREF2,
1160 RT5616_PWR_VREF1 | RT5616_PWR_MB |
1161 RT5616_PWR_BG | RT5616_PWR_VREF2);
1162 mdelay(10);
1163 snd_soc_update_bits(codec, RT5616_PWR_ANLG1,
1164 RT5616_PWR_FV1 | RT5616_PWR_FV2,
1165 RT5616_PWR_FV1 | RT5616_PWR_FV2);
1166 snd_soc_update_bits(codec, RT5616_D_MISC,
1167 RT5616_D_GATE_EN, RT5616_D_GATE_EN);
1168 }
1169 break;
1170
1171 case SND_SOC_BIAS_OFF:
1172 snd_soc_update_bits(codec, RT5616_D_MISC, RT5616_D_GATE_EN, 0);
1173 snd_soc_write(codec, RT5616_PWR_DIG1, 0x0000);
1174 snd_soc_write(codec, RT5616_PWR_DIG2, 0x0000);
1175 snd_soc_write(codec, RT5616_PWR_VOL, 0x0000);
1176 snd_soc_write(codec, RT5616_PWR_MIXER, 0x0000);
1177 snd_soc_write(codec, RT5616_PWR_ANLG1, 0x0000);
1178 snd_soc_write(codec, RT5616_PWR_ANLG2, 0x0000);
1179 break;
1180
1181 default:
1182 break;
1183 }
1184
1185 return 0;
1186}
1187
1188static int rt5616_probe(struct snd_soc_codec *codec)
1189{
1190 struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1191
1192 rt5616->codec = codec;
1193
1194 return 0;
1195}
1196
1197#ifdef CONFIG_PM
1198static int rt5616_suspend(struct snd_soc_codec *codec)
1199{
1200 struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1201
1202 regcache_cache_only(rt5616->regmap, true);
1203 regcache_mark_dirty(rt5616->regmap);
1204
1205 return 0;
1206}
1207
1208static int rt5616_resume(struct snd_soc_codec *codec)
1209{
1210 struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
1211
1212 regcache_cache_only(rt5616->regmap, false);
1213 regcache_sync(rt5616->regmap);
1214 return 0;
1215}
1216#else
1217#define rt5616_suspend NULL
1218#define rt5616_resume NULL
1219#endif
1220
1221#define RT5616_STEREO_RATES SNDRV_PCM_RATE_8000_96000
1222#define RT5616_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1223 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
1224
1225
1226struct snd_soc_dai_ops rt5616_aif_dai_ops = {
1227 .hw_params = rt5616_hw_params,
1228 .set_fmt = rt5616_set_dai_fmt,
1229 .set_sysclk = rt5616_set_dai_sysclk,
1230 .set_pll = rt5616_set_dai_pll,
1231};
1232
1233struct snd_soc_dai_driver rt5616_dai[] = {
1234 {
1235 .name = "rt5616-aif1",
1236 .id = RT5616_AIF1,
1237 .playback = {
1238 .stream_name = "AIF1 Playback",
1239 .channels_min = 1,
1240 .channels_max = 2,
1241 .rates = RT5616_STEREO_RATES,
1242 .formats = RT5616_FORMATS,
1243 },
1244 .capture = {
1245 .stream_name = "AIF1 Capture",
1246 .channels_min = 1,
1247 .channels_max = 2,
1248 .rates = RT5616_STEREO_RATES,
1249 .formats = RT5616_FORMATS,
1250 },
1251 .ops = &rt5616_aif_dai_ops,
1252 },
1253};
1254
1255static struct snd_soc_codec_driver soc_codec_dev_rt5616 = {
1256 .probe = rt5616_probe,
1257 .suspend = rt5616_suspend,
1258 .resume = rt5616_resume,
1259 .set_bias_level = rt5616_set_bias_level,
1260 .idle_bias_off = true,
1261 .controls = rt5616_snd_controls,
1262 .num_controls = ARRAY_SIZE(rt5616_snd_controls),
1263 .dapm_widgets = rt5616_dapm_widgets,
1264 .num_dapm_widgets = ARRAY_SIZE(rt5616_dapm_widgets),
1265 .dapm_routes = rt5616_dapm_routes,
1266 .num_dapm_routes = ARRAY_SIZE(rt5616_dapm_routes),
1267};
1268
1269static const struct regmap_config rt5616_regmap = {
1270 .reg_bits = 8,
1271 .val_bits = 16,
1272 .use_single_rw = true,
1273 .max_register = RT5616_DEVICE_ID + 1 + (ARRAY_SIZE(rt5616_ranges) *
1274 RT5616_PR_SPACING),
1275 .volatile_reg = rt5616_volatile_register,
1276 .readable_reg = rt5616_readable_register,
1277 .cache_type = REGCACHE_RBTREE,
1278 .reg_defaults = rt5616_reg,
1279 .num_reg_defaults = ARRAY_SIZE(rt5616_reg),
1280 .ranges = rt5616_ranges,
1281 .num_ranges = ARRAY_SIZE(rt5616_ranges),
1282};
1283
1284static const struct i2c_device_id rt5616_i2c_id[] = {
1285 { "rt5616", 0 },
1286 { }
1287};
1288MODULE_DEVICE_TABLE(i2c, rt5616_i2c_id);
1289
1290#if defined(CONFIG_OF)
1291static const struct of_device_id rt5616_of_match[] = {
1292 { .compatible = "realtek,rt5616", },
1293 {},
1294};
1295MODULE_DEVICE_TABLE(of, rt5616_of_match);
1296#endif
1297
1298static int rt5616_i2c_probe(struct i2c_client *i2c,
1299 const struct i2c_device_id *id)
1300{
1301 struct rt5616_priv *rt5616;
1302 unsigned int val;
1303 int ret;
1304
1305 rt5616 = devm_kzalloc(&i2c->dev, sizeof(struct rt5616_priv),
1306 GFP_KERNEL);
1307 if (rt5616 == NULL)
1308 return -ENOMEM;
1309
1310 i2c_set_clientdata(i2c, rt5616);
1311
1312 rt5616->regmap = devm_regmap_init_i2c(i2c, &rt5616_regmap);
1313 if (IS_ERR(rt5616->regmap)) {
1314 ret = PTR_ERR(rt5616->regmap);
1315 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
1316 ret);
1317 return ret;
1318 }
1319
1320 regmap_read(rt5616->regmap, RT5616_DEVICE_ID, &val);
1321 if (val != 0x6281) {
1322 dev_err(&i2c->dev,
1323 "Device with ID register %#x is not rt5616\n",
1324 val);
1325 return -ENODEV;
1326 }
1327 regmap_write(rt5616->regmap, RT5616_RESET, 0);
1328 regmap_update_bits(rt5616->regmap, RT5616_PWR_ANLG1,
1329 RT5616_PWR_VREF1 | RT5616_PWR_MB |
1330 RT5616_PWR_BG | RT5616_PWR_VREF2,
1331 RT5616_PWR_VREF1 | RT5616_PWR_MB |
1332 RT5616_PWR_BG | RT5616_PWR_VREF2);
1333 mdelay(10);
1334 regmap_update_bits(rt5616->regmap, RT5616_PWR_ANLG1,
1335 RT5616_PWR_FV1 | RT5616_PWR_FV2,
1336 RT5616_PWR_FV1 | RT5616_PWR_FV2);
1337
1338 ret = regmap_register_patch(rt5616->regmap, init_list,
1339 ARRAY_SIZE(init_list));
1340 if (ret != 0)
1341 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
1342
1343 regmap_update_bits(rt5616->regmap, RT5616_PWR_ANLG1,
1344 RT5616_PWR_LDO_DVO_MASK, RT5616_PWR_LDO_DVO_1_2V);
1345
1346 return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5616,
1347 rt5616_dai, ARRAY_SIZE(rt5616_dai));
1348
1349}
1350
1351static int rt5616_i2c_remove(struct i2c_client *i2c)
1352{
1353 snd_soc_unregister_codec(&i2c->dev);
1354
1355 return 0;
1356}
1357
1358static void rt5616_i2c_shutdown(struct i2c_client *client)
1359{
1360 struct rt5616_priv *rt5616 = i2c_get_clientdata(client);
1361
1362 regmap_write(rt5616->regmap, RT5616_HP_VOL, 0xc8c8);
1363 regmap_write(rt5616->regmap, RT5616_LOUT_CTRL1, 0xc8c8);
1364
1365}
1366
1367static struct i2c_driver rt5616_i2c_driver = {
1368 .driver = {
1369 .name = "rt5616",
1370 .of_match_table = of_match_ptr(rt5616_of_match),
1371 },
1372 .probe = rt5616_i2c_probe,
1373 .remove = rt5616_i2c_remove,
1374 .shutdown = rt5616_i2c_shutdown,
1375 .id_table = rt5616_i2c_id,
1376};
1377module_i2c_driver(rt5616_i2c_driver);
1378
1379MODULE_DESCRIPTION("ASoC RT5616 driver");
1380MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
1381MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/rt5616.h b/sound/soc/codecs/rt5616.h
new file mode 100644
index 000000000000..f88cdddbc34a
--- /dev/null
+++ b/sound/soc/codecs/rt5616.h
@@ -0,0 +1,1819 @@
1/*
2 * rt5616.h -- RT5616 ALSA SoC audio driver
3 *
4 * Copyright 2011 Realtek Microelectronics
5 * Author: Johnny Hsu <johnnyhsu@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#ifndef __RT5616_H__
13#define __RT5616_H__
14
15/* Info */
16#define RT5616_RESET 0x00
17#define RT5616_VERSION_ID 0xfd
18#define RT5616_VENDOR_ID 0xfe
19#define RT5616_DEVICE_ID 0xff
20/* I/O - Output */
21#define RT5616_HP_VOL 0x02
22#define RT5616_LOUT_CTRL1 0x03
23#define RT5616_LOUT_CTRL2 0x05
24/* I/O - Input */
25#define RT5616_IN1_IN2 0x0d
26#define RT5616_INL1_INR1_VOL 0x0f
27/* I/O - ADC/DAC/DMIC */
28#define RT5616_DAC1_DIG_VOL 0x19
29#define RT5616_ADC_DIG_VOL 0x1c
30#define RT5616_ADC_BST_VOL 0x1e
31/* Mixer - D-D */
32#define RT5616_STO1_ADC_MIXER 0x27
33#define RT5616_AD_DA_MIXER 0x29
34#define RT5616_STO_DAC_MIXER 0x2a
35
36/* Mixer - ADC */
37#define RT5616_REC_L1_MIXER 0x3b
38#define RT5616_REC_L2_MIXER 0x3c
39#define RT5616_REC_R1_MIXER 0x3d
40#define RT5616_REC_R2_MIXER 0x3e
41/* Mixer - DAC */
42#define RT5616_HPO_MIXER 0x45
43#define RT5616_OUT_L1_MIXER 0x4d
44#define RT5616_OUT_L2_MIXER 0x4e
45#define RT5616_OUT_L3_MIXER 0x4f
46#define RT5616_OUT_R1_MIXER 0x50
47#define RT5616_OUT_R2_MIXER 0x51
48#define RT5616_OUT_R3_MIXER 0x52
49#define RT5616_LOUT_MIXER 0x53
50/* Power */
51#define RT5616_PWR_DIG1 0x61
52#define RT5616_PWR_DIG2 0x62
53#define RT5616_PWR_ANLG1 0x63
54#define RT5616_PWR_ANLG2 0x64
55#define RT5616_PWR_MIXER 0x65
56#define RT5616_PWR_VOL 0x66
57/* Private Register Control */
58#define RT5616_PRIV_INDEX 0x6a
59#define RT5616_PRIV_DATA 0x6c
60/* Format - ADC/DAC */
61#define RT5616_I2S1_SDP 0x70
62#define RT5616_ADDA_CLK1 0x73
63#define RT5616_ADDA_CLK2 0x74
64
65/* Function - Analog */
66#define RT5616_GLB_CLK 0x80
67#define RT5616_PLL_CTRL1 0x81
68#define RT5616_PLL_CTRL2 0x82
69#define RT5616_HP_OVCD 0x8b
70#define RT5616_DEPOP_M1 0x8e
71#define RT5616_DEPOP_M2 0x8f
72#define RT5616_DEPOP_M3 0x90
73#define RT5616_CHARGE_PUMP 0x91
74#define RT5616_PV_DET_SPK_G 0x92
75#define RT5616_MICBIAS 0x93
76#define RT5616_A_JD_CTL1 0x94
77#define RT5616_A_JD_CTL2 0x95
78/* Function - Digital */
79#define RT5616_EQ_CTRL1 0xb0
80#define RT5616_EQ_CTRL2 0xb1
81#define RT5616_WIND_FILTER 0xb2
82#define RT5616_DRC_AGC_1 0xb4
83#define RT5616_DRC_AGC_2 0xb5
84#define RT5616_DRC_AGC_3 0xb6
85#define RT5616_SVOL_ZC 0xb7
86#define RT5616_JD_CTRL1 0xbb
87#define RT5616_JD_CTRL2 0xbc
88#define RT5616_IRQ_CTRL1 0xbd
89#define RT5616_IRQ_CTRL2 0xbe
90#define RT5616_INT_IRQ_ST 0xbf
91#define RT5616_GPIO_CTRL1 0xc0
92#define RT5616_GPIO_CTRL2 0xc1
93#define RT5616_GPIO_CTRL3 0xc2
94#define RT5616_PGM_REG_ARR1 0xc8
95#define RT5616_PGM_REG_ARR2 0xc9
96#define RT5616_PGM_REG_ARR3 0xca
97#define RT5616_PGM_REG_ARR4 0xcb
98#define RT5616_PGM_REG_ARR5 0xcc
99#define RT5616_SCB_FUNC 0xcd
100#define RT5616_SCB_CTRL 0xce
101#define RT5616_BASE_BACK 0xcf
102#define RT5616_MP3_PLUS1 0xd0
103#define RT5616_MP3_PLUS2 0xd1
104#define RT5616_ADJ_HPF_CTRL1 0xd3
105#define RT5616_ADJ_HPF_CTRL2 0xd4
106#define RT5616_HP_CALIB_AMP_DET 0xd6
107#define RT5616_HP_CALIB2 0xd7
108#define RT5616_SV_ZCD1 0xd9
109#define RT5616_SV_ZCD2 0xda
110#define RT5616_D_MISC 0xfa
111/* Dummy Register */
112#define RT5616_DUMMY2 0xfb
113#define RT5616_DUMMY3 0xfc
114
115
116/* Index of Codec Private Register definition */
117#define RT5616_BIAS_CUR1 0x12
118#define RT5616_BIAS_CUR3 0x14
119#define RT5616_CLSD_INT_REG1 0x1c
120#define RT5616_MAMP_INT_REG2 0x37
121#define RT5616_CHOP_DAC_ADC 0x3d
122#define RT5616_3D_SPK 0x63
123#define RT5616_WND_1 0x6c
124#define RT5616_WND_2 0x6d
125#define RT5616_WND_3 0x6e
126#define RT5616_WND_4 0x6f
127#define RT5616_WND_5 0x70
128#define RT5616_WND_8 0x73
129#define RT5616_DIP_SPK_INF 0x75
130#define RT5616_HP_DCC_INT1 0x77
131#define RT5616_EQ_BW_LOP 0xa0
132#define RT5616_EQ_GN_LOP 0xa1
133#define RT5616_EQ_FC_BP1 0xa2
134#define RT5616_EQ_BW_BP1 0xa3
135#define RT5616_EQ_GN_BP1 0xa4
136#define RT5616_EQ_FC_BP2 0xa5
137#define RT5616_EQ_BW_BP2 0xa6
138#define RT5616_EQ_GN_BP2 0xa7
139#define RT5616_EQ_FC_BP3 0xa8
140#define RT5616_EQ_BW_BP3 0xa9
141#define RT5616_EQ_GN_BP3 0xaa
142#define RT5616_EQ_FC_BP4 0xab
143#define RT5616_EQ_BW_BP4 0xac
144#define RT5616_EQ_GN_BP4 0xad
145#define RT5616_EQ_FC_HIP1 0xae
146#define RT5616_EQ_GN_HIP1 0xaf
147#define RT5616_EQ_FC_HIP2 0xb0
148#define RT5616_EQ_BW_HIP2 0xb1
149#define RT5616_EQ_GN_HIP2 0xb2
150#define RT5616_EQ_PRE_VOL 0xb3
151#define RT5616_EQ_PST_VOL 0xb4
152
153
154/* global definition */
155#define RT5616_L_MUTE (0x1 << 15)
156#define RT5616_L_MUTE_SFT 15
157#define RT5616_VOL_L_MUTE (0x1 << 14)
158#define RT5616_VOL_L_SFT 14
159#define RT5616_R_MUTE (0x1 << 7)
160#define RT5616_R_MUTE_SFT 7
161#define RT5616_VOL_R_MUTE (0x1 << 6)
162#define RT5616_VOL_R_SFT 6
163#define RT5616_L_VOL_MASK (0x3f << 8)
164#define RT5616_L_VOL_SFT 8
165#define RT5616_R_VOL_MASK (0x3f)
166#define RT5616_R_VOL_SFT 0
167
168/* LOUT Control 2(0x05) */
169#define RT5616_EN_DFO (0x1 << 15)
170
171/* IN1 and IN2 Control (0x0d) */
172/* IN3 and IN4 Control (0x0e) */
173#define RT5616_BST_MASK1 (0xf<<12)
174#define RT5616_BST_SFT1 12
175#define RT5616_BST_MASK2 (0xf<<8)
176#define RT5616_BST_SFT2 8
177#define RT5616_IN_DF1 (0x1 << 7)
178#define RT5616_IN_SFT1 7
179#define RT5616_IN_DF2 (0x1 << 6)
180#define RT5616_IN_SFT2 6
181
182/* INL1 and INR1 Volume Control (0x0f) */
183#define RT5616_INL_VOL_MASK (0x1f << 8)
184#define RT5616_INL_VOL_SFT 8
185#define RT5616_INR_SEL_MASK (0x1 << 7)
186#define RT5616_INR_SEL_SFT 7
187#define RT5616_INR_SEL_IN4N (0x0 << 7)
188#define RT5616_INR_SEL_MONON (0x1 << 7)
189#define RT5616_INR_VOL_MASK (0x1f)
190#define RT5616_INR_VOL_SFT 0
191
192/* DAC1 Digital Volume (0x19) */
193#define RT5616_DAC_L1_VOL_MASK (0xff << 8)
194#define RT5616_DAC_L1_VOL_SFT 8
195#define RT5616_DAC_R1_VOL_MASK (0xff)
196#define RT5616_DAC_R1_VOL_SFT 0
197
198/* DAC2 Digital Volume (0x1a) */
199#define RT5616_DAC_L2_VOL_MASK (0xff << 8)
200#define RT5616_DAC_L2_VOL_SFT 8
201#define RT5616_DAC_R2_VOL_MASK (0xff)
202#define RT5616_DAC_R2_VOL_SFT 0
203
204/* ADC Digital Volume Control (0x1c) */
205#define RT5616_ADC_L_VOL_MASK (0x7f << 8)
206#define RT5616_ADC_L_VOL_SFT 8
207#define RT5616_ADC_R_VOL_MASK (0x7f)
208#define RT5616_ADC_R_VOL_SFT 0
209
210/* Mono ADC Digital Volume Control (0x1d) */
211#define RT5616_M_MONO_ADC_L (0x1 << 15)
212#define RT5616_M_MONO_ADC_L_SFT 15
213#define RT5616_MONO_ADC_L_VOL_MASK (0x7f << 8)
214#define RT5616_MONO_ADC_L_VOL_SFT 8
215#define RT5616_M_MONO_ADC_R (0x1 << 7)
216#define RT5616_M_MONO_ADC_R_SFT 7
217#define RT5616_MONO_ADC_R_VOL_MASK (0x7f)
218#define RT5616_MONO_ADC_R_VOL_SFT 0
219
220/* ADC Boost Volume Control (0x1e) */
221#define RT5616_ADC_L_BST_MASK (0x3 << 14)
222#define RT5616_ADC_L_BST_SFT 14
223#define RT5616_ADC_R_BST_MASK (0x3 << 12)
224#define RT5616_ADC_R_BST_SFT 12
225#define RT5616_ADC_COMP_MASK (0x3 << 10)
226#define RT5616_ADC_COMP_SFT 10
227
228/* Stereo ADC1 Mixer Control (0x27) */
229#define RT5616_M_STO1_ADC_L1 (0x1 << 14)
230#define RT5616_M_STO1_ADC_L1_SFT 14
231#define RT5616_M_STO1_ADC_R1 (0x1 << 6)
232#define RT5616_M_STO1_ADC_R1_SFT 6
233
234/* ADC Mixer to DAC Mixer Control (0x29) */
235#define RT5616_M_ADCMIX_L (0x1 << 15)
236#define RT5616_M_ADCMIX_L_SFT 15
237#define RT5616_M_IF1_DAC_L (0x1 << 14)
238#define RT5616_M_IF1_DAC_L_SFT 14
239#define RT5616_M_ADCMIX_R (0x1 << 7)
240#define RT5616_M_ADCMIX_R_SFT 7
241#define RT5616_M_IF1_DAC_R (0x1 << 6)
242#define RT5616_M_IF1_DAC_R_SFT 6
243
244/* Stereo DAC Mixer Control (0x2a) */
245#define RT5616_M_DAC_L1_MIXL (0x1 << 14)
246#define RT5616_M_DAC_L1_MIXL_SFT 14
247#define RT5616_DAC_L1_STO_L_VOL_MASK (0x1 << 13)
248#define RT5616_DAC_L1_STO_L_VOL_SFT 13
249#define RT5616_M_DAC_R1_MIXL (0x1 << 9)
250#define RT5616_M_DAC_R1_MIXL_SFT 9
251#define RT5616_DAC_R1_STO_L_VOL_MASK (0x1 << 8)
252#define RT5616_DAC_R1_STO_L_VOL_SFT 8
253#define RT5616_M_DAC_R1_MIXR (0x1 << 6)
254#define RT5616_M_DAC_R1_MIXR_SFT 6
255#define RT5616_DAC_R1_STO_R_VOL_MASK (0x1 << 5)
256#define RT5616_DAC_R1_STO_R_VOL_SFT 5
257#define RT5616_M_DAC_L1_MIXR (0x1 << 1)
258#define RT5616_M_DAC_L1_MIXR_SFT 1
259#define RT5616_DAC_L1_STO_R_VOL_MASK (0x1)
260#define RT5616_DAC_L1_STO_R_VOL_SFT 0
261
262/* DD Mixer Control (0x2b) */
263#define RT5616_M_STO_DD_L1 (0x1 << 14)
264#define RT5616_M_STO_DD_L1_SFT 14
265#define RT5616_STO_DD_L1_VOL_MASK (0x1 << 13)
266#define RT5616_DAC_DD_L1_VOL_SFT 13
267#define RT5616_M_STO_DD_L2 (0x1 << 12)
268#define RT5616_M_STO_DD_L2_SFT 12
269#define RT5616_STO_DD_L2_VOL_MASK (0x1 << 11)
270#define RT5616_STO_DD_L2_VOL_SFT 11
271#define RT5616_M_STO_DD_R2_L (0x1 << 10)
272#define RT5616_M_STO_DD_R2_L_SFT 10
273#define RT5616_STO_DD_R2_L_VOL_MASK (0x1 << 9)
274#define RT5616_STO_DD_R2_L_VOL_SFT 9
275#define RT5616_M_STO_DD_R1 (0x1 << 6)
276#define RT5616_M_STO_DD_R1_SFT 6
277#define RT5616_STO_DD_R1_VOL_MASK (0x1 << 5)
278#define RT5616_STO_DD_R1_VOL_SFT 5
279#define RT5616_M_STO_DD_R2 (0x1 << 4)
280#define RT5616_M_STO_DD_R2_SFT 4
281#define RT5616_STO_DD_R2_VOL_MASK (0x1 << 3)
282#define RT5616_STO_DD_R2_VOL_SFT 3
283#define RT5616_M_STO_DD_L2_R (0x1 << 2)
284#define RT5616_M_STO_DD_L2_R_SFT 2
285#define RT5616_STO_DD_L2_R_VOL_MASK (0x1 << 1)
286#define RT5616_STO_DD_L2_R_VOL_SFT 1
287
288/* Digital Mixer Control (0x2c) */
289#define RT5616_M_STO_L_DAC_L (0x1 << 15)
290#define RT5616_M_STO_L_DAC_L_SFT 15
291#define RT5616_STO_L_DAC_L_VOL_MASK (0x1 << 14)
292#define RT5616_STO_L_DAC_L_VOL_SFT 14
293#define RT5616_M_DAC_L2_DAC_L (0x1 << 13)
294#define RT5616_M_DAC_L2_DAC_L_SFT 13
295#define RT5616_DAC_L2_DAC_L_VOL_MASK (0x1 << 12)
296#define RT5616_DAC_L2_DAC_L_VOL_SFT 12
297#define RT5616_M_STO_R_DAC_R (0x1 << 11)
298#define RT5616_M_STO_R_DAC_R_SFT 11
299#define RT5616_STO_R_DAC_R_VOL_MASK (0x1 << 10)
300#define RT5616_STO_R_DAC_R_VOL_SFT 10
301#define RT5616_M_DAC_R2_DAC_R (0x1 << 9)
302#define RT5616_M_DAC_R2_DAC_R_SFT 9
303#define RT5616_DAC_R2_DAC_R_VOL_MASK (0x1 << 8)
304#define RT5616_DAC_R2_DAC_R_VOL_SFT 8
305
306/* DSP Path Control 1 (0x2d) */
307#define RT5616_RXDP_SRC_MASK (0x1 << 15)
308#define RT5616_RXDP_SRC_SFT 15
309#define RT5616_RXDP_SRC_NOR (0x0 << 15)
310#define RT5616_RXDP_SRC_DIV3 (0x1 << 15)
311#define RT5616_TXDP_SRC_MASK (0x1 << 14)
312#define RT5616_TXDP_SRC_SFT 14
313#define RT5616_TXDP_SRC_NOR (0x0 << 14)
314#define RT5616_TXDP_SRC_DIV3 (0x1 << 14)
315
316/* DSP Path Control 2 (0x2e) */
317#define RT5616_DAC_L2_SEL_MASK (0x3 << 14)
318#define RT5616_DAC_L2_SEL_SFT 14
319#define RT5616_DAC_L2_SEL_IF2 (0x0 << 14)
320#define RT5616_DAC_L2_SEL_IF3 (0x1 << 14)
321#define RT5616_DAC_L2_SEL_TXDC (0x2 << 14)
322#define RT5616_DAC_L2_SEL_BASS (0x3 << 14)
323#define RT5616_DAC_R2_SEL_MASK (0x3 << 12)
324#define RT5616_DAC_R2_SEL_SFT 12
325#define RT5616_DAC_R2_SEL_IF2 (0x0 << 12)
326#define RT5616_DAC_R2_SEL_IF3 (0x1 << 12)
327#define RT5616_DAC_R2_SEL_TXDC (0x2 << 12)
328#define RT5616_IF2_ADC_L_SEL_MASK (0x1 << 11)
329#define RT5616_IF2_ADC_L_SEL_SFT 11
330#define RT5616_IF2_ADC_L_SEL_TXDP (0x0 << 11)
331#define RT5616_IF2_ADC_L_SEL_PASS (0x1 << 11)
332#define RT5616_IF2_ADC_R_SEL_MASK (0x1 << 10)
333#define RT5616_IF2_ADC_R_SEL_SFT 10
334#define RT5616_IF2_ADC_R_SEL_TXDP (0x0 << 10)
335#define RT5616_IF2_ADC_R_SEL_PASS (0x1 << 10)
336#define RT5616_RXDC_SEL_MASK (0x3 << 8)
337#define RT5616_RXDC_SEL_SFT 8
338#define RT5616_RXDC_SEL_NOR (0x0 << 8)
339#define RT5616_RXDC_SEL_L2R (0x1 << 8)
340#define RT5616_RXDC_SEL_R2L (0x2 << 8)
341#define RT5616_RXDC_SEL_SWAP (0x3 << 8)
342#define RT5616_RXDP_SEL_MASK (0x3 << 6)
343#define RT5616_RXDP_SEL_SFT 6
344#define RT5616_RXDP_SEL_NOR (0x0 << 6)
345#define RT5616_RXDP_SEL_L2R (0x1 << 6)
346#define RT5616_RXDP_SEL_R2L (0x2 << 6)
347#define RT5616_RXDP_SEL_SWAP (0x3 << 6)
348#define RT5616_TXDC_SEL_MASK (0x3 << 4)
349#define RT5616_TXDC_SEL_SFT 4
350#define RT5616_TXDC_SEL_NOR (0x0 << 4)
351#define RT5616_TXDC_SEL_L2R (0x1 << 4)
352#define RT5616_TXDC_SEL_R2L (0x2 << 4)
353#define RT5616_TXDC_SEL_SWAP (0x3 << 4)
354#define RT5616_TXDP_SEL_MASK (0x3 << 2)
355#define RT5616_TXDP_SEL_SFT 2
356#define RT5616_TXDP_SEL_NOR (0x0 << 2)
357#define RT5616_TXDP_SEL_L2R (0x1 << 2)
358#define RT5616_TXDP_SEL_R2L (0x2 << 2)
359#define RT5616_TRXDP_SEL_SWAP (0x3 << 2)
360
361/* REC Left Mixer Control 1 (0x3b) */
362#define RT5616_G_LN_L2_RM_L_MASK (0x7 << 13)
363#define RT5616_G_IN_L2_RM_L_SFT 13
364#define RT5616_G_LN_L1_RM_L_MASK (0x7 << 10)
365#define RT5616_G_IN_L1_RM_L_SFT 10
366#define RT5616_G_BST3_RM_L_MASK (0x7 << 4)
367#define RT5616_G_BST3_RM_L_SFT 4
368#define RT5616_G_BST2_RM_L_MASK (0x7 << 1)
369#define RT5616_G_BST2_RM_L_SFT 1
370
371/* REC Left Mixer Control 2 (0x3c) */
372#define RT5616_G_BST1_RM_L_MASK (0x7 << 13)
373#define RT5616_G_BST1_RM_L_SFT 13
374#define RT5616_G_OM_L_RM_L_MASK (0x7 << 10)
375#define RT5616_G_OM_L_RM_L_SFT 10
376#define RT5616_M_IN2_L_RM_L (0x1 << 6)
377#define RT5616_M_IN2_L_RM_L_SFT 6
378#define RT5616_M_IN1_L_RM_L (0x1 << 5)
379#define RT5616_M_IN1_L_RM_L_SFT 5
380#define RT5616_M_BST3_RM_L (0x1 << 3)
381#define RT5616_M_BST3_RM_L_SFT 3
382#define RT5616_M_BST2_RM_L (0x1 << 2)
383#define RT5616_M_BST2_RM_L_SFT 2
384#define RT5616_M_BST1_RM_L (0x1 << 1)
385#define RT5616_M_BST1_RM_L_SFT 1
386#define RT5616_M_OM_L_RM_L (0x1)
387#define RT5616_M_OM_L_RM_L_SFT 0
388
389/* REC Right Mixer Control 1 (0x3d) */
390#define RT5616_G_IN2_R_RM_R_MASK (0x7 << 13)
391#define RT5616_G_IN2_R_RM_R_SFT 13
392#define RT5616_G_IN1_R_RM_R_MASK (0x7 << 10)
393#define RT5616_G_IN1_R_RM_R_SFT 10
394#define RT5616_G_BST3_RM_R_MASK (0x7 << 4)
395#define RT5616_G_BST3_RM_R_SFT 4
396#define RT5616_G_BST2_RM_R_MASK (0x7 << 1)
397#define RT5616_G_BST2_RM_R_SFT 1
398
399/* REC Right Mixer Control 2 (0x3e) */
400#define RT5616_G_BST1_RM_R_MASK (0x7 << 13)
401#define RT5616_G_BST1_RM_R_SFT 13
402#define RT5616_G_OM_R_RM_R_MASK (0x7 << 10)
403#define RT5616_G_OM_R_RM_R_SFT 10
404#define RT5616_M_IN2_R_RM_R (0x1 << 6)
405#define RT5616_M_IN2_R_RM_R_SFT 6
406#define RT5616_M_IN1_R_RM_R (0x1 << 5)
407#define RT5616_M_IN1_R_RM_R_SFT 5
408#define RT5616_M_BST3_RM_R (0x1 << 3)
409#define RT5616_M_BST3_RM_R_SFT 3
410#define RT5616_M_BST2_RM_R (0x1 << 2)
411#define RT5616_M_BST2_RM_R_SFT 2
412#define RT5616_M_BST1_RM_R (0x1 << 1)
413#define RT5616_M_BST1_RM_R_SFT 1
414#define RT5616_M_OM_R_RM_R (0x1)
415#define RT5616_M_OM_R_RM_R_SFT 0
416
417/* HPMIX Control (0x45) */
418#define RT5616_M_DAC1_HM (0x1 << 14)
419#define RT5616_M_DAC1_HM_SFT 14
420#define RT5616_M_HPVOL_HM (0x1 << 13)
421#define RT5616_M_HPVOL_HM_SFT 13
422#define RT5616_G_HPOMIX_MASK (0x1 << 12)
423#define RT5616_G_HPOMIX_SFT 12
424
425/* SPK Left Mixer Control (0x46) */
426#define RT5616_G_RM_L_SM_L_MASK (0x3 << 14)
427#define RT5616_G_RM_L_SM_L_SFT 14
428#define RT5616_G_IN_L_SM_L_MASK (0x3 << 12)
429#define RT5616_G_IN_L_SM_L_SFT 12
430#define RT5616_G_DAC_L1_SM_L_MASK (0x3 << 10)
431#define RT5616_G_DAC_L1_SM_L_SFT 10
432#define RT5616_G_DAC_L2_SM_L_MASK (0x3 << 8)
433#define RT5616_G_DAC_L2_SM_L_SFT 8
434#define RT5616_G_OM_L_SM_L_MASK (0x3 << 6)
435#define RT5616_G_OM_L_SM_L_SFT 6
436#define RT5616_M_RM_L_SM_L (0x1 << 5)
437#define RT5616_M_RM_L_SM_L_SFT 5
438#define RT5616_M_IN_L_SM_L (0x1 << 4)
439#define RT5616_M_IN_L_SM_L_SFT 4
440#define RT5616_M_DAC_L1_SM_L (0x1 << 3)
441#define RT5616_M_DAC_L1_SM_L_SFT 3
442#define RT5616_M_DAC_L2_SM_L (0x1 << 2)
443#define RT5616_M_DAC_L2_SM_L_SFT 2
444#define RT5616_M_OM_L_SM_L (0x1 << 1)
445#define RT5616_M_OM_L_SM_L_SFT 1
446
447/* SPK Right Mixer Control (0x47) */
448#define RT5616_G_RM_R_SM_R_MASK (0x3 << 14)
449#define RT5616_G_RM_R_SM_R_SFT 14
450#define RT5616_G_IN_R_SM_R_MASK (0x3 << 12)
451#define RT5616_G_IN_R_SM_R_SFT 12
452#define RT5616_G_DAC_R1_SM_R_MASK (0x3 << 10)
453#define RT5616_G_DAC_R1_SM_R_SFT 10
454#define RT5616_G_DAC_R2_SM_R_MASK (0x3 << 8)
455#define RT5616_G_DAC_R2_SM_R_SFT 8
456#define RT5616_G_OM_R_SM_R_MASK (0x3 << 6)
457#define RT5616_G_OM_R_SM_R_SFT 6
458#define RT5616_M_RM_R_SM_R (0x1 << 5)
459#define RT5616_M_RM_R_SM_R_SFT 5
460#define RT5616_M_IN_R_SM_R (0x1 << 4)
461#define RT5616_M_IN_R_SM_R_SFT 4
462#define RT5616_M_DAC_R1_SM_R (0x1 << 3)
463#define RT5616_M_DAC_R1_SM_R_SFT 3
464#define RT5616_M_DAC_R2_SM_R (0x1 << 2)
465#define RT5616_M_DAC_R2_SM_R_SFT 2
466#define RT5616_M_OM_R_SM_R (0x1 << 1)
467#define RT5616_M_OM_R_SM_R_SFT 1
468
469/* SPOLMIX Control (0x48) */
470#define RT5616_M_DAC_R1_SPM_L (0x1 << 15)
471#define RT5616_M_DAC_R1_SPM_L_SFT 15
472#define RT5616_M_DAC_L1_SPM_L (0x1 << 14)
473#define RT5616_M_DAC_L1_SPM_L_SFT 14
474#define RT5616_M_SV_R_SPM_L (0x1 << 13)
475#define RT5616_M_SV_R_SPM_L_SFT 13
476#define RT5616_M_SV_L_SPM_L (0x1 << 12)
477#define RT5616_M_SV_L_SPM_L_SFT 12
478#define RT5616_M_BST1_SPM_L (0x1 << 11)
479#define RT5616_M_BST1_SPM_L_SFT 11
480
481/* SPORMIX Control (0x49) */
482#define RT5616_M_DAC_R1_SPM_R (0x1 << 13)
483#define RT5616_M_DAC_R1_SPM_R_SFT 13
484#define RT5616_M_SV_R_SPM_R (0x1 << 12)
485#define RT5616_M_SV_R_SPM_R_SFT 12
486#define RT5616_M_BST1_SPM_R (0x1 << 11)
487#define RT5616_M_BST1_SPM_R_SFT 11
488
489/* SPOLMIX / SPORMIX Ratio Control (0x4a) */
490#define RT5616_SPO_CLSD_RATIO_MASK (0x7)
491#define RT5616_SPO_CLSD_RATIO_SFT 0
492
493/* Mono Output Mixer Control (0x4c) */
494#define RT5616_M_DAC_R2_MM (0x1 << 15)
495#define RT5616_M_DAC_R2_MM_SFT 15
496#define RT5616_M_DAC_L2_MM (0x1 << 14)
497#define RT5616_M_DAC_L2_MM_SFT 14
498#define RT5616_M_OV_R_MM (0x1 << 13)
499#define RT5616_M_OV_R_MM_SFT 13
500#define RT5616_M_OV_L_MM (0x1 << 12)
501#define RT5616_M_OV_L_MM_SFT 12
502#define RT5616_M_BST1_MM (0x1 << 11)
503#define RT5616_M_BST1_MM_SFT 11
504#define RT5616_G_MONOMIX_MASK (0x1 << 10)
505#define RT5616_G_MONOMIX_SFT 10
506
507/* Output Left Mixer Control 1 (0x4d) */
508#define RT5616_G_BST2_OM_L_MASK (0x7 << 10)
509#define RT5616_G_BST2_OM_L_SFT 10
510#define RT5616_G_BST1_OM_L_MASK (0x7 << 7)
511#define RT5616_G_BST1_OM_L_SFT 7
512#define RT5616_G_IN1_L_OM_L_MASK (0x7 << 4)
513#define RT5616_G_IN1_L_OM_L_SFT 4
514#define RT5616_G_RM_L_OM_L_MASK (0x7 << 1)
515#define RT5616_G_RM_L_OM_L_SFT 1
516
517/* Output Left Mixer Control 2 (0x4e) */
518#define RT5616_G_DAC_L1_OM_L_MASK (0x7 << 7)
519#define RT5616_G_DAC_L1_OM_L_SFT 7
520#define RT5616_G_IN2_L_OM_L_MASK (0x7 << 4)
521#define RT5616_G_IN2_L_OM_L_SFT 4
522
523/* Output Left Mixer Control 3 (0x4f) */
524#define RT5616_M_IN2_L_OM_L (0x1 << 9)
525#define RT5616_M_IN2_L_OM_L_SFT 9
526#define RT5616_M_BST2_OM_L (0x1 << 6)
527#define RT5616_M_BST2_OM_L_SFT 6
528#define RT5616_M_BST1_OM_L (0x1 << 5)
529#define RT5616_M_BST1_OM_L_SFT 5
530#define RT5616_M_IN1_L_OM_L (0x1 << 4)
531#define RT5616_M_IN1_L_OM_L_SFT 4
532#define RT5616_M_RM_L_OM_L (0x1 << 3)
533#define RT5616_M_RM_L_OM_L_SFT 3
534#define RT5616_M_DAC_L1_OM_L (0x1)
535#define RT5616_M_DAC_L1_OM_L_SFT 0
536
537/* Output Right Mixer Control 1 (0x50) */
538#define RT5616_G_BST2_OM_R_MASK (0x7 << 10)
539#define RT5616_G_BST2_OM_R_SFT 10
540#define RT5616_G_BST1_OM_R_MASK (0x7 << 7)
541#define RT5616_G_BST1_OM_R_SFT 7
542#define RT5616_G_IN1_R_OM_R_MASK (0x7 << 4)
543#define RT5616_G_IN1_R_OM_R_SFT 4
544#define RT5616_G_RM_R_OM_R_MASK (0x7 << 1)
545#define RT5616_G_RM_R_OM_R_SFT 1
546
547/* Output Right Mixer Control 2 (0x51) */
548#define RT5616_G_DAC_R1_OM_R_MASK (0x7 << 7)
549#define RT5616_G_DAC_R1_OM_R_SFT 7
550#define RT5616_G_IN2_R_OM_R_MASK (0x7 << 4)
551#define RT5616_G_IN2_R_OM_R_SFT 4
552
553/* Output Right Mixer Control 3 (0x52) */
554#define RT5616_M_IN2_R_OM_R (0x1 << 9)
555#define RT5616_M_IN2_R_OM_R_SFT 9
556#define RT5616_M_BST2_OM_R (0x1 << 6)
557#define RT5616_M_BST2_OM_R_SFT 6
558#define RT5616_M_BST1_OM_R (0x1 << 5)
559#define RT5616_M_BST1_OM_R_SFT 5
560#define RT5616_M_IN1_R_OM_R (0x1 << 4)
561#define RT5616_M_IN1_R_OM_R_SFT 4
562#define RT5616_M_RM_R_OM_R (0x1 << 3)
563#define RT5616_M_RM_R_OM_R_SFT 3
564#define RT5616_M_DAC_R1_OM_R (0x1)
565#define RT5616_M_DAC_R1_OM_R_SFT 0
566
567/* LOUT Mixer Control (0x53) */
568#define RT5616_M_DAC_L1_LM (0x1 << 15)
569#define RT5616_M_DAC_L1_LM_SFT 15
570#define RT5616_M_DAC_R1_LM (0x1 << 14)
571#define RT5616_M_DAC_R1_LM_SFT 14
572#define RT5616_M_OV_L_LM (0x1 << 13)
573#define RT5616_M_OV_L_LM_SFT 13
574#define RT5616_M_OV_R_LM (0x1 << 12)
575#define RT5616_M_OV_R_LM_SFT 12
576#define RT5616_G_LOUTMIX_MASK (0x1 << 11)
577#define RT5616_G_LOUTMIX_SFT 11
578
579/* Power Management for Digital 1 (0x61) */
580#define RT5616_PWR_I2S1 (0x1 << 15)
581#define RT5616_PWR_I2S1_BIT 15
582#define RT5616_PWR_I2S2 (0x1 << 14)
583#define RT5616_PWR_I2S2_BIT 14
584#define RT5616_PWR_DAC_L1 (0x1 << 12)
585#define RT5616_PWR_DAC_L1_BIT 12
586#define RT5616_PWR_DAC_R1 (0x1 << 11)
587#define RT5616_PWR_DAC_R1_BIT 11
588#define RT5616_PWR_ADC_L (0x1 << 2)
589#define RT5616_PWR_ADC_L_BIT 2
590#define RT5616_PWR_ADC_R (0x1 << 1)
591#define RT5616_PWR_ADC_R_BIT 1
592
593/* Power Management for Digital 2 (0x62) */
594#define RT5616_PWR_ADC_STO1_F (0x1 << 15)
595#define RT5616_PWR_ADC_STO1_F_BIT 15
596#define RT5616_PWR_DAC_STO1_F (0x1 << 11)
597#define RT5616_PWR_DAC_STO1_F_BIT 11
598
599/* Power Management for Analog 1 (0x63) */
600#define RT5616_PWR_VREF1 (0x1 << 15)
601#define RT5616_PWR_VREF1_BIT 15
602#define RT5616_PWR_FV1 (0x1 << 14)
603#define RT5616_PWR_FV1_BIT 14
604#define RT5616_PWR_MB (0x1 << 13)
605#define RT5616_PWR_MB_BIT 13
606#define RT5616_PWR_LM (0x1 << 12)
607#define RT5616_PWR_LM_BIT 12
608#define RT5616_PWR_BG (0x1 << 11)
609#define RT5616_PWR_BG_BIT 11
610#define RT5616_PWR_HP_L (0x1 << 7)
611#define RT5616_PWR_HP_L_BIT 7
612#define RT5616_PWR_HP_R (0x1 << 6)
613#define RT5616_PWR_HP_R_BIT 6
614#define RT5616_PWR_HA (0x1 << 5)
615#define RT5616_PWR_HA_BIT 5
616#define RT5616_PWR_VREF2 (0x1 << 4)
617#define RT5616_PWR_VREF2_BIT 4
618#define RT5616_PWR_FV2 (0x1 << 3)
619#define RT5616_PWR_FV2_BIT 3
620#define RT5616_PWR_LDO (0x1 << 2)
621#define RT5616_PWR_LDO_BIT 2
622#define RT5616_PWR_LDO_DVO_MASK (0x3)
623#define RT5616_PWR_LDO_DVO_1_0V 0
624#define RT5616_PWR_LDO_DVO_1_1V 1
625#define RT5616_PWR_LDO_DVO_1_2V 2
626#define RT5616_PWR_LDO_DVO_1_3V 3
627
628/* Power Management for Analog 2 (0x64) */
629#define RT5616_PWR_BST1 (0x1 << 15)
630#define RT5616_PWR_BST1_BIT 15
631#define RT5616_PWR_BST2 (0x1 << 14)
632#define RT5616_PWR_BST2_BIT 14
633#define RT5616_PWR_MB1 (0x1 << 11)
634#define RT5616_PWR_MB1_BIT 11
635#define RT5616_PWR_PLL (0x1 << 9)
636#define RT5616_PWR_PLL_BIT 9
637#define RT5616_PWR_BST1_OP2 (0x1 << 5)
638#define RT5616_PWR_BST1_OP2_BIT 5
639#define RT5616_PWR_BST2_OP2 (0x1 << 4)
640#define RT5616_PWR_BST2_OP2_BIT 4
641#define RT5616_PWR_BST3_OP2 (0x1 << 3)
642#define RT5616_PWR_BST3_OP2_BIT 3
643#define RT5616_PWR_JD_M (0x1 << 2)
644#define RT5616_PWM_JD_M_BIT 2
645#define RT5616_PWR_JD2 (0x1 << 1)
646#define RT5616_PWM_JD2_BIT 1
647#define RT5616_PWR_JD3 (0x1)
648#define RT5616_PWM_JD3_BIT 0
649
650/* Power Management for Mixer (0x65) */
651#define RT5616_PWR_OM_L (0x1 << 15)
652#define RT5616_PWR_OM_L_BIT 15
653#define RT5616_PWR_OM_R (0x1 << 14)
654#define RT5616_PWR_OM_R_BIT 14
655#define RT5616_PWR_RM_L (0x1 << 11)
656#define RT5616_PWR_RM_L_BIT 11
657#define RT5616_PWR_RM_R (0x1 << 10)
658#define RT5616_PWR_RM_R_BIT 10
659
660/* Power Management for Volume (0x66) */
661#define RT5616_PWR_OV_L (0x1 << 13)
662#define RT5616_PWR_OV_L_BIT 13
663#define RT5616_PWR_OV_R (0x1 << 12)
664#define RT5616_PWR_OV_R_BIT 12
665#define RT5616_PWR_HV_L (0x1 << 11)
666#define RT5616_PWR_HV_L_BIT 11
667#define RT5616_PWR_HV_R (0x1 << 10)
668#define RT5616_PWR_HV_R_BIT 10
669#define RT5616_PWR_IN1_L (0x1 << 9)
670#define RT5616_PWR_IN1_L_BIT 9
671#define RT5616_PWR_IN1_R (0x1 << 8)
672#define RT5616_PWR_IN1_R_BIT 8
673#define RT5616_PWR_IN2_L (0x1 << 7)
674#define RT5616_PWR_IN2_L_BIT 7
675#define RT5616_PWR_IN2_R (0x1 << 6)
676#define RT5616_PWR_IN2_R_BIT 6
677
678/* I2S1/2/3 Audio Serial Data Port Control (0x70 0x71) */
679#define RT5616_I2S_MS_MASK (0x1 << 15)
680#define RT5616_I2S_MS_SFT 15
681#define RT5616_I2S_MS_M (0x0 << 15)
682#define RT5616_I2S_MS_S (0x1 << 15)
683#define RT5616_I2S_O_CP_MASK (0x3 << 10)
684#define RT5616_I2S_O_CP_SFT 10
685#define RT5616_I2S_O_CP_OFF (0x0 << 10)
686#define RT5616_I2S_O_CP_U_LAW (0x1 << 10)
687#define RT5616_I2S_O_CP_A_LAW (0x2 << 10)
688#define RT5616_I2S_I_CP_MASK (0x3 << 8)
689#define RT5616_I2S_I_CP_SFT 8
690#define RT5616_I2S_I_CP_OFF (0x0 << 8)
691#define RT5616_I2S_I_CP_U_LAW (0x1 << 8)
692#define RT5616_I2S_I_CP_A_LAW (0x2 << 8)
693#define RT5616_I2S_BP_MASK (0x1 << 7)
694#define RT5616_I2S_BP_SFT 7
695#define RT5616_I2S_BP_NOR (0x0 << 7)
696#define RT5616_I2S_BP_INV (0x1 << 7)
697#define RT5616_I2S_DL_MASK (0x3 << 2)
698#define RT5616_I2S_DL_SFT 2
699#define RT5616_I2S_DL_16 (0x0 << 2)
700#define RT5616_I2S_DL_20 (0x1 << 2)
701#define RT5616_I2S_DL_24 (0x2 << 2)
702#define RT5616_I2S_DL_8 (0x3 << 2)
703#define RT5616_I2S_DF_MASK (0x3)
704#define RT5616_I2S_DF_SFT 0
705#define RT5616_I2S_DF_I2S (0x0)
706#define RT5616_I2S_DF_LEFT (0x1)
707#define RT5616_I2S_DF_PCM_A (0x2)
708#define RT5616_I2S_DF_PCM_B (0x3)
709
710/* ADC/DAC Clock Control 1 (0x73) */
711#define RT5616_I2S_PD1_MASK (0x7 << 12)
712#define RT5616_I2S_PD1_SFT 12
713#define RT5616_I2S_PD1_1 (0x0 << 12)
714#define RT5616_I2S_PD1_2 (0x1 << 12)
715#define RT5616_I2S_PD1_3 (0x2 << 12)
716#define RT5616_I2S_PD1_4 (0x3 << 12)
717#define RT5616_I2S_PD1_6 (0x4 << 12)
718#define RT5616_I2S_PD1_8 (0x5 << 12)
719#define RT5616_I2S_PD1_12 (0x6 << 12)
720#define RT5616_I2S_PD1_16 (0x7 << 12)
721#define RT5616_I2S_BCLK_MS2_MASK (0x1 << 11)
722#define RT5616_DAC_OSR_MASK (0x3 << 2)
723#define RT5616_DAC_OSR_SFT 2
724#define RT5616_DAC_OSR_128 (0x0 << 2)
725#define RT5616_DAC_OSR_64 (0x1 << 2)
726#define RT5616_DAC_OSR_32 (0x2 << 2)
727#define RT5616_DAC_OSR_128_3 (0x3 << 2)
728#define RT5616_ADC_OSR_MASK (0x3)
729#define RT5616_ADC_OSR_SFT 0
730#define RT5616_ADC_OSR_128 (0x0)
731#define RT5616_ADC_OSR_64 (0x1)
732#define RT5616_ADC_OSR_32 (0x2)
733#define RT5616_ADC_OSR_128_3 (0x3)
734
735/* ADC/DAC Clock Control 2 (0x74) */
736#define RT5616_DAHPF_EN (0x1 << 11)
737#define RT5616_DAHPF_EN_SFT 11
738#define RT5616_ADHPF_EN (0x1 << 10)
739#define RT5616_ADHPF_EN_SFT 10
740
741/* TDM Control 1 (0x77) */
742#define RT5616_TDM_INTEL_SEL_MASK (0x1 << 15)
743#define RT5616_TDM_INTEL_SEL_SFT 15
744#define RT5616_TDM_INTEL_SEL_64 (0x0 << 15)
745#define RT5616_TDM_INTEL_SEL_50 (0x1 << 15)
746#define RT5616_TDM_MODE_SEL_MASK (0x1 << 14)
747#define RT5616_TDM_MODE_SEL_SFT 14
748#define RT5616_TDM_MODE_SEL_NOR (0x0 << 14)
749#define RT5616_TDM_MODE_SEL_TDM (0x1 << 14)
750#define RT5616_TDM_CH_NUM_SEL_MASK (0x3 << 12)
751#define RT5616_TDM_CH_NUM_SEL_SFT 12
752#define RT5616_TDM_CH_NUM_SEL_2 (0x0 << 12)
753#define RT5616_TDM_CH_NUM_SEL_4 (0x1 << 12)
754#define RT5616_TDM_CH_NUM_SEL_6 (0x2 << 12)
755#define RT5616_TDM_CH_NUM_SEL_8 (0x3 << 12)
756#define RT5616_TDM_CH_LEN_SEL_MASK (0x3 << 10)
757#define RT5616_TDM_CH_LEN_SEL_SFT 10
758#define RT5616_TDM_CH_LEN_SEL_16 (0x0 << 10)
759#define RT5616_TDM_CH_LEN_SEL_20 (0x1 << 10)
760#define RT5616_TDM_CH_LEN_SEL_24 (0x2 << 10)
761#define RT5616_TDM_CH_LEN_SEL_32 (0x3 << 10)
762#define RT5616_TDM_ADC_SEL_MASK (0x1 << 9)
763#define RT5616_TDM_ADC_SEL_SFT 9
764#define RT5616_TDM_ADC_SEL_NOR (0x0 << 9)
765#define RT5616_TDM_ADC_SEL_SWAP (0x1 << 9)
766#define RT5616_TDM_ADC_START_SEL_MASK (0x1 << 8)
767#define RT5616_TDM_ADC_START_SEL_SFT 8
768#define RT5616_TDM_ADC_START_SEL_SL0 (0x0 << 8)
769#define RT5616_TDM_ADC_START_SEL_SL4 (0x1 << 8)
770#define RT5616_TDM_I2S_CH2_SEL_MASK (0x3 << 6)
771#define RT5616_TDM_I2S_CH2_SEL_SFT 6
772#define RT5616_TDM_I2S_CH2_SEL_LR (0x0 << 6)
773#define RT5616_TDM_I2S_CH2_SEL_RL (0x1 << 6)
774#define RT5616_TDM_I2S_CH2_SEL_LL (0x2 << 6)
775#define RT5616_TDM_I2S_CH2_SEL_RR (0x3 << 6)
776#define RT5616_TDM_I2S_CH4_SEL_MASK (0x3 << 4)
777#define RT5616_TDM_I2S_CH4_SEL_SFT 4
778#define RT5616_TDM_I2S_CH4_SEL_LR (0x0 << 4)
779#define RT5616_TDM_I2S_CH4_SEL_RL (0x1 << 4)
780#define RT5616_TDM_I2S_CH4_SEL_LL (0x2 << 4)
781#define RT5616_TDM_I2S_CH4_SEL_RR (0x3 << 4)
782#define RT5616_TDM_I2S_CH6_SEL_MASK (0x3 << 2)
783#define RT5616_TDM_I2S_CH6_SEL_SFT 2
784#define RT5616_TDM_I2S_CH6_SEL_LR (0x0 << 2)
785#define RT5616_TDM_I2S_CH6_SEL_RL (0x1 << 2)
786#define RT5616_TDM_I2S_CH6_SEL_LL (0x2 << 2)
787#define RT5616_TDM_I2S_CH6_SEL_RR (0x3 << 2)
788#define RT5616_TDM_I2S_CH8_SEL_MASK (0x3)
789#define RT5616_TDM_I2S_CH8_SEL_SFT 0
790#define RT5616_TDM_I2S_CH8_SEL_LR (0x0)
791#define RT5616_TDM_I2S_CH8_SEL_RL (0x1)
792#define RT5616_TDM_I2S_CH8_SEL_LL (0x2)
793#define RT5616_TDM_I2S_CH8_SEL_RR (0x3)
794
795/* TDM Control 2 (0x78) */
796#define RT5616_TDM_LRCK_POL_SEL_MASK (0x1 << 15)
797#define RT5616_TDM_LRCK_POL_SEL_SFT 15
798#define RT5616_TDM_LRCK_POL_SEL_NOR (0x0 << 15)
799#define RT5616_TDM_LRCK_POL_SEL_INV (0x1 << 15)
800#define RT5616_TDM_CH_VAL_SEL_MASK (0x1 << 14)
801#define RT5616_TDM_CH_VAL_SEL_SFT 14
802#define RT5616_TDM_CH_VAL_SEL_CH01 (0x0 << 14)
803#define RT5616_TDM_CH_VAL_SEL_CH0123 (0x1 << 14)
804#define RT5616_TDM_CH_VAL_EN (0x1 << 13)
805#define RT5616_TDM_CH_VAL_SFT 13
806#define RT5616_TDM_LPBK_EN (0x1 << 12)
807#define RT5616_TDM_LPBK_SFT 12
808#define RT5616_TDM_LRCK_PULSE_SEL_MASK (0x1 << 11)
809#define RT5616_TDM_LRCK_PULSE_SEL_SFT 11
810#define RT5616_TDM_LRCK_PULSE_SEL_BCLK (0x0 << 11)
811#define RT5616_TDM_LRCK_PULSE_SEL_CH (0x1 << 11)
812#define RT5616_TDM_END_EDGE_SEL_MASK (0x1 << 10)
813#define RT5616_TDM_END_EDGE_SEL_SFT 10
814#define RT5616_TDM_END_EDGE_SEL_POS (0x0 << 10)
815#define RT5616_TDM_END_EDGE_SEL_NEG (0x1 << 10)
816#define RT5616_TDM_END_EDGE_EN (0x1 << 9)
817#define RT5616_TDM_END_EDGE_EN_SFT 9
818#define RT5616_TDM_TRAN_EDGE_SEL_MASK (0x1 << 8)
819#define RT5616_TDM_TRAN_EDGE_SEL_SFT 8
820#define RT5616_TDM_TRAN_EDGE_SEL_POS (0x0 << 8)
821#define RT5616_TDM_TRAN_EDGE_SEL_NEG (0x1 << 8)
822#define RT5616_M_TDM2_L (0x1 << 7)
823#define RT5616_M_TDM2_L_SFT 7
824#define RT5616_M_TDM2_R (0x1 << 6)
825#define RT5616_M_TDM2_R_SFT 6
826#define RT5616_M_TDM4_L (0x1 << 5)
827#define RT5616_M_TDM4_L_SFT 5
828#define RT5616_M_TDM4_R (0x1 << 4)
829#define RT5616_M_TDM4_R_SFT 4
830
831/* Global Clock Control (0x80) */
832#define RT5616_SCLK_SRC_MASK (0x3 << 14)
833#define RT5616_SCLK_SRC_SFT 14
834#define RT5616_SCLK_SRC_MCLK (0x0 << 14)
835#define RT5616_SCLK_SRC_PLL1 (0x1 << 14)
836#define RT5616_PLL1_SRC_MASK (0x3 << 12)
837#define RT5616_PLL1_SRC_SFT 12
838#define RT5616_PLL1_SRC_MCLK (0x0 << 12)
839#define RT5616_PLL1_SRC_BCLK1 (0x1 << 12)
840#define RT5616_PLL1_SRC_BCLK2 (0x2 << 12)
841#define RT5616_PLL1_PD_MASK (0x1 << 3)
842#define RT5616_PLL1_PD_SFT 3
843#define RT5616_PLL1_PD_1 (0x0 << 3)
844#define RT5616_PLL1_PD_2 (0x1 << 3)
845
846#define RT5616_PLL_INP_MAX 40000000
847#define RT5616_PLL_INP_MIN 256000
848/* PLL M/N/K Code Control 1 (0x81) */
849#define RT5616_PLL_N_MAX 0x1ff
850#define RT5616_PLL_N_MASK (RT5616_PLL_N_MAX << 7)
851#define RT5616_PLL_N_SFT 7
852#define RT5616_PLL_K_MAX 0x1f
853#define RT5616_PLL_K_MASK (RT5616_PLL_K_MAX)
854#define RT5616_PLL_K_SFT 0
855
856/* PLL M/N/K Code Control 2 (0x82) */
857#define RT5616_PLL_M_MAX 0xf
858#define RT5616_PLL_M_MASK (RT5616_PLL_M_MAX << 12)
859#define RT5616_PLL_M_SFT 12
860#define RT5616_PLL_M_BP (0x1 << 11)
861#define RT5616_PLL_M_BP_SFT 11
862
863/* PLL tracking mode 1 (0x83) */
864#define RT5616_STO1_T_MASK (0x1 << 15)
865#define RT5616_STO1_T_SFT 15
866#define RT5616_STO1_T_SCLK (0x0 << 15)
867#define RT5616_STO1_T_LRCK1 (0x1 << 15)
868#define RT5616_STO2_T_MASK (0x1 << 12)
869#define RT5616_STO2_T_SFT 12
870#define RT5616_STO2_T_I2S2 (0x0 << 12)
871#define RT5616_STO2_T_LRCK2 (0x1 << 12)
872#define RT5616_ASRC2_REF_MASK (0x1 << 11)
873#define RT5616_ASRC2_REF_SFT 11
874#define RT5616_ASRC2_REF_LRCK2 (0x0 << 11)
875#define RT5616_ASRC2_REF_LRCK1 (0x1 << 11)
876#define RT5616_DMIC_1_M_MASK (0x1 << 9)
877#define RT5616_DMIC_1_M_SFT 9
878#define RT5616_DMIC_1_M_NOR (0x0 << 9)
879#define RT5616_DMIC_1_M_ASYN (0x1 << 9)
880
881/* PLL tracking mode 2 (0x84) */
882#define RT5616_STO1_ASRC_EN (0x1 << 15)
883#define RT5616_STO1_ASRC_EN_SFT 15
884#define RT5616_STO2_ASRC_EN (0x1 << 14)
885#define RT5616_STO2_ASRC_EN_SFT 14
886#define RT5616_STO1_DAC_M_MASK (0x1 << 13)
887#define RT5616_STO1_DAC_M_SFT 13
888#define RT5616_STO1_DAC_M_NOR (0x0 << 13)
889#define RT5616_STO1_DAC_M_ASRC (0x1 << 13)
890#define RT5616_STO2_DAC_M_MASK (0x1 << 12)
891#define RT5616_STO2_DAC_M_SFT 12
892#define RT5616_STO2_DAC_M_NOR (0x0 << 12)
893#define RT5616_STO2_DAC_M_ASRC (0x1 << 12)
894#define RT5616_ADC_M_MASK (0x1 << 11)
895#define RT5616_ADC_M_SFT 11
896#define RT5616_ADC_M_NOR (0x0 << 11)
897#define RT5616_ADC_M_ASRC (0x1 << 11)
898#define RT5616_I2S1_R_D_MASK (0x1 << 4)
899#define RT5616_I2S1_R_D_SFT 4
900#define RT5616_I2S1_R_D_DIS (0x0 << 4)
901#define RT5616_I2S1_R_D_EN (0x1 << 4)
902#define RT5616_I2S2_R_D_MASK (0x1 << 3)
903#define RT5616_I2S2_R_D_SFT 3
904#define RT5616_I2S2_R_D_DIS (0x0 << 3)
905#define RT5616_I2S2_R_D_EN (0x1 << 3)
906#define RT5616_PRE_SCLK_MASK (0x3)
907#define RT5616_PRE_SCLK_SFT 0
908#define RT5616_PRE_SCLK_512 (0x0)
909#define RT5616_PRE_SCLK_1024 (0x1)
910#define RT5616_PRE_SCLK_2048 (0x2)
911
912/* PLL tracking mode 3 (0x85) */
913#define RT5616_I2S1_RATE_MASK (0xf << 12)
914#define RT5616_I2S1_RATE_SFT 12
915#define RT5616_I2S2_RATE_MASK (0xf << 8)
916#define RT5616_I2S2_RATE_SFT 8
917#define RT5616_G_ASRC_LP_MASK (0x1 << 3)
918#define RT5616_G_ASRC_LP_SFT 3
919#define RT5616_ASRC_LP_F_M (0x1 << 2)
920#define RT5616_ASRC_LP_F_SFT 2
921#define RT5616_ASRC_LP_F_NOR (0x0 << 2)
922#define RT5616_ASRC_LP_F_SB (0x1 << 2)
923#define RT5616_FTK_PH_DET_MASK (0x3)
924#define RT5616_FTK_PH_DET_SFT 0
925#define RT5616_FTK_PH_DET_DIV1 (0x0)
926#define RT5616_FTK_PH_DET_DIV2 (0x1)
927#define RT5616_FTK_PH_DET_DIV4 (0x2)
928#define RT5616_FTK_PH_DET_DIV8 (0x3)
929
930/*PLL tracking mode 6 (0x89) */
931#define RT5616_I2S1_PD_MASK (0x7 << 12)
932#define RT5616_I2S1_PD_SFT 12
933#define RT5616_I2S2_PD_MASK (0x7 << 8)
934#define RT5616_I2S2_PD_SFT 8
935
936/*PLL tracking mode 7 (0x8a) */
937#define RT5616_FSI1_RATE_MASK (0xf << 12)
938#define RT5616_FSI1_RATE_SFT 12
939#define RT5616_FSI2_RATE_MASK (0xf << 8)
940#define RT5616_FSI2_RATE_SFT 8
941
942/* HPOUT Over Current Detection (0x8b) */
943#define RT5616_HP_OVCD_MASK (0x1 << 10)
944#define RT5616_HP_OVCD_SFT 10
945#define RT5616_HP_OVCD_DIS (0x0 << 10)
946#define RT5616_HP_OVCD_EN (0x1 << 10)
947#define RT5616_HP_OC_TH_MASK (0x3 << 8)
948#define RT5616_HP_OC_TH_SFT 8
949#define RT5616_HP_OC_TH_90 (0x0 << 8)
950#define RT5616_HP_OC_TH_105 (0x1 << 8)
951#define RT5616_HP_OC_TH_120 (0x2 << 8)
952#define RT5616_HP_OC_TH_135 (0x3 << 8)
953
954/* Depop Mode Control 1 (0x8e) */
955#define RT5616_SMT_TRIG_MASK (0x1 << 15)
956#define RT5616_SMT_TRIG_SFT 15
957#define RT5616_SMT_TRIG_DIS (0x0 << 15)
958#define RT5616_SMT_TRIG_EN (0x1 << 15)
959#define RT5616_HP_L_SMT_MASK (0x1 << 9)
960#define RT5616_HP_L_SMT_SFT 9
961#define RT5616_HP_L_SMT_DIS (0x0 << 9)
962#define RT5616_HP_L_SMT_EN (0x1 << 9)
963#define RT5616_HP_R_SMT_MASK (0x1 << 8)
964#define RT5616_HP_R_SMT_SFT 8
965#define RT5616_HP_R_SMT_DIS (0x0 << 8)
966#define RT5616_HP_R_SMT_EN (0x1 << 8)
967#define RT5616_HP_CD_PD_MASK (0x1 << 7)
968#define RT5616_HP_CD_PD_SFT 7
969#define RT5616_HP_CD_PD_DIS (0x0 << 7)
970#define RT5616_HP_CD_PD_EN (0x1 << 7)
971#define RT5616_RSTN_MASK (0x1 << 6)
972#define RT5616_RSTN_SFT 6
973#define RT5616_RSTN_DIS (0x0 << 6)
974#define RT5616_RSTN_EN (0x1 << 6)
975#define RT5616_RSTP_MASK (0x1 << 5)
976#define RT5616_RSTP_SFT 5
977#define RT5616_RSTP_DIS (0x0 << 5)
978#define RT5616_RSTP_EN (0x1 << 5)
979#define RT5616_HP_CO_MASK (0x1 << 4)
980#define RT5616_HP_CO_SFT 4
981#define RT5616_HP_CO_DIS (0x0 << 4)
982#define RT5616_HP_CO_EN (0x1 << 4)
983#define RT5616_HP_CP_MASK (0x1 << 3)
984#define RT5616_HP_CP_SFT 3
985#define RT5616_HP_CP_PD (0x0 << 3)
986#define RT5616_HP_CP_PU (0x1 << 3)
987#define RT5616_HP_SG_MASK (0x1 << 2)
988#define RT5616_HP_SG_SFT 2
989#define RT5616_HP_SG_DIS (0x0 << 2)
990#define RT5616_HP_SG_EN (0x1 << 2)
991#define RT5616_HP_DP_MASK (0x1 << 1)
992#define RT5616_HP_DP_SFT 1
993#define RT5616_HP_DP_PD (0x0 << 1)
994#define RT5616_HP_DP_PU (0x1 << 1)
995#define RT5616_HP_CB_MASK (0x1)
996#define RT5616_HP_CB_SFT 0
997#define RT5616_HP_CB_PD (0x0)
998#define RT5616_HP_CB_PU (0x1)
999
1000/* Depop Mode Control 2 (0x8f) */
1001#define RT5616_DEPOP_MASK (0x1 << 13)
1002#define RT5616_DEPOP_SFT 13
1003#define RT5616_DEPOP_AUTO (0x0 << 13)
1004#define RT5616_DEPOP_MAN (0x1 << 13)
1005#define RT5616_RAMP_MASK (0x1 << 12)
1006#define RT5616_RAMP_SFT 12
1007#define RT5616_RAMP_DIS (0x0 << 12)
1008#define RT5616_RAMP_EN (0x1 << 12)
1009#define RT5616_BPS_MASK (0x1 << 11)
1010#define RT5616_BPS_SFT 11
1011#define RT5616_BPS_DIS (0x0 << 11)
1012#define RT5616_BPS_EN (0x1 << 11)
1013#define RT5616_FAST_UPDN_MASK (0x1 << 10)
1014#define RT5616_FAST_UPDN_SFT 10
1015#define RT5616_FAST_UPDN_DIS (0x0 << 10)
1016#define RT5616_FAST_UPDN_EN (0x1 << 10)
1017#define RT5616_MRES_MASK (0x3 << 8)
1018#define RT5616_MRES_SFT 8
1019#define RT5616_MRES_15MO (0x0 << 8)
1020#define RT5616_MRES_25MO (0x1 << 8)
1021#define RT5616_MRES_35MO (0x2 << 8)
1022#define RT5616_MRES_45MO (0x3 << 8)
1023#define RT5616_VLO_MASK (0x1 << 7)
1024#define RT5616_VLO_SFT 7
1025#define RT5616_VLO_3V (0x0 << 7)
1026#define RT5616_VLO_32V (0x1 << 7)
1027#define RT5616_DIG_DP_MASK (0x1 << 6)
1028#define RT5616_DIG_DP_SFT 6
1029#define RT5616_DIG_DP_DIS (0x0 << 6)
1030#define RT5616_DIG_DP_EN (0x1 << 6)
1031#define RT5616_DP_TH_MASK (0x3 << 4)
1032#define RT5616_DP_TH_SFT 4
1033
1034/* Depop Mode Control 3 (0x90) */
1035#define RT5616_CP_SYS_MASK (0x7 << 12)
1036#define RT5616_CP_SYS_SFT 12
1037#define RT5616_CP_FQ1_MASK (0x7 << 8)
1038#define RT5616_CP_FQ1_SFT 8
1039#define RT5616_CP_FQ2_MASK (0x7 << 4)
1040#define RT5616_CP_FQ2_SFT 4
1041#define RT5616_CP_FQ3_MASK (0x7)
1042#define RT5616_CP_FQ3_SFT 0
1043#define RT5616_CP_FQ_1_5_KHZ 0
1044#define RT5616_CP_FQ_3_KHZ 1
1045#define RT5616_CP_FQ_6_KHZ 2
1046#define RT5616_CP_FQ_12_KHZ 3
1047#define RT5616_CP_FQ_24_KHZ 4
1048#define RT5616_CP_FQ_48_KHZ 5
1049#define RT5616_CP_FQ_96_KHZ 6
1050#define RT5616_CP_FQ_192_KHZ 7
1051
1052/* HPOUT charge pump (0x91) */
1053#define RT5616_OSW_L_MASK (0x1 << 11)
1054#define RT5616_OSW_L_SFT 11
1055#define RT5616_OSW_L_DIS (0x0 << 11)
1056#define RT5616_OSW_L_EN (0x1 << 11)
1057#define RT5616_OSW_R_MASK (0x1 << 10)
1058#define RT5616_OSW_R_SFT 10
1059#define RT5616_OSW_R_DIS (0x0 << 10)
1060#define RT5616_OSW_R_EN (0x1 << 10)
1061#define RT5616_PM_HP_MASK (0x3 << 8)
1062#define RT5616_PM_HP_SFT 8
1063#define RT5616_PM_HP_LV (0x0 << 8)
1064#define RT5616_PM_HP_MV (0x1 << 8)
1065#define RT5616_PM_HP_HV (0x2 << 8)
1066#define RT5616_IB_HP_MASK (0x3 << 6)
1067#define RT5616_IB_HP_SFT 6
1068#define RT5616_IB_HP_125IL (0x0 << 6)
1069#define RT5616_IB_HP_25IL (0x1 << 6)
1070#define RT5616_IB_HP_5IL (0x2 << 6)
1071#define RT5616_IB_HP_1IL (0x3 << 6)
1072
1073/* Micbias Control (0x93) */
1074#define RT5616_MIC1_BS_MASK (0x1 << 15)
1075#define RT5616_MIC1_BS_SFT 15
1076#define RT5616_MIC1_BS_9AV (0x0 << 15)
1077#define RT5616_MIC1_BS_75AV (0x1 << 15)
1078#define RT5616_MIC1_CLK_MASK (0x1 << 13)
1079#define RT5616_MIC1_CLK_SFT 13
1080#define RT5616_MIC1_CLK_DIS (0x0 << 13)
1081#define RT5616_MIC1_CLK_EN (0x1 << 13)
1082#define RT5616_MIC1_OVCD_MASK (0x1 << 11)
1083#define RT5616_MIC1_OVCD_SFT 11
1084#define RT5616_MIC1_OVCD_DIS (0x0 << 11)
1085#define RT5616_MIC1_OVCD_EN (0x1 << 11)
1086#define RT5616_MIC1_OVTH_MASK (0x3 << 9)
1087#define RT5616_MIC1_OVTH_SFT 9
1088#define RT5616_MIC1_OVTH_600UA (0x0 << 9)
1089#define RT5616_MIC1_OVTH_1500UA (0x1 << 9)
1090#define RT5616_MIC1_OVTH_2000UA (0x2 << 9)
1091#define RT5616_PWR_MB_MASK (0x1 << 5)
1092#define RT5616_PWR_MB_SFT 5
1093#define RT5616_PWR_MB_PD (0x0 << 5)
1094#define RT5616_PWR_MB_PU (0x1 << 5)
1095#define RT5616_PWR_CLK12M_MASK (0x1 << 4)
1096#define RT5616_PWR_CLK12M_SFT 4
1097#define RT5616_PWR_CLK12M_PD (0x0 << 4)
1098#define RT5616_PWR_CLK12M_PU (0x1 << 4)
1099
1100/* Analog JD Control 1 (0x94) */
1101#define RT5616_JD2_CMP_MASK (0x7 << 12)
1102#define RT5616_JD2_CMP_SFT 12
1103#define RT5616_JD_PU (0x1 << 11)
1104#define RT5616_JD_PU_SFT 11
1105#define RT5616_JD_PD (0x1 << 10)
1106#define RT5616_JD_PD_SFT 10
1107#define RT5616_JD_MODE_SEL_MASK (0x3 << 8)
1108#define RT5616_JD_MODE_SEL_SFT 8
1109#define RT5616_JD_MODE_SEL_M0 (0x0 << 8)
1110#define RT5616_JD_MODE_SEL_M1 (0x1 << 8)
1111#define RT5616_JD_MODE_SEL_M2 (0x2 << 8)
1112#define RT5616_JD_M_CMP (0x7 << 4)
1113#define RT5616_JD_M_CMP_SFT 4
1114#define RT5616_JD_M_PU (0x1 << 3)
1115#define RT5616_JD_M_PU_SFT 3
1116#define RT5616_JD_M_PD (0x1 << 2)
1117#define RT5616_JD_M_PD_SFT 2
1118#define RT5616_JD_M_MODE_SEL_MASK (0x3)
1119#define RT5616_JD_M_MODE_SEL_SFT 0
1120#define RT5616_JD_M_MODE_SEL_M0 (0x0)
1121#define RT5616_JD_M_MODE_SEL_M1 (0x1)
1122#define RT5616_JD_M_MODE_SEL_M2 (0x2)
1123
1124/* Analog JD Control 2 (0x95) */
1125#define RT5616_JD3_CMP_MASK (0x7 << 12)
1126#define RT5616_JD3_CMP_SFT 12
1127
1128/* EQ Control 1 (0xb0) */
1129#define RT5616_EQ_SRC_MASK (0x1 << 15)
1130#define RT5616_EQ_SRC_SFT 15
1131#define RT5616_EQ_SRC_DAC (0x0 << 15)
1132#define RT5616_EQ_SRC_ADC (0x1 << 15)
1133#define RT5616_EQ_UPD (0x1 << 14)
1134#define RT5616_EQ_UPD_BIT 14
1135#define RT5616_EQ_CD_MASK (0x1 << 13)
1136#define RT5616_EQ_CD_SFT 13
1137#define RT5616_EQ_CD_DIS (0x0 << 13)
1138#define RT5616_EQ_CD_EN (0x1 << 13)
1139#define RT5616_EQ_DITH_MASK (0x3 << 8)
1140#define RT5616_EQ_DITH_SFT 8
1141#define RT5616_EQ_DITH_NOR (0x0 << 8)
1142#define RT5616_EQ_DITH_LSB (0x1 << 8)
1143#define RT5616_EQ_DITH_LSB_1 (0x2 << 8)
1144#define RT5616_EQ_DITH_LSB_2 (0x3 << 8)
1145#define RT5616_EQ_CD_F (0x1 << 7)
1146#define RT5616_EQ_CD_F_BIT 7
1147#define RT5616_EQ_STA_HP2 (0x1 << 6)
1148#define RT5616_EQ_STA_HP2_BIT 6
1149#define RT5616_EQ_STA_HP1 (0x1 << 5)
1150#define RT5616_EQ_STA_HP1_BIT 5
1151#define RT5616_EQ_STA_BP4 (0x1 << 4)
1152#define RT5616_EQ_STA_BP4_BIT 4
1153#define RT5616_EQ_STA_BP3 (0x1 << 3)
1154#define RT5616_EQ_STA_BP3_BIT 3
1155#define RT5616_EQ_STA_BP2 (0x1 << 2)
1156#define RT5616_EQ_STA_BP2_BIT 2
1157#define RT5616_EQ_STA_BP1 (0x1 << 1)
1158#define RT5616_EQ_STA_BP1_BIT 1
1159#define RT5616_EQ_STA_LP (0x1)
1160#define RT5616_EQ_STA_LP_BIT 0
1161
1162/* EQ Control 2 (0xb1) */
1163#define RT5616_EQ_HPF1_M_MASK (0x1 << 8)
1164#define RT5616_EQ_HPF1_M_SFT 8
1165#define RT5616_EQ_HPF1_M_HI (0x0 << 8)
1166#define RT5616_EQ_HPF1_M_1ST (0x1 << 8)
1167#define RT5616_EQ_LPF1_M_MASK (0x1 << 7)
1168#define RT5616_EQ_LPF1_M_SFT 7
1169#define RT5616_EQ_LPF1_M_LO (0x0 << 7)
1170#define RT5616_EQ_LPF1_M_1ST (0x1 << 7)
1171#define RT5616_EQ_HPF2_MASK (0x1 << 6)
1172#define RT5616_EQ_HPF2_SFT 6
1173#define RT5616_EQ_HPF2_DIS (0x0 << 6)
1174#define RT5616_EQ_HPF2_EN (0x1 << 6)
1175#define RT5616_EQ_HPF1_MASK (0x1 << 5)
1176#define RT5616_EQ_HPF1_SFT 5
1177#define RT5616_EQ_HPF1_DIS (0x0 << 5)
1178#define RT5616_EQ_HPF1_EN (0x1 << 5)
1179#define RT5616_EQ_BPF4_MASK (0x1 << 4)
1180#define RT5616_EQ_BPF4_SFT 4
1181#define RT5616_EQ_BPF4_DIS (0x0 << 4)
1182#define RT5616_EQ_BPF4_EN (0x1 << 4)
1183#define RT5616_EQ_BPF3_MASK (0x1 << 3)
1184#define RT5616_EQ_BPF3_SFT 3
1185#define RT5616_EQ_BPF3_DIS (0x0 << 3)
1186#define RT5616_EQ_BPF3_EN (0x1 << 3)
1187#define RT5616_EQ_BPF2_MASK (0x1 << 2)
1188#define RT5616_EQ_BPF2_SFT 2
1189#define RT5616_EQ_BPF2_DIS (0x0 << 2)
1190#define RT5616_EQ_BPF2_EN (0x1 << 2)
1191#define RT5616_EQ_BPF1_MASK (0x1 << 1)
1192#define RT5616_EQ_BPF1_SFT 1
1193#define RT5616_EQ_BPF1_DIS (0x0 << 1)
1194#define RT5616_EQ_BPF1_EN (0x1 << 1)
1195#define RT5616_EQ_LPF_MASK (0x1)
1196#define RT5616_EQ_LPF_SFT 0
1197#define RT5616_EQ_LPF_DIS (0x0)
1198#define RT5616_EQ_LPF_EN (0x1)
1199#define RT5616_EQ_CTRL_MASK (0x7f)
1200
1201/* Memory Test (0xb2) */
1202#define RT5616_MT_MASK (0x1 << 15)
1203#define RT5616_MT_SFT 15
1204#define RT5616_MT_DIS (0x0 << 15)
1205#define RT5616_MT_EN (0x1 << 15)
1206
1207/* DRC/AGC Control 1 (0xb4) */
1208#define RT5616_DRC_AGC_P_MASK (0x1 << 15)
1209#define RT5616_DRC_AGC_P_SFT 15
1210#define RT5616_DRC_AGC_P_DAC (0x0 << 15)
1211#define RT5616_DRC_AGC_P_ADC (0x1 << 15)
1212#define RT5616_DRC_AGC_MASK (0x1 << 14)
1213#define RT5616_DRC_AGC_SFT 14
1214#define RT5616_DRC_AGC_DIS (0x0 << 14)
1215#define RT5616_DRC_AGC_EN (0x1 << 14)
1216#define RT5616_DRC_AGC_UPD (0x1 << 13)
1217#define RT5616_DRC_AGC_UPD_BIT 13
1218#define RT5616_DRC_AGC_AR_MASK (0x1f << 8)
1219#define RT5616_DRC_AGC_AR_SFT 8
1220#define RT5616_DRC_AGC_R_MASK (0x7 << 5)
1221#define RT5616_DRC_AGC_R_SFT 5
1222#define RT5616_DRC_AGC_R_48K (0x1 << 5)
1223#define RT5616_DRC_AGC_R_96K (0x2 << 5)
1224#define RT5616_DRC_AGC_R_192K (0x3 << 5)
1225#define RT5616_DRC_AGC_R_441K (0x5 << 5)
1226#define RT5616_DRC_AGC_R_882K (0x6 << 5)
1227#define RT5616_DRC_AGC_R_1764K (0x7 << 5)
1228#define RT5616_DRC_AGC_RC_MASK (0x1f)
1229#define RT5616_DRC_AGC_RC_SFT 0
1230
1231/* DRC/AGC Control 2 (0xb5) */
1232#define RT5616_DRC_AGC_POB_MASK (0x3f << 8)
1233#define RT5616_DRC_AGC_POB_SFT 8
1234#define RT5616_DRC_AGC_CP_MASK (0x1 << 7)
1235#define RT5616_DRC_AGC_CP_SFT 7
1236#define RT5616_DRC_AGC_CP_DIS (0x0 << 7)
1237#define RT5616_DRC_AGC_CP_EN (0x1 << 7)
1238#define RT5616_DRC_AGC_CPR_MASK (0x3 << 5)
1239#define RT5616_DRC_AGC_CPR_SFT 5
1240#define RT5616_DRC_AGC_CPR_1_1 (0x0 << 5)
1241#define RT5616_DRC_AGC_CPR_1_2 (0x1 << 5)
1242#define RT5616_DRC_AGC_CPR_1_3 (0x2 << 5)
1243#define RT5616_DRC_AGC_CPR_1_4 (0x3 << 5)
1244#define RT5616_DRC_AGC_PRB_MASK (0x1f)
1245#define RT5616_DRC_AGC_PRB_SFT 0
1246
1247/* DRC/AGC Control 3 (0xb6) */
1248#define RT5616_DRC_AGC_NGB_MASK (0xf << 12)
1249#define RT5616_DRC_AGC_NGB_SFT 12
1250#define RT5616_DRC_AGC_TAR_MASK (0x1f << 7)
1251#define RT5616_DRC_AGC_TAR_SFT 7
1252#define RT5616_DRC_AGC_NG_MASK (0x1 << 6)
1253#define RT5616_DRC_AGC_NG_SFT 6
1254#define RT5616_DRC_AGC_NG_DIS (0x0 << 6)
1255#define RT5616_DRC_AGC_NG_EN (0x1 << 6)
1256#define RT5616_DRC_AGC_NGH_MASK (0x1 << 5)
1257#define RT5616_DRC_AGC_NGH_SFT 5
1258#define RT5616_DRC_AGC_NGH_DIS (0x0 << 5)
1259#define RT5616_DRC_AGC_NGH_EN (0x1 << 5)
1260#define RT5616_DRC_AGC_NGT_MASK (0x1f)
1261#define RT5616_DRC_AGC_NGT_SFT 0
1262
1263/* Jack Detect Control 1 (0xbb) */
1264#define RT5616_JD_MASK (0x7 << 13)
1265#define RT5616_JD_SFT 13
1266#define RT5616_JD_DIS (0x0 << 13)
1267#define RT5616_JD_GPIO1 (0x1 << 13)
1268#define RT5616_JD_GPIO2 (0x2 << 13)
1269#define RT5616_JD_GPIO3 (0x3 << 13)
1270#define RT5616_JD_GPIO4 (0x4 << 13)
1271#define RT5616_JD_GPIO5 (0x5 << 13)
1272#define RT5616_JD_GPIO6 (0x6 << 13)
1273#define RT5616_JD_HP_MASK (0x1 << 11)
1274#define RT5616_JD_HP_SFT 11
1275#define RT5616_JD_HP_DIS (0x0 << 11)
1276#define RT5616_JD_HP_EN (0x1 << 11)
1277#define RT5616_JD_HP_TRG_MASK (0x1 << 10)
1278#define RT5616_JD_HP_TRG_SFT 10
1279#define RT5616_JD_HP_TRG_LO (0x0 << 10)
1280#define RT5616_JD_HP_TRG_HI (0x1 << 10)
1281#define RT5616_JD_SPL_MASK (0x1 << 9)
1282#define RT5616_JD_SPL_SFT 9
1283#define RT5616_JD_SPL_DIS (0x0 << 9)
1284#define RT5616_JD_SPL_EN (0x1 << 9)
1285#define RT5616_JD_SPL_TRG_MASK (0x1 << 8)
1286#define RT5616_JD_SPL_TRG_SFT 8
1287#define RT5616_JD_SPL_TRG_LO (0x0 << 8)
1288#define RT5616_JD_SPL_TRG_HI (0x1 << 8)
1289#define RT5616_JD_SPR_MASK (0x1 << 7)
1290#define RT5616_JD_SPR_SFT 7
1291#define RT5616_JD_SPR_DIS (0x0 << 7)
1292#define RT5616_JD_SPR_EN (0x1 << 7)
1293#define RT5616_JD_SPR_TRG_MASK (0x1 << 6)
1294#define RT5616_JD_SPR_TRG_SFT 6
1295#define RT5616_JD_SPR_TRG_LO (0x0 << 6)
1296#define RT5616_JD_SPR_TRG_HI (0x1 << 6)
1297#define RT5616_JD_LO_MASK (0x1 << 3)
1298#define RT5616_JD_LO_SFT 3
1299#define RT5616_JD_LO_DIS (0x0 << 3)
1300#define RT5616_JD_LO_EN (0x1 << 3)
1301#define RT5616_JD_LO_TRG_MASK (0x1 << 2)
1302#define RT5616_JD_LO_TRG_SFT 2
1303#define RT5616_JD_LO_TRG_LO (0x0 << 2)
1304#define RT5616_JD_LO_TRG_HI (0x1 << 2)
1305
1306/* Jack Detect Control 2 (0xbc) */
1307#define RT5616_JD_TRG_SEL_MASK (0x7 << 9)
1308#define RT5616_JD_TRG_SEL_SFT 9
1309#define RT5616_JD_TRG_SEL_GPIO (0x0 << 9)
1310#define RT5616_JD_TRG_SEL_JD1_1 (0x1 << 9)
1311#define RT5616_JD_TRG_SEL_JD1_2 (0x2 << 9)
1312#define RT5616_JD_TRG_SEL_JD2 (0x3 << 9)
1313#define RT5616_JD_TRG_SEL_JD3 (0x4 << 9)
1314#define RT5616_JD3_IRQ_EN (0x1 << 8)
1315#define RT5616_JD3_IRQ_EN_SFT 8
1316#define RT5616_JD3_EN_STKY (0x1 << 7)
1317#define RT5616_JD3_EN_STKY_SFT 7
1318#define RT5616_JD3_INV (0x1 << 6)
1319#define RT5616_JD3_INV_SFT 6
1320
1321/* IRQ Control 1 (0xbd) */
1322#define RT5616_IRQ_JD_MASK (0x1 << 15)
1323#define RT5616_IRQ_JD_SFT 15
1324#define RT5616_IRQ_JD_BP (0x0 << 15)
1325#define RT5616_IRQ_JD_NOR (0x1 << 15)
1326#define RT5616_JD_STKY_MASK (0x1 << 13)
1327#define RT5616_JD_STKY_SFT 13
1328#define RT5616_JD_STKY_DIS (0x0 << 13)
1329#define RT5616_JD_STKY_EN (0x1 << 13)
1330#define RT5616_JD_P_MASK (0x1 << 11)
1331#define RT5616_JD_P_SFT 11
1332#define RT5616_JD_P_NOR (0x0 << 11)
1333#define RT5616_JD_P_INV (0x1 << 11)
1334#define RT5616_JD1_1_IRQ_EN (0x1 << 9)
1335#define RT5616_JD1_1_IRQ_EN_SFT 9
1336#define RT5616_JD1_1_EN_STKY (0x1 << 8)
1337#define RT5616_JD1_1_EN_STKY_SFT 8
1338#define RT5616_JD1_1_INV (0x1 << 7)
1339#define RT5616_JD1_1_INV_SFT 7
1340#define RT5616_JD1_2_IRQ_EN (0x1 << 6)
1341#define RT5616_JD1_2_IRQ_EN_SFT 6
1342#define RT5616_JD1_2_EN_STKY (0x1 << 5)
1343#define RT5616_JD1_2_EN_STKY_SFT 5
1344#define RT5616_JD1_2_INV (0x1 << 4)
1345#define RT5616_JD1_2_INV_SFT 4
1346#define RT5616_JD2_IRQ_EN (0x1 << 3)
1347#define RT5616_JD2_IRQ_EN_SFT 3
1348#define RT5616_JD2_EN_STKY (0x1 << 2)
1349#define RT5616_JD2_EN_STKY_SFT 2
1350#define RT5616_JD2_INV (0x1 << 1)
1351#define RT5616_JD2_INV_SFT 1
1352
1353/* IRQ Control 2 (0xbe) */
1354#define RT5616_IRQ_MB1_OC_MASK (0x1 << 15)
1355#define RT5616_IRQ_MB1_OC_SFT 15
1356#define RT5616_IRQ_MB1_OC_BP (0x0 << 15)
1357#define RT5616_IRQ_MB1_OC_NOR (0x1 << 15)
1358#define RT5616_MB1_OC_STKY_MASK (0x1 << 11)
1359#define RT5616_MB1_OC_STKY_SFT 11
1360#define RT5616_MB1_OC_STKY_DIS (0x0 << 11)
1361#define RT5616_MB1_OC_STKY_EN (0x1 << 11)
1362#define RT5616_MB1_OC_P_MASK (0x1 << 7)
1363#define RT5616_MB1_OC_P_SFT 7
1364#define RT5616_MB1_OC_P_NOR (0x0 << 7)
1365#define RT5616_MB1_OC_P_INV (0x1 << 7)
1366#define RT5616_MB2_OC_P_MASK (0x1 << 6)
1367#define RT5616_MB1_OC_CLR (0x1 << 3)
1368#define RT5616_MB1_OC_CLR_SFT 3
1369#define RT5616_STA_GPIO8 (0x1)
1370#define RT5616_STA_GPIO8_BIT 0
1371
1372/* Internal Status and GPIO status (0xbf) */
1373#define RT5616_STA_JD3 (0x1 << 15)
1374#define RT5616_STA_JD3_BIT 15
1375#define RT5616_STA_JD2 (0x1 << 14)
1376#define RT5616_STA_JD2_BIT 14
1377#define RT5616_STA_JD1_2 (0x1 << 13)
1378#define RT5616_STA_JD1_2_BIT 13
1379#define RT5616_STA_JD1_1 (0x1 << 12)
1380#define RT5616_STA_JD1_1_BIT 12
1381#define RT5616_STA_GP7 (0x1 << 11)
1382#define RT5616_STA_GP7_BIT 11
1383#define RT5616_STA_GP6 (0x1 << 10)
1384#define RT5616_STA_GP6_BIT 10
1385#define RT5616_STA_GP5 (0x1 << 9)
1386#define RT5616_STA_GP5_BIT 9
1387#define RT5616_STA_GP1 (0x1 << 8)
1388#define RT5616_STA_GP1_BIT 8
1389#define RT5616_STA_GP2 (0x1 << 7)
1390#define RT5616_STA_GP2_BIT 7
1391#define RT5616_STA_GP3 (0x1 << 6)
1392#define RT5616_STA_GP3_BIT 6
1393#define RT5616_STA_GP4 (0x1 << 5)
1394#define RT5616_STA_GP4_BIT 5
1395#define RT5616_STA_GP_JD (0x1 << 4)
1396#define RT5616_STA_GP_JD_BIT 4
1397
1398/* GPIO Control 1 (0xc0) */
1399#define RT5616_GP1_PIN_MASK (0x1 << 15)
1400#define RT5616_GP1_PIN_SFT 15
1401#define RT5616_GP1_PIN_GPIO1 (0x0 << 15)
1402#define RT5616_GP1_PIN_IRQ (0x1 << 15)
1403#define RT5616_GP2_PIN_MASK (0x1 << 14)
1404#define RT5616_GP2_PIN_SFT 14
1405#define RT5616_GP2_PIN_GPIO2 (0x0 << 14)
1406#define RT5616_GP2_PIN_DMIC1_SCL (0x1 << 14)
1407#define RT5616_GPIO_M_MASK (0x1 << 9)
1408#define RT5616_GPIO_M_SFT 9
1409#define RT5616_GPIO_M_FLT (0x0 << 9)
1410#define RT5616_GPIO_M_PH (0x1 << 9)
1411#define RT5616_I2S2_SEL_MASK (0x1 << 8)
1412#define RT5616_I2S2_SEL_SFT 8
1413#define RT5616_I2S2_SEL_I2S (0x0 << 8)
1414#define RT5616_I2S2_SEL_GPIO (0x1 << 8)
1415#define RT5616_GP5_PIN_MASK (0x1 << 7)
1416#define RT5616_GP5_PIN_SFT 7
1417#define RT5616_GP5_PIN_GPIO5 (0x0 << 7)
1418#define RT5616_GP5_PIN_IRQ (0x1 << 7)
1419#define RT5616_GP6_PIN_MASK (0x1 << 6)
1420#define RT5616_GP6_PIN_SFT 6
1421#define RT5616_GP6_PIN_GPIO6 (0x0 << 6)
1422#define RT5616_GP6_PIN_DMIC_SDA (0x1 << 6)
1423#define RT5616_GP7_PIN_MASK (0x1 << 5)
1424#define RT5616_GP7_PIN_SFT 5
1425#define RT5616_GP7_PIN_GPIO7 (0x0 << 5)
1426#define RT5616_GP7_PIN_IRQ (0x1 << 5)
1427#define RT5616_GP8_PIN_MASK (0x1 << 4)
1428#define RT5616_GP8_PIN_SFT 4
1429#define RT5616_GP8_PIN_GPIO8 (0x0 << 4)
1430#define RT5616_GP8_PIN_DMIC_SDA (0x1 << 4)
1431#define RT5616_GPIO_PDM_SEL_MASK (0x1 << 3)
1432#define RT5616_GPIO_PDM_SEL_SFT 3
1433#define RT5616_GPIO_PDM_SEL_GPIO (0x0 << 3)
1434#define RT5616_GPIO_PDM_SEL_PDM (0x1 << 3)
1435
1436/* GPIO Control 2 (0xc1) */
1437#define RT5616_GP5_DR_MASK (0x1 << 14)
1438#define RT5616_GP5_DR_SFT 14
1439#define RT5616_GP5_DR_IN (0x0 << 14)
1440#define RT5616_GP5_DR_OUT (0x1 << 14)
1441#define RT5616_GP5_OUT_MASK (0x1 << 13)
1442#define RT5616_GP5_OUT_SFT 13
1443#define RT5616_GP5_OUT_LO (0x0 << 13)
1444#define RT5616_GP5_OUT_HI (0x1 << 13)
1445#define RT5616_GP5_P_MASK (0x1 << 12)
1446#define RT5616_GP5_P_SFT 12
1447#define RT5616_GP5_P_NOR (0x0 << 12)
1448#define RT5616_GP5_P_INV (0x1 << 12)
1449#define RT5616_GP4_DR_MASK (0x1 << 11)
1450#define RT5616_GP4_DR_SFT 11
1451#define RT5616_GP4_DR_IN (0x0 << 11)
1452#define RT5616_GP4_DR_OUT (0x1 << 11)
1453#define RT5616_GP4_OUT_MASK (0x1 << 10)
1454#define RT5616_GP4_OUT_SFT 10
1455#define RT5616_GP4_OUT_LO (0x0 << 10)
1456#define RT5616_GP4_OUT_HI (0x1 << 10)
1457#define RT5616_GP4_P_MASK (0x1 << 9)
1458#define RT5616_GP4_P_SFT 9
1459#define RT5616_GP4_P_NOR (0x0 << 9)
1460#define RT5616_GP4_P_INV (0x1 << 9)
1461#define RT5616_GP3_DR_MASK (0x1 << 8)
1462#define RT5616_GP3_DR_SFT 8
1463#define RT5616_GP3_DR_IN (0x0 << 8)
1464#define RT5616_GP3_DR_OUT (0x1 << 8)
1465#define RT5616_GP3_OUT_MASK (0x1 << 7)
1466#define RT5616_GP3_OUT_SFT 7
1467#define RT5616_GP3_OUT_LO (0x0 << 7)
1468#define RT5616_GP3_OUT_HI (0x1 << 7)
1469#define RT5616_GP3_P_MASK (0x1 << 6)
1470#define RT5616_GP3_P_SFT 6
1471#define RT5616_GP3_P_NOR (0x0 << 6)
1472#define RT5616_GP3_P_INV (0x1 << 6)
1473#define RT5616_GP2_DR_MASK (0x1 << 5)
1474#define RT5616_GP2_DR_SFT 5
1475#define RT5616_GP2_DR_IN (0x0 << 5)
1476#define RT5616_GP2_DR_OUT (0x1 << 5)
1477#define RT5616_GP2_OUT_MASK (0x1 << 4)
1478#define RT5616_GP2_OUT_SFT 4
1479#define RT5616_GP2_OUT_LO (0x0 << 4)
1480#define RT5616_GP2_OUT_HI (0x1 << 4)
1481#define RT5616_GP2_P_MASK (0x1 << 3)
1482#define RT5616_GP2_P_SFT 3
1483#define RT5616_GP2_P_NOR (0x0 << 3)
1484#define RT5616_GP2_P_INV (0x1 << 3)
1485#define RT5616_GP1_DR_MASK (0x1 << 2)
1486#define RT5616_GP1_DR_SFT 2
1487#define RT5616_GP1_DR_IN (0x0 << 2)
1488#define RT5616_GP1_DR_OUT (0x1 << 2)
1489#define RT5616_GP1_OUT_MASK (0x1 << 1)
1490#define RT5616_GP1_OUT_SFT 1
1491#define RT5616_GP1_OUT_LO (0x0 << 1)
1492#define RT5616_GP1_OUT_HI (0x1 << 1)
1493#define RT5616_GP1_P_MASK (0x1)
1494#define RT5616_GP1_P_SFT 0
1495#define RT5616_GP1_P_NOR (0x0)
1496#define RT5616_GP1_P_INV (0x1)
1497
1498/* GPIO Control 3 (0xc2) */
1499#define RT5616_GP8_DR_MASK (0x1 << 8)
1500#define RT5616_GP8_DR_SFT 8
1501#define RT5616_GP8_DR_IN (0x0 << 8)
1502#define RT5616_GP8_DR_OUT (0x1 << 8)
1503#define RT5616_GP8_OUT_MASK (0x1 << 7)
1504#define RT5616_GP8_OUT_SFT 7
1505#define RT5616_GP8_OUT_LO (0x0 << 7)
1506#define RT5616_GP8_OUT_HI (0x1 << 7)
1507#define RT5616_GP8_P_MASK (0x1 << 6)
1508#define RT5616_GP8_P_SFT 6
1509#define RT5616_GP8_P_NOR (0x0 << 6)
1510#define RT5616_GP8_P_INV (0x1 << 6)
1511#define RT5616_GP7_DR_MASK (0x1 << 5)
1512#define RT5616_GP7_DR_SFT 5
1513#define RT5616_GP7_DR_IN (0x0 << 5)
1514#define RT5616_GP7_DR_OUT (0x1 << 5)
1515#define RT5616_GP7_OUT_MASK (0x1 << 4)
1516#define RT5616_GP7_OUT_SFT 4
1517#define RT5616_GP7_OUT_LO (0x0 << 4)
1518#define RT5616_GP7_OUT_HI (0x1 << 4)
1519#define RT5616_GP7_P_MASK (0x1 << 3)
1520#define RT5616_GP7_P_SFT 3
1521#define RT5616_GP7_P_NOR (0x0 << 3)
1522#define RT5616_GP7_P_INV (0x1 << 3)
1523#define RT5616_GP6_DR_MASK (0x1 << 2)
1524#define RT5616_GP6_DR_SFT 2
1525#define RT5616_GP6_DR_IN (0x0 << 2)
1526#define RT5616_GP6_DR_OUT (0x1 << 2)
1527#define RT5616_GP6_OUT_MASK (0x1 << 1)
1528#define RT5616_GP6_OUT_SFT 1
1529#define RT5616_GP6_OUT_LO (0x0 << 1)
1530#define RT5616_GP6_OUT_HI (0x1 << 1)
1531#define RT5616_GP6_P_MASK (0x1)
1532#define RT5616_GP6_P_SFT 0
1533#define RT5616_GP6_P_NOR (0x0)
1534#define RT5616_GP6_P_INV (0x1)
1535
1536/* Scramble Control (0xce) */
1537#define RT5616_SCB_SWAP_MASK (0x1 << 15)
1538#define RT5616_SCB_SWAP_SFT 15
1539#define RT5616_SCB_SWAP_DIS (0x0 << 15)
1540#define RT5616_SCB_SWAP_EN (0x1 << 15)
1541#define RT5616_SCB_MASK (0x1 << 14)
1542#define RT5616_SCB_SFT 14
1543#define RT5616_SCB_DIS (0x0 << 14)
1544#define RT5616_SCB_EN (0x1 << 14)
1545
1546/* Baseback Control (0xcf) */
1547#define RT5616_BB_MASK (0x1 << 15)
1548#define RT5616_BB_SFT 15
1549#define RT5616_BB_DIS (0x0 << 15)
1550#define RT5616_BB_EN (0x1 << 15)
1551#define RT5616_BB_CT_MASK (0x7 << 12)
1552#define RT5616_BB_CT_SFT 12
1553#define RT5616_BB_CT_A (0x0 << 12)
1554#define RT5616_BB_CT_B (0x1 << 12)
1555#define RT5616_BB_CT_C (0x2 << 12)
1556#define RT5616_BB_CT_D (0x3 << 12)
1557#define RT5616_M_BB_L_MASK (0x1 << 9)
1558#define RT5616_M_BB_L_SFT 9
1559#define RT5616_M_BB_R_MASK (0x1 << 8)
1560#define RT5616_M_BB_R_SFT 8
1561#define RT5616_M_BB_HPF_L_MASK (0x1 << 7)
1562#define RT5616_M_BB_HPF_L_SFT 7
1563#define RT5616_M_BB_HPF_R_MASK (0x1 << 6)
1564#define RT5616_M_BB_HPF_R_SFT 6
1565#define RT5616_G_BB_BST_MASK (0x3f)
1566#define RT5616_G_BB_BST_SFT 0
1567
1568/* MP3 Plus Control 1 (0xd0) */
1569#define RT5616_M_MP3_L_MASK (0x1 << 15)
1570#define RT5616_M_MP3_L_SFT 15
1571#define RT5616_M_MP3_R_MASK (0x1 << 14)
1572#define RT5616_M_MP3_R_SFT 14
1573#define RT5616_M_MP3_MASK (0x1 << 13)
1574#define RT5616_M_MP3_SFT 13
1575#define RT5616_M_MP3_DIS (0x0 << 13)
1576#define RT5616_M_MP3_EN (0x1 << 13)
1577#define RT5616_EG_MP3_MASK (0x1f << 8)
1578#define RT5616_EG_MP3_SFT 8
1579#define RT5616_MP3_HLP_MASK (0x1 << 7)
1580#define RT5616_MP3_HLP_SFT 7
1581#define RT5616_MP3_HLP_DIS (0x0 << 7)
1582#define RT5616_MP3_HLP_EN (0x1 << 7)
1583#define RT5616_M_MP3_ORG_L_MASK (0x1 << 6)
1584#define RT5616_M_MP3_ORG_L_SFT 6
1585#define RT5616_M_MP3_ORG_R_MASK (0x1 << 5)
1586#define RT5616_M_MP3_ORG_R_SFT 5
1587
1588/* MP3 Plus Control 2 (0xd1) */
1589#define RT5616_MP3_WT_MASK (0x1 << 13)
1590#define RT5616_MP3_WT_SFT 13
1591#define RT5616_MP3_WT_1_4 (0x0 << 13)
1592#define RT5616_MP3_WT_1_2 (0x1 << 13)
1593#define RT5616_OG_MP3_MASK (0x1f << 8)
1594#define RT5616_OG_MP3_SFT 8
1595#define RT5616_HG_MP3_MASK (0x3f)
1596#define RT5616_HG_MP3_SFT 0
1597
1598/* 3D HP Control 1 (0xd2) */
1599#define RT5616_3D_CF_MASK (0x1 << 15)
1600#define RT5616_3D_CF_SFT 15
1601#define RT5616_3D_CF_DIS (0x0 << 15)
1602#define RT5616_3D_CF_EN (0x1 << 15)
1603#define RT5616_3D_HP_MASK (0x1 << 14)
1604#define RT5616_3D_HP_SFT 14
1605#define RT5616_3D_HP_DIS (0x0 << 14)
1606#define RT5616_3D_HP_EN (0x1 << 14)
1607#define RT5616_3D_BT_MASK (0x1 << 13)
1608#define RT5616_3D_BT_SFT 13
1609#define RT5616_3D_BT_DIS (0x0 << 13)
1610#define RT5616_3D_BT_EN (0x1 << 13)
1611#define RT5616_3D_1F_MIX_MASK (0x3 << 11)
1612#define RT5616_3D_1F_MIX_SFT 11
1613#define RT5616_3D_HP_M_MASK (0x1 << 10)
1614#define RT5616_3D_HP_M_SFT 10
1615#define RT5616_3D_HP_M_SUR (0x0 << 10)
1616#define RT5616_3D_HP_M_FRO (0x1 << 10)
1617#define RT5616_M_3D_HRTF_MASK (0x1 << 9)
1618#define RT5616_M_3D_HRTF_SFT 9
1619#define RT5616_M_3D_D2H_MASK (0x1 << 8)
1620#define RT5616_M_3D_D2H_SFT 8
1621#define RT5616_M_3D_D2R_MASK (0x1 << 7)
1622#define RT5616_M_3D_D2R_SFT 7
1623#define RT5616_M_3D_REVB_MASK (0x1 << 6)
1624#define RT5616_M_3D_REVB_SFT 6
1625
1626/* Adjustable high pass filter control 1 (0xd3) */
1627#define RT5616_2ND_HPF_MASK (0x1 << 15)
1628#define RT5616_2ND_HPF_SFT 15
1629#define RT5616_2ND_HPF_DIS (0x0 << 15)
1630#define RT5616_2ND_HPF_EN (0x1 << 15)
1631#define RT5616_HPF_CF_L_MASK (0x7 << 12)
1632#define RT5616_HPF_CF_L_SFT 12
1633#define RT5616_HPF_CF_R_MASK (0x7 << 8)
1634#define RT5616_HPF_CF_R_SFT 8
1635#define RT5616_ZD_T_MASK (0x3 << 6)
1636#define RT5616_ZD_T_SFT 6
1637#define RT5616_ZD_F_MASK (0x3 << 4)
1638#define RT5616_ZD_F_SFT 4
1639#define RT5616_ZD_F_IM (0x0 << 4)
1640#define RT5616_ZD_F_ZC_IM (0x1 << 4)
1641#define RT5616_ZD_F_ZC_IOD (0x2 << 4)
1642#define RT5616_ZD_F_UN (0x3 << 4)
1643
1644/* Adjustable high pass filter control 2 (0xd4) */
1645#define RT5616_HPF_CF_L_NUM_MASK (0x3f << 8)
1646#define RT5616_HPF_CF_L_NUM_SFT 8
1647#define RT5616_HPF_CF_R_NUM_MASK (0x3f)
1648#define RT5616_HPF_CF_R_NUM_SFT 0
1649
1650/* HP calibration control and Amp detection (0xd6) */
1651#define RT5616_SI_DAC_MASK (0x1 << 11)
1652#define RT5616_SI_DAC_SFT 11
1653#define RT5616_SI_DAC_AUTO (0x0 << 11)
1654#define RT5616_SI_DAC_TEST (0x1 << 11)
1655#define RT5616_DC_CAL_M_MASK (0x1 << 10)
1656#define RT5616_DC_CAL_M_SFT 10
1657#define RT5616_DC_CAL_M_NOR (0x0 << 10)
1658#define RT5616_DC_CAL_M_CAL (0x1 << 10)
1659#define RT5616_DC_CAL_MASK (0x1 << 9)
1660#define RT5616_DC_CAL_SFT 9
1661#define RT5616_DC_CAL_DIS (0x0 << 9)
1662#define RT5616_DC_CAL_EN (0x1 << 9)
1663#define RT5616_HPD_RCV_MASK (0x7 << 6)
1664#define RT5616_HPD_RCV_SFT 6
1665#define RT5616_HPD_PS_MASK (0x1 << 5)
1666#define RT5616_HPD_PS_SFT 5
1667#define RT5616_HPD_PS_DIS (0x0 << 5)
1668#define RT5616_HPD_PS_EN (0x1 << 5)
1669#define RT5616_CAL_M_MASK (0x1 << 4)
1670#define RT5616_CAL_M_SFT 4
1671#define RT5616_CAL_M_DEP (0x0 << 4)
1672#define RT5616_CAL_M_CAL (0x1 << 4)
1673#define RT5616_CAL_MASK (0x1 << 3)
1674#define RT5616_CAL_SFT 3
1675#define RT5616_CAL_DIS (0x0 << 3)
1676#define RT5616_CAL_EN (0x1 << 3)
1677#define RT5616_CAL_TEST_MASK (0x1 << 2)
1678#define RT5616_CAL_TEST_SFT 2
1679#define RT5616_CAL_TEST_DIS (0x0 << 2)
1680#define RT5616_CAL_TEST_EN (0x1 << 2)
1681#define RT5616_CAL_P_MASK (0x3)
1682#define RT5616_CAL_P_SFT 0
1683#define RT5616_CAL_P_NONE (0x0)
1684#define RT5616_CAL_P_CAL (0x1)
1685#define RT5616_CAL_P_DAC_CAL (0x2)
1686
1687/* Soft volume and zero cross control 1 (0xd9) */
1688#define RT5616_SV_MASK (0x1 << 15)
1689#define RT5616_SV_SFT 15
1690#define RT5616_SV_DIS (0x0 << 15)
1691#define RT5616_SV_EN (0x1 << 15)
1692#define RT5616_OUT_SV_MASK (0x1 << 13)
1693#define RT5616_OUT_SV_SFT 13
1694#define RT5616_OUT_SV_DIS (0x0 << 13)
1695#define RT5616_OUT_SV_EN (0x1 << 13)
1696#define RT5616_HP_SV_MASK (0x1 << 12)
1697#define RT5616_HP_SV_SFT 12
1698#define RT5616_HP_SV_DIS (0x0 << 12)
1699#define RT5616_HP_SV_EN (0x1 << 12)
1700#define RT5616_ZCD_DIG_MASK (0x1 << 11)
1701#define RT5616_ZCD_DIG_SFT 11
1702#define RT5616_ZCD_DIG_DIS (0x0 << 11)
1703#define RT5616_ZCD_DIG_EN (0x1 << 11)
1704#define RT5616_ZCD_MASK (0x1 << 10)
1705#define RT5616_ZCD_SFT 10
1706#define RT5616_ZCD_PD (0x0 << 10)
1707#define RT5616_ZCD_PU (0x1 << 10)
1708#define RT5616_M_ZCD_MASK (0x3f << 4)
1709#define RT5616_M_ZCD_SFT 4
1710#define RT5616_M_ZCD_OM_L (0x1 << 7)
1711#define RT5616_M_ZCD_OM_R (0x1 << 6)
1712#define RT5616_M_ZCD_RM_L (0x1 << 5)
1713#define RT5616_M_ZCD_RM_R (0x1 << 4)
1714#define RT5616_SV_DLY_MASK (0xf)
1715#define RT5616_SV_DLY_SFT 0
1716
1717/* Soft volume and zero cross control 2 (0xda) */
1718#define RT5616_ZCD_HP_MASK (0x1 << 15)
1719#define RT5616_ZCD_HP_SFT 15
1720#define RT5616_ZCD_HP_DIS (0x0 << 15)
1721#define RT5616_ZCD_HP_EN (0x1 << 15)
1722
1723/* Digital Misc Control (0xfa) */
1724#define RT5616_I2S2_MS_SP_MASK (0x1 << 8)
1725#define RT5616_I2S2_MS_SP_SEL 8
1726#define RT5616_I2S2_MS_SP_64 (0x0 << 8)
1727#define RT5616_I2S2_MS_SP_50 (0x1 << 8)
1728#define RT5616_CLK_DET_EN (0x1 << 3)
1729#define RT5616_CLK_DET_EN_SFT 3
1730#define RT5616_AMP_DET_EN (0x1 << 1)
1731#define RT5616_AMP_DET_EN_SFT 1
1732#define RT5616_D_GATE_EN (0x1)
1733#define RT5616_D_GATE_EN_SFT 0
1734
1735/* Codec Private Register definition */
1736/* 3D Speaker Control (0x63) */
1737#define RT5616_3D_SPK_MASK (0x1 << 15)
1738#define RT5616_3D_SPK_SFT 15
1739#define RT5616_3D_SPK_DIS (0x0 << 15)
1740#define RT5616_3D_SPK_EN (0x1 << 15)
1741#define RT5616_3D_SPK_M_MASK (0x3 << 13)
1742#define RT5616_3D_SPK_M_SFT 13
1743#define RT5616_3D_SPK_CG_MASK (0x1f << 8)
1744#define RT5616_3D_SPK_CG_SFT 8
1745#define RT5616_3D_SPK_SG_MASK (0x1f)
1746#define RT5616_3D_SPK_SG_SFT 0
1747
1748/* Wind Noise Detection Control 1 (0x6c) */
1749#define RT5616_WND_MASK (0x1 << 15)
1750#define RT5616_WND_SFT 15
1751#define RT5616_WND_DIS (0x0 << 15)
1752#define RT5616_WND_EN (0x1 << 15)
1753
1754/* Wind Noise Detection Control 2 (0x6d) */
1755#define RT5616_WND_FC_NW_MASK (0x3f << 10)
1756#define RT5616_WND_FC_NW_SFT 10
1757#define RT5616_WND_FC_WK_MASK (0x3f << 4)
1758#define RT5616_WND_FC_WK_SFT 4
1759
1760/* Wind Noise Detection Control 3 (0x6e) */
1761#define RT5616_HPF_FC_MASK (0x3f << 6)
1762#define RT5616_HPF_FC_SFT 6
1763#define RT5616_WND_FC_ST_MASK (0x3f)
1764#define RT5616_WND_FC_ST_SFT 0
1765
1766/* Wind Noise Detection Control 4 (0x6f) */
1767#define RT5616_WND_TH_LO_MASK (0x3ff)
1768#define RT5616_WND_TH_LO_SFT 0
1769
1770/* Wind Noise Detection Control 5 (0x70) */
1771#define RT5616_WND_TH_HI_MASK (0x3ff)
1772#define RT5616_WND_TH_HI_SFT 0
1773
1774/* Wind Noise Detection Control 8 (0x73) */
1775#define RT5616_WND_WIND_MASK (0x1 << 13) /* Read-Only */
1776#define RT5616_WND_WIND_SFT 13
1777#define RT5616_WND_STRONG_MASK (0x1 << 12) /* Read-Only */
1778#define RT5616_WND_STRONG_SFT 12
1779enum {
1780 RT5616_NO_WIND,
1781 RT5616_BREEZE,
1782 RT5616_STORM,
1783};
1784
1785/* Dipole Speaker Interface (0x75) */
1786#define RT5616_DP_ATT_MASK (0x3 << 14)
1787#define RT5616_DP_ATT_SFT 14
1788#define RT5616_DP_SPK_MASK (0x1 << 10)
1789#define RT5616_DP_SPK_SFT 10
1790#define RT5616_DP_SPK_DIS (0x0 << 10)
1791#define RT5616_DP_SPK_EN (0x1 << 10)
1792
1793/* EQ Pre Volume Control (0xb3) */
1794#define RT5616_EQ_PRE_VOL_MASK (0xffff)
1795#define RT5616_EQ_PRE_VOL_SFT 0
1796
1797/* EQ Post Volume Control (0xb4) */
1798#define RT5616_EQ_PST_VOL_MASK (0xffff)
1799#define RT5616_EQ_PST_VOL_SFT 0
1800
1801/* System Clock Source */
1802enum {
1803 RT5616_SCLK_S_MCLK,
1804 RT5616_SCLK_S_PLL1,
1805};
1806
1807/* PLL1 Source */
1808enum {
1809 RT5616_PLL1_S_MCLK,
1810 RT5616_PLL1_S_BCLK1,
1811 RT5616_PLL1_S_BCLK2,
1812};
1813
1814enum {
1815 RT5616_AIF1,
1816 RT5616_AIFS,
1817};
1818
1819#endif /* __RT5616_H__ */
diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c
index f2beb1aa5763..11d032cdc658 100644
--- a/sound/soc/codecs/rt5640.c
+++ b/sound/soc/codecs/rt5640.c
@@ -488,6 +488,18 @@ static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
488 return 0; 488 return 0;
489} 489}
490 490
491static int is_using_asrc(struct snd_soc_dapm_widget *source,
492 struct snd_soc_dapm_widget *sink)
493{
494 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm);
495 struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
496
497 if (!rt5640->asrc_en)
498 return 0;
499
500 return 1;
501}
502
491/* Digital Mixer */ 503/* Digital Mixer */
492static const struct snd_kcontrol_new rt5640_sto_adc_l_mix[] = { 504static const struct snd_kcontrol_new rt5640_sto_adc_l_mix[] = {
493 SOC_DAPM_SINGLE("ADC1 Switch", RT5640_STO_ADC_MIXER, 505 SOC_DAPM_SINGLE("ADC1 Switch", RT5640_STO_ADC_MIXER,
@@ -1059,6 +1071,20 @@ static int rt5640_hp_post_event(struct snd_soc_dapm_widget *w,
1059static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = { 1071static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
1060 SND_SOC_DAPM_SUPPLY("PLL1", RT5640_PWR_ANLG2, 1072 SND_SOC_DAPM_SUPPLY("PLL1", RT5640_PWR_ANLG2,
1061 RT5640_PWR_PLL_BIT, 0, NULL, 0), 1073 RT5640_PWR_PLL_BIT, 0, NULL, 0),
1074
1075 /* ASRC */
1076 SND_SOC_DAPM_SUPPLY_S("Stereo Filter ASRC", 1, RT5640_ASRC_1,
1077 15, 0, NULL, 0),
1078 SND_SOC_DAPM_SUPPLY_S("I2S2 Filter ASRC", 1, RT5640_ASRC_1,
1079 12, 0, NULL, 0),
1080 SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5640_ASRC_1,
1081 11, 0, NULL, 0),
1082 SND_SOC_DAPM_SUPPLY_S("DMIC1 ASRC", 1, RT5640_ASRC_1,
1083 9, 0, NULL, 0),
1084 SND_SOC_DAPM_SUPPLY_S("DMIC2 ASRC", 1, RT5640_ASRC_1,
1085 8, 0, NULL, 0),
1086
1087
1062 /* Input Side */ 1088 /* Input Side */
1063 /* micbias */ 1089 /* micbias */
1064 SND_SOC_DAPM_SUPPLY("LDO2", RT5640_PWR_ANLG1, 1090 SND_SOC_DAPM_SUPPLY("LDO2", RT5640_PWR_ANLG1,
@@ -1319,6 +1345,12 @@ static const struct snd_soc_dapm_widget rt5639_specific_dapm_widgets[] = {
1319}; 1345};
1320 1346
1321static const struct snd_soc_dapm_route rt5640_dapm_routes[] = { 1347static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
1348 { "I2S1", NULL, "Stereo Filter ASRC", is_using_asrc },
1349 { "I2S2", NULL, "I2S2 ASRC", is_using_asrc },
1350 { "I2S2", NULL, "I2S2 Filter ASRC", is_using_asrc },
1351 { "DMIC1", NULL, "DMIC1 ASRC", is_using_asrc },
1352 { "DMIC2", NULL, "DMIC2 ASRC", is_using_asrc },
1353
1322 {"IN1P", NULL, "LDO2"}, 1354 {"IN1P", NULL, "LDO2"},
1323 {"IN2P", NULL, "LDO2"}, 1355 {"IN2P", NULL, "LDO2"},
1324 {"IN3P", NULL, "LDO2"}, 1356 {"IN3P", NULL, "LDO2"},
@@ -1981,6 +2013,76 @@ int rt5640_dmic_enable(struct snd_soc_codec *codec,
1981} 2013}
1982EXPORT_SYMBOL_GPL(rt5640_dmic_enable); 2014EXPORT_SYMBOL_GPL(rt5640_dmic_enable);
1983 2015
2016int rt5640_sel_asrc_clk_src(struct snd_soc_codec *codec,
2017 unsigned int filter_mask, unsigned int clk_src)
2018{
2019 struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);
2020 unsigned int asrc2_mask = 0;
2021 unsigned int asrc2_value = 0;
2022
2023 switch (clk_src) {
2024 case RT5640_CLK_SEL_SYS:
2025 case RT5640_CLK_SEL_ASRC:
2026 break;
2027
2028 default:
2029 return -EINVAL;
2030 }
2031
2032 if (!filter_mask)
2033 return -EINVAL;
2034
2035 if (filter_mask & RT5640_DA_STEREO_FILTER) {
2036 asrc2_mask |= RT5640_STO_DAC_M_MASK;
2037 asrc2_value = (asrc2_value & ~RT5640_STO_DAC_M_MASK)
2038 | (clk_src << RT5640_STO_DAC_M_SFT);
2039 }
2040
2041 if (filter_mask & RT5640_DA_MONO_L_FILTER) {
2042 asrc2_mask |= RT5640_MDA_L_M_MASK;
2043 asrc2_value = (asrc2_value & ~RT5640_MDA_L_M_MASK)
2044 | (clk_src << RT5640_MDA_L_M_SFT);
2045 }
2046
2047 if (filter_mask & RT5640_DA_MONO_R_FILTER) {
2048 asrc2_mask |= RT5640_MDA_R_M_MASK;
2049 asrc2_value = (asrc2_value & ~RT5640_MDA_R_M_MASK)
2050 | (clk_src << RT5640_MDA_R_M_SFT);
2051 }
2052
2053 if (filter_mask & RT5640_AD_STEREO_FILTER) {
2054 asrc2_mask |= RT5640_ADC_M_MASK;
2055 asrc2_value = (asrc2_value & ~RT5640_ADC_M_MASK)
2056 | (clk_src << RT5640_ADC_M_SFT);
2057 }
2058
2059 if (filter_mask & RT5640_AD_MONO_L_FILTER) {
2060 asrc2_mask |= RT5640_MAD_L_M_MASK;
2061 asrc2_value = (asrc2_value & ~RT5640_MAD_L_M_MASK)
2062 | (clk_src << RT5640_MAD_L_M_SFT);
2063 }
2064
2065 if (filter_mask & RT5640_AD_MONO_R_FILTER) {
2066 asrc2_mask |= RT5640_MAD_R_M_MASK;
2067 asrc2_value = (asrc2_value & ~RT5640_MAD_R_M_MASK)
2068 | (clk_src << RT5640_MAD_R_M_SFT);
2069 }
2070
2071 snd_soc_update_bits(codec, RT5640_ASRC_2,
2072 asrc2_mask, asrc2_value);
2073
2074 if (snd_soc_read(codec, RT5640_ASRC_2)) {
2075 rt5640->asrc_en = true;
2076 snd_soc_update_bits(codec, RT5640_JD_CTRL, 0x3, 0x3);
2077 } else {
2078 rt5640->asrc_en = false;
2079 snd_soc_update_bits(codec, RT5640_JD_CTRL, 0x3, 0x0);
2080 }
2081
2082 return 0;
2083}
2084EXPORT_SYMBOL_GPL(rt5640_sel_asrc_clk_src);
2085
1984static int rt5640_probe(struct snd_soc_codec *codec) 2086static int rt5640_probe(struct snd_soc_codec *codec)
1985{ 2087{
1986 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 2088 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
@@ -2175,6 +2277,7 @@ static const struct acpi_device_id rt5640_acpi_match[] = {
2175 { "INT33CA", 0 }, 2277 { "INT33CA", 0 },
2176 { "10EC5640", 0 }, 2278 { "10EC5640", 0 },
2177 { "10EC5642", 0 }, 2279 { "10EC5642", 0 },
2280 { "INTCCFFD", 0 },
2178 { }, 2281 { },
2179}; 2282};
2180MODULE_DEVICE_TABLE(acpi, rt5640_acpi_match); 2283MODULE_DEVICE_TABLE(acpi, rt5640_acpi_match);
diff --git a/sound/soc/codecs/rt5640.h b/sound/soc/codecs/rt5640.h
index 3deb8babeabb..83a7150ddc24 100644
--- a/sound/soc/codecs/rt5640.h
+++ b/sound/soc/codecs/rt5640.h
@@ -1033,6 +1033,10 @@
1033#define RT5640_DMIC_2_M_NOR (0x0 << 8) 1033#define RT5640_DMIC_2_M_NOR (0x0 << 8)
1034#define RT5640_DMIC_2_M_ASYN (0x1 << 8) 1034#define RT5640_DMIC_2_M_ASYN (0x1 << 8)
1035 1035
1036/* ASRC clock source selection (0x84) */
1037#define RT5640_CLK_SEL_SYS (0x0)
1038#define RT5640_CLK_SEL_ASRC (0x1)
1039
1036/* ASRC Control 2 (0x84) */ 1040/* ASRC Control 2 (0x84) */
1037#define RT5640_MDA_L_M_MASK (0x1 << 15) 1041#define RT5640_MDA_L_M_MASK (0x1 << 15)
1038#define RT5640_MDA_L_M_SFT 15 1042#define RT5640_MDA_L_M_SFT 15
@@ -2079,6 +2083,16 @@ enum {
2079 RT5640_DMIC2, 2083 RT5640_DMIC2,
2080}; 2084};
2081 2085
2086/* filter mask */
2087enum {
2088 RT5640_DA_STEREO_FILTER = 0x1,
2089 RT5640_DA_MONO_L_FILTER = (0x1 << 1),
2090 RT5640_DA_MONO_R_FILTER = (0x1 << 2),
2091 RT5640_AD_STEREO_FILTER = (0x1 << 3),
2092 RT5640_AD_MONO_L_FILTER = (0x1 << 4),
2093 RT5640_AD_MONO_R_FILTER = (0x1 << 5),
2094};
2095
2082struct rt5640_priv { 2096struct rt5640_priv {
2083 struct snd_soc_codec *codec; 2097 struct snd_soc_codec *codec;
2084 struct rt5640_platform_data pdata; 2098 struct rt5640_platform_data pdata;
@@ -2095,9 +2109,12 @@ struct rt5640_priv {
2095 int pll_out; 2109 int pll_out;
2096 2110
2097 bool hp_mute; 2111 bool hp_mute;
2112 bool asrc_en;
2098}; 2113};
2099 2114
2100int rt5640_dmic_enable(struct snd_soc_codec *codec, 2115int rt5640_dmic_enable(struct snd_soc_codec *codec,
2101 bool dmic1_data_pin, bool dmic2_data_pin); 2116 bool dmic1_data_pin, bool dmic2_data_pin);
2117int rt5640_sel_asrc_clk_src(struct snd_soc_codec *codec,
2118 unsigned int filter_mask, unsigned int clk_src);
2102 2119
2103#endif 2120#endif
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c
index 3e3c7f6be29d..c61d38b585fb 100644
--- a/sound/soc/codecs/rt5645.c
+++ b/sound/soc/codecs/rt5645.c
@@ -64,7 +64,6 @@ static const struct reg_sequence init_list[] = {
64 {RT5645_PR_BASE + 0x21, 0x4040}, 64 {RT5645_PR_BASE + 0x21, 0x4040},
65 {RT5645_PR_BASE + 0x23, 0x0004}, 65 {RT5645_PR_BASE + 0x23, 0x0004},
66}; 66};
67#define RT5645_INIT_REG_LEN ARRAY_SIZE(init_list)
68 67
69static const struct reg_sequence rt5650_init_list[] = { 68static const struct reg_sequence rt5650_init_list[] = {
70 {0xf6, 0x0100}, 69 {0xf6, 0x0100},
@@ -226,6 +225,163 @@ static const struct reg_default rt5645_reg[] = {
226 { 0xff, 0x6308 }, 225 { 0xff, 0x6308 },
227}; 226};
228 227
228static const struct reg_default rt5650_reg[] = {
229 { 0x00, 0x0000 },
230 { 0x01, 0xc8c8 },
231 { 0x02, 0xc8c8 },
232 { 0x03, 0xc8c8 },
233 { 0x0a, 0x0002 },
234 { 0x0b, 0x2827 },
235 { 0x0c, 0xe000 },
236 { 0x0d, 0x0000 },
237 { 0x0e, 0x0000 },
238 { 0x0f, 0x0808 },
239 { 0x14, 0x3333 },
240 { 0x16, 0x4b00 },
241 { 0x18, 0x018b },
242 { 0x19, 0xafaf },
243 { 0x1a, 0xafaf },
244 { 0x1b, 0x0001 },
245 { 0x1c, 0x2f2f },
246 { 0x1d, 0x2f2f },
247 { 0x1e, 0x0000 },
248 { 0x20, 0x0000 },
249 { 0x27, 0x7060 },
250 { 0x28, 0x7070 },
251 { 0x29, 0x8080 },
252 { 0x2a, 0x5656 },
253 { 0x2b, 0x5454 },
254 { 0x2c, 0xaaa0 },
255 { 0x2d, 0x0000 },
256 { 0x2f, 0x1002 },
257 { 0x31, 0x5000 },
258 { 0x32, 0x0000 },
259 { 0x33, 0x0000 },
260 { 0x34, 0x0000 },
261 { 0x35, 0x0000 },
262 { 0x3b, 0x0000 },
263 { 0x3c, 0x007f },
264 { 0x3d, 0x0000 },
265 { 0x3e, 0x007f },
266 { 0x3f, 0x0000 },
267 { 0x40, 0x001f },
268 { 0x41, 0x0000 },
269 { 0x42, 0x001f },
270 { 0x45, 0x6000 },
271 { 0x46, 0x003e },
272 { 0x47, 0x003e },
273 { 0x48, 0xf807 },
274 { 0x4a, 0x0004 },
275 { 0x4d, 0x0000 },
276 { 0x4e, 0x0000 },
277 { 0x4f, 0x01ff },
278 { 0x50, 0x0000 },
279 { 0x51, 0x0000 },
280 { 0x52, 0x01ff },
281 { 0x53, 0xf000 },
282 { 0x56, 0x0111 },
283 { 0x57, 0x0064 },
284 { 0x58, 0xef0e },
285 { 0x59, 0xf0f0 },
286 { 0x5a, 0xef0e },
287 { 0x5b, 0xf0f0 },
288 { 0x5c, 0xef0e },
289 { 0x5d, 0xf0f0 },
290 { 0x5e, 0xf000 },
291 { 0x5f, 0x0000 },
292 { 0x61, 0x0300 },
293 { 0x62, 0x0000 },
294 { 0x63, 0x00c2 },
295 { 0x64, 0x0000 },
296 { 0x65, 0x0000 },
297 { 0x66, 0x0000 },
298 { 0x6a, 0x0000 },
299 { 0x6c, 0x0aaa },
300 { 0x70, 0x8000 },
301 { 0x71, 0x8000 },
302 { 0x72, 0x8000 },
303 { 0x73, 0x7770 },
304 { 0x74, 0x3e00 },
305 { 0x75, 0x2409 },
306 { 0x76, 0x000a },
307 { 0x77, 0x0c00 },
308 { 0x78, 0x0000 },
309 { 0x79, 0x0123 },
310 { 0x7a, 0x0123 },
311 { 0x80, 0x0000 },
312 { 0x81, 0x0000 },
313 { 0x82, 0x0000 },
314 { 0x83, 0x0000 },
315 { 0x84, 0x0000 },
316 { 0x85, 0x0000 },
317 { 0x8a, 0x0000 },
318 { 0x8e, 0x0004 },
319 { 0x8f, 0x1100 },
320 { 0x90, 0x0646 },
321 { 0x91, 0x0c06 },
322 { 0x93, 0x0000 },
323 { 0x94, 0x0200 },
324 { 0x95, 0x0000 },
325 { 0x9a, 0x2184 },
326 { 0x9b, 0x010a },
327 { 0x9c, 0x0aea },
328 { 0x9d, 0x000c },
329 { 0x9e, 0x0400 },
330 { 0xa0, 0xa0a8 },
331 { 0xa1, 0x0059 },
332 { 0xa2, 0x0001 },
333 { 0xae, 0x6000 },
334 { 0xaf, 0x0000 },
335 { 0xb0, 0x6000 },
336 { 0xb1, 0x0000 },
337 { 0xb2, 0x0000 },
338 { 0xb3, 0x001f },
339 { 0xb4, 0x020c },
340 { 0xb5, 0x1f00 },
341 { 0xb6, 0x0000 },
342 { 0xbb, 0x0000 },
343 { 0xbc, 0x0000 },
344 { 0xbd, 0x0000 },
345 { 0xbe, 0x0000 },
346 { 0xbf, 0x3100 },
347 { 0xc0, 0x0000 },
348 { 0xc1, 0x0000 },
349 { 0xc2, 0x0000 },
350 { 0xc3, 0x2000 },
351 { 0xcd, 0x0000 },
352 { 0xce, 0x0000 },
353 { 0xcf, 0x1813 },
354 { 0xd0, 0x0690 },
355 { 0xd1, 0x1c17 },
356 { 0xd3, 0xb320 },
357 { 0xd4, 0x0000 },
358 { 0xd6, 0x0400 },
359 { 0xd9, 0x0809 },
360 { 0xda, 0x0000 },
361 { 0xdb, 0x0003 },
362 { 0xdc, 0x0049 },
363 { 0xdd, 0x001b },
364 { 0xdf, 0x0008 },
365 { 0xe0, 0x4000 },
366 { 0xe6, 0x8000 },
367 { 0xe7, 0x0200 },
368 { 0xec, 0xb300 },
369 { 0xed, 0x0000 },
370 { 0xf0, 0x001f },
371 { 0xf1, 0x020c },
372 { 0xf2, 0x1f00 },
373 { 0xf3, 0x0000 },
374 { 0xf4, 0x4000 },
375 { 0xf8, 0x0000 },
376 { 0xf9, 0x0000 },
377 { 0xfa, 0x2060 },
378 { 0xfb, 0x4040 },
379 { 0xfc, 0x0000 },
380 { 0xfd, 0x0002 },
381 { 0xfe, 0x10ec },
382 { 0xff, 0x6308 },
383};
384
229struct rt5645_eq_param_s { 385struct rt5645_eq_param_s {
230 unsigned short reg; 386 unsigned short reg;
231 unsigned short val; 387 unsigned short val;
@@ -248,6 +404,7 @@ struct rt5645_priv {
248 struct delayed_work jack_detect_work, rcclock_work; 404 struct delayed_work jack_detect_work, rcclock_work;
249 struct regulator_bulk_data supplies[ARRAY_SIZE(rt5645_supply_names)]; 405 struct regulator_bulk_data supplies[ARRAY_SIZE(rt5645_supply_names)];
250 struct rt5645_eq_param_s *eq_param; 406 struct rt5645_eq_param_s *eq_param;
407 struct timer_list btn_check_timer;
251 408
252 int codec_type; 409 int codec_type;
253 int sysclk; 410 int sysclk;
@@ -572,14 +729,12 @@ static int rt5645_spk_put_volsw(struct snd_kcontrol *kcontrol,
572 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); 729 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
573 int ret; 730 int ret;
574 731
575 cancel_delayed_work_sync(&rt5645->rcclock_work);
576
577 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS, 732 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
578 RT5645_PWR_CLK25M_MASK, RT5645_PWR_CLK25M_PU); 733 RT5645_PWR_CLK25M_MASK, RT5645_PWR_CLK25M_PU);
579 734
580 ret = snd_soc_put_volsw(kcontrol, ucontrol); 735 ret = snd_soc_put_volsw(kcontrol, ucontrol);
581 736
582 queue_delayed_work(system_power_efficient_wq, &rt5645->rcclock_work, 737 mod_delayed_work(system_power_efficient_wq, &rt5645->rcclock_work,
583 msecs_to_jiffies(200)); 738 msecs_to_jiffies(200));
584 739
585 return ret; 740 return ret;
@@ -2911,6 +3066,7 @@ static void rt5645_enable_push_button_irq(struct snd_soc_codec *codec,
2911 snd_soc_dapm_force_enable_pin(dapm, "ADC R power"); 3066 snd_soc_dapm_force_enable_pin(dapm, "ADC R power");
2912 snd_soc_dapm_sync(dapm); 3067 snd_soc_dapm_sync(dapm);
2913 3068
3069 snd_soc_update_bits(codec, RT5650_4BTN_IL_CMD1, 0x3, 0x3);
2914 snd_soc_update_bits(codec, 3070 snd_soc_update_bits(codec,
2915 RT5645_INT_IRQ_ST, 0x8, 0x8); 3071 RT5645_INT_IRQ_ST, 0x8, 0x8);
2916 snd_soc_update_bits(codec, 3072 snd_soc_update_bits(codec,
@@ -2979,7 +3135,7 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
2979 } 3135 }
2980 if (rt5645->pdata.jd_invert) 3136 if (rt5645->pdata.jd_invert)
2981 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, 3137 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
2982 RT5645_JD_1_1_MASK, RT5645_JD_1_1_INV); 3138 RT5645_JD_1_1_MASK, RT5645_JD_1_1_NOR);
2983 } else { /* jack out */ 3139 } else { /* jack out */
2984 rt5645->jack_type = 0; 3140 rt5645->jack_type = 0;
2985 3141
@@ -3000,7 +3156,7 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
3000 snd_soc_dapm_sync(dapm); 3156 snd_soc_dapm_sync(dapm);
3001 if (rt5645->pdata.jd_invert) 3157 if (rt5645->pdata.jd_invert)
3002 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, 3158 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
3003 RT5645_JD_1_1_MASK, RT5645_JD_1_1_NOR); 3159 RT5645_JD_1_1_MASK, RT5645_JD_1_1_INV);
3004 } 3160 }
3005 3161
3006 return rt5645->jack_type; 3162 return rt5645->jack_type;
@@ -3124,6 +3280,12 @@ static void rt5645_jack_detect_work(struct work_struct *work)
3124 } 3280 }
3125 if (btn_type == 0)/* button release */ 3281 if (btn_type == 0)/* button release */
3126 report = rt5645->jack_type; 3282 report = rt5645->jack_type;
3283 else {
3284 if (rt5645->pdata.jd_invert) {
3285 mod_timer(&rt5645->btn_check_timer,
3286 msecs_to_jiffies(100));
3287 }
3288 }
3127 3289
3128 break; 3290 break;
3129 /* jack out */ 3291 /* jack out */
@@ -3166,6 +3328,14 @@ static irqreturn_t rt5645_irq(int irq, void *data)
3166 return IRQ_HANDLED; 3328 return IRQ_HANDLED;
3167} 3329}
3168 3330
3331static void rt5645_btn_check_callback(unsigned long data)
3332{
3333 struct rt5645_priv *rt5645 = (struct rt5645_priv *)data;
3334
3335 queue_delayed_work(system_power_efficient_wq,
3336 &rt5645->jack_detect_work, msecs_to_jiffies(5));
3337}
3338
3169static int rt5645_probe(struct snd_soc_codec *codec) 3339static int rt5645_probe(struct snd_soc_codec *codec)
3170{ 3340{
3171 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 3341 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
@@ -3322,6 +3492,31 @@ static const struct regmap_config rt5645_regmap = {
3322 .num_ranges = ARRAY_SIZE(rt5645_ranges), 3492 .num_ranges = ARRAY_SIZE(rt5645_ranges),
3323}; 3493};
3324 3494
3495static const struct regmap_config rt5650_regmap = {
3496 .reg_bits = 8,
3497 .val_bits = 16,
3498 .use_single_rw = true,
3499 .max_register = RT5645_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5645_ranges) *
3500 RT5645_PR_SPACING),
3501 .volatile_reg = rt5645_volatile_register,
3502 .readable_reg = rt5645_readable_register,
3503
3504 .cache_type = REGCACHE_RBTREE,
3505 .reg_defaults = rt5650_reg,
3506 .num_reg_defaults = ARRAY_SIZE(rt5650_reg),
3507 .ranges = rt5645_ranges,
3508 .num_ranges = ARRAY_SIZE(rt5645_ranges),
3509};
3510
3511static const struct regmap_config temp_regmap = {
3512 .name="nocache",
3513 .reg_bits = 8,
3514 .val_bits = 16,
3515 .use_single_rw = true,
3516 .max_register = RT5645_VENDOR_ID2 + 1,
3517 .cache_type = REGCACHE_NONE,
3518};
3519
3325static const struct i2c_device_id rt5645_i2c_id[] = { 3520static const struct i2c_device_id rt5645_i2c_id[] = {
3326 { "rt5645", 0 }, 3521 { "rt5645", 0 },
3327 { "rt5650", 0 }, 3522 { "rt5650", 0 },
@@ -3330,7 +3525,7 @@ static const struct i2c_device_id rt5645_i2c_id[] = {
3330MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id); 3525MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id);
3331 3526
3332#ifdef CONFIG_ACPI 3527#ifdef CONFIG_ACPI
3333static struct acpi_device_id rt5645_acpi_match[] = { 3528static const struct acpi_device_id rt5645_acpi_match[] = {
3334 { "10EC5645", 0 }, 3529 { "10EC5645", 0 },
3335 { "10EC5650", 0 }, 3530 { "10EC5650", 0 },
3336 {}, 3531 {},
@@ -3338,69 +3533,23 @@ static struct acpi_device_id rt5645_acpi_match[] = {
3338MODULE_DEVICE_TABLE(acpi, rt5645_acpi_match); 3533MODULE_DEVICE_TABLE(acpi, rt5645_acpi_match);
3339#endif 3534#endif
3340 3535
3341static struct rt5645_platform_data *rt5645_pdata; 3536static struct rt5645_platform_data general_platform_data = {
3342
3343static struct rt5645_platform_data strago_platform_data = {
3344 .dmic1_data_pin = RT5645_DMIC1_DISABLE, 3537 .dmic1_data_pin = RT5645_DMIC1_DISABLE,
3345 .dmic2_data_pin = RT5645_DMIC_DATA_IN2P, 3538 .dmic2_data_pin = RT5645_DMIC_DATA_IN2P,
3346 .jd_mode = 3, 3539 .jd_mode = 3,
3347}; 3540};
3348 3541
3349static int strago_quirk_cb(const struct dmi_system_id *id)
3350{
3351 rt5645_pdata = &strago_platform_data;
3352
3353 return 1;
3354}
3355
3356static const struct dmi_system_id dmi_platform_intel_braswell[] = { 3542static const struct dmi_system_id dmi_platform_intel_braswell[] = {
3357 { 3543 {
3358 .ident = "Intel Strago", 3544 .ident = "Intel Strago",
3359 .callback = strago_quirk_cb,
3360 .matches = { 3545 .matches = {
3361 DMI_MATCH(DMI_PRODUCT_NAME, "Strago"), 3546 DMI_MATCH(DMI_PRODUCT_NAME, "Strago"),
3362 }, 3547 },
3363 }, 3548 },
3364 { 3549 {
3365 .ident = "Google Celes", 3550 .ident = "Google Chrome",
3366 .callback = strago_quirk_cb,
3367 .matches = {
3368 DMI_MATCH(DMI_PRODUCT_NAME, "Celes"),
3369 },
3370 },
3371 {
3372 .ident = "Google Ultima",
3373 .callback = strago_quirk_cb,
3374 .matches = {
3375 DMI_MATCH(DMI_PRODUCT_NAME, "Ultima"),
3376 },
3377 },
3378 {
3379 .ident = "Google Reks",
3380 .callback = strago_quirk_cb,
3381 .matches = {
3382 DMI_MATCH(DMI_PRODUCT_NAME, "Reks"),
3383 },
3384 },
3385 {
3386 .ident = "Google Edgar",
3387 .callback = strago_quirk_cb,
3388 .matches = { 3551 .matches = {
3389 DMI_MATCH(DMI_PRODUCT_NAME, "Edgar"), 3552 DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
3390 },
3391 },
3392 {
3393 .ident = "Google Wizpig",
3394 .callback = strago_quirk_cb,
3395 .matches = {
3396 DMI_MATCH(DMI_PRODUCT_NAME, "Wizpig"),
3397 },
3398 },
3399 {
3400 .ident = "Google Terra",
3401 .callback = strago_quirk_cb,
3402 .matches = {
3403 DMI_MATCH(DMI_PRODUCT_NAME, "Terra"),
3404 }, 3553 },
3405 }, 3554 },
3406 { } 3555 { }
@@ -3413,17 +3562,9 @@ static struct rt5645_platform_data buddy_platform_data = {
3413 .jd_invert = true, 3562 .jd_invert = true,
3414}; 3563};
3415 3564
3416static int buddy_quirk_cb(const struct dmi_system_id *id)
3417{
3418 rt5645_pdata = &buddy_platform_data;
3419
3420 return 1;
3421}
3422
3423static struct dmi_system_id dmi_platform_intel_broadwell[] = { 3565static struct dmi_system_id dmi_platform_intel_broadwell[] = {
3424 { 3566 {
3425 .ident = "Chrome Buddy", 3567 .ident = "Chrome Buddy",
3426 .callback = buddy_quirk_cb,
3427 .matches = { 3568 .matches = {
3428 DMI_MATCH(DMI_PRODUCT_NAME, "Buddy"), 3569 DMI_MATCH(DMI_PRODUCT_NAME, "Buddy"),
3429 }, 3570 },
@@ -3431,6 +3572,16 @@ static struct dmi_system_id dmi_platform_intel_broadwell[] = {
3431 { } 3572 { }
3432}; 3573};
3433 3574
3575static bool rt5645_check_dp(struct device *dev)
3576{
3577 if (device_property_present(dev, "realtek,in2-differential") ||
3578 device_property_present(dev, "realtek,dmic1-data-pin") ||
3579 device_property_present(dev, "realtek,dmic2-data-pin") ||
3580 device_property_present(dev, "realtek,jd-mode"))
3581 return true;
3582
3583 return false;
3584}
3434 3585
3435static int rt5645_parse_dt(struct rt5645_priv *rt5645, struct device *dev) 3586static int rt5645_parse_dt(struct rt5645_priv *rt5645, struct device *dev)
3436{ 3587{
@@ -3453,6 +3604,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
3453 struct rt5645_priv *rt5645; 3604 struct rt5645_priv *rt5645;
3454 int ret, i; 3605 int ret, i;
3455 unsigned int val; 3606 unsigned int val;
3607 struct regmap *regmap;
3456 3608
3457 rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv), 3609 rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv),
3458 GFP_KERNEL); 3610 GFP_KERNEL);
@@ -3464,11 +3616,12 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
3464 3616
3465 if (pdata) 3617 if (pdata)
3466 rt5645->pdata = *pdata; 3618 rt5645->pdata = *pdata;
3467 else if (dmi_check_system(dmi_platform_intel_braswell) || 3619 else if (dmi_check_system(dmi_platform_intel_broadwell))
3468 dmi_check_system(dmi_platform_intel_broadwell)) 3620 rt5645->pdata = buddy_platform_data;
3469 rt5645->pdata = *rt5645_pdata; 3621 else if (rt5645_check_dp(&i2c->dev))
3470 else
3471 rt5645_parse_dt(rt5645, &i2c->dev); 3622 rt5645_parse_dt(rt5645, &i2c->dev);
3623 else if (dmi_check_system(dmi_platform_intel_braswell))
3624 rt5645->pdata = general_platform_data;
3472 3625
3473 rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect", 3626 rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect",
3474 GPIOD_IN); 3627 GPIOD_IN);
@@ -3478,14 +3631,6 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
3478 return PTR_ERR(rt5645->gpiod_hp_det); 3631 return PTR_ERR(rt5645->gpiod_hp_det);
3479 } 3632 }
3480 3633
3481 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5645_regmap);
3482 if (IS_ERR(rt5645->regmap)) {
3483 ret = PTR_ERR(rt5645->regmap);
3484 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
3485 ret);
3486 return ret;
3487 }
3488
3489 for (i = 0; i < ARRAY_SIZE(rt5645->supplies); i++) 3634 for (i = 0; i < ARRAY_SIZE(rt5645->supplies); i++)
3490 rt5645->supplies[i].supply = rt5645_supply_names[i]; 3635 rt5645->supplies[i].supply = rt5645_supply_names[i];
3491 3636
@@ -3504,13 +3649,22 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
3504 return ret; 3649 return ret;
3505 } 3650 }
3506 3651
3507 regmap_read(rt5645->regmap, RT5645_VENDOR_ID2, &val); 3652 regmap = devm_regmap_init_i2c(i2c, &temp_regmap);
3653 if (IS_ERR(regmap)) {
3654 ret = PTR_ERR(regmap);
3655 dev_err(&i2c->dev, "Failed to allocate temp register map: %d\n",
3656 ret);
3657 return ret;
3658 }
3659 regmap_read(regmap, RT5645_VENDOR_ID2, &val);
3508 3660
3509 switch (val) { 3661 switch (val) {
3510 case RT5645_DEVICE_ID: 3662 case RT5645_DEVICE_ID:
3663 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5645_regmap);
3511 rt5645->codec_type = CODEC_TYPE_RT5645; 3664 rt5645->codec_type = CODEC_TYPE_RT5645;
3512 break; 3665 break;
3513 case RT5650_DEVICE_ID: 3666 case RT5650_DEVICE_ID:
3667 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5650_regmap);
3514 rt5645->codec_type = CODEC_TYPE_RT5650; 3668 rt5645->codec_type = CODEC_TYPE_RT5650;
3515 break; 3669 break;
3516 default: 3670 default:
@@ -3521,6 +3675,13 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
3521 goto err_enable; 3675 goto err_enable;
3522 } 3676 }
3523 3677
3678 if (IS_ERR(rt5645->regmap)) {
3679 ret = PTR_ERR(rt5645->regmap);
3680 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
3681 ret);
3682 return ret;
3683 }
3684
3524 regmap_write(rt5645->regmap, RT5645_RESET, 0); 3685 regmap_write(rt5645->regmap, RT5645_RESET, 0);
3525 3686
3526 ret = regmap_register_patch(rt5645->regmap, init_list, 3687 ret = regmap_register_patch(rt5645->regmap, init_list,
@@ -3641,6 +3802,13 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
3641 } 3802 }
3642 } 3803 }
3643 3804
3805 if (rt5645->pdata.jd_invert) {
3806 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
3807 RT5645_JD_1_1_MASK, RT5645_JD_1_1_INV);
3808 setup_timer(&rt5645->btn_check_timer,
3809 rt5645_btn_check_callback, (unsigned long)rt5645);
3810 }
3811
3644 INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work); 3812 INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work);
3645 INIT_DELAYED_WORK(&rt5645->rcclock_work, rt5645_rcclock_work); 3813 INIT_DELAYED_WORK(&rt5645->rcclock_work, rt5645_rcclock_work);
3646 3814
diff --git a/sound/soc/codecs/rt5651.c b/sound/soc/codecs/rt5651.c
index 1d4031818966..7a6197042423 100644
--- a/sound/soc/codecs/rt5651.c
+++ b/sound/soc/codecs/rt5651.c
@@ -18,6 +18,7 @@
18#include <linux/regmap.h> 18#include <linux/regmap.h>
19#include <linux/platform_device.h> 19#include <linux/platform_device.h>
20#include <linux/spi/spi.h> 20#include <linux/spi/spi.h>
21#include <linux/acpi.h>
21#include <sound/core.h> 22#include <sound/core.h>
22#include <sound/pcm.h> 23#include <sound/pcm.h>
23#include <sound/pcm_params.h> 24#include <sound/pcm_params.h>
@@ -1735,12 +1736,38 @@ static const struct regmap_config rt5651_regmap = {
1735 .num_ranges = ARRAY_SIZE(rt5651_ranges), 1736 .num_ranges = ARRAY_SIZE(rt5651_ranges),
1736}; 1737};
1737 1738
1739#if defined(CONFIG_OF)
1740static const struct of_device_id rt5651_of_match[] = {
1741 { .compatible = "realtek,rt5651", },
1742 {},
1743};
1744MODULE_DEVICE_TABLE(of, rt5651_of_match);
1745#endif
1746
1747#ifdef CONFIG_ACPI
1748static const struct acpi_device_id rt5651_acpi_match[] = {
1749 { "10EC5651", 0 },
1750 { },
1751};
1752MODULE_DEVICE_TABLE(acpi, rt5651_acpi_match);
1753#endif
1754
1738static const struct i2c_device_id rt5651_i2c_id[] = { 1755static const struct i2c_device_id rt5651_i2c_id[] = {
1739 { "rt5651", 0 }, 1756 { "rt5651", 0 },
1740 { } 1757 { }
1741}; 1758};
1742MODULE_DEVICE_TABLE(i2c, rt5651_i2c_id); 1759MODULE_DEVICE_TABLE(i2c, rt5651_i2c_id);
1743 1760
1761static int rt5651_parse_dt(struct rt5651_priv *rt5651, struct device_node *np)
1762{
1763 rt5651->pdata.in2_diff = of_property_read_bool(np,
1764 "realtek,in2-differential");
1765 rt5651->pdata.dmic_en = of_property_read_bool(np,
1766 "realtek,dmic-en");
1767
1768 return 0;
1769}
1770
1744static int rt5651_i2c_probe(struct i2c_client *i2c, 1771static int rt5651_i2c_probe(struct i2c_client *i2c,
1745 const struct i2c_device_id *id) 1772 const struct i2c_device_id *id)
1746{ 1773{
@@ -1757,6 +1784,8 @@ static int rt5651_i2c_probe(struct i2c_client *i2c,
1757 1784
1758 if (pdata) 1785 if (pdata)
1759 rt5651->pdata = *pdata; 1786 rt5651->pdata = *pdata;
1787 else if (i2c->dev.of_node)
1788 rt5651_parse_dt(rt5651, i2c->dev.of_node);
1760 1789
1761 rt5651->regmap = devm_regmap_init_i2c(i2c, &rt5651_regmap); 1790 rt5651->regmap = devm_regmap_init_i2c(i2c, &rt5651_regmap);
1762 if (IS_ERR(rt5651->regmap)) { 1791 if (IS_ERR(rt5651->regmap)) {
@@ -1806,6 +1835,8 @@ static int rt5651_i2c_remove(struct i2c_client *i2c)
1806static struct i2c_driver rt5651_i2c_driver = { 1835static struct i2c_driver rt5651_i2c_driver = {
1807 .driver = { 1836 .driver = {
1808 .name = "rt5651", 1837 .name = "rt5651",
1838 .acpi_match_table = ACPI_PTR(rt5651_acpi_match),
1839 .of_match_table = of_match_ptr(rt5651_of_match),
1809 }, 1840 },
1810 .probe = rt5651_i2c_probe, 1841 .probe = rt5651_i2c_probe,
1811 .remove = rt5651_i2c_remove, 1842 .remove = rt5651_i2c_remove,
diff --git a/sound/soc/codecs/rt5659.c b/sound/soc/codecs/rt5659.c
new file mode 100644
index 000000000000..820d8fa62b5e
--- /dev/null
+++ b/sound/soc/codecs/rt5659.c
@@ -0,0 +1,4223 @@
1/*
2 * rt5659.c -- RT5659/RT5658 ALSA SoC audio codec driver
3 *
4 * Copyright 2015 Realtek Semiconductor Corp.
5 * Author: Bard Liao <bardliao@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#include <linux/module.h>
13#include <linux/moduleparam.h>
14#include <linux/init.h>
15#include <linux/delay.h>
16#include <linux/pm.h>
17#include <linux/i2c.h>
18#include <linux/platform_device.h>
19#include <linux/spi/spi.h>
20#include <linux/acpi.h>
21#include <linux/gpio.h>
22#include <linux/gpio/consumer.h>
23#include <sound/core.h>
24#include <sound/pcm.h>
25#include <sound/pcm_params.h>
26#include <sound/jack.h>
27#include <sound/soc.h>
28#include <sound/soc-dapm.h>
29#include <sound/initval.h>
30#include <sound/tlv.h>
31#include <sound/rt5659.h>
32
33#include "rl6231.h"
34#include "rt5659.h"
35
36static const struct reg_default rt5659_reg[] = {
37 { 0x0000, 0x0000 },
38 { 0x0001, 0x4848 },
39 { 0x0002, 0x8080 },
40 { 0x0003, 0xc8c8 },
41 { 0x0004, 0xc80a },
42 { 0x0005, 0x0000 },
43 { 0x0006, 0x0000 },
44 { 0x0007, 0x0103 },
45 { 0x0008, 0x0080 },
46 { 0x0009, 0x0000 },
47 { 0x000a, 0x0000 },
48 { 0x000c, 0x0000 },
49 { 0x000d, 0x0000 },
50 { 0x000f, 0x0808 },
51 { 0x0010, 0x3080 },
52 { 0x0011, 0x4a00 },
53 { 0x0012, 0x4e00 },
54 { 0x0015, 0x42c1 },
55 { 0x0016, 0x0000 },
56 { 0x0018, 0x000b },
57 { 0x0019, 0xafaf },
58 { 0x001a, 0xafaf },
59 { 0x001b, 0x0011 },
60 { 0x001c, 0x2f2f },
61 { 0x001d, 0x2f2f },
62 { 0x001e, 0x2f2f },
63 { 0x001f, 0x0000 },
64 { 0x0020, 0x0000 },
65 { 0x0021, 0x0000 },
66 { 0x0022, 0x5757 },
67 { 0x0023, 0x0039 },
68 { 0x0026, 0xc060 },
69 { 0x0027, 0xd8d8 },
70 { 0x0029, 0x8080 },
71 { 0x002a, 0xaaaa },
72 { 0x002b, 0xaaaa },
73 { 0x002c, 0x00af },
74 { 0x002d, 0x0000 },
75 { 0x002f, 0x1002 },
76 { 0x0031, 0x5000 },
77 { 0x0032, 0x0000 },
78 { 0x0033, 0x0000 },
79 { 0x0034, 0x0000 },
80 { 0x0035, 0x0000 },
81 { 0x0036, 0x0000 },
82 { 0x003a, 0x0000 },
83 { 0x003b, 0x0000 },
84 { 0x003c, 0x007f },
85 { 0x003d, 0x0000 },
86 { 0x003e, 0x007f },
87 { 0x0040, 0x0808 },
88 { 0x0046, 0x001f },
89 { 0x0047, 0x001f },
90 { 0x0048, 0x0003 },
91 { 0x0049, 0xe061 },
92 { 0x004a, 0x0000 },
93 { 0x004b, 0x031f },
94 { 0x004d, 0x0000 },
95 { 0x004e, 0x001f },
96 { 0x004f, 0x0000 },
97 { 0x0050, 0x001f },
98 { 0x0052, 0xf000 },
99 { 0x0053, 0x0111 },
100 { 0x0054, 0x0064 },
101 { 0x0055, 0x0080 },
102 { 0x0056, 0xef0e },
103 { 0x0057, 0xf0f0 },
104 { 0x0058, 0xef0e },
105 { 0x0059, 0xf0f0 },
106 { 0x005a, 0xef0e },
107 { 0x005b, 0xf0f0 },
108 { 0x005c, 0xf000 },
109 { 0x005d, 0x0000 },
110 { 0x005e, 0x1f2c },
111 { 0x005f, 0x1f2c },
112 { 0x0060, 0x2717 },
113 { 0x0061, 0x0000 },
114 { 0x0062, 0x0000 },
115 { 0x0063, 0x003e },
116 { 0x0064, 0x0000 },
117 { 0x0065, 0x0000 },
118 { 0x0066, 0x0000 },
119 { 0x0067, 0x0000 },
120 { 0x006a, 0x0000 },
121 { 0x006b, 0x0000 },
122 { 0x006c, 0x0000 },
123 { 0x006e, 0x0000 },
124 { 0x006f, 0x0000 },
125 { 0x0070, 0x8000 },
126 { 0x0071, 0x8000 },
127 { 0x0072, 0x8000 },
128 { 0x0073, 0x1110 },
129 { 0x0074, 0xfe00 },
130 { 0x0075, 0x2409 },
131 { 0x0076, 0x000a },
132 { 0x0077, 0x00f0 },
133 { 0x0078, 0x0000 },
134 { 0x0079, 0x0000 },
135 { 0x007a, 0x0123 },
136 { 0x007b, 0x8003 },
137 { 0x0080, 0x0000 },
138 { 0x0081, 0x0000 },
139 { 0x0082, 0x0000 },
140 { 0x0083, 0x0000 },
141 { 0x0084, 0x0000 },
142 { 0x0085, 0x0000 },
143 { 0x0086, 0x0008 },
144 { 0x0087, 0x0000 },
145 { 0x0088, 0x0000 },
146 { 0x0089, 0x0000 },
147 { 0x008a, 0x0000 },
148 { 0x008b, 0x0000 },
149 { 0x008c, 0x0003 },
150 { 0x008e, 0x0000 },
151 { 0x008f, 0x1000 },
152 { 0x0090, 0x0646 },
153 { 0x0091, 0x0c16 },
154 { 0x0092, 0x0073 },
155 { 0x0093, 0x0000 },
156 { 0x0094, 0x0080 },
157 { 0x0097, 0x0000 },
158 { 0x0098, 0x0000 },
159 { 0x0099, 0x0000 },
160 { 0x009a, 0x0000 },
161 { 0x009b, 0x0000 },
162 { 0x009c, 0x007f },
163 { 0x009d, 0x0000 },
164 { 0x009e, 0x007f },
165 { 0x009f, 0x0000 },
166 { 0x00a0, 0x0060 },
167 { 0x00a1, 0x90a1 },
168 { 0x00ae, 0x2000 },
169 { 0x00af, 0x0000 },
170 { 0x00b0, 0x2000 },
171 { 0x00b1, 0x0000 },
172 { 0x00b2, 0x0000 },
173 { 0x00b6, 0x0000 },
174 { 0x00b7, 0x0000 },
175 { 0x00b8, 0x0000 },
176 { 0x00b9, 0x0000 },
177 { 0x00ba, 0x0000 },
178 { 0x00bb, 0x0000 },
179 { 0x00be, 0x0000 },
180 { 0x00bf, 0x0000 },
181 { 0x00c0, 0x0000 },
182 { 0x00c1, 0x0000 },
183 { 0x00c2, 0x0000 },
184 { 0x00c3, 0x0000 },
185 { 0x00c4, 0x0003 },
186 { 0x00c5, 0x0000 },
187 { 0x00cb, 0xa02f },
188 { 0x00cc, 0x0000 },
189 { 0x00cd, 0x0e02 },
190 { 0x00d6, 0x0000 },
191 { 0x00d7, 0x2244 },
192 { 0x00d9, 0x0809 },
193 { 0x00da, 0x0000 },
194 { 0x00db, 0x0008 },
195 { 0x00dc, 0x00c0 },
196 { 0x00dd, 0x6724 },
197 { 0x00de, 0x3131 },
198 { 0x00df, 0x0008 },
199 { 0x00e0, 0x4000 },
200 { 0x00e1, 0x3131 },
201 { 0x00e4, 0x400c },
202 { 0x00e5, 0x8031 },
203 { 0x00ea, 0xb320 },
204 { 0x00eb, 0x0000 },
205 { 0x00ec, 0xb300 },
206 { 0x00ed, 0x0000 },
207 { 0x00f0, 0x0000 },
208 { 0x00f1, 0x0202 },
209 { 0x00f2, 0x0ddd },
210 { 0x00f3, 0x0ddd },
211 { 0x00f4, 0x0ddd },
212 { 0x00f6, 0x0000 },
213 { 0x00f7, 0x0000 },
214 { 0x00f8, 0x0000 },
215 { 0x00f9, 0x0000 },
216 { 0x00fa, 0x8000 },
217 { 0x00fb, 0x0000 },
218 { 0x00fc, 0x0000 },
219 { 0x00fd, 0x0001 },
220 { 0x00fe, 0x10ec },
221 { 0x00ff, 0x6311 },
222 { 0x0100, 0xaaaa },
223 { 0x010a, 0xaaaa },
224 { 0x010b, 0x00a0 },
225 { 0x010c, 0xaeae },
226 { 0x010d, 0xaaaa },
227 { 0x010e, 0xaaa8 },
228 { 0x010f, 0xa0aa },
229 { 0x0110, 0xe02a },
230 { 0x0111, 0xa702 },
231 { 0x0112, 0xaaaa },
232 { 0x0113, 0x2800 },
233 { 0x0116, 0x0000 },
234 { 0x0117, 0x0f00 },
235 { 0x011a, 0x0020 },
236 { 0x011b, 0x0011 },
237 { 0x011c, 0x0150 },
238 { 0x011d, 0x0000 },
239 { 0x011e, 0x0000 },
240 { 0x011f, 0x0000 },
241 { 0x0120, 0x0000 },
242 { 0x0121, 0x009b },
243 { 0x0122, 0x5014 },
244 { 0x0123, 0x0421 },
245 { 0x0124, 0x7cea },
246 { 0x0125, 0x0420 },
247 { 0x0126, 0x5550 },
248 { 0x0132, 0x0000 },
249 { 0x0133, 0x0000 },
250 { 0x0137, 0x5055 },
251 { 0x0138, 0x3700 },
252 { 0x0139, 0x79a1 },
253 { 0x013a, 0x2020 },
254 { 0x013b, 0x2020 },
255 { 0x013c, 0x2005 },
256 { 0x013e, 0x1f00 },
257 { 0x013f, 0x0000 },
258 { 0x0145, 0x0002 },
259 { 0x0146, 0x0000 },
260 { 0x0147, 0x0000 },
261 { 0x0148, 0x0000 },
262 { 0x0150, 0x1813 },
263 { 0x0151, 0x0690 },
264 { 0x0152, 0x1c17 },
265 { 0x0153, 0x6883 },
266 { 0x0154, 0xd3ce },
267 { 0x0155, 0x352d },
268 { 0x0156, 0x00eb },
269 { 0x0157, 0x3717 },
270 { 0x0158, 0x4c6a },
271 { 0x0159, 0xe41b },
272 { 0x015a, 0x2a13 },
273 { 0x015b, 0xb600 },
274 { 0x015c, 0xc730 },
275 { 0x015d, 0x35d4 },
276 { 0x015e, 0x00bf },
277 { 0x0160, 0x0ec0 },
278 { 0x0161, 0x0020 },
279 { 0x0162, 0x0080 },
280 { 0x0163, 0x0800 },
281 { 0x0164, 0x0000 },
282 { 0x0165, 0x0000 },
283 { 0x0166, 0x0000 },
284 { 0x0167, 0x001f },
285 { 0x0170, 0x4e80 },
286 { 0x0171, 0x0020 },
287 { 0x0172, 0x0080 },
288 { 0x0173, 0x0800 },
289 { 0x0174, 0x000c },
290 { 0x0175, 0x0000 },
291 { 0x0190, 0x3300 },
292 { 0x0191, 0x2200 },
293 { 0x0192, 0x0000 },
294 { 0x01b0, 0x4b38 },
295 { 0x01b1, 0x0000 },
296 { 0x01b2, 0x0000 },
297 { 0x01b3, 0x0000 },
298 { 0x01c0, 0x0045 },
299 { 0x01c1, 0x0540 },
300 { 0x01c2, 0x0000 },
301 { 0x01c3, 0x0030 },
302 { 0x01c7, 0x0000 },
303 { 0x01c8, 0x5757 },
304 { 0x01c9, 0x5757 },
305 { 0x01ca, 0x5757 },
306 { 0x01cb, 0x5757 },
307 { 0x01cc, 0x5757 },
308 { 0x01cd, 0x5757 },
309 { 0x01ce, 0x006f },
310 { 0x01da, 0x0000 },
311 { 0x01db, 0x0000 },
312 { 0x01de, 0x7d00 },
313 { 0x01df, 0x10c0 },
314 { 0x01e0, 0x06a1 },
315 { 0x01e1, 0x0000 },
316 { 0x01e2, 0x0000 },
317 { 0x01e3, 0x0000 },
318 { 0x01e4, 0x0001 },
319 { 0x01e6, 0x0000 },
320 { 0x01e7, 0x0000 },
321 { 0x01e8, 0x0000 },
322 { 0x01ea, 0x0000 },
323 { 0x01eb, 0x0000 },
324 { 0x01ec, 0x0000 },
325 { 0x01ed, 0x0000 },
326 { 0x01ee, 0x0000 },
327 { 0x01ef, 0x0000 },
328 { 0x01f0, 0x0000 },
329 { 0x01f1, 0x0000 },
330 { 0x01f2, 0x0000 },
331 { 0x01f6, 0x1e04 },
332 { 0x01f7, 0x01a1 },
333 { 0x01f8, 0x0000 },
334 { 0x01f9, 0x0000 },
335 { 0x01fa, 0x0002 },
336 { 0x01fb, 0x0000 },
337 { 0x01fc, 0x0000 },
338 { 0x01fd, 0x0000 },
339 { 0x01fe, 0x0000 },
340 { 0x0200, 0x066c },
341 { 0x0201, 0x7fff },
342 { 0x0202, 0x7fff },
343 { 0x0203, 0x0000 },
344 { 0x0204, 0x0000 },
345 { 0x0205, 0x0000 },
346 { 0x0206, 0x0000 },
347 { 0x0207, 0x0000 },
348 { 0x0208, 0x0000 },
349 { 0x0256, 0x0000 },
350 { 0x0257, 0x0000 },
351 { 0x0258, 0x0000 },
352 { 0x0259, 0x0000 },
353 { 0x025a, 0x0000 },
354 { 0x025b, 0x3333 },
355 { 0x025c, 0x3333 },
356 { 0x025d, 0x3333 },
357 { 0x025e, 0x0000 },
358 { 0x025f, 0x0000 },
359 { 0x0260, 0x0000 },
360 { 0x0261, 0x0022 },
361 { 0x0262, 0x0300 },
362 { 0x0265, 0x1e80 },
363 { 0x0266, 0x0131 },
364 { 0x0267, 0x0003 },
365 { 0x0268, 0x0000 },
366 { 0x0269, 0x0000 },
367 { 0x026a, 0x0000 },
368 { 0x026b, 0x0000 },
369 { 0x026c, 0x0000 },
370 { 0x026d, 0x0000 },
371 { 0x026e, 0x0000 },
372 { 0x026f, 0x0000 },
373 { 0x0270, 0x0000 },
374 { 0x0271, 0x0000 },
375 { 0x0272, 0x0000 },
376 { 0x0273, 0x0000 },
377 { 0x0280, 0x0000 },
378 { 0x0281, 0x0000 },
379 { 0x0282, 0x0418 },
380 { 0x0283, 0x7fff },
381 { 0x0284, 0x7000 },
382 { 0x0290, 0x01d0 },
383 { 0x0291, 0x0100 },
384 { 0x02fa, 0x0000 },
385 { 0x02fb, 0x0000 },
386 { 0x02fc, 0x0000 },
387 { 0x0300, 0x001f },
388 { 0x0301, 0x032c },
389 { 0x0302, 0x5f21 },
390 { 0x0303, 0x4000 },
391 { 0x0304, 0x4000 },
392 { 0x0305, 0x0600 },
393 { 0x0306, 0x8000 },
394 { 0x0307, 0x0700 },
395 { 0x0308, 0x001f },
396 { 0x0309, 0x032c },
397 { 0x030a, 0x5f21 },
398 { 0x030b, 0x4000 },
399 { 0x030c, 0x4000 },
400 { 0x030d, 0x0600 },
401 { 0x030e, 0x8000 },
402 { 0x030f, 0x0700 },
403 { 0x0310, 0x4560 },
404 { 0x0311, 0xa4a8 },
405 { 0x0312, 0x7418 },
406 { 0x0313, 0x0000 },
407 { 0x0314, 0x0006 },
408 { 0x0315, 0x00ff },
409 { 0x0316, 0xc400 },
410 { 0x0317, 0x4560 },
411 { 0x0318, 0xa4a8 },
412 { 0x0319, 0x7418 },
413 { 0x031a, 0x0000 },
414 { 0x031b, 0x0006 },
415 { 0x031c, 0x00ff },
416 { 0x031d, 0xc400 },
417 { 0x0320, 0x0f20 },
418 { 0x0321, 0x8700 },
419 { 0x0322, 0x7dc2 },
420 { 0x0323, 0xa178 },
421 { 0x0324, 0x5383 },
422 { 0x0325, 0x7dc2 },
423 { 0x0326, 0xa178 },
424 { 0x0327, 0x5383 },
425 { 0x0328, 0x003e },
426 { 0x0329, 0x02c1 },
427 { 0x032a, 0xd37d },
428 { 0x0330, 0x00a6 },
429 { 0x0331, 0x04c3 },
430 { 0x0332, 0x27c8 },
431 { 0x0333, 0xbf50 },
432 { 0x0334, 0x0045 },
433 { 0x0335, 0x2007 },
434 { 0x0336, 0x7418 },
435 { 0x0337, 0x0501 },
436 { 0x0338, 0x0000 },
437 { 0x0339, 0x0010 },
438 { 0x033a, 0x1010 },
439 { 0x0340, 0x0800 },
440 { 0x0341, 0x0800 },
441 { 0x0342, 0x0800 },
442 { 0x0343, 0x0800 },
443 { 0x0344, 0x0000 },
444 { 0x0345, 0x0000 },
445 { 0x0346, 0x0000 },
446 { 0x0347, 0x0000 },
447 { 0x0348, 0x0000 },
448 { 0x0349, 0x0000 },
449 { 0x034a, 0x0000 },
450 { 0x034b, 0x0000 },
451 { 0x034c, 0x0000 },
452 { 0x034d, 0x0000 },
453 { 0x034e, 0x0000 },
454 { 0x034f, 0x0000 },
455 { 0x0350, 0x0000 },
456 { 0x0351, 0x0000 },
457 { 0x0352, 0x0000 },
458 { 0x0353, 0x0000 },
459 { 0x0354, 0x0000 },
460 { 0x0355, 0x0000 },
461 { 0x0356, 0x0000 },
462 { 0x0357, 0x0000 },
463 { 0x0358, 0x0000 },
464 { 0x0359, 0x0000 },
465 { 0x035a, 0x0000 },
466 { 0x035b, 0x0000 },
467 { 0x035c, 0x0000 },
468 { 0x035d, 0x0000 },
469 { 0x035e, 0x2000 },
470 { 0x035f, 0x0000 },
471 { 0x0360, 0x2000 },
472 { 0x0361, 0x2000 },
473 { 0x0362, 0x0000 },
474 { 0x0363, 0x2000 },
475 { 0x0364, 0x0200 },
476 { 0x0365, 0x0000 },
477 { 0x0366, 0x0000 },
478 { 0x0367, 0x0000 },
479 { 0x0368, 0x0000 },
480 { 0x0369, 0x0000 },
481 { 0x036a, 0x0000 },
482 { 0x036b, 0x0000 },
483 { 0x036c, 0x0000 },
484 { 0x036d, 0x0000 },
485 { 0x036e, 0x0200 },
486 { 0x036f, 0x0000 },
487 { 0x0370, 0x0000 },
488 { 0x0371, 0x0000 },
489 { 0x0372, 0x0000 },
490 { 0x0373, 0x0000 },
491 { 0x0374, 0x0000 },
492 { 0x0375, 0x0000 },
493 { 0x0376, 0x0000 },
494 { 0x0377, 0x0000 },
495 { 0x03d0, 0x0000 },
496 { 0x03d1, 0x0000 },
497 { 0x03d2, 0x0000 },
498 { 0x03d3, 0x0000 },
499 { 0x03d4, 0x2000 },
500 { 0x03d5, 0x2000 },
501 { 0x03d6, 0x0000 },
502 { 0x03d7, 0x0000 },
503 { 0x03d8, 0x2000 },
504 { 0x03d9, 0x2000 },
505 { 0x03da, 0x2000 },
506 { 0x03db, 0x2000 },
507 { 0x03dc, 0x0000 },
508 { 0x03dd, 0x0000 },
509 { 0x03de, 0x0000 },
510 { 0x03df, 0x2000 },
511 { 0x03e0, 0x0000 },
512 { 0x03e1, 0x0000 },
513 { 0x03e2, 0x0000 },
514 { 0x03e3, 0x0000 },
515 { 0x03e4, 0x0000 },
516 { 0x03e5, 0x0000 },
517 { 0x03e6, 0x0000 },
518 { 0x03e7, 0x0000 },
519 { 0x03e8, 0x0000 },
520 { 0x03e9, 0x0000 },
521 { 0x03ea, 0x0000 },
522 { 0x03eb, 0x0000 },
523 { 0x03ec, 0x0000 },
524 { 0x03ed, 0x0000 },
525 { 0x03ee, 0x0000 },
526 { 0x03ef, 0x0000 },
527 { 0x03f0, 0x0800 },
528 { 0x03f1, 0x0800 },
529 { 0x03f2, 0x0800 },
530 { 0x03f3, 0x0800 },
531};
532
533static bool rt5659_volatile_register(struct device *dev, unsigned int reg)
534{
535 switch (reg) {
536 case RT5659_RESET:
537 case RT5659_EJD_CTRL_2:
538 case RT5659_SILENCE_CTRL:
539 case RT5659_DAC2_DIG_VOL:
540 case RT5659_HP_IMP_GAIN_2:
541 case RT5659_PDM_OUT_CTRL:
542 case RT5659_PDM_DATA_CTRL_1:
543 case RT5659_PDM_DATA_CTRL_4:
544 case RT5659_HAPTIC_GEN_CTRL_1:
545 case RT5659_HAPTIC_GEN_CTRL_3:
546 case RT5659_HAPTIC_LPF_CTRL_3:
547 case RT5659_CLK_DET:
548 case RT5659_MICBIAS_1:
549 case RT5659_ASRC_11:
550 case RT5659_ADC_EQ_CTRL_1:
551 case RT5659_DAC_EQ_CTRL_1:
552 case RT5659_INT_ST_1:
553 case RT5659_INT_ST_2:
554 case RT5659_GPIO_STA:
555 case RT5659_SINE_GEN_CTRL_1:
556 case RT5659_IL_CMD_1:
557 case RT5659_4BTN_IL_CMD_1:
558 case RT5659_PSV_IL_CMD_1:
559 case RT5659_AJD1_CTRL:
560 case RT5659_AJD2_AJD3_CTRL:
561 case RT5659_JD_CTRL_3:
562 case RT5659_VENDOR_ID:
563 case RT5659_VENDOR_ID_1:
564 case RT5659_DEVICE_ID:
565 case RT5659_MEMORY_TEST:
566 case RT5659_SOFT_RAMP_DEPOP_DAC_CLK_CTRL:
567 case RT5659_VOL_TEST:
568 case RT5659_STO_NG2_CTRL_1:
569 case RT5659_STO_NG2_CTRL_5:
570 case RT5659_STO_NG2_CTRL_6:
571 case RT5659_STO_NG2_CTRL_7:
572 case RT5659_MONO_NG2_CTRL_1:
573 case RT5659_MONO_NG2_CTRL_5:
574 case RT5659_MONO_NG2_CTRL_6:
575 case RT5659_HP_IMP_SENS_CTRL_1:
576 case RT5659_HP_IMP_SENS_CTRL_3:
577 case RT5659_HP_IMP_SENS_CTRL_4:
578 case RT5659_HP_CALIB_CTRL_1:
579 case RT5659_HP_CALIB_CTRL_9:
580 case RT5659_HP_CALIB_STA_1:
581 case RT5659_HP_CALIB_STA_2:
582 case RT5659_HP_CALIB_STA_3:
583 case RT5659_HP_CALIB_STA_4:
584 case RT5659_HP_CALIB_STA_5:
585 case RT5659_HP_CALIB_STA_6:
586 case RT5659_HP_CALIB_STA_7:
587 case RT5659_HP_CALIB_STA_8:
588 case RT5659_HP_CALIB_STA_9:
589 case RT5659_MONO_AMP_CALIB_CTRL_1:
590 case RT5659_MONO_AMP_CALIB_CTRL_3:
591 case RT5659_MONO_AMP_CALIB_STA_1:
592 case RT5659_MONO_AMP_CALIB_STA_2:
593 case RT5659_MONO_AMP_CALIB_STA_3:
594 case RT5659_MONO_AMP_CALIB_STA_4:
595 case RT5659_SPK_PWR_LMT_STA_1:
596 case RT5659_SPK_PWR_LMT_STA_2:
597 case RT5659_SPK_PWR_LMT_STA_3:
598 case RT5659_SPK_PWR_LMT_STA_4:
599 case RT5659_SPK_PWR_LMT_STA_5:
600 case RT5659_SPK_PWR_LMT_STA_6:
601 case RT5659_SPK_DC_CAILB_CTRL_1:
602 case RT5659_SPK_DC_CAILB_STA_1:
603 case RT5659_SPK_DC_CAILB_STA_2:
604 case RT5659_SPK_DC_CAILB_STA_3:
605 case RT5659_SPK_DC_CAILB_STA_4:
606 case RT5659_SPK_DC_CAILB_STA_5:
607 case RT5659_SPK_DC_CAILB_STA_6:
608 case RT5659_SPK_DC_CAILB_STA_7:
609 case RT5659_SPK_DC_CAILB_STA_8:
610 case RT5659_SPK_DC_CAILB_STA_9:
611 case RT5659_SPK_DC_CAILB_STA_10:
612 case RT5659_SPK_VDD_STA_1:
613 case RT5659_SPK_VDD_STA_2:
614 case RT5659_SPK_DC_DET_CTRL_1:
615 case RT5659_PURE_DC_DET_CTRL_1:
616 case RT5659_PURE_DC_DET_CTRL_2:
617 case RT5659_DRC1_PRIV_1:
618 case RT5659_DRC1_PRIV_4:
619 case RT5659_DRC1_PRIV_5:
620 case RT5659_DRC1_PRIV_6:
621 case RT5659_DRC1_PRIV_7:
622 case RT5659_DRC2_PRIV_1:
623 case RT5659_DRC2_PRIV_4:
624 case RT5659_DRC2_PRIV_5:
625 case RT5659_DRC2_PRIV_6:
626 case RT5659_DRC2_PRIV_7:
627 case RT5659_ALC_PGA_STA_1:
628 case RT5659_ALC_PGA_STA_2:
629 case RT5659_ALC_PGA_STA_3:
630 return true;
631 default:
632 return false;
633 }
634}
635
636static bool rt5659_readable_register(struct device *dev, unsigned int reg)
637{
638 switch (reg) {
639 case RT5659_RESET:
640 case RT5659_SPO_VOL:
641 case RT5659_HP_VOL:
642 case RT5659_LOUT:
643 case RT5659_MONO_OUT:
644 case RT5659_HPL_GAIN:
645 case RT5659_HPR_GAIN:
646 case RT5659_MONO_GAIN:
647 case RT5659_SPDIF_CTRL_1:
648 case RT5659_SPDIF_CTRL_2:
649 case RT5659_CAL_BST_CTRL:
650 case RT5659_IN1_IN2:
651 case RT5659_IN3_IN4:
652 case RT5659_INL1_INR1_VOL:
653 case RT5659_EJD_CTRL_1:
654 case RT5659_EJD_CTRL_2:
655 case RT5659_EJD_CTRL_3:
656 case RT5659_SILENCE_CTRL:
657 case RT5659_PSV_CTRL:
658 case RT5659_SIDETONE_CTRL:
659 case RT5659_DAC1_DIG_VOL:
660 case RT5659_DAC2_DIG_VOL:
661 case RT5659_DAC_CTRL:
662 case RT5659_STO1_ADC_DIG_VOL:
663 case RT5659_MONO_ADC_DIG_VOL:
664 case RT5659_STO2_ADC_DIG_VOL:
665 case RT5659_STO1_BOOST:
666 case RT5659_MONO_BOOST:
667 case RT5659_STO2_BOOST:
668 case RT5659_HP_IMP_GAIN_1:
669 case RT5659_HP_IMP_GAIN_2:
670 case RT5659_STO1_ADC_MIXER:
671 case RT5659_MONO_ADC_MIXER:
672 case RT5659_AD_DA_MIXER:
673 case RT5659_STO_DAC_MIXER:
674 case RT5659_MONO_DAC_MIXER:
675 case RT5659_DIG_MIXER:
676 case RT5659_A_DAC_MUX:
677 case RT5659_DIG_INF23_DATA:
678 case RT5659_PDM_OUT_CTRL:
679 case RT5659_PDM_DATA_CTRL_1:
680 case RT5659_PDM_DATA_CTRL_2:
681 case RT5659_PDM_DATA_CTRL_3:
682 case RT5659_PDM_DATA_CTRL_4:
683 case RT5659_SPDIF_CTRL:
684 case RT5659_REC1_GAIN:
685 case RT5659_REC1_L1_MIXER:
686 case RT5659_REC1_L2_MIXER:
687 case RT5659_REC1_R1_MIXER:
688 case RT5659_REC1_R2_MIXER:
689 case RT5659_CAL_REC:
690 case RT5659_REC2_L1_MIXER:
691 case RT5659_REC2_L2_MIXER:
692 case RT5659_REC2_R1_MIXER:
693 case RT5659_REC2_R2_MIXER:
694 case RT5659_SPK_L_MIXER:
695 case RT5659_SPK_R_MIXER:
696 case RT5659_SPO_AMP_GAIN:
697 case RT5659_ALC_BACK_GAIN:
698 case RT5659_MONOMIX_GAIN:
699 case RT5659_MONOMIX_IN_GAIN:
700 case RT5659_OUT_L_GAIN:
701 case RT5659_OUT_L_MIXER:
702 case RT5659_OUT_R_GAIN:
703 case RT5659_OUT_R_MIXER:
704 case RT5659_LOUT_MIXER:
705 case RT5659_HAPTIC_GEN_CTRL_1:
706 case RT5659_HAPTIC_GEN_CTRL_2:
707 case RT5659_HAPTIC_GEN_CTRL_3:
708 case RT5659_HAPTIC_GEN_CTRL_4:
709 case RT5659_HAPTIC_GEN_CTRL_5:
710 case RT5659_HAPTIC_GEN_CTRL_6:
711 case RT5659_HAPTIC_GEN_CTRL_7:
712 case RT5659_HAPTIC_GEN_CTRL_8:
713 case RT5659_HAPTIC_GEN_CTRL_9:
714 case RT5659_HAPTIC_GEN_CTRL_10:
715 case RT5659_HAPTIC_GEN_CTRL_11:
716 case RT5659_HAPTIC_LPF_CTRL_1:
717 case RT5659_HAPTIC_LPF_CTRL_2:
718 case RT5659_HAPTIC_LPF_CTRL_3:
719 case RT5659_PWR_DIG_1:
720 case RT5659_PWR_DIG_2:
721 case RT5659_PWR_ANLG_1:
722 case RT5659_PWR_ANLG_2:
723 case RT5659_PWR_ANLG_3:
724 case RT5659_PWR_MIXER:
725 case RT5659_PWR_VOL:
726 case RT5659_PRIV_INDEX:
727 case RT5659_CLK_DET:
728 case RT5659_PRIV_DATA:
729 case RT5659_PRE_DIV_1:
730 case RT5659_PRE_DIV_2:
731 case RT5659_I2S1_SDP:
732 case RT5659_I2S2_SDP:
733 case RT5659_I2S3_SDP:
734 case RT5659_ADDA_CLK_1:
735 case RT5659_ADDA_CLK_2:
736 case RT5659_DMIC_CTRL_1:
737 case RT5659_DMIC_CTRL_2:
738 case RT5659_TDM_CTRL_1:
739 case RT5659_TDM_CTRL_2:
740 case RT5659_TDM_CTRL_3:
741 case RT5659_TDM_CTRL_4:
742 case RT5659_TDM_CTRL_5:
743 case RT5659_GLB_CLK:
744 case RT5659_PLL_CTRL_1:
745 case RT5659_PLL_CTRL_2:
746 case RT5659_ASRC_1:
747 case RT5659_ASRC_2:
748 case RT5659_ASRC_3:
749 case RT5659_ASRC_4:
750 case RT5659_ASRC_5:
751 case RT5659_ASRC_6:
752 case RT5659_ASRC_7:
753 case RT5659_ASRC_8:
754 case RT5659_ASRC_9:
755 case RT5659_ASRC_10:
756 case RT5659_DEPOP_1:
757 case RT5659_DEPOP_2:
758 case RT5659_DEPOP_3:
759 case RT5659_HP_CHARGE_PUMP_1:
760 case RT5659_HP_CHARGE_PUMP_2:
761 case RT5659_MICBIAS_1:
762 case RT5659_MICBIAS_2:
763 case RT5659_ASRC_11:
764 case RT5659_ASRC_12:
765 case RT5659_ASRC_13:
766 case RT5659_REC_M1_M2_GAIN_CTRL:
767 case RT5659_RC_CLK_CTRL:
768 case RT5659_CLASSD_CTRL_1:
769 case RT5659_CLASSD_CTRL_2:
770 case RT5659_ADC_EQ_CTRL_1:
771 case RT5659_ADC_EQ_CTRL_2:
772 case RT5659_DAC_EQ_CTRL_1:
773 case RT5659_DAC_EQ_CTRL_2:
774 case RT5659_DAC_EQ_CTRL_3:
775 case RT5659_IRQ_CTRL_1:
776 case RT5659_IRQ_CTRL_2:
777 case RT5659_IRQ_CTRL_3:
778 case RT5659_IRQ_CTRL_4:
779 case RT5659_IRQ_CTRL_5:
780 case RT5659_IRQ_CTRL_6:
781 case RT5659_INT_ST_1:
782 case RT5659_INT_ST_2:
783 case RT5659_GPIO_CTRL_1:
784 case RT5659_GPIO_CTRL_2:
785 case RT5659_GPIO_CTRL_3:
786 case RT5659_GPIO_CTRL_4:
787 case RT5659_GPIO_CTRL_5:
788 case RT5659_GPIO_STA:
789 case RT5659_SINE_GEN_CTRL_1:
790 case RT5659_SINE_GEN_CTRL_2:
791 case RT5659_SINE_GEN_CTRL_3:
792 case RT5659_HP_AMP_DET_CTRL_1:
793 case RT5659_HP_AMP_DET_CTRL_2:
794 case RT5659_SV_ZCD_1:
795 case RT5659_SV_ZCD_2:
796 case RT5659_IL_CMD_1:
797 case RT5659_IL_CMD_2:
798 case RT5659_IL_CMD_3:
799 case RT5659_IL_CMD_4:
800 case RT5659_4BTN_IL_CMD_1:
801 case RT5659_4BTN_IL_CMD_2:
802 case RT5659_4BTN_IL_CMD_3:
803 case RT5659_PSV_IL_CMD_1:
804 case RT5659_PSV_IL_CMD_2:
805 case RT5659_ADC_STO1_HP_CTRL_1:
806 case RT5659_ADC_STO1_HP_CTRL_2:
807 case RT5659_ADC_MONO_HP_CTRL_1:
808 case RT5659_ADC_MONO_HP_CTRL_2:
809 case RT5659_AJD1_CTRL:
810 case RT5659_AJD2_AJD3_CTRL:
811 case RT5659_JD1_THD:
812 case RT5659_JD2_THD:
813 case RT5659_JD3_THD:
814 case RT5659_JD_CTRL_1:
815 case RT5659_JD_CTRL_2:
816 case RT5659_JD_CTRL_3:
817 case RT5659_JD_CTRL_4:
818 case RT5659_DIG_MISC:
819 case RT5659_DUMMY_2:
820 case RT5659_DUMMY_3:
821 case RT5659_VENDOR_ID:
822 case RT5659_VENDOR_ID_1:
823 case RT5659_DEVICE_ID:
824 case RT5659_DAC_ADC_DIG_VOL:
825 case RT5659_BIAS_CUR_CTRL_1:
826 case RT5659_BIAS_CUR_CTRL_2:
827 case RT5659_BIAS_CUR_CTRL_3:
828 case RT5659_BIAS_CUR_CTRL_4:
829 case RT5659_BIAS_CUR_CTRL_5:
830 case RT5659_BIAS_CUR_CTRL_6:
831 case RT5659_BIAS_CUR_CTRL_7:
832 case RT5659_BIAS_CUR_CTRL_8:
833 case RT5659_BIAS_CUR_CTRL_9:
834 case RT5659_BIAS_CUR_CTRL_10:
835 case RT5659_MEMORY_TEST:
836 case RT5659_VREF_REC_OP_FB_CAP_CTRL:
837 case RT5659_CLASSD_0:
838 case RT5659_CLASSD_1:
839 case RT5659_CLASSD_2:
840 case RT5659_CLASSD_3:
841 case RT5659_CLASSD_4:
842 case RT5659_CLASSD_5:
843 case RT5659_CLASSD_6:
844 case RT5659_CLASSD_7:
845 case RT5659_CLASSD_8:
846 case RT5659_CLASSD_9:
847 case RT5659_CLASSD_10:
848 case RT5659_CHARGE_PUMP_1:
849 case RT5659_CHARGE_PUMP_2:
850 case RT5659_DIG_IN_CTRL_1:
851 case RT5659_DIG_IN_CTRL_2:
852 case RT5659_PAD_DRIVING_CTRL:
853 case RT5659_SOFT_RAMP_DEPOP:
854 case RT5659_PLL:
855 case RT5659_CHOP_DAC:
856 case RT5659_CHOP_ADC:
857 case RT5659_CALIB_ADC_CTRL:
858 case RT5659_SOFT_RAMP_DEPOP_DAC_CLK_CTRL:
859 case RT5659_VOL_TEST:
860 case RT5659_TEST_MODE_CTRL_1:
861 case RT5659_TEST_MODE_CTRL_2:
862 case RT5659_TEST_MODE_CTRL_3:
863 case RT5659_TEST_MODE_CTRL_4:
864 case RT5659_BASSBACK_CTRL:
865 case RT5659_MP3_PLUS_CTRL_1:
866 case RT5659_MP3_PLUS_CTRL_2:
867 case RT5659_MP3_HPF_A1:
868 case RT5659_MP3_HPF_A2:
869 case RT5659_MP3_HPF_H0:
870 case RT5659_MP3_LPF_H0:
871 case RT5659_3D_SPK_CTRL:
872 case RT5659_3D_SPK_COEF_1:
873 case RT5659_3D_SPK_COEF_2:
874 case RT5659_3D_SPK_COEF_3:
875 case RT5659_3D_SPK_COEF_4:
876 case RT5659_3D_SPK_COEF_5:
877 case RT5659_3D_SPK_COEF_6:
878 case RT5659_3D_SPK_COEF_7:
879 case RT5659_STO_NG2_CTRL_1:
880 case RT5659_STO_NG2_CTRL_2:
881 case RT5659_STO_NG2_CTRL_3:
882 case RT5659_STO_NG2_CTRL_4:
883 case RT5659_STO_NG2_CTRL_5:
884 case RT5659_STO_NG2_CTRL_6:
885 case RT5659_STO_NG2_CTRL_7:
886 case RT5659_STO_NG2_CTRL_8:
887 case RT5659_MONO_NG2_CTRL_1:
888 case RT5659_MONO_NG2_CTRL_2:
889 case RT5659_MONO_NG2_CTRL_3:
890 case RT5659_MONO_NG2_CTRL_4:
891 case RT5659_MONO_NG2_CTRL_5:
892 case RT5659_MONO_NG2_CTRL_6:
893 case RT5659_MID_HP_AMP_DET:
894 case RT5659_LOW_HP_AMP_DET:
895 case RT5659_LDO_CTRL:
896 case RT5659_HP_DECROSS_CTRL_1:
897 case RT5659_HP_DECROSS_CTRL_2:
898 case RT5659_HP_DECROSS_CTRL_3:
899 case RT5659_HP_DECROSS_CTRL_4:
900 case RT5659_HP_IMP_SENS_CTRL_1:
901 case RT5659_HP_IMP_SENS_CTRL_2:
902 case RT5659_HP_IMP_SENS_CTRL_3:
903 case RT5659_HP_IMP_SENS_CTRL_4:
904 case RT5659_HP_IMP_SENS_MAP_1:
905 case RT5659_HP_IMP_SENS_MAP_2:
906 case RT5659_HP_IMP_SENS_MAP_3:
907 case RT5659_HP_IMP_SENS_MAP_4:
908 case RT5659_HP_IMP_SENS_MAP_5:
909 case RT5659_HP_IMP_SENS_MAP_6:
910 case RT5659_HP_IMP_SENS_MAP_7:
911 case RT5659_HP_IMP_SENS_MAP_8:
912 case RT5659_HP_LOGIC_CTRL_1:
913 case RT5659_HP_LOGIC_CTRL_2:
914 case RT5659_HP_CALIB_CTRL_1:
915 case RT5659_HP_CALIB_CTRL_2:
916 case RT5659_HP_CALIB_CTRL_3:
917 case RT5659_HP_CALIB_CTRL_4:
918 case RT5659_HP_CALIB_CTRL_5:
919 case RT5659_HP_CALIB_CTRL_6:
920 case RT5659_HP_CALIB_CTRL_7:
921 case RT5659_HP_CALIB_CTRL_9:
922 case RT5659_HP_CALIB_CTRL_10:
923 case RT5659_HP_CALIB_CTRL_11:
924 case RT5659_HP_CALIB_STA_1:
925 case RT5659_HP_CALIB_STA_2:
926 case RT5659_HP_CALIB_STA_3:
927 case RT5659_HP_CALIB_STA_4:
928 case RT5659_HP_CALIB_STA_5:
929 case RT5659_HP_CALIB_STA_6:
930 case RT5659_HP_CALIB_STA_7:
931 case RT5659_HP_CALIB_STA_8:
932 case RT5659_HP_CALIB_STA_9:
933 case RT5659_MONO_AMP_CALIB_CTRL_1:
934 case RT5659_MONO_AMP_CALIB_CTRL_2:
935 case RT5659_MONO_AMP_CALIB_CTRL_3:
936 case RT5659_MONO_AMP_CALIB_CTRL_4:
937 case RT5659_MONO_AMP_CALIB_CTRL_5:
938 case RT5659_MONO_AMP_CALIB_STA_1:
939 case RT5659_MONO_AMP_CALIB_STA_2:
940 case RT5659_MONO_AMP_CALIB_STA_3:
941 case RT5659_MONO_AMP_CALIB_STA_4:
942 case RT5659_SPK_PWR_LMT_CTRL_1:
943 case RT5659_SPK_PWR_LMT_CTRL_2:
944 case RT5659_SPK_PWR_LMT_CTRL_3:
945 case RT5659_SPK_PWR_LMT_STA_1:
946 case RT5659_SPK_PWR_LMT_STA_2:
947 case RT5659_SPK_PWR_LMT_STA_3:
948 case RT5659_SPK_PWR_LMT_STA_4:
949 case RT5659_SPK_PWR_LMT_STA_5:
950 case RT5659_SPK_PWR_LMT_STA_6:
951 case RT5659_FLEX_SPK_BST_CTRL_1:
952 case RT5659_FLEX_SPK_BST_CTRL_2:
953 case RT5659_FLEX_SPK_BST_CTRL_3:
954 case RT5659_FLEX_SPK_BST_CTRL_4:
955 case RT5659_SPK_EX_LMT_CTRL_1:
956 case RT5659_SPK_EX_LMT_CTRL_2:
957 case RT5659_SPK_EX_LMT_CTRL_3:
958 case RT5659_SPK_EX_LMT_CTRL_4:
959 case RT5659_SPK_EX_LMT_CTRL_5:
960 case RT5659_SPK_EX_LMT_CTRL_6:
961 case RT5659_SPK_EX_LMT_CTRL_7:
962 case RT5659_ADJ_HPF_CTRL_1:
963 case RT5659_ADJ_HPF_CTRL_2:
964 case RT5659_SPK_DC_CAILB_CTRL_1:
965 case RT5659_SPK_DC_CAILB_CTRL_2:
966 case RT5659_SPK_DC_CAILB_CTRL_3:
967 case RT5659_SPK_DC_CAILB_CTRL_4:
968 case RT5659_SPK_DC_CAILB_CTRL_5:
969 case RT5659_SPK_DC_CAILB_STA_1:
970 case RT5659_SPK_DC_CAILB_STA_2:
971 case RT5659_SPK_DC_CAILB_STA_3:
972 case RT5659_SPK_DC_CAILB_STA_4:
973 case RT5659_SPK_DC_CAILB_STA_5:
974 case RT5659_SPK_DC_CAILB_STA_6:
975 case RT5659_SPK_DC_CAILB_STA_7:
976 case RT5659_SPK_DC_CAILB_STA_8:
977 case RT5659_SPK_DC_CAILB_STA_9:
978 case RT5659_SPK_DC_CAILB_STA_10:
979 case RT5659_SPK_VDD_STA_1:
980 case RT5659_SPK_VDD_STA_2:
981 case RT5659_SPK_DC_DET_CTRL_1:
982 case RT5659_SPK_DC_DET_CTRL_2:
983 case RT5659_SPK_DC_DET_CTRL_3:
984 case RT5659_PURE_DC_DET_CTRL_1:
985 case RT5659_PURE_DC_DET_CTRL_2:
986 case RT5659_DUMMY_4:
987 case RT5659_DUMMY_5:
988 case RT5659_DUMMY_6:
989 case RT5659_DRC1_CTRL_1:
990 case RT5659_DRC1_CTRL_2:
991 case RT5659_DRC1_CTRL_3:
992 case RT5659_DRC1_CTRL_4:
993 case RT5659_DRC1_CTRL_5:
994 case RT5659_DRC1_CTRL_6:
995 case RT5659_DRC1_HARD_LMT_CTRL_1:
996 case RT5659_DRC1_HARD_LMT_CTRL_2:
997 case RT5659_DRC2_CTRL_1:
998 case RT5659_DRC2_CTRL_2:
999 case RT5659_DRC2_CTRL_3:
1000 case RT5659_DRC2_CTRL_4:
1001 case RT5659_DRC2_CTRL_5:
1002 case RT5659_DRC2_CTRL_6:
1003 case RT5659_DRC2_HARD_LMT_CTRL_1:
1004 case RT5659_DRC2_HARD_LMT_CTRL_2:
1005 case RT5659_DRC1_PRIV_1:
1006 case RT5659_DRC1_PRIV_2:
1007 case RT5659_DRC1_PRIV_3:
1008 case RT5659_DRC1_PRIV_4:
1009 case RT5659_DRC1_PRIV_5:
1010 case RT5659_DRC1_PRIV_6:
1011 case RT5659_DRC1_PRIV_7:
1012 case RT5659_DRC2_PRIV_1:
1013 case RT5659_DRC2_PRIV_2:
1014 case RT5659_DRC2_PRIV_3:
1015 case RT5659_DRC2_PRIV_4:
1016 case RT5659_DRC2_PRIV_5:
1017 case RT5659_DRC2_PRIV_6:
1018 case RT5659_DRC2_PRIV_7:
1019 case RT5659_MULTI_DRC_CTRL:
1020 case RT5659_CROSS_OVER_1:
1021 case RT5659_CROSS_OVER_2:
1022 case RT5659_CROSS_OVER_3:
1023 case RT5659_CROSS_OVER_4:
1024 case RT5659_CROSS_OVER_5:
1025 case RT5659_CROSS_OVER_6:
1026 case RT5659_CROSS_OVER_7:
1027 case RT5659_CROSS_OVER_8:
1028 case RT5659_CROSS_OVER_9:
1029 case RT5659_CROSS_OVER_10:
1030 case RT5659_ALC_PGA_CTRL_1:
1031 case RT5659_ALC_PGA_CTRL_2:
1032 case RT5659_ALC_PGA_CTRL_3:
1033 case RT5659_ALC_PGA_CTRL_4:
1034 case RT5659_ALC_PGA_CTRL_5:
1035 case RT5659_ALC_PGA_CTRL_6:
1036 case RT5659_ALC_PGA_CTRL_7:
1037 case RT5659_ALC_PGA_CTRL_8:
1038 case RT5659_ALC_PGA_STA_1:
1039 case RT5659_ALC_PGA_STA_2:
1040 case RT5659_ALC_PGA_STA_3:
1041 case RT5659_DAC_L_EQ_PRE_VOL:
1042 case RT5659_DAC_R_EQ_PRE_VOL:
1043 case RT5659_DAC_L_EQ_POST_VOL:
1044 case RT5659_DAC_R_EQ_POST_VOL:
1045 case RT5659_DAC_L_EQ_LPF1_A1:
1046 case RT5659_DAC_L_EQ_LPF1_H0:
1047 case RT5659_DAC_R_EQ_LPF1_A1:
1048 case RT5659_DAC_R_EQ_LPF1_H0:
1049 case RT5659_DAC_L_EQ_BPF2_A1:
1050 case RT5659_DAC_L_EQ_BPF2_A2:
1051 case RT5659_DAC_L_EQ_BPF2_H0:
1052 case RT5659_DAC_R_EQ_BPF2_A1:
1053 case RT5659_DAC_R_EQ_BPF2_A2:
1054 case RT5659_DAC_R_EQ_BPF2_H0:
1055 case RT5659_DAC_L_EQ_BPF3_A1:
1056 case RT5659_DAC_L_EQ_BPF3_A2:
1057 case RT5659_DAC_L_EQ_BPF3_H0:
1058 case RT5659_DAC_R_EQ_BPF3_A1:
1059 case RT5659_DAC_R_EQ_BPF3_A2:
1060 case RT5659_DAC_R_EQ_BPF3_H0:
1061 case RT5659_DAC_L_EQ_BPF4_A1:
1062 case RT5659_DAC_L_EQ_BPF4_A2:
1063 case RT5659_DAC_L_EQ_BPF4_H0:
1064 case RT5659_DAC_R_EQ_BPF4_A1:
1065 case RT5659_DAC_R_EQ_BPF4_A2:
1066 case RT5659_DAC_R_EQ_BPF4_H0:
1067 case RT5659_DAC_L_EQ_HPF1_A1:
1068 case RT5659_DAC_L_EQ_HPF1_H0:
1069 case RT5659_DAC_R_EQ_HPF1_A1:
1070 case RT5659_DAC_R_EQ_HPF1_H0:
1071 case RT5659_DAC_L_EQ_HPF2_A1:
1072 case RT5659_DAC_L_EQ_HPF2_A2:
1073 case RT5659_DAC_L_EQ_HPF2_H0:
1074 case RT5659_DAC_R_EQ_HPF2_A1:
1075 case RT5659_DAC_R_EQ_HPF2_A2:
1076 case RT5659_DAC_R_EQ_HPF2_H0:
1077 case RT5659_DAC_L_BI_EQ_BPF1_H0_1:
1078 case RT5659_DAC_L_BI_EQ_BPF1_H0_2:
1079 case RT5659_DAC_L_BI_EQ_BPF1_B1_1:
1080 case RT5659_DAC_L_BI_EQ_BPF1_B1_2:
1081 case RT5659_DAC_L_BI_EQ_BPF1_B2_1:
1082 case RT5659_DAC_L_BI_EQ_BPF1_B2_2:
1083 case RT5659_DAC_L_BI_EQ_BPF1_A1_1:
1084 case RT5659_DAC_L_BI_EQ_BPF1_A1_2:
1085 case RT5659_DAC_L_BI_EQ_BPF1_A2_1:
1086 case RT5659_DAC_L_BI_EQ_BPF1_A2_2:
1087 case RT5659_DAC_R_BI_EQ_BPF1_H0_1:
1088 case RT5659_DAC_R_BI_EQ_BPF1_H0_2:
1089 case RT5659_DAC_R_BI_EQ_BPF1_B1_1:
1090 case RT5659_DAC_R_BI_EQ_BPF1_B1_2:
1091 case RT5659_DAC_R_BI_EQ_BPF1_B2_1:
1092 case RT5659_DAC_R_BI_EQ_BPF1_B2_2:
1093 case RT5659_DAC_R_BI_EQ_BPF1_A1_1:
1094 case RT5659_DAC_R_BI_EQ_BPF1_A1_2:
1095 case RT5659_DAC_R_BI_EQ_BPF1_A2_1:
1096 case RT5659_DAC_R_BI_EQ_BPF1_A2_2:
1097 case RT5659_ADC_L_EQ_LPF1_A1:
1098 case RT5659_ADC_R_EQ_LPF1_A1:
1099 case RT5659_ADC_L_EQ_LPF1_H0:
1100 case RT5659_ADC_R_EQ_LPF1_H0:
1101 case RT5659_ADC_L_EQ_BPF1_A1:
1102 case RT5659_ADC_R_EQ_BPF1_A1:
1103 case RT5659_ADC_L_EQ_BPF1_A2:
1104 case RT5659_ADC_R_EQ_BPF1_A2:
1105 case RT5659_ADC_L_EQ_BPF1_H0:
1106 case RT5659_ADC_R_EQ_BPF1_H0:
1107 case RT5659_ADC_L_EQ_BPF2_A1:
1108 case RT5659_ADC_R_EQ_BPF2_A1:
1109 case RT5659_ADC_L_EQ_BPF2_A2:
1110 case RT5659_ADC_R_EQ_BPF2_A2:
1111 case RT5659_ADC_L_EQ_BPF2_H0:
1112 case RT5659_ADC_R_EQ_BPF2_H0:
1113 case RT5659_ADC_L_EQ_BPF3_A1:
1114 case RT5659_ADC_R_EQ_BPF3_A1:
1115 case RT5659_ADC_L_EQ_BPF3_A2:
1116 case RT5659_ADC_R_EQ_BPF3_A2:
1117 case RT5659_ADC_L_EQ_BPF3_H0:
1118 case RT5659_ADC_R_EQ_BPF3_H0:
1119 case RT5659_ADC_L_EQ_BPF4_A1:
1120 case RT5659_ADC_R_EQ_BPF4_A1:
1121 case RT5659_ADC_L_EQ_BPF4_A2:
1122 case RT5659_ADC_R_EQ_BPF4_A2:
1123 case RT5659_ADC_L_EQ_BPF4_H0:
1124 case RT5659_ADC_R_EQ_BPF4_H0:
1125 case RT5659_ADC_L_EQ_HPF1_A1:
1126 case RT5659_ADC_R_EQ_HPF1_A1:
1127 case RT5659_ADC_L_EQ_HPF1_H0:
1128 case RT5659_ADC_R_EQ_HPF1_H0:
1129 case RT5659_ADC_L_EQ_PRE_VOL:
1130 case RT5659_ADC_R_EQ_PRE_VOL:
1131 case RT5659_ADC_L_EQ_POST_VOL:
1132 case RT5659_ADC_R_EQ_POST_VOL:
1133 return true;
1134 default:
1135 return false;
1136 }
1137}
1138
1139static const DECLARE_TLV_DB_SCALE(hp_vol_tlv, -2325, 75, 0);
1140static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
1141static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
1142static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
1143static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0);
1144static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
1145static const DECLARE_TLV_DB_SCALE(in_bst_tlv, -1200, 75, 0);
1146
1147/* Interface data select */
1148static const char * const rt5659_data_select[] = {
1149 "L/R", "R/L", "L/L", "R/R"
1150};
1151
1152static const SOC_ENUM_SINGLE_DECL(rt5659_if1_01_adc_enum,
1153 RT5659_TDM_CTRL_2, RT5659_DS_ADC_SLOT01_SFT, rt5659_data_select);
1154
1155static const SOC_ENUM_SINGLE_DECL(rt5659_if1_23_adc_enum,
1156 RT5659_TDM_CTRL_2, RT5659_DS_ADC_SLOT23_SFT, rt5659_data_select);
1157
1158static const SOC_ENUM_SINGLE_DECL(rt5659_if1_45_adc_enum,
1159 RT5659_TDM_CTRL_2, RT5659_DS_ADC_SLOT45_SFT, rt5659_data_select);
1160
1161static const SOC_ENUM_SINGLE_DECL(rt5659_if1_67_adc_enum,
1162 RT5659_TDM_CTRL_2, RT5659_DS_ADC_SLOT67_SFT, rt5659_data_select);
1163
1164static const SOC_ENUM_SINGLE_DECL(rt5659_if2_dac_enum,
1165 RT5659_DIG_INF23_DATA, RT5659_IF2_DAC_SEL_SFT, rt5659_data_select);
1166
1167static const SOC_ENUM_SINGLE_DECL(rt5659_if2_adc_enum,
1168 RT5659_DIG_INF23_DATA, RT5659_IF2_ADC_SEL_SFT, rt5659_data_select);
1169
1170static const SOC_ENUM_SINGLE_DECL(rt5659_if3_dac_enum,
1171 RT5659_DIG_INF23_DATA, RT5659_IF3_DAC_SEL_SFT, rt5659_data_select);
1172
1173static const SOC_ENUM_SINGLE_DECL(rt5659_if3_adc_enum,
1174 RT5659_DIG_INF23_DATA, RT5659_IF3_ADC_SEL_SFT, rt5659_data_select);
1175
1176static const struct snd_kcontrol_new rt5659_if1_01_adc_swap_mux =
1177 SOC_DAPM_ENUM("IF1 01 ADC Swap Source", rt5659_if1_01_adc_enum);
1178
1179static const struct snd_kcontrol_new rt5659_if1_23_adc_swap_mux =
1180 SOC_DAPM_ENUM("IF1 23 ADC1 Swap Source", rt5659_if1_23_adc_enum);
1181
1182static const struct snd_kcontrol_new rt5659_if1_45_adc_swap_mux =
1183 SOC_DAPM_ENUM("IF1 45 ADC1 Swap Source", rt5659_if1_45_adc_enum);
1184
1185static const struct snd_kcontrol_new rt5659_if1_67_adc_swap_mux =
1186 SOC_DAPM_ENUM("IF1 67 ADC1 Swap Source", rt5659_if1_67_adc_enum);
1187
1188static const struct snd_kcontrol_new rt5659_if2_dac_swap_mux =
1189 SOC_DAPM_ENUM("IF2 DAC Swap Source", rt5659_if2_dac_enum);
1190
1191static const struct snd_kcontrol_new rt5659_if2_adc_swap_mux =
1192 SOC_DAPM_ENUM("IF2 ADC Swap Source", rt5659_if2_adc_enum);
1193
1194static const struct snd_kcontrol_new rt5659_if3_dac_swap_mux =
1195 SOC_DAPM_ENUM("IF3 DAC Swap Source", rt5659_if3_dac_enum);
1196
1197static const struct snd_kcontrol_new rt5659_if3_adc_swap_mux =
1198 SOC_DAPM_ENUM("IF3 ADC Swap Source", rt5659_if3_adc_enum);
1199
1200static const char * const rt5659_asrc_clk_src[] = {
1201 "clk_sysy_div_out", "clk_i2s1_track", "clk_i2s2_track",
1202 "clk_i2s3_track", "clk_sys2", "clk_sys3"
1203};
1204
1205static unsigned int rt5659_asrc_clk_map_values[] = {
1206 0, 1, 2, 3, 5, 6,
1207};
1208
1209static const SOC_VALUE_ENUM_SINGLE_DECL(
1210 rt5659_da_sto_asrc_enum, RT5659_ASRC_2, RT5659_DA_STO_T_SFT, 0x7,
1211 rt5659_asrc_clk_src, rt5659_asrc_clk_map_values);
1212
1213static const SOC_VALUE_ENUM_SINGLE_DECL(
1214 rt5659_da_monol_asrc_enum, RT5659_ASRC_2, RT5659_DA_MONO_L_T_SFT, 0x7,
1215 rt5659_asrc_clk_src, rt5659_asrc_clk_map_values);
1216
1217static const SOC_VALUE_ENUM_SINGLE_DECL(
1218 rt5659_da_monor_asrc_enum, RT5659_ASRC_2, RT5659_DA_MONO_R_T_SFT, 0x7,
1219 rt5659_asrc_clk_src, rt5659_asrc_clk_map_values);
1220
1221static const SOC_VALUE_ENUM_SINGLE_DECL(
1222 rt5659_ad_sto1_asrc_enum, RT5659_ASRC_2, RT5659_AD_STO1_T_SFT, 0x7,
1223 rt5659_asrc_clk_src, rt5659_asrc_clk_map_values);
1224
1225static const SOC_VALUE_ENUM_SINGLE_DECL(
1226 rt5659_ad_sto2_asrc_enum, RT5659_ASRC_3, RT5659_AD_STO2_T_SFT, 0x7,
1227 rt5659_asrc_clk_src, rt5659_asrc_clk_map_values);
1228
1229static const SOC_VALUE_ENUM_SINGLE_DECL(
1230 rt5659_ad_monol_asrc_enum, RT5659_ASRC_3, RT5659_AD_MONO_L_T_SFT, 0x7,
1231 rt5659_asrc_clk_src, rt5659_asrc_clk_map_values);
1232
1233static const SOC_VALUE_ENUM_SINGLE_DECL(
1234 rt5659_ad_monor_asrc_enum, RT5659_ASRC_3, RT5659_AD_MONO_R_T_SFT, 0x7,
1235 rt5659_asrc_clk_src, rt5659_asrc_clk_map_values);
1236
1237static int rt5659_hp_vol_put(struct snd_kcontrol *kcontrol,
1238 struct snd_ctl_elem_value *ucontrol)
1239{
1240 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1241 int ret = snd_soc_put_volsw(kcontrol, ucontrol);
1242
1243 if (snd_soc_read(codec, RT5659_STO_NG2_CTRL_1) & RT5659_NG2_EN) {
1244 snd_soc_update_bits(codec, RT5659_STO_NG2_CTRL_1,
1245 RT5659_NG2_EN_MASK, RT5659_NG2_DIS);
1246 snd_soc_update_bits(codec, RT5659_STO_NG2_CTRL_1,
1247 RT5659_NG2_EN_MASK, RT5659_NG2_EN);
1248 }
1249
1250 return ret;
1251}
1252
1253static void rt5659_enable_push_button_irq(struct snd_soc_codec *codec,
1254 bool enable)
1255{
1256 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
1257
1258 if (enable) {
1259 snd_soc_write(codec, RT5659_4BTN_IL_CMD_1, 0x000b);
1260
1261 /* MICBIAS1 and Mic Det Power for button detect*/
1262 snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1");
1263 snd_soc_dapm_force_enable_pin(dapm,
1264 "Mic Det Power");
1265 snd_soc_dapm_sync(dapm);
1266
1267 snd_soc_update_bits(codec, RT5659_PWR_ANLG_2,
1268 RT5659_PWR_MB1, RT5659_PWR_MB1);
1269 snd_soc_update_bits(codec, RT5659_PWR_VOL,
1270 RT5659_PWR_MIC_DET, RT5659_PWR_MIC_DET);
1271
1272 snd_soc_update_bits(codec, RT5659_IRQ_CTRL_2,
1273 RT5659_IL_IRQ_MASK, RT5659_IL_IRQ_EN);
1274 snd_soc_update_bits(codec, RT5659_4BTN_IL_CMD_2,
1275 RT5659_4BTN_IL_MASK, RT5659_4BTN_IL_EN);
1276 } else {
1277 snd_soc_update_bits(codec, RT5659_4BTN_IL_CMD_2,
1278 RT5659_4BTN_IL_MASK, RT5659_4BTN_IL_DIS);
1279 snd_soc_update_bits(codec, RT5659_IRQ_CTRL_2,
1280 RT5659_IL_IRQ_MASK, RT5659_IL_IRQ_DIS);
1281 /* MICBIAS1 and Mic Det Power for button detect*/
1282 snd_soc_dapm_disable_pin(dapm, "MICBIAS1");
1283 snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
1284 snd_soc_dapm_sync(dapm);
1285 }
1286}
1287
1288/**
1289 * rt5659_headset_detect - Detect headset.
1290 * @codec: SoC audio codec device.
1291 * @jack_insert: Jack insert or not.
1292 *
1293 * Detect whether is headset or not when jack inserted.
1294 *
1295 * Returns detect status.
1296 */
1297
1298static int rt5659_headset_detect(struct snd_soc_codec *codec, int jack_insert)
1299{
1300 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
1301 int val, i = 0, sleep_time[5] = {300, 150, 100, 50, 30};
1302 int reg_63;
1303
1304 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
1305
1306 if (jack_insert) {
1307 snd_soc_dapm_force_enable_pin(dapm,
1308 "Mic Det Power");
1309 snd_soc_dapm_sync(dapm);
1310 reg_63 = snd_soc_read(codec, RT5659_PWR_ANLG_1);
1311
1312 snd_soc_update_bits(codec, RT5659_PWR_ANLG_1,
1313 RT5659_PWR_VREF2 | RT5659_PWR_MB,
1314 RT5659_PWR_VREF2 | RT5659_PWR_MB);
1315 msleep(20);
1316 snd_soc_update_bits(codec, RT5659_PWR_ANLG_1,
1317 RT5659_PWR_FV2, RT5659_PWR_FV2);
1318
1319 snd_soc_write(codec, RT5659_EJD_CTRL_2, 0x4160);
1320 snd_soc_update_bits(codec, RT5659_EJD_CTRL_1,
1321 0x20, 0x0);
1322 msleep(20);
1323 snd_soc_update_bits(codec, RT5659_EJD_CTRL_1,
1324 0x20, 0x20);
1325
1326 while (i < 5) {
1327 msleep(sleep_time[i]);
1328 val = snd_soc_read(codec, RT5659_EJD_CTRL_2) & 0x0003;
1329 i++;
1330 if (val == 0x1 || val == 0x2 || val == 0x3)
1331 break;
1332 }
1333
1334 switch (val) {
1335 case 1:
1336 rt5659->jack_type = SND_JACK_HEADSET;
1337 rt5659_enable_push_button_irq(codec, true);
1338 break;
1339 default:
1340 snd_soc_write(codec, RT5659_PWR_ANLG_1, reg_63);
1341 rt5659->jack_type = SND_JACK_HEADPHONE;
1342 snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
1343 snd_soc_dapm_sync(dapm);
1344 break;
1345 }
1346 } else {
1347 snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
1348 snd_soc_dapm_sync(dapm);
1349 if (rt5659->jack_type == SND_JACK_HEADSET)
1350 rt5659_enable_push_button_irq(codec, false);
1351 rt5659->jack_type = 0;
1352 }
1353
1354 dev_dbg(codec->dev, "jack_type = %d\n", rt5659->jack_type);
1355 return rt5659->jack_type;
1356}
1357
1358static int rt5659_button_detect(struct snd_soc_codec *codec)
1359{
1360 int btn_type, val;
1361
1362 val = snd_soc_read(codec, RT5659_4BTN_IL_CMD_1);
1363 btn_type = val & 0xfff0;
1364 snd_soc_write(codec, RT5659_4BTN_IL_CMD_1, val);
1365
1366 return btn_type;
1367}
1368
1369static irqreturn_t rt5659_irq(int irq, void *data)
1370{
1371 struct rt5659_priv *rt5659 = data;
1372
1373 queue_delayed_work(system_power_efficient_wq,
1374 &rt5659->jack_detect_work, msecs_to_jiffies(250));
1375
1376 return IRQ_HANDLED;
1377}
1378
1379int rt5659_set_jack_detect(struct snd_soc_codec *codec,
1380 struct snd_soc_jack *hs_jack)
1381{
1382 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
1383
1384 rt5659->hs_jack = hs_jack;
1385
1386 rt5659_irq(0, rt5659);
1387
1388 return 0;
1389}
1390EXPORT_SYMBOL_GPL(rt5659_set_jack_detect);
1391
1392static void rt5659_jack_detect_work(struct work_struct *work)
1393{
1394 struct rt5659_priv *rt5659 =
1395 container_of(work, struct rt5659_priv, jack_detect_work.work);
1396 int val, btn_type, report = 0;
1397
1398 if (!rt5659->codec)
1399 return;
1400
1401 val = snd_soc_read(rt5659->codec, RT5659_INT_ST_1) & 0x0080;
1402 if (!val) {
1403 /* jack in */
1404 if (rt5659->jack_type == 0) {
1405 /* jack was out, report jack type */
1406 report = rt5659_headset_detect(rt5659->codec, 1);
1407 } else {
1408 /* jack is already in, report button event */
1409 report = SND_JACK_HEADSET;
1410 btn_type = rt5659_button_detect(rt5659->codec);
1411 /**
1412 * rt5659 can report three kinds of button behavior,
1413 * one click, double click and hold. However,
1414 * currently we will report button pressed/released
1415 * event. So all the three button behaviors are
1416 * treated as button pressed.
1417 */
1418 switch (btn_type) {
1419 case 0x8000:
1420 case 0x4000:
1421 case 0x2000:
1422 report |= SND_JACK_BTN_0;
1423 break;
1424 case 0x1000:
1425 case 0x0800:
1426 case 0x0400:
1427 report |= SND_JACK_BTN_1;
1428 break;
1429 case 0x0200:
1430 case 0x0100:
1431 case 0x0080:
1432 report |= SND_JACK_BTN_2;
1433 break;
1434 case 0x0040:
1435 case 0x0020:
1436 case 0x0010:
1437 report |= SND_JACK_BTN_3;
1438 break;
1439 case 0x0000: /* unpressed */
1440 break;
1441 default:
1442 btn_type = 0;
1443 dev_err(rt5659->codec->dev,
1444 "Unexpected button code 0x%04x\n",
1445 btn_type);
1446 break;
1447 }
1448
1449 /* button release or spurious interrput*/
1450 if (btn_type == 0)
1451 report = rt5659->jack_type;
1452 }
1453 } else {
1454 /* jack out */
1455 report = rt5659_headset_detect(rt5659->codec, 0);
1456 }
1457
1458 snd_soc_jack_report(rt5659->hs_jack, report, SND_JACK_HEADSET |
1459 SND_JACK_BTN_0 | SND_JACK_BTN_1 |
1460 SND_JACK_BTN_2 | SND_JACK_BTN_3);
1461}
1462
1463static const struct snd_kcontrol_new rt5659_snd_controls[] = {
1464 /* Speaker Output Volume */
1465 SOC_DOUBLE_TLV("Speaker Playback Volume", RT5659_SPO_VOL,
1466 RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 39, 1, out_vol_tlv),
1467
1468 /* Headphone Output Volume */
1469 SOC_DOUBLE_R_EXT_TLV("Headphone Playback Volume", RT5659_HPL_GAIN,
1470 RT5659_HPR_GAIN, RT5659_G_HP_SFT, 31, 1, snd_soc_get_volsw,
1471 rt5659_hp_vol_put, hp_vol_tlv),
1472
1473 /* Mono Output Volume */
1474 SOC_SINGLE_TLV("Mono Playback Volume", RT5659_MONO_OUT,
1475 RT5659_L_VOL_SFT, 39, 1, out_vol_tlv),
1476
1477 /* Output Volume */
1478 SOC_DOUBLE_TLV("OUT Playback Volume", RT5659_LOUT,
1479 RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 39, 1, out_vol_tlv),
1480
1481 /* DAC Digital Volume */
1482 SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5659_DAC1_DIG_VOL,
1483 RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 175, 0, dac_vol_tlv),
1484 SOC_DOUBLE("DAC1 Playback Switch", RT5659_AD_DA_MIXER,
1485 RT5659_M_DAC1_L_SFT, RT5659_M_DAC1_R_SFT, 1, 1),
1486
1487 SOC_DOUBLE_TLV("DAC2 Playback Volume", RT5659_DAC2_DIG_VOL,
1488 RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 175, 0, dac_vol_tlv),
1489 SOC_DOUBLE("DAC2 Playback Switch", RT5659_DAC_CTRL,
1490 RT5659_M_DAC2_L_VOL_SFT, RT5659_M_DAC2_R_VOL_SFT, 1, 1),
1491
1492 /* IN1/IN2/IN3/IN4 Volume */
1493 SOC_SINGLE_TLV("IN1 Boost Volume", RT5659_IN1_IN2,
1494 RT5659_BST1_SFT, 69, 0, in_bst_tlv),
1495 SOC_SINGLE_TLV("IN2 Boost Volume", RT5659_IN1_IN2,
1496 RT5659_BST2_SFT, 69, 0, in_bst_tlv),
1497 SOC_SINGLE_TLV("IN3 Boost Volume", RT5659_IN3_IN4,
1498 RT5659_BST3_SFT, 69, 0, in_bst_tlv),
1499 SOC_SINGLE_TLV("IN4 Boost Volume", RT5659_IN3_IN4,
1500 RT5659_BST4_SFT, 69, 0, in_bst_tlv),
1501
1502 /* INL/INR Volume Control */
1503 SOC_DOUBLE_TLV("IN Capture Volume", RT5659_INL1_INR1_VOL,
1504 RT5659_INL_VOL_SFT, RT5659_INR_VOL_SFT, 31, 1, in_vol_tlv),
1505
1506 /* ADC Digital Volume Control */
1507 SOC_DOUBLE("STO1 ADC Capture Switch", RT5659_STO1_ADC_DIG_VOL,
1508 RT5659_L_MUTE_SFT, RT5659_R_MUTE_SFT, 1, 1),
1509 SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5659_STO1_ADC_DIG_VOL,
1510 RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 127, 0, adc_vol_tlv),
1511 SOC_DOUBLE("Mono ADC Capture Switch", RT5659_MONO_ADC_DIG_VOL,
1512 RT5659_L_MUTE_SFT, RT5659_R_MUTE_SFT, 1, 1),
1513 SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5659_MONO_ADC_DIG_VOL,
1514 RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 127, 0, adc_vol_tlv),
1515 SOC_DOUBLE("STO2 ADC Capture Switch", RT5659_STO2_ADC_DIG_VOL,
1516 RT5659_L_MUTE_SFT, RT5659_R_MUTE_SFT, 1, 1),
1517 SOC_DOUBLE_TLV("STO2 ADC Capture Volume", RT5659_STO2_ADC_DIG_VOL,
1518 RT5659_L_VOL_SFT, RT5659_R_VOL_SFT, 127, 0, adc_vol_tlv),
1519
1520 /* ADC Boost Volume Control */
1521 SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5659_STO1_BOOST,
1522 RT5659_STO1_ADC_L_BST_SFT, RT5659_STO1_ADC_R_BST_SFT,
1523 3, 0, adc_bst_tlv),
1524
1525 SOC_DOUBLE_TLV("Mono ADC Boost Gain Volume", RT5659_MONO_BOOST,
1526 RT5659_MONO_ADC_L_BST_SFT, RT5659_MONO_ADC_R_BST_SFT,
1527 3, 0, adc_bst_tlv),
1528
1529 SOC_DOUBLE_TLV("STO2 ADC Boost Gain Volume", RT5659_STO2_BOOST,
1530 RT5659_STO2_ADC_L_BST_SFT, RT5659_STO2_ADC_R_BST_SFT,
1531 3, 0, adc_bst_tlv),
1532
1533 SOC_SINGLE("DAC IF1 DAC1 L Data Switch", RT5659_TDM_CTRL_4, 12, 7, 0),
1534 SOC_SINGLE("DAC IF1 DAC1 R Data Switch", RT5659_TDM_CTRL_4, 8, 7, 0),
1535 SOC_SINGLE("DAC IF1 DAC2 L Data Switch", RT5659_TDM_CTRL_4, 4, 7, 0),
1536 SOC_SINGLE("DAC IF1 DAC2 R Data Switch", RT5659_TDM_CTRL_4, 0, 7, 0),
1537};
1538
1539/**
1540 * set_dmic_clk - Set parameter of dmic.
1541 *
1542 * @w: DAPM widget.
1543 * @kcontrol: The kcontrol of this widget.
1544 * @event: Event id.
1545 *
1546 * Choose dmic clock between 1MHz and 3MHz.
1547 * It is better for clock to approximate 3MHz.
1548 */
1549static int set_dmic_clk(struct snd_soc_dapm_widget *w,
1550 struct snd_kcontrol *kcontrol, int event)
1551{
1552 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1553 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
1554 int pd, idx = -EINVAL;
1555
1556 pd = rl6231_get_pre_div(rt5659->regmap,
1557 RT5659_ADDA_CLK_1, RT5659_I2S_PD1_SFT);
1558 idx = rl6231_calc_dmic_clk(rt5659->sysclk / pd);
1559
1560 if (idx < 0)
1561 dev_err(codec->dev, "Failed to set DMIC clock\n");
1562 else {
1563 snd_soc_update_bits(codec, RT5659_DMIC_CTRL_1,
1564 RT5659_DMIC_CLK_MASK, idx << RT5659_DMIC_CLK_SFT);
1565 }
1566 return idx;
1567}
1568
1569static int set_adc_clk(struct snd_soc_dapm_widget *w,
1570 struct snd_kcontrol *kcontrol, int event)
1571{
1572 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1573
1574 switch (event) {
1575 case SND_SOC_DAPM_POST_PMU:
1576 snd_soc_update_bits(codec, RT5659_CHOP_ADC,
1577 RT5659_CKXEN_ADCC_MASK | RT5659_CKGEN_ADCC_MASK,
1578 RT5659_CKXEN_ADCC_MASK | RT5659_CKGEN_ADCC_MASK);
1579 break;
1580
1581 case SND_SOC_DAPM_PRE_PMD:
1582 snd_soc_update_bits(codec, RT5659_CHOP_ADC,
1583 RT5659_CKXEN_ADCC_MASK | RT5659_CKGEN_ADCC_MASK, 0);
1584 break;
1585
1586 default:
1587 return 0;
1588 }
1589
1590 return 0;
1591
1592}
1593
1594static int rt5659_charge_pump_event(struct snd_soc_dapm_widget *w,
1595 struct snd_kcontrol *kcontrol, int event)
1596{
1597 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1598
1599 switch (event) {
1600 case SND_SOC_DAPM_PRE_PMU:
1601 /* Depop */
1602 snd_soc_write(codec, RT5659_DEPOP_1, 0x0009);
1603 break;
1604 case SND_SOC_DAPM_POST_PMD:
1605 snd_soc_write(codec, RT5659_HP_CHARGE_PUMP_1, 0x0c16);
1606 break;
1607 default:
1608 return 0;
1609 }
1610
1611 return 0;
1612}
1613
1614static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *w,
1615 struct snd_soc_dapm_widget *sink)
1616{
1617 unsigned int val;
1618 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1619
1620 val = snd_soc_read(codec, RT5659_GLB_CLK);
1621 val &= RT5659_SCLK_SRC_MASK;
1622 if (val == RT5659_SCLK_SRC_PLL1)
1623 return 1;
1624 else
1625 return 0;
1626}
1627
1628static int is_using_asrc(struct snd_soc_dapm_widget *w,
1629 struct snd_soc_dapm_widget *sink)
1630{
1631 unsigned int reg, shift, val;
1632 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1633
1634 switch (w->shift) {
1635 case RT5659_ADC_MONO_R_ASRC_SFT:
1636 reg = RT5659_ASRC_3;
1637 shift = RT5659_AD_MONO_R_T_SFT;
1638 break;
1639 case RT5659_ADC_MONO_L_ASRC_SFT:
1640 reg = RT5659_ASRC_3;
1641 shift = RT5659_AD_MONO_L_T_SFT;
1642 break;
1643 case RT5659_ADC_STO1_ASRC_SFT:
1644 reg = RT5659_ASRC_2;
1645 shift = RT5659_AD_STO1_T_SFT;
1646 break;
1647 case RT5659_DAC_MONO_R_ASRC_SFT:
1648 reg = RT5659_ASRC_2;
1649 shift = RT5659_DA_MONO_R_T_SFT;
1650 break;
1651 case RT5659_DAC_MONO_L_ASRC_SFT:
1652 reg = RT5659_ASRC_2;
1653 shift = RT5659_DA_MONO_L_T_SFT;
1654 break;
1655 case RT5659_DAC_STO_ASRC_SFT:
1656 reg = RT5659_ASRC_2;
1657 shift = RT5659_DA_STO_T_SFT;
1658 break;
1659 default:
1660 return 0;
1661 }
1662
1663 val = (snd_soc_read(codec, reg) >> shift) & 0xf;
1664 switch (val) {
1665 case 1:
1666 case 2:
1667 case 3:
1668 /* I2S_Pre_Div1 should be 1 in asrc mode */
1669 snd_soc_update_bits(codec, RT5659_ADDA_CLK_1,
1670 RT5659_I2S_PD1_MASK, RT5659_I2S_PD1_2);
1671 return 1;
1672 default:
1673 return 0;
1674 }
1675
1676}
1677
1678/* Digital Mixer */
1679static const struct snd_kcontrol_new rt5659_sto1_adc_l_mix[] = {
1680 SOC_DAPM_SINGLE("ADC1 Switch", RT5659_STO1_ADC_MIXER,
1681 RT5659_M_STO1_ADC_L1_SFT, 1, 1),
1682 SOC_DAPM_SINGLE("ADC2 Switch", RT5659_STO1_ADC_MIXER,
1683 RT5659_M_STO1_ADC_L2_SFT, 1, 1),
1684};
1685
1686static const struct snd_kcontrol_new rt5659_sto1_adc_r_mix[] = {
1687 SOC_DAPM_SINGLE("ADC1 Switch", RT5659_STO1_ADC_MIXER,
1688 RT5659_M_STO1_ADC_R1_SFT, 1, 1),
1689 SOC_DAPM_SINGLE("ADC2 Switch", RT5659_STO1_ADC_MIXER,
1690 RT5659_M_STO1_ADC_R2_SFT, 1, 1),
1691};
1692
1693static const struct snd_kcontrol_new rt5659_mono_adc_l_mix[] = {
1694 SOC_DAPM_SINGLE("ADC1 Switch", RT5659_MONO_ADC_MIXER,
1695 RT5659_M_MONO_ADC_L1_SFT, 1, 1),
1696 SOC_DAPM_SINGLE("ADC2 Switch", RT5659_MONO_ADC_MIXER,
1697 RT5659_M_MONO_ADC_L2_SFT, 1, 1),
1698};
1699
1700static const struct snd_kcontrol_new rt5659_mono_adc_r_mix[] = {
1701 SOC_DAPM_SINGLE("ADC1 Switch", RT5659_MONO_ADC_MIXER,
1702 RT5659_M_MONO_ADC_R1_SFT, 1, 1),
1703 SOC_DAPM_SINGLE("ADC2 Switch", RT5659_MONO_ADC_MIXER,
1704 RT5659_M_MONO_ADC_R2_SFT, 1, 1),
1705};
1706
1707static const struct snd_kcontrol_new rt5659_dac_l_mix[] = {
1708 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5659_AD_DA_MIXER,
1709 RT5659_M_ADCMIX_L_SFT, 1, 1),
1710 SOC_DAPM_SINGLE("DAC1 Switch", RT5659_AD_DA_MIXER,
1711 RT5659_M_DAC1_L_SFT, 1, 1),
1712};
1713
1714static const struct snd_kcontrol_new rt5659_dac_r_mix[] = {
1715 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5659_AD_DA_MIXER,
1716 RT5659_M_ADCMIX_R_SFT, 1, 1),
1717 SOC_DAPM_SINGLE("DAC1 Switch", RT5659_AD_DA_MIXER,
1718 RT5659_M_DAC1_R_SFT, 1, 1),
1719};
1720
1721static const struct snd_kcontrol_new rt5659_sto_dac_l_mix[] = {
1722 SOC_DAPM_SINGLE("DAC L1 Switch", RT5659_STO_DAC_MIXER,
1723 RT5659_M_DAC_L1_STO_L_SFT, 1, 1),
1724 SOC_DAPM_SINGLE("DAC R1 Switch", RT5659_STO_DAC_MIXER,
1725 RT5659_M_DAC_R1_STO_L_SFT, 1, 1),
1726 SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_STO_DAC_MIXER,
1727 RT5659_M_DAC_L2_STO_L_SFT, 1, 1),
1728 SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_STO_DAC_MIXER,
1729 RT5659_M_DAC_R2_STO_L_SFT, 1, 1),
1730};
1731
1732static const struct snd_kcontrol_new rt5659_sto_dac_r_mix[] = {
1733 SOC_DAPM_SINGLE("DAC L1 Switch", RT5659_STO_DAC_MIXER,
1734 RT5659_M_DAC_L1_STO_R_SFT, 1, 1),
1735 SOC_DAPM_SINGLE("DAC R1 Switch", RT5659_STO_DAC_MIXER,
1736 RT5659_M_DAC_R1_STO_R_SFT, 1, 1),
1737 SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_STO_DAC_MIXER,
1738 RT5659_M_DAC_L2_STO_R_SFT, 1, 1),
1739 SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_STO_DAC_MIXER,
1740 RT5659_M_DAC_R2_STO_R_SFT, 1, 1),
1741};
1742
1743static const struct snd_kcontrol_new rt5659_mono_dac_l_mix[] = {
1744 SOC_DAPM_SINGLE("DAC L1 Switch", RT5659_MONO_DAC_MIXER,
1745 RT5659_M_DAC_L1_MONO_L_SFT, 1, 1),
1746 SOC_DAPM_SINGLE("DAC R1 Switch", RT5659_MONO_DAC_MIXER,
1747 RT5659_M_DAC_R1_MONO_L_SFT, 1, 1),
1748 SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_MONO_DAC_MIXER,
1749 RT5659_M_DAC_L2_MONO_L_SFT, 1, 1),
1750 SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_MONO_DAC_MIXER,
1751 RT5659_M_DAC_R2_MONO_L_SFT, 1, 1),
1752};
1753
1754static const struct snd_kcontrol_new rt5659_mono_dac_r_mix[] = {
1755 SOC_DAPM_SINGLE("DAC L1 Switch", RT5659_MONO_DAC_MIXER,
1756 RT5659_M_DAC_L1_MONO_R_SFT, 1, 1),
1757 SOC_DAPM_SINGLE("DAC R1 Switch", RT5659_MONO_DAC_MIXER,
1758 RT5659_M_DAC_R1_MONO_R_SFT, 1, 1),
1759 SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_MONO_DAC_MIXER,
1760 RT5659_M_DAC_L2_MONO_R_SFT, 1, 1),
1761 SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_MONO_DAC_MIXER,
1762 RT5659_M_DAC_R2_MONO_R_SFT, 1, 1),
1763};
1764
1765/* Analog Input Mixer */
1766static const struct snd_kcontrol_new rt5659_rec1_l_mix[] = {
1767 SOC_DAPM_SINGLE("SPKVOLL Switch", RT5659_REC1_L2_MIXER,
1768 RT5659_M_SPKVOLL_RM1_L_SFT, 1, 1),
1769 SOC_DAPM_SINGLE("INL Switch", RT5659_REC1_L2_MIXER,
1770 RT5659_M_INL_RM1_L_SFT, 1, 1),
1771 SOC_DAPM_SINGLE("BST4 Switch", RT5659_REC1_L2_MIXER,
1772 RT5659_M_BST4_RM1_L_SFT, 1, 1),
1773 SOC_DAPM_SINGLE("BST3 Switch", RT5659_REC1_L2_MIXER,
1774 RT5659_M_BST3_RM1_L_SFT, 1, 1),
1775 SOC_DAPM_SINGLE("BST2 Switch", RT5659_REC1_L2_MIXER,
1776 RT5659_M_BST2_RM1_L_SFT, 1, 1),
1777 SOC_DAPM_SINGLE("BST1 Switch", RT5659_REC1_L2_MIXER,
1778 RT5659_M_BST1_RM1_L_SFT, 1, 1),
1779};
1780
1781static const struct snd_kcontrol_new rt5659_rec1_r_mix[] = {
1782 SOC_DAPM_SINGLE("HPOVOLR Switch", RT5659_REC1_L2_MIXER,
1783 RT5659_M_HPOVOLR_RM1_R_SFT, 1, 1),
1784 SOC_DAPM_SINGLE("INR Switch", RT5659_REC1_R2_MIXER,
1785 RT5659_M_INR_RM1_R_SFT, 1, 1),
1786 SOC_DAPM_SINGLE("BST4 Switch", RT5659_REC1_R2_MIXER,
1787 RT5659_M_BST4_RM1_R_SFT, 1, 1),
1788 SOC_DAPM_SINGLE("BST3 Switch", RT5659_REC1_R2_MIXER,
1789 RT5659_M_BST3_RM1_R_SFT, 1, 1),
1790 SOC_DAPM_SINGLE("BST2 Switch", RT5659_REC1_R2_MIXER,
1791 RT5659_M_BST2_RM1_R_SFT, 1, 1),
1792 SOC_DAPM_SINGLE("BST1 Switch", RT5659_REC1_R2_MIXER,
1793 RT5659_M_BST1_RM1_R_SFT, 1, 1),
1794};
1795
1796static const struct snd_kcontrol_new rt5659_rec2_l_mix[] = {
1797 SOC_DAPM_SINGLE("SPKVOLL Switch", RT5659_REC2_L2_MIXER,
1798 RT5659_M_SPKVOL_RM2_L_SFT, 1, 1),
1799 SOC_DAPM_SINGLE("OUTVOLL Switch", RT5659_REC2_L2_MIXER,
1800 RT5659_M_OUTVOLL_RM2_L_SFT, 1, 1),
1801 SOC_DAPM_SINGLE("BST4 Switch", RT5659_REC2_L2_MIXER,
1802 RT5659_M_BST4_RM2_L_SFT, 1, 1),
1803 SOC_DAPM_SINGLE("BST3 Switch", RT5659_REC2_L2_MIXER,
1804 RT5659_M_BST3_RM2_L_SFT, 1, 1),
1805 SOC_DAPM_SINGLE("BST2 Switch", RT5659_REC2_L2_MIXER,
1806 RT5659_M_BST2_RM2_L_SFT, 1, 1),
1807 SOC_DAPM_SINGLE("BST1 Switch", RT5659_REC2_L2_MIXER,
1808 RT5659_M_BST1_RM2_L_SFT, 1, 1),
1809};
1810
1811static const struct snd_kcontrol_new rt5659_rec2_r_mix[] = {
1812 SOC_DAPM_SINGLE("MONOVOL Switch", RT5659_REC2_R2_MIXER,
1813 RT5659_M_MONOVOL_RM2_R_SFT, 1, 1),
1814 SOC_DAPM_SINGLE("OUTVOLR Switch", RT5659_REC2_R2_MIXER,
1815 RT5659_M_OUTVOLR_RM2_R_SFT, 1, 1),
1816 SOC_DAPM_SINGLE("BST4 Switch", RT5659_REC2_R2_MIXER,
1817 RT5659_M_BST4_RM2_R_SFT, 1, 1),
1818 SOC_DAPM_SINGLE("BST3 Switch", RT5659_REC2_R2_MIXER,
1819 RT5659_M_BST3_RM2_R_SFT, 1, 1),
1820 SOC_DAPM_SINGLE("BST2 Switch", RT5659_REC2_R2_MIXER,
1821 RT5659_M_BST2_RM2_R_SFT, 1, 1),
1822 SOC_DAPM_SINGLE("BST1 Switch", RT5659_REC2_R2_MIXER,
1823 RT5659_M_BST1_RM2_R_SFT, 1, 1),
1824};
1825
1826static const struct snd_kcontrol_new rt5659_spk_l_mix[] = {
1827 SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_SPK_L_MIXER,
1828 RT5659_M_DAC_L2_SM_L_SFT, 1, 1),
1829 SOC_DAPM_SINGLE("BST1 Switch", RT5659_SPK_L_MIXER,
1830 RT5659_M_BST1_SM_L_SFT, 1, 1),
1831 SOC_DAPM_SINGLE("INL Switch", RT5659_SPK_L_MIXER,
1832 RT5659_M_IN_L_SM_L_SFT, 1, 1),
1833 SOC_DAPM_SINGLE("INR Switch", RT5659_SPK_L_MIXER,
1834 RT5659_M_IN_R_SM_L_SFT, 1, 1),
1835 SOC_DAPM_SINGLE("BST3 Switch", RT5659_SPK_L_MIXER,
1836 RT5659_M_BST3_SM_L_SFT, 1, 1),
1837};
1838
1839static const struct snd_kcontrol_new rt5659_spk_r_mix[] = {
1840 SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_SPK_R_MIXER,
1841 RT5659_M_DAC_R2_SM_R_SFT, 1, 1),
1842 SOC_DAPM_SINGLE("BST4 Switch", RT5659_SPK_R_MIXER,
1843 RT5659_M_BST4_SM_R_SFT, 1, 1),
1844 SOC_DAPM_SINGLE("INL Switch", RT5659_SPK_R_MIXER,
1845 RT5659_M_IN_L_SM_R_SFT, 1, 1),
1846 SOC_DAPM_SINGLE("INR Switch", RT5659_SPK_R_MIXER,
1847 RT5659_M_IN_R_SM_R_SFT, 1, 1),
1848 SOC_DAPM_SINGLE("BST3 Switch", RT5659_SPK_R_MIXER,
1849 RT5659_M_BST3_SM_R_SFT, 1, 1),
1850};
1851
1852static const struct snd_kcontrol_new rt5659_monovol_mix[] = {
1853 SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_MONOMIX_IN_GAIN,
1854 RT5659_M_DAC_L2_MM_SFT, 1, 1),
1855 SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_MONOMIX_IN_GAIN,
1856 RT5659_M_DAC_R2_MM_SFT, 1, 1),
1857 SOC_DAPM_SINGLE("BST1 Switch", RT5659_MONOMIX_IN_GAIN,
1858 RT5659_M_BST1_MM_SFT, 1, 1),
1859 SOC_DAPM_SINGLE("BST2 Switch", RT5659_MONOMIX_IN_GAIN,
1860 RT5659_M_BST2_MM_SFT, 1, 1),
1861 SOC_DAPM_SINGLE("BST3 Switch", RT5659_MONOMIX_IN_GAIN,
1862 RT5659_M_BST3_MM_SFT, 1, 1),
1863};
1864
1865static const struct snd_kcontrol_new rt5659_out_l_mix[] = {
1866 SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_OUT_L_MIXER,
1867 RT5659_M_DAC_L2_OM_L_SFT, 1, 1),
1868 SOC_DAPM_SINGLE("INL Switch", RT5659_OUT_L_MIXER,
1869 RT5659_M_IN_L_OM_L_SFT, 1, 1),
1870 SOC_DAPM_SINGLE("BST1 Switch", RT5659_OUT_L_MIXER,
1871 RT5659_M_BST1_OM_L_SFT, 1, 1),
1872 SOC_DAPM_SINGLE("BST2 Switch", RT5659_OUT_L_MIXER,
1873 RT5659_M_BST2_OM_L_SFT, 1, 1),
1874 SOC_DAPM_SINGLE("BST3 Switch", RT5659_OUT_L_MIXER,
1875 RT5659_M_BST3_OM_L_SFT, 1, 1),
1876};
1877
1878static const struct snd_kcontrol_new rt5659_out_r_mix[] = {
1879 SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_OUT_R_MIXER,
1880 RT5659_M_DAC_R2_OM_R_SFT, 1, 1),
1881 SOC_DAPM_SINGLE("INR Switch", RT5659_OUT_R_MIXER,
1882 RT5659_M_IN_R_OM_R_SFT, 1, 1),
1883 SOC_DAPM_SINGLE("BST2 Switch", RT5659_OUT_R_MIXER,
1884 RT5659_M_BST2_OM_R_SFT, 1, 1),
1885 SOC_DAPM_SINGLE("BST3 Switch", RT5659_OUT_R_MIXER,
1886 RT5659_M_BST3_OM_R_SFT, 1, 1),
1887 SOC_DAPM_SINGLE("BST4 Switch", RT5659_OUT_R_MIXER,
1888 RT5659_M_BST4_OM_R_SFT, 1, 1),
1889};
1890
1891static const struct snd_kcontrol_new rt5659_spo_l_mix[] = {
1892 SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_SPO_AMP_GAIN,
1893 RT5659_M_DAC_L2_SPKOMIX_SFT, 1, 0),
1894 SOC_DAPM_SINGLE("SPKVOL L Switch", RT5659_SPO_AMP_GAIN,
1895 RT5659_M_SPKVOLL_SPKOMIX_SFT, 1, 0),
1896};
1897
1898static const struct snd_kcontrol_new rt5659_spo_r_mix[] = {
1899 SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_SPO_AMP_GAIN,
1900 RT5659_M_DAC_R2_SPKOMIX_SFT, 1, 0),
1901 SOC_DAPM_SINGLE("SPKVOL R Switch", RT5659_SPO_AMP_GAIN,
1902 RT5659_M_SPKVOLR_SPKOMIX_SFT, 1, 0),
1903};
1904
1905static const struct snd_kcontrol_new rt5659_mono_mix[] = {
1906 SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_MONOMIX_IN_GAIN,
1907 RT5659_M_DAC_L2_MA_SFT, 1, 1),
1908 SOC_DAPM_SINGLE("MONOVOL Switch", RT5659_MONOMIX_IN_GAIN,
1909 RT5659_M_MONOVOL_MA_SFT, 1, 1),
1910};
1911
1912static const struct snd_kcontrol_new rt5659_lout_l_mix[] = {
1913 SOC_DAPM_SINGLE("DAC L2 Switch", RT5659_LOUT_MIXER,
1914 RT5659_M_DAC_L2_LM_SFT, 1, 1),
1915 SOC_DAPM_SINGLE("OUTVOL L Switch", RT5659_LOUT_MIXER,
1916 RT5659_M_OV_L_LM_SFT, 1, 1),
1917};
1918
1919static const struct snd_kcontrol_new rt5659_lout_r_mix[] = {
1920 SOC_DAPM_SINGLE("DAC R2 Switch", RT5659_LOUT_MIXER,
1921 RT5659_M_DAC_R2_LM_SFT, 1, 1),
1922 SOC_DAPM_SINGLE("OUTVOL R Switch", RT5659_LOUT_MIXER,
1923 RT5659_M_OV_R_LM_SFT, 1, 1),
1924};
1925
1926/*DAC L2, DAC R2*/
1927/*MX-1B [6:4], MX-1B [2:0]*/
1928static const char * const rt5659_dac2_src[] = {
1929 "IF1 DAC2", "IF2 DAC", "IF3 DAC", "Mono ADC MIX"
1930};
1931
1932static const SOC_ENUM_SINGLE_DECL(
1933 rt5659_dac_l2_enum, RT5659_DAC_CTRL,
1934 RT5659_DAC_L2_SEL_SFT, rt5659_dac2_src);
1935
1936static const struct snd_kcontrol_new rt5659_dac_l2_mux =
1937 SOC_DAPM_ENUM("DAC L2 Source", rt5659_dac_l2_enum);
1938
1939static const SOC_ENUM_SINGLE_DECL(
1940 rt5659_dac_r2_enum, RT5659_DAC_CTRL,
1941 RT5659_DAC_R2_SEL_SFT, rt5659_dac2_src);
1942
1943static const struct snd_kcontrol_new rt5659_dac_r2_mux =
1944 SOC_DAPM_ENUM("DAC R2 Source", rt5659_dac_r2_enum);
1945
1946
1947/* STO1 ADC1 Source */
1948/* MX-26 [13] */
1949static const char * const rt5659_sto1_adc1_src[] = {
1950 "DAC MIX", "ADC"
1951};
1952
1953static const SOC_ENUM_SINGLE_DECL(
1954 rt5659_sto1_adc1_enum, RT5659_STO1_ADC_MIXER,
1955 RT5659_STO1_ADC1_SRC_SFT, rt5659_sto1_adc1_src);
1956
1957static const struct snd_kcontrol_new rt5659_sto1_adc1_mux =
1958 SOC_DAPM_ENUM("Stereo1 ADC1 Source", rt5659_sto1_adc1_enum);
1959
1960/* STO1 ADC Source */
1961/* MX-26 [12] */
1962static const char * const rt5659_sto1_adc_src[] = {
1963 "ADC1", "ADC2"
1964};
1965
1966static const SOC_ENUM_SINGLE_DECL(
1967 rt5659_sto1_adc_enum, RT5659_STO1_ADC_MIXER,
1968 RT5659_STO1_ADC_SRC_SFT, rt5659_sto1_adc_src);
1969
1970static const struct snd_kcontrol_new rt5659_sto1_adc_mux =
1971 SOC_DAPM_ENUM("Stereo1 ADC Source", rt5659_sto1_adc_enum);
1972
1973/* STO1 ADC2 Source */
1974/* MX-26 [11] */
1975static const char * const rt5659_sto1_adc2_src[] = {
1976 "DAC MIX", "DMIC"
1977};
1978
1979static const SOC_ENUM_SINGLE_DECL(
1980 rt5659_sto1_adc2_enum, RT5659_STO1_ADC_MIXER,
1981 RT5659_STO1_ADC2_SRC_SFT, rt5659_sto1_adc2_src);
1982
1983static const struct snd_kcontrol_new rt5659_sto1_adc2_mux =
1984 SOC_DAPM_ENUM("Stereo1 ADC2 Source", rt5659_sto1_adc2_enum);
1985
1986/* STO1 DMIC Source */
1987/* MX-26 [8] */
1988static const char * const rt5659_sto1_dmic_src[] = {
1989 "DMIC1", "DMIC2"
1990};
1991
1992static const SOC_ENUM_SINGLE_DECL(
1993 rt5659_sto1_dmic_enum, RT5659_STO1_ADC_MIXER,
1994 RT5659_STO1_DMIC_SRC_SFT, rt5659_sto1_dmic_src);
1995
1996static const struct snd_kcontrol_new rt5659_sto1_dmic_mux =
1997 SOC_DAPM_ENUM("Stereo1 DMIC Source", rt5659_sto1_dmic_enum);
1998
1999
2000/* MONO ADC L2 Source */
2001/* MX-27 [12] */
2002static const char * const rt5659_mono_adc_l2_src[] = {
2003 "Mono DAC MIXL", "DMIC"
2004};
2005
2006static const SOC_ENUM_SINGLE_DECL(
2007 rt5659_mono_adc_l2_enum, RT5659_MONO_ADC_MIXER,
2008 RT5659_MONO_ADC_L2_SRC_SFT, rt5659_mono_adc_l2_src);
2009
2010static const struct snd_kcontrol_new rt5659_mono_adc_l2_mux =
2011 SOC_DAPM_ENUM("Mono ADC L2 Source", rt5659_mono_adc_l2_enum);
2012
2013
2014/* MONO ADC L1 Source */
2015/* MX-27 [11] */
2016static const char * const rt5659_mono_adc_l1_src[] = {
2017 "Mono DAC MIXL", "ADC"
2018};
2019
2020static const SOC_ENUM_SINGLE_DECL(
2021 rt5659_mono_adc_l1_enum, RT5659_MONO_ADC_MIXER,
2022 RT5659_MONO_ADC_L1_SRC_SFT, rt5659_mono_adc_l1_src);
2023
2024static const struct snd_kcontrol_new rt5659_mono_adc_l1_mux =
2025 SOC_DAPM_ENUM("Mono ADC L1 Source", rt5659_mono_adc_l1_enum);
2026
2027/* MONO ADC L Source, MONO ADC R Source*/
2028/* MX-27 [10:9], MX-27 [2:1] */
2029static const char * const rt5659_mono_adc_src[] = {
2030 "ADC1 L", "ADC1 R", "ADC2 L", "ADC2 R"
2031};
2032
2033static const SOC_ENUM_SINGLE_DECL(
2034 rt5659_mono_adc_l_enum, RT5659_MONO_ADC_MIXER,
2035 RT5659_MONO_ADC_L_SRC_SFT, rt5659_mono_adc_src);
2036
2037static const struct snd_kcontrol_new rt5659_mono_adc_l_mux =
2038 SOC_DAPM_ENUM("Mono ADC L Source", rt5659_mono_adc_l_enum);
2039
2040static const SOC_ENUM_SINGLE_DECL(
2041 rt5659_mono_adcr_enum, RT5659_MONO_ADC_MIXER,
2042 RT5659_MONO_ADC_R_SRC_SFT, rt5659_mono_adc_src);
2043
2044static const struct snd_kcontrol_new rt5659_mono_adc_r_mux =
2045 SOC_DAPM_ENUM("Mono ADC R Source", rt5659_mono_adcr_enum);
2046
2047/* MONO DMIC L Source */
2048/* MX-27 [8] */
2049static const char * const rt5659_mono_dmic_l_src[] = {
2050 "DMIC1 L", "DMIC2 L"
2051};
2052
2053static const SOC_ENUM_SINGLE_DECL(
2054 rt5659_mono_dmic_l_enum, RT5659_MONO_ADC_MIXER,
2055 RT5659_MONO_DMIC_L_SRC_SFT, rt5659_mono_dmic_l_src);
2056
2057static const struct snd_kcontrol_new rt5659_mono_dmic_l_mux =
2058 SOC_DAPM_ENUM("Mono DMIC L Source", rt5659_mono_dmic_l_enum);
2059
2060/* MONO ADC R2 Source */
2061/* MX-27 [4] */
2062static const char * const rt5659_mono_adc_r2_src[] = {
2063 "Mono DAC MIXR", "DMIC"
2064};
2065
2066static const SOC_ENUM_SINGLE_DECL(
2067 rt5659_mono_adc_r2_enum, RT5659_MONO_ADC_MIXER,
2068 RT5659_MONO_ADC_R2_SRC_SFT, rt5659_mono_adc_r2_src);
2069
2070static const struct snd_kcontrol_new rt5659_mono_adc_r2_mux =
2071 SOC_DAPM_ENUM("Mono ADC R2 Source", rt5659_mono_adc_r2_enum);
2072
2073/* MONO ADC R1 Source */
2074/* MX-27 [3] */
2075static const char * const rt5659_mono_adc_r1_src[] = {
2076 "Mono DAC MIXR", "ADC"
2077};
2078
2079static const SOC_ENUM_SINGLE_DECL(
2080 rt5659_mono_adc_r1_enum, RT5659_MONO_ADC_MIXER,
2081 RT5659_MONO_ADC_R1_SRC_SFT, rt5659_mono_adc_r1_src);
2082
2083static const struct snd_kcontrol_new rt5659_mono_adc_r1_mux =
2084 SOC_DAPM_ENUM("Mono ADC R1 Source", rt5659_mono_adc_r1_enum);
2085
2086/* MONO DMIC R Source */
2087/* MX-27 [0] */
2088static const char * const rt5659_mono_dmic_r_src[] = {
2089 "DMIC1 R", "DMIC2 R"
2090};
2091
2092static const SOC_ENUM_SINGLE_DECL(
2093 rt5659_mono_dmic_r_enum, RT5659_MONO_ADC_MIXER,
2094 RT5659_MONO_DMIC_R_SRC_SFT, rt5659_mono_dmic_r_src);
2095
2096static const struct snd_kcontrol_new rt5659_mono_dmic_r_mux =
2097 SOC_DAPM_ENUM("Mono DMIC R Source", rt5659_mono_dmic_r_enum);
2098
2099
2100/* DAC R1 Source, DAC L1 Source*/
2101/* MX-29 [11:10], MX-29 [9:8]*/
2102static const char * const rt5659_dac1_src[] = {
2103 "IF1 DAC1", "IF2 DAC", "IF3 DAC"
2104};
2105
2106static const SOC_ENUM_SINGLE_DECL(
2107 rt5659_dac_r1_enum, RT5659_AD_DA_MIXER,
2108 RT5659_DAC1_R_SEL_SFT, rt5659_dac1_src);
2109
2110static const struct snd_kcontrol_new rt5659_dac_r1_mux =
2111 SOC_DAPM_ENUM("DAC R1 Source", rt5659_dac_r1_enum);
2112
2113static const SOC_ENUM_SINGLE_DECL(
2114 rt5659_dac_l1_enum, RT5659_AD_DA_MIXER,
2115 RT5659_DAC1_L_SEL_SFT, rt5659_dac1_src);
2116
2117static const struct snd_kcontrol_new rt5659_dac_l1_mux =
2118 SOC_DAPM_ENUM("DAC L1 Source", rt5659_dac_l1_enum);
2119
2120/* DAC Digital Mixer L Source, DAC Digital Mixer R Source*/
2121/* MX-2C [6], MX-2C [4]*/
2122static const char * const rt5659_dig_dac_mix_src[] = {
2123 "Stereo DAC Mixer", "Mono DAC Mixer"
2124};
2125
2126static const SOC_ENUM_SINGLE_DECL(
2127 rt5659_dig_dac_mixl_enum, RT5659_DIG_MIXER,
2128 RT5659_DAC_MIX_L_SFT, rt5659_dig_dac_mix_src);
2129
2130static const struct snd_kcontrol_new rt5659_dig_dac_mixl_mux =
2131 SOC_DAPM_ENUM("DAC Digital Mixer L Source", rt5659_dig_dac_mixl_enum);
2132
2133static const SOC_ENUM_SINGLE_DECL(
2134 rt5659_dig_dac_mixr_enum, RT5659_DIG_MIXER,
2135 RT5659_DAC_MIX_R_SFT, rt5659_dig_dac_mix_src);
2136
2137static const struct snd_kcontrol_new rt5659_dig_dac_mixr_mux =
2138 SOC_DAPM_ENUM("DAC Digital Mixer R Source", rt5659_dig_dac_mixr_enum);
2139
2140/* Analog DAC L1 Source, Analog DAC R1 Source*/
2141/* MX-2D [3], MX-2D [2]*/
2142static const char * const rt5659_alg_dac1_src[] = {
2143 "DAC", "Stereo DAC Mixer"
2144};
2145
2146static const SOC_ENUM_SINGLE_DECL(
2147 rt5659_alg_dac_l1_enum, RT5659_A_DAC_MUX,
2148 RT5659_A_DACL1_SFT, rt5659_alg_dac1_src);
2149
2150static const struct snd_kcontrol_new rt5659_alg_dac_l1_mux =
2151 SOC_DAPM_ENUM("Analog DACL1 Source", rt5659_alg_dac_l1_enum);
2152
2153static const SOC_ENUM_SINGLE_DECL(
2154 rt5659_alg_dac_r1_enum, RT5659_A_DAC_MUX,
2155 RT5659_A_DACR1_SFT, rt5659_alg_dac1_src);
2156
2157static const struct snd_kcontrol_new rt5659_alg_dac_r1_mux =
2158 SOC_DAPM_ENUM("Analog DACR1 Source", rt5659_alg_dac_r1_enum);
2159
2160/* Analog DAC LR Source, Analog DAC R2 Source*/
2161/* MX-2D [1], MX-2D [0]*/
2162static const char * const rt5659_alg_dac2_src[] = {
2163 "Stereo DAC Mixer", "Mono DAC Mixer"
2164};
2165
2166static const SOC_ENUM_SINGLE_DECL(
2167 rt5659_alg_dac_l2_enum, RT5659_A_DAC_MUX,
2168 RT5659_A_DACL2_SFT, rt5659_alg_dac2_src);
2169
2170static const struct snd_kcontrol_new rt5659_alg_dac_l2_mux =
2171 SOC_DAPM_ENUM("Analog DAC L2 Source", rt5659_alg_dac_l2_enum);
2172
2173static const SOC_ENUM_SINGLE_DECL(
2174 rt5659_alg_dac_r2_enum, RT5659_A_DAC_MUX,
2175 RT5659_A_DACR2_SFT, rt5659_alg_dac2_src);
2176
2177static const struct snd_kcontrol_new rt5659_alg_dac_r2_mux =
2178 SOC_DAPM_ENUM("Analog DAC R2 Source", rt5659_alg_dac_r2_enum);
2179
2180/* Interface2 ADC Data Input*/
2181/* MX-2F [13:12] */
2182static const char * const rt5659_if2_adc_in_src[] = {
2183 "IF_ADC1", "IF_ADC2", "DAC_REF", "IF_ADC3"
2184};
2185
2186static const SOC_ENUM_SINGLE_DECL(
2187 rt5659_if2_adc_in_enum, RT5659_DIG_INF23_DATA,
2188 RT5659_IF2_ADC_IN_SFT, rt5659_if2_adc_in_src);
2189
2190static const struct snd_kcontrol_new rt5659_if2_adc_in_mux =
2191 SOC_DAPM_ENUM("IF2 ADC IN Source", rt5659_if2_adc_in_enum);
2192
2193/* Interface3 ADC Data Input*/
2194/* MX-2F [1:0] */
2195static const char * const rt5659_if3_adc_in_src[] = {
2196 "IF_ADC1", "IF_ADC2", "DAC_REF", "Stereo2_ADC_L/R"
2197};
2198
2199static const SOC_ENUM_SINGLE_DECL(
2200 rt5659_if3_adc_in_enum, RT5659_DIG_INF23_DATA,
2201 RT5659_IF3_ADC_IN_SFT, rt5659_if3_adc_in_src);
2202
2203static const struct snd_kcontrol_new rt5659_if3_adc_in_mux =
2204 SOC_DAPM_ENUM("IF3 ADC IN Source", rt5659_if3_adc_in_enum);
2205
2206/* PDM 1 L/R*/
2207/* MX-31 [15] [13] */
2208static const char * const rt5659_pdm_src[] = {
2209 "Mono DAC", "Stereo DAC"
2210};
2211
2212static const SOC_ENUM_SINGLE_DECL(
2213 rt5659_pdm_l_enum, RT5659_PDM_OUT_CTRL,
2214 RT5659_PDM1_L_SFT, rt5659_pdm_src);
2215
2216static const struct snd_kcontrol_new rt5659_pdm_l_mux =
2217 SOC_DAPM_ENUM("PDM L Source", rt5659_pdm_l_enum);
2218
2219static const SOC_ENUM_SINGLE_DECL(
2220 rt5659_pdm_r_enum, RT5659_PDM_OUT_CTRL,
2221 RT5659_PDM1_R_SFT, rt5659_pdm_src);
2222
2223static const struct snd_kcontrol_new rt5659_pdm_r_mux =
2224 SOC_DAPM_ENUM("PDM R Source", rt5659_pdm_r_enum);
2225
2226/* SPDIF Output source*/
2227/* MX-36 [1:0] */
2228static const char * const rt5659_spdif_src[] = {
2229 "IF1_DAC1", "IF1_DAC2", "IF2_DAC", "IF3_DAC"
2230};
2231
2232static const SOC_ENUM_SINGLE_DECL(
2233 rt5659_spdif_enum, RT5659_SPDIF_CTRL,
2234 RT5659_SPDIF_SEL_SFT, rt5659_spdif_src);
2235
2236static const struct snd_kcontrol_new rt5659_spdif_mux =
2237 SOC_DAPM_ENUM("SPDIF Source", rt5659_spdif_enum);
2238
2239/* I2S1 TDM ADCDAT Source */
2240/* MX-78[4:0] */
2241static const char * const rt5659_rx_adc_data_src[] = {
2242 "AD1:AD2:DAC:NUL", "AD1:AD2:NUL:DAC", "AD1:DAC:AD2:NUL",
2243 "AD1:DAC:NUL:AD2", "AD1:NUL:DAC:AD2", "AD1:NUL:AD2:DAC",
2244 "AD2:AD1:DAC:NUL", "AD2:AD1:NUL:DAC", "AD2:DAC:AD1:NUL",
2245 "AD2:DAC:NUL:AD1", "AD2:NUL:DAC:AD1", "AD1:NUL:AD1:DAC",
2246 "DAC:AD1:AD2:NUL", "DAC:AD1:NUL:AD2", "DAC:AD2:AD1:NUL",
2247 "DAC:AD2:NUL:AD1", "DAC:NUL:DAC:AD2", "DAC:NUL:AD2:DAC",
2248 "NUL:AD1:AD2:DAC", "NUL:AD1:DAC:AD2", "NUL:AD2:AD1:DAC",
2249 "NUL:AD2:DAC:AD1", "NUL:DAC:DAC:AD2", "NUL:DAC:AD2:DAC"
2250};
2251
2252static const SOC_ENUM_SINGLE_DECL(
2253 rt5659_rx_adc_data_enum, RT5659_TDM_CTRL_2,
2254 RT5659_ADCDAT_SRC_SFT, rt5659_rx_adc_data_src);
2255
2256static const struct snd_kcontrol_new rt5659_rx_adc_dac_mux =
2257 SOC_DAPM_ENUM("TDM ADCDAT Source", rt5659_rx_adc_data_enum);
2258
2259/* Out Volume Switch */
2260static const struct snd_kcontrol_new spkvol_l_switch =
2261 SOC_DAPM_SINGLE("Switch", RT5659_SPO_VOL, RT5659_VOL_L_SFT, 1, 1);
2262
2263static const struct snd_kcontrol_new spkvol_r_switch =
2264 SOC_DAPM_SINGLE("Switch", RT5659_SPO_VOL, RT5659_VOL_R_SFT, 1, 1);
2265
2266static const struct snd_kcontrol_new monovol_switch =
2267 SOC_DAPM_SINGLE("Switch", RT5659_MONO_OUT, RT5659_VOL_L_SFT, 1, 1);
2268
2269static const struct snd_kcontrol_new outvol_l_switch =
2270 SOC_DAPM_SINGLE("Switch", RT5659_LOUT, RT5659_VOL_L_SFT, 1, 1);
2271
2272static const struct snd_kcontrol_new outvol_r_switch =
2273 SOC_DAPM_SINGLE("Switch", RT5659_LOUT, RT5659_VOL_R_SFT, 1, 1);
2274
2275/* Out Switch */
2276static const struct snd_kcontrol_new spo_switch =
2277 SOC_DAPM_SINGLE("Switch", RT5659_CLASSD_2, RT5659_M_RF_DIG_SFT, 1, 1);
2278
2279static const struct snd_kcontrol_new mono_switch =
2280 SOC_DAPM_SINGLE("Switch", RT5659_MONO_OUT, RT5659_L_MUTE_SFT, 1, 1);
2281
2282static const struct snd_kcontrol_new hpo_l_switch =
2283 SOC_DAPM_SINGLE("Switch", RT5659_HP_VOL, RT5659_L_MUTE_SFT, 1, 1);
2284
2285static const struct snd_kcontrol_new hpo_r_switch =
2286 SOC_DAPM_SINGLE("Switch", RT5659_HP_VOL, RT5659_R_MUTE_SFT, 1, 1);
2287
2288static const struct snd_kcontrol_new lout_l_switch =
2289 SOC_DAPM_SINGLE("Switch", RT5659_LOUT, RT5659_L_MUTE_SFT, 1, 1);
2290
2291static const struct snd_kcontrol_new lout_r_switch =
2292 SOC_DAPM_SINGLE("Switch", RT5659_LOUT, RT5659_R_MUTE_SFT, 1, 1);
2293
2294static const struct snd_kcontrol_new pdm_l_switch =
2295 SOC_DAPM_SINGLE("Switch", RT5659_PDM_OUT_CTRL, RT5659_M_PDM1_L_SFT, 1,
2296 1);
2297
2298static const struct snd_kcontrol_new pdm_r_switch =
2299 SOC_DAPM_SINGLE("Switch", RT5659_PDM_OUT_CTRL, RT5659_M_PDM1_R_SFT, 1,
2300 1);
2301
2302static int rt5659_spk_event(struct snd_soc_dapm_widget *w,
2303 struct snd_kcontrol *kcontrol, int event)
2304{
2305 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
2306
2307 switch (event) {
2308 case SND_SOC_DAPM_PRE_PMU:
2309 snd_soc_update_bits(codec, RT5659_CLASSD_CTRL_1,
2310 RT5659_POW_CLSD_DB_MASK, RT5659_POW_CLSD_DB_EN);
2311 snd_soc_update_bits(codec, RT5659_CLASSD_2,
2312 RT5659_M_RI_DIG, RT5659_M_RI_DIG);
2313 snd_soc_write(codec, RT5659_CLASSD_1, 0x0803);
2314 snd_soc_write(codec, RT5659_SPK_DC_CAILB_CTRL_3, 0x0000);
2315 break;
2316
2317 case SND_SOC_DAPM_POST_PMD:
2318 snd_soc_write(codec, RT5659_CLASSD_1, 0x0011);
2319 snd_soc_update_bits(codec, RT5659_CLASSD_2,
2320 RT5659_M_RI_DIG, 0x0);
2321 snd_soc_write(codec, RT5659_SPK_DC_CAILB_CTRL_3, 0x0003);
2322 snd_soc_update_bits(codec, RT5659_CLASSD_CTRL_1,
2323 RT5659_POW_CLSD_DB_MASK, RT5659_POW_CLSD_DB_DIS);
2324 break;
2325
2326 default:
2327 return 0;
2328 }
2329
2330 return 0;
2331
2332}
2333
2334static int rt5659_mono_event(struct snd_soc_dapm_widget *w,
2335 struct snd_kcontrol *kcontrol, int event)
2336{
2337 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
2338
2339 switch (event) {
2340 case SND_SOC_DAPM_PRE_PMU:
2341 snd_soc_write(codec, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e00);
2342 break;
2343
2344 case SND_SOC_DAPM_POST_PMD:
2345 snd_soc_write(codec, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e04);
2346 break;
2347
2348 default:
2349 return 0;
2350 }
2351
2352 return 0;
2353
2354}
2355
2356static int rt5659_hp_event(struct snd_soc_dapm_widget *w,
2357 struct snd_kcontrol *kcontrol, int event)
2358{
2359 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
2360
2361 switch (event) {
2362 case SND_SOC_DAPM_POST_PMU:
2363 snd_soc_write(codec, RT5659_HP_CHARGE_PUMP_1, 0x0e1e);
2364 snd_soc_update_bits(codec, RT5659_DEPOP_1, 0x0010, 0x0010);
2365 break;
2366
2367 case SND_SOC_DAPM_PRE_PMD:
2368 snd_soc_write(codec, RT5659_DEPOP_1, 0x0000);
2369 break;
2370
2371 default:
2372 return 0;
2373 }
2374
2375 return 0;
2376}
2377
2378static int set_dmic_power(struct snd_soc_dapm_widget *w,
2379 struct snd_kcontrol *kcontrol, int event)
2380{
2381 switch (event) {
2382 case SND_SOC_DAPM_POST_PMU:
2383 /*Add delay to avoid pop noise*/
2384 msleep(450);
2385 break;
2386
2387 default:
2388 return 0;
2389 }
2390
2391 return 0;
2392}
2393
2394static const struct snd_soc_dapm_widget rt5659_dapm_widgets[] = {
2395 SND_SOC_DAPM_SUPPLY("LDO2", RT5659_PWR_ANLG_3, RT5659_PWR_LDO2_BIT, 0,
2396 NULL, 0),
2397 SND_SOC_DAPM_SUPPLY("PLL", RT5659_PWR_ANLG_3, RT5659_PWR_PLL_BIT, 0,
2398 NULL, 0),
2399 SND_SOC_DAPM_SUPPLY("Mic Det Power", RT5659_PWR_VOL,
2400 RT5659_PWR_MIC_DET_BIT, 0, NULL, 0),
2401 SND_SOC_DAPM_SUPPLY("Mono Vref", RT5659_PWR_ANLG_1,
2402 RT5659_PWR_VREF3_BIT, 0, NULL, 0),
2403
2404 /* ASRC */
2405 SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5659_ASRC_1,
2406 RT5659_I2S1_ASRC_SFT, 0, NULL, 0),
2407 SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5659_ASRC_1,
2408 RT5659_I2S2_ASRC_SFT, 0, NULL, 0),
2409 SND_SOC_DAPM_SUPPLY_S("I2S3 ASRC", 1, RT5659_ASRC_1,
2410 RT5659_I2S3_ASRC_SFT, 0, NULL, 0),
2411 SND_SOC_DAPM_SUPPLY_S("DAC STO ASRC", 1, RT5659_ASRC_1,
2412 RT5659_DAC_STO_ASRC_SFT, 0, NULL, 0),
2413 SND_SOC_DAPM_SUPPLY_S("DAC Mono L ASRC", 1, RT5659_ASRC_1,
2414 RT5659_DAC_MONO_L_ASRC_SFT, 0, NULL, 0),
2415 SND_SOC_DAPM_SUPPLY_S("DAC Mono R ASRC", 1, RT5659_ASRC_1,
2416 RT5659_DAC_MONO_R_ASRC_SFT, 0, NULL, 0),
2417 SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5659_ASRC_1,
2418 RT5659_ADC_STO1_ASRC_SFT, 0, NULL, 0),
2419 SND_SOC_DAPM_SUPPLY_S("ADC Mono L ASRC", 1, RT5659_ASRC_1,
2420 RT5659_ADC_MONO_L_ASRC_SFT, 0, NULL, 0),
2421 SND_SOC_DAPM_SUPPLY_S("ADC Mono R ASRC", 1, RT5659_ASRC_1,
2422 RT5659_ADC_MONO_R_ASRC_SFT, 0, NULL, 0),
2423
2424 /* Input Side */
2425 SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5659_PWR_ANLG_2, RT5659_PWR_MB1_BIT,
2426 0, NULL, 0),
2427 SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5659_PWR_ANLG_2, RT5659_PWR_MB2_BIT,
2428 0, NULL, 0),
2429 SND_SOC_DAPM_SUPPLY("MICBIAS3", RT5659_PWR_ANLG_2, RT5659_PWR_MB3_BIT,
2430 0, NULL, 0),
2431
2432 /* Input Lines */
2433 SND_SOC_DAPM_INPUT("DMIC L1"),
2434 SND_SOC_DAPM_INPUT("DMIC R1"),
2435 SND_SOC_DAPM_INPUT("DMIC L2"),
2436 SND_SOC_DAPM_INPUT("DMIC R2"),
2437
2438 SND_SOC_DAPM_INPUT("IN1P"),
2439 SND_SOC_DAPM_INPUT("IN1N"),
2440 SND_SOC_DAPM_INPUT("IN2P"),
2441 SND_SOC_DAPM_INPUT("IN2N"),
2442 SND_SOC_DAPM_INPUT("IN3P"),
2443 SND_SOC_DAPM_INPUT("IN3N"),
2444 SND_SOC_DAPM_INPUT("IN4P"),
2445 SND_SOC_DAPM_INPUT("IN4N"),
2446
2447 SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2448 SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2449
2450 SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
2451 set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
2452 SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5659_DMIC_CTRL_1,
2453 RT5659_DMIC_1_EN_SFT, 0, set_dmic_power, SND_SOC_DAPM_POST_PMU),
2454 SND_SOC_DAPM_SUPPLY("DMIC2 Power", RT5659_DMIC_CTRL_1,
2455 RT5659_DMIC_2_EN_SFT, 0, set_dmic_power, SND_SOC_DAPM_POST_PMU),
2456
2457 /* Boost */
2458 SND_SOC_DAPM_PGA("BST1", RT5659_PWR_ANLG_2,
2459 RT5659_PWR_BST1_P_BIT, 0, NULL, 0),
2460 SND_SOC_DAPM_PGA("BST2", RT5659_PWR_ANLG_2,
2461 RT5659_PWR_BST2_P_BIT, 0, NULL, 0),
2462 SND_SOC_DAPM_PGA("BST3", RT5659_PWR_ANLG_2,
2463 RT5659_PWR_BST3_P_BIT, 0, NULL, 0),
2464 SND_SOC_DAPM_PGA("BST4", RT5659_PWR_ANLG_2,
2465 RT5659_PWR_BST4_P_BIT, 0, NULL, 0),
2466 SND_SOC_DAPM_SUPPLY("BST1 Power", RT5659_PWR_ANLG_2,
2467 RT5659_PWR_BST1_BIT, 0, NULL, 0),
2468 SND_SOC_DAPM_SUPPLY("BST2 Power", RT5659_PWR_ANLG_2,
2469 RT5659_PWR_BST2_BIT, 0, NULL, 0),
2470 SND_SOC_DAPM_SUPPLY("BST3 Power", RT5659_PWR_ANLG_2,
2471 RT5659_PWR_BST3_BIT, 0, NULL, 0),
2472 SND_SOC_DAPM_SUPPLY("BST4 Power", RT5659_PWR_ANLG_2,
2473 RT5659_PWR_BST4_BIT, 0, NULL, 0),
2474
2475
2476 /* Input Volume */
2477 SND_SOC_DAPM_PGA("INL VOL", RT5659_PWR_VOL, RT5659_PWR_IN_L_BIT,
2478 0, NULL, 0),
2479 SND_SOC_DAPM_PGA("INR VOL", RT5659_PWR_VOL, RT5659_PWR_IN_R_BIT,
2480 0, NULL, 0),
2481
2482 /* REC Mixer */
2483 SND_SOC_DAPM_MIXER("RECMIX1L", RT5659_PWR_MIXER, RT5659_PWR_RM1_L_BIT,
2484 0, rt5659_rec1_l_mix, ARRAY_SIZE(rt5659_rec1_l_mix)),
2485 SND_SOC_DAPM_MIXER("RECMIX1R", RT5659_PWR_MIXER, RT5659_PWR_RM1_R_BIT,
2486 0, rt5659_rec1_r_mix, ARRAY_SIZE(rt5659_rec1_r_mix)),
2487 SND_SOC_DAPM_MIXER("RECMIX2L", RT5659_PWR_MIXER, RT5659_PWR_RM2_L_BIT,
2488 0, rt5659_rec2_l_mix, ARRAY_SIZE(rt5659_rec2_l_mix)),
2489 SND_SOC_DAPM_MIXER("RECMIX2R", RT5659_PWR_MIXER, RT5659_PWR_RM2_R_BIT,
2490 0, rt5659_rec2_r_mix, ARRAY_SIZE(rt5659_rec2_r_mix)),
2491
2492 /* ADCs */
2493 SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0),
2494 SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0),
2495 SND_SOC_DAPM_ADC("ADC2 L", NULL, SND_SOC_NOPM, 0, 0),
2496 SND_SOC_DAPM_ADC("ADC2 R", NULL, SND_SOC_NOPM, 0, 0),
2497
2498 SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5659_PWR_DIG_1,
2499 RT5659_PWR_ADC_L1_BIT, 0, NULL, 0),
2500 SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5659_PWR_DIG_1,
2501 RT5659_PWR_ADC_R1_BIT, 0, NULL, 0),
2502 SND_SOC_DAPM_SUPPLY("ADC2 L Power", RT5659_PWR_DIG_2,
2503 RT5659_PWR_ADC_L2_BIT, 0, NULL, 0),
2504 SND_SOC_DAPM_SUPPLY("ADC2 R Power", RT5659_PWR_DIG_2,
2505 RT5659_PWR_ADC_R2_BIT, 0, NULL, 0),
2506 SND_SOC_DAPM_SUPPLY("ADC1 clock", SND_SOC_NOPM, 0, 0, set_adc_clk,
2507 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2508 SND_SOC_DAPM_SUPPLY("ADC2 clock", SND_SOC_NOPM, 0, 0, set_adc_clk,
2509 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2510
2511 /* ADC Mux */
2512 SND_SOC_DAPM_MUX("Stereo1 DMIC L Mux", SND_SOC_NOPM, 0, 0,
2513 &rt5659_sto1_dmic_mux),
2514 SND_SOC_DAPM_MUX("Stereo1 DMIC R Mux", SND_SOC_NOPM, 0, 0,
2515 &rt5659_sto1_dmic_mux),
2516 SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
2517 &rt5659_sto1_adc1_mux),
2518 SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
2519 &rt5659_sto1_adc1_mux),
2520 SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
2521 &rt5659_sto1_adc2_mux),
2522 SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
2523 &rt5659_sto1_adc2_mux),
2524 SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0,
2525 &rt5659_sto1_adc_mux),
2526 SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0,
2527 &rt5659_sto1_adc_mux),
2528 SND_SOC_DAPM_MUX("Mono ADC L2 Mux", SND_SOC_NOPM, 0, 0,
2529 &rt5659_mono_adc_l2_mux),
2530 SND_SOC_DAPM_MUX("Mono ADC R2 Mux", SND_SOC_NOPM, 0, 0,
2531 &rt5659_mono_adc_r2_mux),
2532 SND_SOC_DAPM_MUX("Mono ADC L1 Mux", SND_SOC_NOPM, 0, 0,
2533 &rt5659_mono_adc_l1_mux),
2534 SND_SOC_DAPM_MUX("Mono ADC R1 Mux", SND_SOC_NOPM, 0, 0,
2535 &rt5659_mono_adc_r1_mux),
2536 SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
2537 &rt5659_mono_dmic_l_mux),
2538 SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,
2539 &rt5659_mono_dmic_r_mux),
2540 SND_SOC_DAPM_MUX("Mono ADC L Mux", SND_SOC_NOPM, 0, 0,
2541 &rt5659_mono_adc_l_mux),
2542 SND_SOC_DAPM_MUX("Mono ADC R Mux", SND_SOC_NOPM, 0, 0,
2543 &rt5659_mono_adc_r_mux),
2544 /* ADC Mixer */
2545 SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5659_PWR_DIG_2,
2546 RT5659_PWR_ADC_S1F_BIT, 0, NULL, 0),
2547 SND_SOC_DAPM_SUPPLY("ADC Stereo2 Filter", RT5659_PWR_DIG_2,
2548 RT5659_PWR_ADC_S2F_BIT, 0, NULL, 0),
2549 SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", SND_SOC_NOPM,
2550 0, 0, rt5659_sto1_adc_l_mix,
2551 ARRAY_SIZE(rt5659_sto1_adc_l_mix)),
2552 SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", SND_SOC_NOPM,
2553 0, 0, rt5659_sto1_adc_r_mix,
2554 ARRAY_SIZE(rt5659_sto1_adc_r_mix)),
2555 SND_SOC_DAPM_SUPPLY("ADC Mono Left Filter", RT5659_PWR_DIG_2,
2556 RT5659_PWR_ADC_MF_L_BIT, 0, NULL, 0),
2557 SND_SOC_DAPM_MIXER("Mono ADC MIXL", RT5659_MONO_ADC_DIG_VOL,
2558 RT5659_L_MUTE_SFT, 1, rt5659_mono_adc_l_mix,
2559 ARRAY_SIZE(rt5659_mono_adc_l_mix)),
2560 SND_SOC_DAPM_SUPPLY("ADC Mono Right Filter", RT5659_PWR_DIG_2,
2561 RT5659_PWR_ADC_MF_R_BIT, 0, NULL, 0),
2562 SND_SOC_DAPM_MIXER("Mono ADC MIXR", RT5659_MONO_ADC_DIG_VOL,
2563 RT5659_R_MUTE_SFT, 1, rt5659_mono_adc_r_mix,
2564 ARRAY_SIZE(rt5659_mono_adc_r_mix)),
2565
2566 /* ADC PGA */
2567 SND_SOC_DAPM_PGA("IF_ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2568 SND_SOC_DAPM_PGA("IF_ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2569 SND_SOC_DAPM_PGA("IF_ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
2570 SND_SOC_DAPM_PGA("IF1_ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2571 SND_SOC_DAPM_PGA("IF1_ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2572 SND_SOC_DAPM_PGA("IF1_ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
2573 SND_SOC_DAPM_PGA("IF1_ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
2574 SND_SOC_DAPM_PGA("Stereo2 ADC LR", SND_SOC_NOPM, 0, 0, NULL, 0),
2575
2576 SND_SOC_DAPM_PGA("Stereo1 ADC Volume L", RT5659_STO1_ADC_DIG_VOL,
2577 RT5659_L_MUTE_SFT, 1, NULL, 0),
2578 SND_SOC_DAPM_PGA("Stereo1 ADC Volume R", RT5659_STO1_ADC_DIG_VOL,
2579 RT5659_R_MUTE_SFT, 1, NULL, 0),
2580
2581 /* Digital Interface */
2582 SND_SOC_DAPM_SUPPLY("I2S1", RT5659_PWR_DIG_1, RT5659_PWR_I2S1_BIT,
2583 0, NULL, 0),
2584 SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2585 SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2586 SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
2587 SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
2588 SND_SOC_DAPM_PGA("IF1 DAC2 L", SND_SOC_NOPM, 0, 0, NULL, 0),
2589 SND_SOC_DAPM_PGA("IF1 DAC2 R", SND_SOC_NOPM, 0, 0, NULL, 0),
2590 SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2591 SND_SOC_DAPM_PGA("IF1 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2592 SND_SOC_DAPM_PGA("IF1 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2593 SND_SOC_DAPM_SUPPLY("I2S2", RT5659_PWR_DIG_1, RT5659_PWR_I2S2_BIT, 0,
2594 NULL, 0),
2595 SND_SOC_DAPM_PGA("IF2 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2596 SND_SOC_DAPM_PGA("IF2 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2597 SND_SOC_DAPM_PGA("IF2 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2598 SND_SOC_DAPM_PGA("IF2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2599 SND_SOC_DAPM_PGA("IF2 ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2600 SND_SOC_DAPM_PGA("IF2 ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2601 SND_SOC_DAPM_SUPPLY("I2S3", RT5659_PWR_DIG_1, RT5659_PWR_I2S3_BIT, 0,
2602 NULL, 0),
2603 SND_SOC_DAPM_PGA("IF3 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2604 SND_SOC_DAPM_PGA("IF3 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2605 SND_SOC_DAPM_PGA("IF3 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2606 SND_SOC_DAPM_PGA("IF3 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2607 SND_SOC_DAPM_PGA("IF3 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2608 SND_SOC_DAPM_PGA("IF3 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2609
2610 /* Digital Interface Select */
2611 SND_SOC_DAPM_PGA("TDM AD1:AD2:DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2612 SND_SOC_DAPM_PGA("TDM AD2:DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2613 SND_SOC_DAPM_MUX("TDM Data Mux", SND_SOC_NOPM, 0, 0,
2614 &rt5659_rx_adc_dac_mux),
2615 SND_SOC_DAPM_MUX("IF2 ADC Mux", SND_SOC_NOPM, 0, 0,
2616 &rt5659_if2_adc_in_mux),
2617 SND_SOC_DAPM_MUX("IF3 ADC Mux", SND_SOC_NOPM, 0, 0,
2618 &rt5659_if3_adc_in_mux),
2619 SND_SOC_DAPM_MUX("IF1 01 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2620 &rt5659_if1_01_adc_swap_mux),
2621 SND_SOC_DAPM_MUX("IF1 23 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2622 &rt5659_if1_23_adc_swap_mux),
2623 SND_SOC_DAPM_MUX("IF1 45 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2624 &rt5659_if1_45_adc_swap_mux),
2625 SND_SOC_DAPM_MUX("IF1 67 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2626 &rt5659_if1_67_adc_swap_mux),
2627 SND_SOC_DAPM_MUX("IF2 DAC Swap Mux", SND_SOC_NOPM, 0, 0,
2628 &rt5659_if2_dac_swap_mux),
2629 SND_SOC_DAPM_MUX("IF2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2630 &rt5659_if2_adc_swap_mux),
2631 SND_SOC_DAPM_MUX("IF3 DAC Swap Mux", SND_SOC_NOPM, 0, 0,
2632 &rt5659_if3_dac_swap_mux),
2633 SND_SOC_DAPM_MUX("IF3 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2634 &rt5659_if3_adc_swap_mux),
2635
2636 /* Audio Interface */
2637 SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
2638 SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
2639 SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
2640 SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0),
2641 SND_SOC_DAPM_AIF_IN("AIF3RX", "AIF3 Playback", 0, SND_SOC_NOPM, 0, 0),
2642 SND_SOC_DAPM_AIF_OUT("AIF3TX", "AIF3 Capture", 0, SND_SOC_NOPM, 0, 0),
2643
2644 /* Output Side */
2645 /* DAC mixer before sound effect */
2646 SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
2647 rt5659_dac_l_mix, ARRAY_SIZE(rt5659_dac_l_mix)),
2648 SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
2649 rt5659_dac_r_mix, ARRAY_SIZE(rt5659_dac_r_mix)),
2650
2651 /* DAC channel Mux */
2652 SND_SOC_DAPM_MUX("DAC L1 Mux", SND_SOC_NOPM, 0, 0, &rt5659_dac_l1_mux),
2653 SND_SOC_DAPM_MUX("DAC R1 Mux", SND_SOC_NOPM, 0, 0, &rt5659_dac_r1_mux),
2654 SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0, &rt5659_dac_l2_mux),
2655 SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0, &rt5659_dac_r2_mux),
2656
2657 SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0,
2658 &rt5659_alg_dac_l1_mux),
2659 SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0,
2660 &rt5659_alg_dac_r1_mux),
2661 SND_SOC_DAPM_MUX("DAC L2 Source", SND_SOC_NOPM, 0, 0,
2662 &rt5659_alg_dac_l2_mux),
2663 SND_SOC_DAPM_MUX("DAC R2 Source", SND_SOC_NOPM, 0, 0,
2664 &rt5659_alg_dac_r2_mux),
2665
2666 /* DAC Mixer */
2667 SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5659_PWR_DIG_2,
2668 RT5659_PWR_DAC_S1F_BIT, 0, NULL, 0),
2669 SND_SOC_DAPM_SUPPLY("DAC Mono Left Filter", RT5659_PWR_DIG_2,
2670 RT5659_PWR_DAC_MF_L_BIT, 0, NULL, 0),
2671 SND_SOC_DAPM_SUPPLY("DAC Mono Right Filter", RT5659_PWR_DIG_2,
2672 RT5659_PWR_DAC_MF_R_BIT, 0, NULL, 0),
2673 SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
2674 rt5659_sto_dac_l_mix, ARRAY_SIZE(rt5659_sto_dac_l_mix)),
2675 SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
2676 rt5659_sto_dac_r_mix, ARRAY_SIZE(rt5659_sto_dac_r_mix)),
2677 SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,
2678 rt5659_mono_dac_l_mix, ARRAY_SIZE(rt5659_mono_dac_l_mix)),
2679 SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,
2680 rt5659_mono_dac_r_mix, ARRAY_SIZE(rt5659_mono_dac_r_mix)),
2681 SND_SOC_DAPM_MUX("DAC MIXL", SND_SOC_NOPM, 0, 0,
2682 &rt5659_dig_dac_mixl_mux),
2683 SND_SOC_DAPM_MUX("DAC MIXR", SND_SOC_NOPM, 0, 0,
2684 &rt5659_dig_dac_mixr_mux),
2685
2686 /* DACs */
2687 SND_SOC_DAPM_SUPPLY_S("DAC L1 Power", 1, RT5659_PWR_DIG_1,
2688 RT5659_PWR_DAC_L1_BIT, 0, NULL, 0),
2689 SND_SOC_DAPM_SUPPLY_S("DAC R1 Power", 1, RT5659_PWR_DIG_1,
2690 RT5659_PWR_DAC_R1_BIT, 0, NULL, 0),
2691 SND_SOC_DAPM_DAC("DAC L1", NULL, SND_SOC_NOPM, 0, 0),
2692 SND_SOC_DAPM_DAC("DAC R1", NULL, SND_SOC_NOPM, 0, 0),
2693
2694 SND_SOC_DAPM_SUPPLY("DAC L2 Power", RT5659_PWR_DIG_1,
2695 RT5659_PWR_DAC_L2_BIT, 0, NULL, 0),
2696 SND_SOC_DAPM_SUPPLY("DAC R2 Power", RT5659_PWR_DIG_1,
2697 RT5659_PWR_DAC_R2_BIT, 0, NULL, 0),
2698 SND_SOC_DAPM_DAC("DAC L2", NULL, SND_SOC_NOPM, 0, 0),
2699 SND_SOC_DAPM_DAC("DAC R2", NULL, SND_SOC_NOPM, 0, 0),
2700 SND_SOC_DAPM_PGA("DAC_REF", SND_SOC_NOPM, 0, 0, NULL, 0),
2701
2702 /* OUT Mixer */
2703 SND_SOC_DAPM_MIXER("SPK MIXL", RT5659_PWR_MIXER, RT5659_PWR_SM_L_BIT,
2704 0, rt5659_spk_l_mix, ARRAY_SIZE(rt5659_spk_l_mix)),
2705 SND_SOC_DAPM_MIXER("SPK MIXR", RT5659_PWR_MIXER, RT5659_PWR_SM_R_BIT,
2706 0, rt5659_spk_r_mix, ARRAY_SIZE(rt5659_spk_r_mix)),
2707 SND_SOC_DAPM_MIXER("MONOVOL MIX", RT5659_PWR_MIXER, RT5659_PWR_MM_BIT,
2708 0, rt5659_monovol_mix, ARRAY_SIZE(rt5659_monovol_mix)),
2709 SND_SOC_DAPM_MIXER("OUT MIXL", RT5659_PWR_MIXER, RT5659_PWR_OM_L_BIT,
2710 0, rt5659_out_l_mix, ARRAY_SIZE(rt5659_out_l_mix)),
2711 SND_SOC_DAPM_MIXER("OUT MIXR", RT5659_PWR_MIXER, RT5659_PWR_OM_R_BIT,
2712 0, rt5659_out_r_mix, ARRAY_SIZE(rt5659_out_r_mix)),
2713
2714 /* Output Volume */
2715 SND_SOC_DAPM_SWITCH("SPKVOL L", RT5659_PWR_VOL, RT5659_PWR_SV_L_BIT, 0,
2716 &spkvol_l_switch),
2717 SND_SOC_DAPM_SWITCH("SPKVOL R", RT5659_PWR_VOL, RT5659_PWR_SV_R_BIT, 0,
2718 &spkvol_r_switch),
2719 SND_SOC_DAPM_SWITCH("MONOVOL", RT5659_PWR_VOL, RT5659_PWR_MV_BIT, 0,
2720 &monovol_switch),
2721 SND_SOC_DAPM_SWITCH("OUTVOL L", RT5659_PWR_VOL, RT5659_PWR_OV_L_BIT, 0,
2722 &outvol_l_switch),
2723 SND_SOC_DAPM_SWITCH("OUTVOL R", RT5659_PWR_VOL, RT5659_PWR_OV_R_BIT, 0,
2724 &outvol_r_switch),
2725
2726 /* SPO/MONO/HPO/LOUT */
2727 SND_SOC_DAPM_MIXER("SPO L MIX", SND_SOC_NOPM, 0, 0, rt5659_spo_l_mix,
2728 ARRAY_SIZE(rt5659_spo_l_mix)),
2729 SND_SOC_DAPM_MIXER("SPO R MIX", SND_SOC_NOPM, 0, 0, rt5659_spo_r_mix,
2730 ARRAY_SIZE(rt5659_spo_r_mix)),
2731 SND_SOC_DAPM_MIXER("Mono MIX", SND_SOC_NOPM, 0, 0, rt5659_mono_mix,
2732 ARRAY_SIZE(rt5659_mono_mix)),
2733 SND_SOC_DAPM_MIXER("LOUT L MIX", SND_SOC_NOPM, 0, 0, rt5659_lout_l_mix,
2734 ARRAY_SIZE(rt5659_lout_l_mix)),
2735 SND_SOC_DAPM_MIXER("LOUT R MIX", SND_SOC_NOPM, 0, 0, rt5659_lout_r_mix,
2736 ARRAY_SIZE(rt5659_lout_r_mix)),
2737
2738 SND_SOC_DAPM_PGA_S("SPK Amp", 1, RT5659_PWR_DIG_1, RT5659_PWR_CLS_D_BIT,
2739 0, rt5659_spk_event, SND_SOC_DAPM_POST_PMD |
2740 SND_SOC_DAPM_PRE_PMU),
2741 SND_SOC_DAPM_PGA_S("Mono Amp", 1, RT5659_PWR_ANLG_1, RT5659_PWR_MA_BIT,
2742 0, rt5659_mono_event, SND_SOC_DAPM_POST_PMD |
2743 SND_SOC_DAPM_PRE_PMU),
2744 SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5659_hp_event,
2745 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
2746 SND_SOC_DAPM_PGA("LOUT Amp", SND_SOC_NOPM, 0, 0, NULL, 0),
2747
2748 SND_SOC_DAPM_SUPPLY("Charge Pump", SND_SOC_NOPM, 0, 0,
2749 rt5659_charge_pump_event, SND_SOC_DAPM_PRE_PMU |
2750 SND_SOC_DAPM_POST_PMD),
2751
2752 SND_SOC_DAPM_SWITCH("SPO Playback", SND_SOC_NOPM, 0, 0, &spo_switch),
2753 SND_SOC_DAPM_SWITCH("Mono Playback", SND_SOC_NOPM, 0, 0,
2754 &mono_switch),
2755 SND_SOC_DAPM_SWITCH("HPO L Playback", SND_SOC_NOPM, 0, 0,
2756 &hpo_l_switch),
2757 SND_SOC_DAPM_SWITCH("HPO R Playback", SND_SOC_NOPM, 0, 0,
2758 &hpo_r_switch),
2759 SND_SOC_DAPM_SWITCH("LOUT L Playback", SND_SOC_NOPM, 0, 0,
2760 &lout_l_switch),
2761 SND_SOC_DAPM_SWITCH("LOUT R Playback", SND_SOC_NOPM, 0, 0,
2762 &lout_r_switch),
2763 SND_SOC_DAPM_SWITCH("PDM L Playback", SND_SOC_NOPM, 0, 0,
2764 &pdm_l_switch),
2765 SND_SOC_DAPM_SWITCH("PDM R Playback", SND_SOC_NOPM, 0, 0,
2766 &pdm_r_switch),
2767
2768 /* PDM */
2769 SND_SOC_DAPM_SUPPLY("PDM Power", RT5659_PWR_DIG_2,
2770 RT5659_PWR_PDM1_BIT, 0, NULL, 0),
2771 SND_SOC_DAPM_MUX("PDM L Mux", RT5659_PDM_OUT_CTRL,
2772 RT5659_M_PDM1_L_SFT, 1, &rt5659_pdm_l_mux),
2773 SND_SOC_DAPM_MUX("PDM R Mux", RT5659_PDM_OUT_CTRL,
2774 RT5659_M_PDM1_R_SFT, 1, &rt5659_pdm_r_mux),
2775
2776 /* SPDIF */
2777 SND_SOC_DAPM_MUX("SPDIF Mux", SND_SOC_NOPM, 0, 0, &rt5659_spdif_mux),
2778
2779 SND_SOC_DAPM_SUPPLY("SYS CLK DET", RT5659_CLK_DET, 3, 0, NULL, 0),
2780 SND_SOC_DAPM_SUPPLY("CLKDET", RT5659_CLK_DET, 0, 0, NULL, 0),
2781
2782 /* Output Lines */
2783 SND_SOC_DAPM_OUTPUT("HPOL"),
2784 SND_SOC_DAPM_OUTPUT("HPOR"),
2785 SND_SOC_DAPM_OUTPUT("SPOL"),
2786 SND_SOC_DAPM_OUTPUT("SPOR"),
2787 SND_SOC_DAPM_OUTPUT("LOUTL"),
2788 SND_SOC_DAPM_OUTPUT("LOUTR"),
2789 SND_SOC_DAPM_OUTPUT("MONOOUT"),
2790 SND_SOC_DAPM_OUTPUT("PDML"),
2791 SND_SOC_DAPM_OUTPUT("PDMR"),
2792 SND_SOC_DAPM_OUTPUT("SPDIF"),
2793};
2794
2795static const struct snd_soc_dapm_route rt5659_dapm_routes[] = {
2796 /*PLL*/
2797 { "ADC Stereo1 Filter", NULL, "PLL", is_sys_clk_from_pll },
2798 { "ADC Stereo2 Filter", NULL, "PLL", is_sys_clk_from_pll },
2799 { "ADC Mono Left Filter", NULL, "PLL", is_sys_clk_from_pll },
2800 { "ADC Mono Right Filter", NULL, "PLL", is_sys_clk_from_pll },
2801 { "DAC Stereo1 Filter", NULL, "PLL", is_sys_clk_from_pll },
2802 { "DAC Mono Left Filter", NULL, "PLL", is_sys_clk_from_pll },
2803 { "DAC Mono Right Filter", NULL, "PLL", is_sys_clk_from_pll },
2804
2805 /*ASRC*/
2806 { "ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc },
2807 { "ADC Mono Left Filter", NULL, "ADC Mono L ASRC", is_using_asrc },
2808 { "ADC Mono Right Filter", NULL, "ADC Mono R ASRC", is_using_asrc },
2809 { "DAC Mono Left Filter", NULL, "DAC Mono L ASRC", is_using_asrc },
2810 { "DAC Mono Right Filter", NULL, "DAC Mono R ASRC", is_using_asrc },
2811 { "DAC Stereo1 Filter", NULL, "DAC STO ASRC", is_using_asrc },
2812
2813 { "SYS CLK DET", NULL, "CLKDET" },
2814
2815 { "I2S1", NULL, "I2S1 ASRC" },
2816 { "I2S2", NULL, "I2S2 ASRC" },
2817 { "I2S3", NULL, "I2S3 ASRC" },
2818
2819 { "IN1P", NULL, "LDO2" },
2820 { "IN2P", NULL, "LDO2" },
2821 { "IN3P", NULL, "LDO2" },
2822 { "IN4P", NULL, "LDO2" },
2823
2824 { "DMIC1", NULL, "DMIC L1" },
2825 { "DMIC1", NULL, "DMIC R1" },
2826 { "DMIC2", NULL, "DMIC L2" },
2827 { "DMIC2", NULL, "DMIC R2" },
2828
2829 { "BST1", NULL, "IN1P" },
2830 { "BST1", NULL, "IN1N" },
2831 { "BST1", NULL, "BST1 Power" },
2832 { "BST2", NULL, "IN2P" },
2833 { "BST2", NULL, "IN2N" },
2834 { "BST2", NULL, "BST2 Power" },
2835 { "BST3", NULL, "IN3P" },
2836 { "BST3", NULL, "IN3N" },
2837 { "BST3", NULL, "BST3 Power" },
2838 { "BST4", NULL, "IN4P" },
2839 { "BST4", NULL, "IN4N" },
2840 { "BST4", NULL, "BST4 Power" },
2841
2842 { "INL VOL", NULL, "IN2P" },
2843 { "INR VOL", NULL, "IN2N" },
2844
2845 { "RECMIX1L", "SPKVOLL Switch", "SPKVOL L" },
2846 { "RECMIX1L", "INL Switch", "INL VOL" },
2847 { "RECMIX1L", "BST4 Switch", "BST4" },
2848 { "RECMIX1L", "BST3 Switch", "BST3" },
2849 { "RECMIX1L", "BST2 Switch", "BST2" },
2850 { "RECMIX1L", "BST1 Switch", "BST1" },
2851
2852 { "RECMIX1R", "HPOVOLR Switch", "HPO R Playback" },
2853 { "RECMIX1R", "INR Switch", "INR VOL" },
2854 { "RECMIX1R", "BST4 Switch", "BST4" },
2855 { "RECMIX1R", "BST3 Switch", "BST3" },
2856 { "RECMIX1R", "BST2 Switch", "BST2" },
2857 { "RECMIX1R", "BST1 Switch", "BST1" },
2858
2859 { "RECMIX2L", "SPKVOLL Switch", "SPKVOL L" },
2860 { "RECMIX2L", "OUTVOLL Switch", "OUTVOL L" },
2861 { "RECMIX2L", "BST4 Switch", "BST4" },
2862 { "RECMIX2L", "BST3 Switch", "BST3" },
2863 { "RECMIX2L", "BST2 Switch", "BST2" },
2864 { "RECMIX2L", "BST1 Switch", "BST1" },
2865
2866 { "RECMIX2R", "MONOVOL Switch", "MONOVOL" },
2867 { "RECMIX2R", "OUTVOLR Switch", "OUTVOL R" },
2868 { "RECMIX2R", "BST4 Switch", "BST4" },
2869 { "RECMIX2R", "BST3 Switch", "BST3" },
2870 { "RECMIX2R", "BST2 Switch", "BST2" },
2871 { "RECMIX2R", "BST1 Switch", "BST1" },
2872
2873 { "ADC1 L", NULL, "RECMIX1L" },
2874 { "ADC1 L", NULL, "ADC1 L Power" },
2875 { "ADC1 L", NULL, "ADC1 clock" },
2876 { "ADC1 R", NULL, "RECMIX1R" },
2877 { "ADC1 R", NULL, "ADC1 R Power" },
2878 { "ADC1 R", NULL, "ADC1 clock" },
2879
2880 { "ADC2 L", NULL, "RECMIX2L" },
2881 { "ADC2 L", NULL, "ADC2 L Power" },
2882 { "ADC2 L", NULL, "ADC2 clock" },
2883 { "ADC2 R", NULL, "RECMIX2R" },
2884 { "ADC2 R", NULL, "ADC2 R Power" },
2885 { "ADC2 R", NULL, "ADC2 clock" },
2886
2887 { "DMIC L1", NULL, "DMIC CLK" },
2888 { "DMIC L1", NULL, "DMIC1 Power" },
2889 { "DMIC R1", NULL, "DMIC CLK" },
2890 { "DMIC R1", NULL, "DMIC1 Power" },
2891 { "DMIC L2", NULL, "DMIC CLK" },
2892 { "DMIC L2", NULL, "DMIC2 Power" },
2893 { "DMIC R2", NULL, "DMIC CLK" },
2894 { "DMIC R2", NULL, "DMIC2 Power" },
2895
2896 { "Stereo1 DMIC L Mux", "DMIC1", "DMIC L1" },
2897 { "Stereo1 DMIC L Mux", "DMIC2", "DMIC L2" },
2898
2899 { "Stereo1 DMIC R Mux", "DMIC1", "DMIC R1" },
2900 { "Stereo1 DMIC R Mux", "DMIC2", "DMIC R2" },
2901
2902 { "Mono DMIC L Mux", "DMIC1 L", "DMIC L1" },
2903 { "Mono DMIC L Mux", "DMIC2 L", "DMIC L2" },
2904
2905 { "Mono DMIC R Mux", "DMIC1 R", "DMIC R1" },
2906 { "Mono DMIC R Mux", "DMIC2 R", "DMIC R2" },
2907
2908 { "Stereo1 ADC L Mux", "ADC1", "ADC1 L" },
2909 { "Stereo1 ADC L Mux", "ADC2", "ADC2 L" },
2910 { "Stereo1 ADC R Mux", "ADC1", "ADC1 R" },
2911 { "Stereo1 ADC R Mux", "ADC2", "ADC2 R" },
2912
2913 { "Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux" },
2914 { "Stereo1 ADC L1 Mux", "DAC MIX", "DAC MIXL" },
2915 { "Stereo1 ADC L2 Mux", "DMIC", "Stereo1 DMIC L Mux" },
2916 { "Stereo1 ADC L2 Mux", "DAC MIX", "DAC MIXL" },
2917
2918 { "Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux" },
2919 { "Stereo1 ADC R1 Mux", "DAC MIX", "DAC MIXR" },
2920 { "Stereo1 ADC R2 Mux", "DMIC", "Stereo1 DMIC R Mux" },
2921 { "Stereo1 ADC R2 Mux", "DAC MIX", "DAC MIXR" },
2922
2923 { "Mono ADC L Mux", "ADC1 L", "ADC1 L" },
2924 { "Mono ADC L Mux", "ADC1 R", "ADC1 R" },
2925 { "Mono ADC L Mux", "ADC2 L", "ADC2 L" },
2926 { "Mono ADC L Mux", "ADC2 R", "ADC2 R" },
2927
2928 { "Mono ADC R Mux", "ADC1 L", "ADC1 L" },
2929 { "Mono ADC R Mux", "ADC1 R", "ADC1 R" },
2930 { "Mono ADC R Mux", "ADC2 L", "ADC2 L" },
2931 { "Mono ADC R Mux", "ADC2 R", "ADC2 R" },
2932
2933 { "Mono ADC L2 Mux", "DMIC", "Mono DMIC L Mux" },
2934 { "Mono ADC L2 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
2935 { "Mono ADC L1 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
2936 { "Mono ADC L1 Mux", "ADC", "Mono ADC L Mux" },
2937
2938 { "Mono ADC R1 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
2939 { "Mono ADC R1 Mux", "ADC", "Mono ADC R Mux" },
2940 { "Mono ADC R2 Mux", "DMIC", "Mono DMIC R Mux" },
2941 { "Mono ADC R2 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
2942
2943 { "Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux" },
2944 { "Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux" },
2945 { "Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter" },
2946
2947 { "Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux" },
2948 { "Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux" },
2949 { "Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter" },
2950
2951 { "Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux" },
2952 { "Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux" },
2953 { "Mono ADC MIXL", NULL, "ADC Mono Left Filter" },
2954
2955 { "Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux" },
2956 { "Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux" },
2957 { "Mono ADC MIXR", NULL, "ADC Mono Right Filter" },
2958
2959 { "Stereo1 ADC Volume L", NULL, "Stereo1 ADC MIXL" },
2960 { "Stereo1 ADC Volume R", NULL, "Stereo1 ADC MIXR" },
2961
2962 { "IF_ADC1", NULL, "Stereo1 ADC Volume L" },
2963 { "IF_ADC1", NULL, "Stereo1 ADC Volume R" },
2964 { "IF_ADC2", NULL, "Mono ADC MIXL" },
2965 { "IF_ADC2", NULL, "Mono ADC MIXR" },
2966
2967 { "TDM AD1:AD2:DAC", NULL, "IF_ADC1" },
2968 { "TDM AD1:AD2:DAC", NULL, "IF_ADC2" },
2969 { "TDM AD1:AD2:DAC", NULL, "DAC_REF" },
2970 { "TDM AD2:DAC", NULL, "IF_ADC2" },
2971 { "TDM AD2:DAC", NULL, "DAC_REF" },
2972 { "TDM Data Mux", "AD1:AD2:DAC:NUL", "TDM AD1:AD2:DAC" },
2973 { "TDM Data Mux", "AD1:AD2:NUL:DAC", "TDM AD1:AD2:DAC" },
2974 { "TDM Data Mux", "AD1:DAC:AD2:NUL", "TDM AD1:AD2:DAC" },
2975 { "TDM Data Mux", "AD1:DAC:NUL:AD2", "TDM AD1:AD2:DAC" },
2976 { "TDM Data Mux", "AD1:NUL:DAC:AD2", "TDM AD1:AD2:DAC" },
2977 { "TDM Data Mux", "AD1:NUL:AD2:DAC", "TDM AD1:AD2:DAC" },
2978 { "TDM Data Mux", "AD2:AD1:DAC:NUL", "TDM AD1:AD2:DAC" },
2979 { "TDM Data Mux", "AD2:AD1:NUL:DAC", "TDM AD1:AD2:DAC" },
2980 { "TDM Data Mux", "AD2:DAC:AD1:NUL", "TDM AD1:AD2:DAC" },
2981 { "TDM Data Mux", "AD2:DAC:NUL:AD1", "TDM AD1:AD2:DAC" },
2982 { "TDM Data Mux", "AD2:NUL:DAC:AD1", "TDM AD1:AD2:DAC" },
2983 { "TDM Data Mux", "AD1:NUL:AD1:DAC", "TDM AD1:AD2:DAC" },
2984 { "TDM Data Mux", "DAC:AD1:AD2:NUL", "TDM AD1:AD2:DAC" },
2985 { "TDM Data Mux", "DAC:AD1:NUL:AD2", "TDM AD1:AD2:DAC" },
2986 { "TDM Data Mux", "DAC:AD2:AD1:NUL", "TDM AD1:AD2:DAC" },
2987 { "TDM Data Mux", "DAC:AD2:NUL:AD1", "TDM AD1:AD2:DAC" },
2988 { "TDM Data Mux", "DAC:NUL:DAC:AD2", "TDM AD2:DAC" },
2989 { "TDM Data Mux", "DAC:NUL:AD2:DAC", "TDM AD2:DAC" },
2990 { "TDM Data Mux", "NUL:AD1:AD2:DAC", "TDM AD1:AD2:DAC" },
2991 { "TDM Data Mux", "NUL:AD1:DAC:AD2", "TDM AD1:AD2:DAC" },
2992 { "TDM Data Mux", "NUL:AD2:AD1:DAC", "TDM AD1:AD2:DAC" },
2993 { "TDM Data Mux", "NUL:AD2:DAC:AD1", "TDM AD1:AD2:DAC" },
2994 { "TDM Data Mux", "NUL:DAC:DAC:AD2", "TDM AD2:DAC" },
2995 { "TDM Data Mux", "NUL:DAC:AD2:DAC", "TDM AD2:DAC" },
2996 { "IF1 01 ADC Swap Mux", "L/R", "TDM Data Mux" },
2997 { "IF1 01 ADC Swap Mux", "R/L", "TDM Data Mux" },
2998 { "IF1 01 ADC Swap Mux", "L/L", "TDM Data Mux" },
2999 { "IF1 01 ADC Swap Mux", "R/R", "TDM Data Mux" },
3000 { "IF1 23 ADC Swap Mux", "L/R", "TDM Data Mux" },
3001 { "IF1 23 ADC Swap Mux", "R/L", "TDM Data Mux" },
3002 { "IF1 23 ADC Swap Mux", "L/L", "TDM Data Mux" },
3003 { "IF1 23 ADC Swap Mux", "R/R", "TDM Data Mux" },
3004 { "IF1 45 ADC Swap Mux", "L/R", "TDM Data Mux" },
3005 { "IF1 45 ADC Swap Mux", "R/L", "TDM Data Mux" },
3006 { "IF1 45 ADC Swap Mux", "L/L", "TDM Data Mux" },
3007 { "IF1 45 ADC Swap Mux", "R/R", "TDM Data Mux" },
3008 { "IF1 67 ADC Swap Mux", "L/R", "TDM Data Mux" },
3009 { "IF1 67 ADC Swap Mux", "R/L", "TDM Data Mux" },
3010 { "IF1 67 ADC Swap Mux", "L/L", "TDM Data Mux" },
3011 { "IF1 67 ADC Swap Mux", "R/R", "TDM Data Mux" },
3012 { "IF1 ADC", NULL, "IF1 01 ADC Swap Mux" },
3013 { "IF1 ADC", NULL, "IF1 23 ADC Swap Mux" },
3014 { "IF1 ADC", NULL, "IF1 45 ADC Swap Mux" },
3015 { "IF1 ADC", NULL, "IF1 67 ADC Swap Mux" },
3016 { "IF1 ADC", NULL, "I2S1" },
3017
3018 { "IF2 ADC Mux", "IF_ADC1", "IF_ADC1" },
3019 { "IF2 ADC Mux", "IF_ADC2", "IF_ADC2" },
3020 { "IF2 ADC Mux", "IF_ADC3", "IF_ADC3" },
3021 { "IF2 ADC Mux", "DAC_REF", "DAC_REF" },
3022 { "IF2 ADC", NULL, "IF2 ADC Mux"},
3023 { "IF2 ADC", NULL, "I2S2" },
3024
3025 { "IF3 ADC Mux", "IF_ADC1", "IF_ADC1" },
3026 { "IF3 ADC Mux", "IF_ADC2", "IF_ADC2" },
3027 { "IF3 ADC Mux", "Stereo2_ADC_L/R", "Stereo2 ADC LR" },
3028 { "IF3 ADC Mux", "DAC_REF", "DAC_REF" },
3029 { "IF3 ADC", NULL, "IF3 ADC Mux"},
3030 { "IF3 ADC", NULL, "I2S3" },
3031
3032 { "AIF1TX", NULL, "IF1 ADC" },
3033 { "IF2 ADC Swap Mux", "L/R", "IF2 ADC" },
3034 { "IF2 ADC Swap Mux", "R/L", "IF2 ADC" },
3035 { "IF2 ADC Swap Mux", "L/L", "IF2 ADC" },
3036 { "IF2 ADC Swap Mux", "R/R", "IF2 ADC" },
3037 { "AIF2TX", NULL, "IF2 ADC Swap Mux" },
3038 { "IF3 ADC Swap Mux", "L/R", "IF3 ADC" },
3039 { "IF3 ADC Swap Mux", "R/L", "IF3 ADC" },
3040 { "IF3 ADC Swap Mux", "L/L", "IF3 ADC" },
3041 { "IF3 ADC Swap Mux", "R/R", "IF3 ADC" },
3042 { "AIF3TX", NULL, "IF3 ADC Swap Mux" },
3043
3044 { "IF1 DAC1", NULL, "AIF1RX" },
3045 { "IF1 DAC2", NULL, "AIF1RX" },
3046 { "IF2 DAC Swap Mux", "L/R", "AIF2RX" },
3047 { "IF2 DAC Swap Mux", "R/L", "AIF2RX" },
3048 { "IF2 DAC Swap Mux", "L/L", "AIF2RX" },
3049 { "IF2 DAC Swap Mux", "R/R", "AIF2RX" },
3050 { "IF2 DAC", NULL, "IF2 DAC Swap Mux" },
3051 { "IF3 DAC Swap Mux", "L/R", "AIF3RX" },
3052 { "IF3 DAC Swap Mux", "R/L", "AIF3RX" },
3053 { "IF3 DAC Swap Mux", "L/L", "AIF3RX" },
3054 { "IF3 DAC Swap Mux", "R/R", "AIF3RX" },
3055 { "IF3 DAC", NULL, "IF3 DAC Swap Mux" },
3056
3057 { "IF1 DAC1", NULL, "I2S1" },
3058 { "IF1 DAC2", NULL, "I2S1" },
3059 { "IF2 DAC", NULL, "I2S2" },
3060 { "IF3 DAC", NULL, "I2S3" },
3061
3062 { "IF1 DAC2 L", NULL, "IF1 DAC2" },
3063 { "IF1 DAC2 R", NULL, "IF1 DAC2" },
3064 { "IF1 DAC1 L", NULL, "IF1 DAC1" },
3065 { "IF1 DAC1 R", NULL, "IF1 DAC1" },
3066 { "IF2 DAC L", NULL, "IF2 DAC" },
3067 { "IF2 DAC R", NULL, "IF2 DAC" },
3068 { "IF3 DAC L", NULL, "IF3 DAC" },
3069 { "IF3 DAC R", NULL, "IF3 DAC" },
3070
3071 { "DAC L1 Mux", "IF1 DAC1", "IF1 DAC1 L" },
3072 { "DAC L1 Mux", "IF2 DAC", "IF2 DAC L" },
3073 { "DAC L1 Mux", "IF3 DAC", "IF3 DAC L" },
3074 { "DAC L1 Mux", NULL, "DAC Stereo1 Filter" },
3075
3076 { "DAC R1 Mux", "IF1 DAC1", "IF1 DAC1 R" },
3077 { "DAC R1 Mux", "IF2 DAC", "IF2 DAC R" },
3078 { "DAC R1 Mux", "IF3 DAC", "IF3 DAC R" },
3079 { "DAC R1 Mux", NULL, "DAC Stereo1 Filter" },
3080
3081 { "DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC Volume L" },
3082 { "DAC1 MIXL", "DAC1 Switch", "DAC L1 Mux" },
3083 { "DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC Volume R" },
3084 { "DAC1 MIXR", "DAC1 Switch", "DAC R1 Mux" },
3085
3086 { "DAC_REF", NULL, "DAC1 MIXL" },
3087 { "DAC_REF", NULL, "DAC1 MIXR" },
3088
3089 { "DAC L2 Mux", "IF1 DAC2", "IF1 DAC2 L" },
3090 { "DAC L2 Mux", "IF2 DAC", "IF2 DAC L" },
3091 { "DAC L2 Mux", "IF3 DAC", "IF3 DAC L" },
3092 { "DAC L2 Mux", "Mono ADC MIX", "Mono ADC MIXL" },
3093 { "DAC L2 Mux", NULL, "DAC Mono Left Filter" },
3094
3095 { "DAC R2 Mux", "IF1 DAC2", "IF1 DAC2 R" },
3096 { "DAC R2 Mux", "IF2 DAC", "IF2 DAC R" },
3097 { "DAC R2 Mux", "IF3 DAC", "IF3 DAC R" },
3098 { "DAC R2 Mux", "Mono ADC MIX", "Mono ADC MIXR" },
3099 { "DAC R2 Mux", NULL, "DAC Mono Right Filter" },
3100
3101 { "Stereo DAC MIXL", "DAC L1 Switch", "DAC1 MIXL" },
3102 { "Stereo DAC MIXL", "DAC R1 Switch", "DAC1 MIXR" },
3103 { "Stereo DAC MIXL", "DAC L2 Switch", "DAC L2 Mux" },
3104 { "Stereo DAC MIXL", "DAC R2 Switch", "DAC R2 Mux" },
3105
3106 { "Stereo DAC MIXR", "DAC R1 Switch", "DAC1 MIXR" },
3107 { "Stereo DAC MIXR", "DAC L1 Switch", "DAC1 MIXL" },
3108 { "Stereo DAC MIXR", "DAC L2 Switch", "DAC L2 Mux" },
3109 { "Stereo DAC MIXR", "DAC R2 Switch", "DAC R2 Mux" },
3110
3111 { "Mono DAC MIXL", "DAC L1 Switch", "DAC1 MIXL" },
3112 { "Mono DAC MIXL", "DAC R1 Switch", "DAC1 MIXR" },
3113 { "Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Mux" },
3114 { "Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Mux" },
3115 { "Mono DAC MIXR", "DAC L1 Switch", "DAC1 MIXL" },
3116 { "Mono DAC MIXR", "DAC R1 Switch", "DAC1 MIXR" },
3117 { "Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Mux" },
3118 { "Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Mux" },
3119
3120 { "DAC MIXL", "Stereo DAC Mixer", "Stereo DAC MIXL" },
3121 { "DAC MIXL", "Mono DAC Mixer", "Mono DAC MIXL" },
3122 { "DAC MIXR", "Stereo DAC Mixer", "Stereo DAC MIXR" },
3123 { "DAC MIXR", "Mono DAC Mixer", "Mono DAC MIXR" },
3124
3125 { "DAC L1 Source", NULL, "DAC L1 Power" },
3126 { "DAC L1 Source", "DAC", "DAC1 MIXL" },
3127 { "DAC L1 Source", "Stereo DAC Mixer", "Stereo DAC MIXL" },
3128 { "DAC R1 Source", NULL, "DAC R1 Power" },
3129 { "DAC R1 Source", "DAC", "DAC1 MIXR" },
3130 { "DAC R1 Source", "Stereo DAC Mixer", "Stereo DAC MIXR" },
3131 { "DAC L2 Source", "Stereo DAC Mixer", "Stereo DAC MIXL" },
3132 { "DAC L2 Source", "Mono DAC Mixer", "Mono DAC MIXL" },
3133 { "DAC L2 Source", NULL, "DAC L2 Power" },
3134 { "DAC R2 Source", "Stereo DAC Mixer", "Stereo DAC MIXR" },
3135 { "DAC R2 Source", "Mono DAC Mixer", "Mono DAC MIXR" },
3136 { "DAC R2 Source", NULL, "DAC R2 Power" },
3137
3138 { "DAC L1", NULL, "DAC L1 Source" },
3139 { "DAC R1", NULL, "DAC R1 Source" },
3140 { "DAC L2", NULL, "DAC L2 Source" },
3141 { "DAC R2", NULL, "DAC R2 Source" },
3142
3143 { "SPK MIXL", "DAC L2 Switch", "DAC L2" },
3144 { "SPK MIXL", "BST1 Switch", "BST1" },
3145 { "SPK MIXL", "INL Switch", "INL VOL" },
3146 { "SPK MIXL", "INR Switch", "INR VOL" },
3147 { "SPK MIXL", "BST3 Switch", "BST3" },
3148 { "SPK MIXR", "DAC R2 Switch", "DAC R2" },
3149 { "SPK MIXR", "BST4 Switch", "BST4" },
3150 { "SPK MIXR", "INL Switch", "INL VOL" },
3151 { "SPK MIXR", "INR Switch", "INR VOL" },
3152 { "SPK MIXR", "BST3 Switch", "BST3" },
3153
3154 { "MONOVOL MIX", "DAC L2 Switch", "DAC L2" },
3155 { "MONOVOL MIX", "DAC R2 Switch", "DAC R2" },
3156 { "MONOVOL MIX", "BST1 Switch", "BST1" },
3157 { "MONOVOL MIX", "BST2 Switch", "BST2" },
3158 { "MONOVOL MIX", "BST3 Switch", "BST3" },
3159
3160 { "OUT MIXL", "DAC L2 Switch", "DAC L2" },
3161 { "OUT MIXL", "INL Switch", "INL VOL" },
3162 { "OUT MIXL", "BST1 Switch", "BST1" },
3163 { "OUT MIXL", "BST2 Switch", "BST2" },
3164 { "OUT MIXL", "BST3 Switch", "BST3" },
3165 { "OUT MIXR", "DAC R2 Switch", "DAC R2" },
3166 { "OUT MIXR", "INR Switch", "INR VOL" },
3167 { "OUT MIXR", "BST2 Switch", "BST2" },
3168 { "OUT MIXR", "BST3 Switch", "BST3" },
3169 { "OUT MIXR", "BST4 Switch", "BST4" },
3170
3171 { "SPKVOL L", "Switch", "SPK MIXL" },
3172 { "SPKVOL R", "Switch", "SPK MIXR" },
3173 { "SPO L MIX", "DAC L2 Switch", "DAC L2" },
3174 { "SPO L MIX", "SPKVOL L Switch", "SPKVOL L" },
3175 { "SPO R MIX", "DAC R2 Switch", "DAC R2" },
3176 { "SPO R MIX", "SPKVOL R Switch", "SPKVOL R" },
3177 { "SPK Amp", NULL, "SPO L MIX" },
3178 { "SPK Amp", NULL, "SPO R MIX" },
3179 { "SPK Amp", NULL, "SYS CLK DET" },
3180 { "SPO Playback", "Switch", "SPK Amp" },
3181 { "SPOL", NULL, "SPO Playback" },
3182 { "SPOR", NULL, "SPO Playback" },
3183
3184 { "MONOVOL", "Switch", "MONOVOL MIX" },
3185 { "Mono MIX", "DAC L2 Switch", "DAC L2" },
3186 { "Mono MIX", "MONOVOL Switch", "MONOVOL" },
3187 { "Mono Amp", NULL, "Mono MIX" },
3188 { "Mono Amp", NULL, "Mono Vref" },
3189 { "Mono Amp", NULL, "SYS CLK DET" },
3190 { "Mono Playback", "Switch", "Mono Amp" },
3191 { "MONOOUT", NULL, "Mono Playback" },
3192
3193 { "HP Amp", NULL, "DAC L1" },
3194 { "HP Amp", NULL, "DAC R1" },
3195 { "HP Amp", NULL, "Charge Pump" },
3196 { "HP Amp", NULL, "SYS CLK DET" },
3197 { "HPO L Playback", "Switch", "HP Amp"},
3198 { "HPO R Playback", "Switch", "HP Amp"},
3199 { "HPOL", NULL, "HPO L Playback" },
3200 { "HPOR", NULL, "HPO R Playback" },
3201
3202 { "OUTVOL L", "Switch", "OUT MIXL" },
3203 { "OUTVOL R", "Switch", "OUT MIXR" },
3204 { "LOUT L MIX", "DAC L2 Switch", "DAC L2" },
3205 { "LOUT L MIX", "OUTVOL L Switch", "OUTVOL L" },
3206 { "LOUT R MIX", "DAC R2 Switch", "DAC R2" },
3207 { "LOUT R MIX", "OUTVOL R Switch", "OUTVOL R" },
3208 { "LOUT Amp", NULL, "LOUT L MIX" },
3209 { "LOUT Amp", NULL, "LOUT R MIX" },
3210 { "LOUT Amp", NULL, "SYS CLK DET" },
3211 { "LOUT L Playback", "Switch", "LOUT Amp" },
3212 { "LOUT R Playback", "Switch", "LOUT Amp" },
3213 { "LOUTL", NULL, "LOUT L Playback" },
3214 { "LOUTR", NULL, "LOUT R Playback" },
3215
3216 { "PDM L Mux", "Mono DAC", "Mono DAC MIXL" },
3217 { "PDM L Mux", "Stereo DAC", "Stereo DAC MIXL" },
3218 { "PDM L Mux", NULL, "PDM Power" },
3219 { "PDM R Mux", "Mono DAC", "Mono DAC MIXR" },
3220 { "PDM R Mux", "Stereo DAC", "Stereo DAC MIXR" },
3221 { "PDM R Mux", NULL, "PDM Power" },
3222 { "PDM L Playback", "Switch", "PDM L Mux" },
3223 { "PDM R Playback", "Switch", "PDM R Mux" },
3224 { "PDML", NULL, "PDM L Playback" },
3225 { "PDMR", NULL, "PDM R Playback" },
3226
3227 { "SPDIF Mux", "IF3_DAC", "IF3 DAC" },
3228 { "SPDIF Mux", "IF2_DAC", "IF2 DAC" },
3229 { "SPDIF Mux", "IF1_DAC2", "IF1 DAC2" },
3230 { "SPDIF Mux", "IF1_DAC1", "IF1 DAC1" },
3231 { "SPDIF", NULL, "SPDIF Mux" },
3232};
3233
3234static int rt5659_hw_params(struct snd_pcm_substream *substream,
3235 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
3236{
3237 struct snd_soc_codec *codec = dai->codec;
3238 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
3239 unsigned int val_len = 0, val_clk, mask_clk;
3240 int pre_div, frame_size;
3241
3242 rt5659->lrck[dai->id] = params_rate(params);
3243 pre_div = rl6231_get_clk_info(rt5659->sysclk, rt5659->lrck[dai->id]);
3244 if (pre_div < 0) {
3245 dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n",
3246 rt5659->lrck[dai->id], dai->id);
3247 return -EINVAL;
3248 }
3249 frame_size = snd_soc_params_to_frame_size(params);
3250 if (frame_size < 0) {
3251 dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size);
3252 return -EINVAL;
3253 }
3254
3255 dev_dbg(dai->dev, "lrck is %dHz and pre_div is %d for iis %d\n",
3256 rt5659->lrck[dai->id], pre_div, dai->id);
3257
3258 switch (params_width(params)) {
3259 case 16:
3260 break;
3261 case 20:
3262 val_len |= RT5659_I2S_DL_20;
3263 break;
3264 case 24:
3265 val_len |= RT5659_I2S_DL_24;
3266 break;
3267 case 8:
3268 val_len |= RT5659_I2S_DL_8;
3269 break;
3270 default:
3271 return -EINVAL;
3272 }
3273
3274 switch (dai->id) {
3275 case RT5659_AIF1:
3276 mask_clk = RT5659_I2S_PD1_MASK;
3277 val_clk = pre_div << RT5659_I2S_PD1_SFT;
3278 snd_soc_update_bits(codec, RT5659_I2S1_SDP,
3279 RT5659_I2S_DL_MASK, val_len);
3280 break;
3281 case RT5659_AIF2:
3282 mask_clk = RT5659_I2S_PD2_MASK;
3283 val_clk = pre_div << RT5659_I2S_PD2_SFT;
3284 snd_soc_update_bits(codec, RT5659_I2S2_SDP,
3285 RT5659_I2S_DL_MASK, val_len);
3286 break;
3287 case RT5659_AIF3:
3288 mask_clk = RT5659_I2S_PD3_MASK;
3289 val_clk = pre_div << RT5659_I2S_PD3_SFT;
3290 snd_soc_update_bits(codec, RT5659_I2S3_SDP,
3291 RT5659_I2S_DL_MASK, val_len);
3292 break;
3293 default:
3294 dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id);
3295 return -EINVAL;
3296 }
3297
3298 snd_soc_update_bits(codec, RT5659_ADDA_CLK_1, mask_clk, val_clk);
3299
3300 switch (rt5659->lrck[dai->id]) {
3301 case 192000:
3302 snd_soc_update_bits(codec, RT5659_ADDA_CLK_1,
3303 RT5659_DAC_OSR_MASK, RT5659_DAC_OSR_32);
3304 break;
3305 case 96000:
3306 snd_soc_update_bits(codec, RT5659_ADDA_CLK_1,
3307 RT5659_DAC_OSR_MASK, RT5659_DAC_OSR_64);
3308 break;
3309 default:
3310 snd_soc_update_bits(codec, RT5659_ADDA_CLK_1,
3311 RT5659_DAC_OSR_MASK, RT5659_DAC_OSR_128);
3312 break;
3313 }
3314
3315 return 0;
3316}
3317
3318static int rt5659_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
3319{
3320 struct snd_soc_codec *codec = dai->codec;
3321 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
3322 unsigned int reg_val = 0;
3323
3324 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
3325 case SND_SOC_DAIFMT_CBM_CFM:
3326 rt5659->master[dai->id] = 1;
3327 break;
3328 case SND_SOC_DAIFMT_CBS_CFS:
3329 reg_val |= RT5659_I2S_MS_S;
3330 rt5659->master[dai->id] = 0;
3331 break;
3332 default:
3333 return -EINVAL;
3334 }
3335
3336 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
3337 case SND_SOC_DAIFMT_NB_NF:
3338 break;
3339 case SND_SOC_DAIFMT_IB_NF:
3340 reg_val |= RT5659_I2S_BP_INV;
3341 break;
3342 default:
3343 return -EINVAL;
3344 }
3345
3346 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
3347 case SND_SOC_DAIFMT_I2S:
3348 break;
3349 case SND_SOC_DAIFMT_LEFT_J:
3350 reg_val |= RT5659_I2S_DF_LEFT;
3351 break;
3352 case SND_SOC_DAIFMT_DSP_A:
3353 reg_val |= RT5659_I2S_DF_PCM_A;
3354 break;
3355 case SND_SOC_DAIFMT_DSP_B:
3356 reg_val |= RT5659_I2S_DF_PCM_B;
3357 break;
3358 default:
3359 return -EINVAL;
3360 }
3361
3362 switch (dai->id) {
3363 case RT5659_AIF1:
3364 snd_soc_update_bits(codec, RT5659_I2S1_SDP,
3365 RT5659_I2S_MS_MASK | RT5659_I2S_BP_MASK |
3366 RT5659_I2S_DF_MASK, reg_val);
3367 break;
3368 case RT5659_AIF2:
3369 snd_soc_update_bits(codec, RT5659_I2S2_SDP,
3370 RT5659_I2S_MS_MASK | RT5659_I2S_BP_MASK |
3371 RT5659_I2S_DF_MASK, reg_val);
3372 break;
3373 case RT5659_AIF3:
3374 snd_soc_update_bits(codec, RT5659_I2S3_SDP,
3375 RT5659_I2S_MS_MASK | RT5659_I2S_BP_MASK |
3376 RT5659_I2S_DF_MASK, reg_val);
3377 break;
3378 default:
3379 dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id);
3380 return -EINVAL;
3381 }
3382 return 0;
3383}
3384
3385static int rt5659_set_dai_sysclk(struct snd_soc_dai *dai,
3386 int clk_id, unsigned int freq, int dir)
3387{
3388 struct snd_soc_codec *codec = dai->codec;
3389 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
3390 unsigned int reg_val = 0;
3391
3392 if (freq == rt5659->sysclk && clk_id == rt5659->sysclk_src)
3393 return 0;
3394
3395 switch (clk_id) {
3396 case RT5659_SCLK_S_MCLK:
3397 reg_val |= RT5659_SCLK_SRC_MCLK;
3398 break;
3399 case RT5659_SCLK_S_PLL1:
3400 reg_val |= RT5659_SCLK_SRC_PLL1;
3401 break;
3402 case RT5659_SCLK_S_RCCLK:
3403 reg_val |= RT5659_SCLK_SRC_RCCLK;
3404 break;
3405 default:
3406 dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id);
3407 return -EINVAL;
3408 }
3409 snd_soc_update_bits(codec, RT5659_GLB_CLK,
3410 RT5659_SCLK_SRC_MASK, reg_val);
3411 rt5659->sysclk = freq;
3412 rt5659->sysclk_src = clk_id;
3413
3414 dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
3415
3416 return 0;
3417}
3418
3419static int rt5659_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int Source,
3420 unsigned int freq_in, unsigned int freq_out)
3421{
3422 struct snd_soc_codec *codec = dai->codec;
3423 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
3424 struct rl6231_pll_code pll_code;
3425 int ret;
3426
3427 if (Source == rt5659->pll_src && freq_in == rt5659->pll_in &&
3428 freq_out == rt5659->pll_out)
3429 return 0;
3430
3431 if (!freq_in || !freq_out) {
3432 dev_dbg(codec->dev, "PLL disabled\n");
3433
3434 rt5659->pll_in = 0;
3435 rt5659->pll_out = 0;
3436 snd_soc_update_bits(codec, RT5659_GLB_CLK,
3437 RT5659_SCLK_SRC_MASK, RT5659_SCLK_SRC_MCLK);
3438 return 0;
3439 }
3440
3441 switch (Source) {
3442 case RT5659_PLL1_S_MCLK:
3443 snd_soc_update_bits(codec, RT5659_GLB_CLK,
3444 RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_MCLK);
3445 break;
3446 case RT5659_PLL1_S_BCLK1:
3447 snd_soc_update_bits(codec, RT5659_GLB_CLK,
3448 RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_BCLK1);
3449 break;
3450 case RT5659_PLL1_S_BCLK2:
3451 snd_soc_update_bits(codec, RT5659_GLB_CLK,
3452 RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_BCLK2);
3453 break;
3454 case RT5659_PLL1_S_BCLK3:
3455 snd_soc_update_bits(codec, RT5659_GLB_CLK,
3456 RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_BCLK3);
3457 break;
3458 default:
3459 dev_err(codec->dev, "Unknown PLL Source %d\n", Source);
3460 return -EINVAL;
3461 }
3462
3463 ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
3464 if (ret < 0) {
3465 dev_err(codec->dev, "Unsupport input clock %d\n", freq_in);
3466 return ret;
3467 }
3468
3469 dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n",
3470 pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
3471 pll_code.n_code, pll_code.k_code);
3472
3473 snd_soc_write(codec, RT5659_PLL_CTRL_1,
3474 pll_code.n_code << RT5659_PLL_N_SFT | pll_code.k_code);
3475 snd_soc_write(codec, RT5659_PLL_CTRL_2,
3476 (pll_code.m_bp ? 0 : pll_code.m_code) << RT5659_PLL_M_SFT |
3477 pll_code.m_bp << RT5659_PLL_M_BP_SFT);
3478
3479 rt5659->pll_in = freq_in;
3480 rt5659->pll_out = freq_out;
3481 rt5659->pll_src = Source;
3482
3483 return 0;
3484}
3485
3486static int rt5659_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
3487 unsigned int rx_mask, int slots, int slot_width)
3488{
3489 struct snd_soc_codec *codec = dai->codec;
3490 unsigned int val = 0;
3491
3492 if (rx_mask || tx_mask)
3493 val |= (1 << 15);
3494
3495 switch (slots) {
3496 case 4:
3497 val |= (1 << 10);
3498 val |= (1 << 8);
3499 break;
3500 case 6:
3501 val |= (2 << 10);
3502 val |= (2 << 8);
3503 break;
3504 case 8:
3505 val |= (3 << 10);
3506 val |= (3 << 8);
3507 break;
3508 case 2:
3509 break;
3510 default:
3511 return -EINVAL;
3512 }
3513
3514 switch (slot_width) {
3515 case 20:
3516 val |= (1 << 6);
3517 val |= (1 << 4);
3518 break;
3519 case 24:
3520 val |= (2 << 6);
3521 val |= (2 << 4);
3522 break;
3523 case 32:
3524 val |= (3 << 6);
3525 val |= (3 << 4);
3526 break;
3527 case 16:
3528 break;
3529 default:
3530 return -EINVAL;
3531 }
3532
3533 snd_soc_update_bits(codec, RT5659_TDM_CTRL_1, 0x8ff0, val);
3534
3535 return 0;
3536}
3537
3538static int rt5659_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
3539{
3540 struct snd_soc_codec *codec = dai->codec;
3541 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
3542
3543 dev_dbg(codec->dev, "%s ratio=%d\n", __func__, ratio);
3544
3545 rt5659->bclk[dai->id] = ratio;
3546
3547 if (ratio == 64) {
3548 switch (dai->id) {
3549 case RT5659_AIF2:
3550 snd_soc_update_bits(codec, RT5659_ADDA_CLK_1,
3551 RT5659_I2S_BCLK_MS2_MASK,
3552 RT5659_I2S_BCLK_MS2_64);
3553 break;
3554 case RT5659_AIF3:
3555 snd_soc_update_bits(codec, RT5659_ADDA_CLK_1,
3556 RT5659_I2S_BCLK_MS3_MASK,
3557 RT5659_I2S_BCLK_MS3_64);
3558 break;
3559 }
3560 }
3561
3562 return 0;
3563}
3564
3565static int rt5659_set_bias_level(struct snd_soc_codec *codec,
3566 enum snd_soc_bias_level level)
3567{
3568 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
3569
3570 switch (level) {
3571 case SND_SOC_BIAS_PREPARE:
3572 regmap_update_bits(rt5659->regmap, RT5659_DIG_MISC,
3573 RT5659_DIG_GATE_CTRL, RT5659_DIG_GATE_CTRL);
3574 regmap_update_bits(rt5659->regmap, RT5659_PWR_DIG_1,
3575 RT5659_PWR_LDO, RT5659_PWR_LDO);
3576 regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1,
3577 RT5659_PWR_MB | RT5659_PWR_VREF1 | RT5659_PWR_VREF2,
3578 RT5659_PWR_MB | RT5659_PWR_VREF1 | RT5659_PWR_VREF2);
3579 msleep(20);
3580 regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1,
3581 RT5659_PWR_FV1 | RT5659_PWR_FV2,
3582 RT5659_PWR_FV1 | RT5659_PWR_FV2);
3583 break;
3584
3585 case SND_SOC_BIAS_OFF:
3586 regmap_update_bits(rt5659->regmap, RT5659_PWR_DIG_1,
3587 RT5659_PWR_LDO, 0);
3588 regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1,
3589 RT5659_PWR_MB | RT5659_PWR_VREF1 | RT5659_PWR_VREF2
3590 | RT5659_PWR_FV1 | RT5659_PWR_FV2,
3591 RT5659_PWR_MB | RT5659_PWR_VREF2);
3592 regmap_update_bits(rt5659->regmap, RT5659_DIG_MISC,
3593 RT5659_DIG_GATE_CTRL, 0);
3594 break;
3595
3596 default:
3597 break;
3598 }
3599
3600 return 0;
3601}
3602
3603static int rt5659_probe(struct snd_soc_codec *codec)
3604{
3605 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
3606
3607 rt5659->codec = codec;
3608
3609 return 0;
3610}
3611
3612static int rt5659_remove(struct snd_soc_codec *codec)
3613{
3614 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
3615
3616 regmap_write(rt5659->regmap, RT5659_RESET, 0);
3617
3618 return 0;
3619}
3620
3621#ifdef CONFIG_PM
3622static int rt5659_suspend(struct snd_soc_codec *codec)
3623{
3624 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
3625
3626 regcache_cache_only(rt5659->regmap, true);
3627 regcache_mark_dirty(rt5659->regmap);
3628 return 0;
3629}
3630
3631static int rt5659_resume(struct snd_soc_codec *codec)
3632{
3633 struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec);
3634
3635 regcache_cache_only(rt5659->regmap, false);
3636 regcache_sync(rt5659->regmap);
3637
3638 return 0;
3639}
3640#else
3641#define rt5659_suspend NULL
3642#define rt5659_resume NULL
3643#endif
3644
3645#define RT5659_STEREO_RATES SNDRV_PCM_RATE_8000_192000
3646#define RT5659_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
3647 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
3648
3649static const struct snd_soc_dai_ops rt5659_aif_dai_ops = {
3650 .hw_params = rt5659_hw_params,
3651 .set_fmt = rt5659_set_dai_fmt,
3652 .set_sysclk = rt5659_set_dai_sysclk,
3653 .set_tdm_slot = rt5659_set_tdm_slot,
3654 .set_pll = rt5659_set_dai_pll,
3655 .set_bclk_ratio = rt5659_set_bclk_ratio,
3656};
3657
3658static struct snd_soc_dai_driver rt5659_dai[] = {
3659 {
3660 .name = "rt5659-aif1",
3661 .id = RT5659_AIF1,
3662 .playback = {
3663 .stream_name = "AIF1 Playback",
3664 .channels_min = 1,
3665 .channels_max = 2,
3666 .rates = RT5659_STEREO_RATES,
3667 .formats = RT5659_FORMATS,
3668 },
3669 .capture = {
3670 .stream_name = "AIF1 Capture",
3671 .channels_min = 1,
3672 .channels_max = 2,
3673 .rates = RT5659_STEREO_RATES,
3674 .formats = RT5659_FORMATS,
3675 },
3676 .ops = &rt5659_aif_dai_ops,
3677 },
3678 {
3679 .name = "rt5659-aif2",
3680 .id = RT5659_AIF2,
3681 .playback = {
3682 .stream_name = "AIF2 Playback",
3683 .channels_min = 1,
3684 .channels_max = 2,
3685 .rates = RT5659_STEREO_RATES,
3686 .formats = RT5659_FORMATS,
3687 },
3688 .capture = {
3689 .stream_name = "AIF2 Capture",
3690 .channels_min = 1,
3691 .channels_max = 2,
3692 .rates = RT5659_STEREO_RATES,
3693 .formats = RT5659_FORMATS,
3694 },
3695 .ops = &rt5659_aif_dai_ops,
3696 },
3697 {
3698 .name = "rt5659-aif3",
3699 .id = RT5659_AIF3,
3700 .playback = {
3701 .stream_name = "AIF3 Playback",
3702 .channels_min = 1,
3703 .channels_max = 2,
3704 .rates = RT5659_STEREO_RATES,
3705 .formats = RT5659_FORMATS,
3706 },
3707 .capture = {
3708 .stream_name = "AIF3 Capture",
3709 .channels_min = 1,
3710 .channels_max = 2,
3711 .rates = RT5659_STEREO_RATES,
3712 .formats = RT5659_FORMATS,
3713 },
3714 .ops = &rt5659_aif_dai_ops,
3715 },
3716};
3717
3718static struct snd_soc_codec_driver soc_codec_dev_rt5659 = {
3719 .probe = rt5659_probe,
3720 .remove = rt5659_remove,
3721 .suspend = rt5659_suspend,
3722 .resume = rt5659_resume,
3723 .set_bias_level = rt5659_set_bias_level,
3724 .idle_bias_off = true,
3725 .controls = rt5659_snd_controls,
3726 .num_controls = ARRAY_SIZE(rt5659_snd_controls),
3727 .dapm_widgets = rt5659_dapm_widgets,
3728 .num_dapm_widgets = ARRAY_SIZE(rt5659_dapm_widgets),
3729 .dapm_routes = rt5659_dapm_routes,
3730 .num_dapm_routes = ARRAY_SIZE(rt5659_dapm_routes),
3731};
3732
3733
3734static const struct regmap_config rt5659_regmap = {
3735 .reg_bits = 16,
3736 .val_bits = 16,
3737 .max_register = 0x0400,
3738 .volatile_reg = rt5659_volatile_register,
3739 .readable_reg = rt5659_readable_register,
3740 .cache_type = REGCACHE_RBTREE,
3741 .reg_defaults = rt5659_reg,
3742 .num_reg_defaults = ARRAY_SIZE(rt5659_reg),
3743};
3744
3745static const struct i2c_device_id rt5659_i2c_id[] = {
3746 { "rt5658", 0 },
3747 { "rt5659", 0 },
3748 { }
3749};
3750MODULE_DEVICE_TABLE(i2c, rt5659_i2c_id);
3751
3752static int rt5659_parse_dt(struct rt5659_priv *rt5659, struct device *dev)
3753{
3754 rt5659->pdata.in1_diff = device_property_read_bool(dev,
3755 "realtek,in1-differential");
3756 rt5659->pdata.in3_diff = device_property_read_bool(dev,
3757 "realtek,in3-differential");
3758 rt5659->pdata.in4_diff = device_property_read_bool(dev,
3759 "realtek,in4-differential");
3760
3761
3762 device_property_read_u32(dev, "realtek,dmic1-data-pin",
3763 &rt5659->pdata.dmic1_data_pin);
3764 device_property_read_u32(dev, "realtek,dmic2-data-pin",
3765 &rt5659->pdata.dmic2_data_pin);
3766 device_property_read_u32(dev, "realtek,jd-src",
3767 &rt5659->pdata.jd_src);
3768
3769 return 0;
3770}
3771
3772static void rt5659_calibrate(struct rt5659_priv *rt5659)
3773{
3774 int value, count;
3775
3776 /* Calibrate HPO Start */
3777 /* Fine tune HP Performance */
3778 regmap_write(rt5659->regmap, RT5659_BIAS_CUR_CTRL_8, 0xa502);
3779 regmap_write(rt5659->regmap, RT5659_CHOP_DAC, 0x3030);
3780
3781 regmap_write(rt5659->regmap, RT5659_PRE_DIV_1, 0xef00);
3782 regmap_write(rt5659->regmap, RT5659_PRE_DIV_2, 0xeffc);
3783 regmap_write(rt5659->regmap, RT5659_MICBIAS_2, 0x0280);
3784 regmap_write(rt5659->regmap, RT5659_DIG_MISC, 0x0001);
3785 regmap_write(rt5659->regmap, RT5659_GLB_CLK, 0x8000);
3786
3787 regmap_write(rt5659->regmap, RT5659_PWR_ANLG_1, 0xaa7e);
3788 msleep(60);
3789 regmap_write(rt5659->regmap, RT5659_PWR_ANLG_1, 0xfe7e);
3790 msleep(50);
3791 regmap_write(rt5659->regmap, RT5659_PWR_ANLG_3, 0x0004);
3792 regmap_write(rt5659->regmap, RT5659_PWR_DIG_2, 0x0400);
3793 msleep(50);
3794 regmap_write(rt5659->regmap, RT5659_PWR_DIG_1, 0x0080);
3795 usleep_range(10000, 10005);
3796 regmap_write(rt5659->regmap, RT5659_DEPOP_1, 0x0009);
3797 msleep(50);
3798 regmap_write(rt5659->regmap, RT5659_PWR_DIG_1, 0x0f80);
3799 msleep(50);
3800 regmap_write(rt5659->regmap, RT5659_HP_CHARGE_PUMP_1, 0x0e16);
3801 msleep(50);
3802
3803 /* Enalbe K ADC Power And Clock */
3804 regmap_write(rt5659->regmap, RT5659_CAL_REC, 0x0505);
3805 msleep(50);
3806 regmap_write(rt5659->regmap, RT5659_PWR_ANLG_3, 0x0184);
3807 regmap_write(rt5659->regmap, RT5659_CALIB_ADC_CTRL, 0x3c05);
3808 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x20c1);
3809
3810 /* K Headphone */
3811 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x2cc1);
3812 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, 0x5100);
3813 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_7, 0x0014);
3814 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, 0xd100);
3815 msleep(60);
3816
3817 /* Manual K ADC Offset */
3818 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x2cc1);
3819 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, 0x4900);
3820 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_7, 0x0016);
3821 regmap_update_bits(rt5659->regmap, RT5659_HP_CALIB_CTRL_1,
3822 0x8000, 0x8000);
3823
3824 count = 0;
3825 while (true) {
3826 regmap_read(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, &value);
3827 if (value & 0x8000)
3828 usleep_range(10000, 10005);
3829 else
3830 break;
3831
3832 if (count > 30) {
3833 dev_err(rt5659->codec->dev,
3834 "HP Calibration 1 Failure\n");
3835 return;
3836 }
3837
3838 count++;
3839 }
3840
3841 /* Manual K Internal Path Offset */
3842 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x2cc1);
3843 regmap_write(rt5659->regmap, RT5659_HP_VOL, 0x0000);
3844 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, 0x4500);
3845 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_7, 0x001f);
3846 regmap_update_bits(rt5659->regmap, RT5659_HP_CALIB_CTRL_1,
3847 0x8000, 0x8000);
3848
3849 count = 0;
3850 while (true) {
3851 regmap_read(rt5659->regmap, RT5659_HP_CALIB_CTRL_1, &value);
3852 if (value & 0x8000)
3853 usleep_range(10000, 10005);
3854 else
3855 break;
3856
3857 if (count > 85) {
3858 dev_err(rt5659->codec->dev,
3859 "HP Calibration 2 Failure\n");
3860 return;
3861 }
3862
3863 count++;
3864 }
3865
3866 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_7, 0x0000);
3867 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x20c0);
3868 /* Calibrate HPO End */
3869
3870 /* Calibrate SPO Start */
3871 regmap_write(rt5659->regmap, RT5659_CLASSD_0, 0x2021);
3872 regmap_write(rt5659->regmap, RT5659_CLASSD_CTRL_1, 0x0260);
3873 regmap_write(rt5659->regmap, RT5659_PWR_MIXER, 0x3000);
3874 regmap_write(rt5659->regmap, RT5659_PWR_VOL, 0xc000);
3875 regmap_write(rt5659->regmap, RT5659_A_DAC_MUX, 0x000c);
3876 regmap_write(rt5659->regmap, RT5659_DIG_MISC, 0x8000);
3877 regmap_write(rt5659->regmap, RT5659_SPO_VOL, 0x0808);
3878 regmap_write(rt5659->regmap, RT5659_SPK_L_MIXER, 0x001e);
3879 regmap_write(rt5659->regmap, RT5659_SPK_R_MIXER, 0x001e);
3880 regmap_write(rt5659->regmap, RT5659_CLASSD_1, 0x0803);
3881 regmap_write(rt5659->regmap, RT5659_CLASSD_2, 0x0554);
3882 regmap_write(rt5659->regmap, RT5659_SPO_AMP_GAIN, 0x1103);
3883
3884 /* Enalbe K ADC Power And Clock */
3885 regmap_write(rt5659->regmap, RT5659_CAL_REC, 0x0909);
3886 regmap_update_bits(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x0001,
3887 0x0001);
3888
3889 /* Start Calibration */
3890 regmap_write(rt5659->regmap, RT5659_SPK_DC_CAILB_CTRL_3, 0x0000);
3891 regmap_write(rt5659->regmap, RT5659_CLASSD_0, 0x0021);
3892 regmap_write(rt5659->regmap, RT5659_SPK_DC_CAILB_CTRL_1, 0x3e80);
3893 regmap_update_bits(rt5659->regmap, RT5659_SPK_DC_CAILB_CTRL_1,
3894 0x8000, 0x8000);
3895
3896 count = 0;
3897 while (true) {
3898 regmap_read(rt5659->regmap,
3899 RT5659_SPK_DC_CAILB_CTRL_1, &value);
3900 if (value & 0x8000)
3901 usleep_range(10000, 10005);
3902 else
3903 break;
3904
3905 if (count > 10) {
3906 dev_err(rt5659->codec->dev,
3907 "SPK Calibration Failure\n");
3908 return;
3909 }
3910
3911 count++;
3912 }
3913 /* Calibrate SPO End */
3914
3915 /* Calibrate MONO Start */
3916 regmap_write(rt5659->regmap, RT5659_DIG_MISC, 0x0000);
3917 regmap_write(rt5659->regmap, RT5659_MONOMIX_IN_GAIN, 0x021f);
3918 regmap_write(rt5659->regmap, RT5659_MONO_OUT, 0x480a);
3919 /* MONO NG2 GAIN 5dB */
3920 regmap_write(rt5659->regmap, RT5659_MONO_GAIN, 0x0003);
3921 regmap_write(rt5659->regmap, RT5659_MONO_NG2_CTRL_5, 0x0009);
3922
3923 /* Start Calibration */
3924 regmap_write(rt5659->regmap, RT5659_SPK_DC_CAILB_CTRL_3, 0x000f);
3925 regmap_write(rt5659->regmap, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e00);
3926 regmap_update_bits(rt5659->regmap, RT5659_MONO_AMP_CALIB_CTRL_1,
3927 0x8000, 0x8000);
3928
3929 count = 0;
3930 while (true) {
3931 regmap_read(rt5659->regmap, RT5659_MONO_AMP_CALIB_CTRL_1,
3932 &value);
3933 if (value & 0x8000)
3934 usleep_range(10000, 10005);
3935 else
3936 break;
3937
3938 if (count > 35) {
3939 dev_err(rt5659->codec->dev,
3940 "Mono Calibration Failure\n");
3941 return;
3942 }
3943
3944 count++;
3945 }
3946
3947 regmap_write(rt5659->regmap, RT5659_SPK_DC_CAILB_CTRL_3, 0x0003);
3948 /* Calibrate MONO End */
3949
3950 /* Power Off */
3951 regmap_write(rt5659->regmap, RT5659_CAL_REC, 0x0808);
3952 regmap_write(rt5659->regmap, RT5659_PWR_ANLG_3, 0x0000);
3953 regmap_write(rt5659->regmap, RT5659_CALIB_ADC_CTRL, 0x2005);
3954 regmap_write(rt5659->regmap, RT5659_HP_CALIB_CTRL_2, 0x20c0);
3955 regmap_write(rt5659->regmap, RT5659_DEPOP_1, 0x0000);
3956 regmap_write(rt5659->regmap, RT5659_CLASSD_1, 0x0011);
3957 regmap_write(rt5659->regmap, RT5659_CLASSD_2, 0x0150);
3958 regmap_write(rt5659->regmap, RT5659_PWR_ANLG_1, 0xfe3e);
3959 regmap_write(rt5659->regmap, RT5659_MONO_OUT, 0xc80a);
3960 regmap_write(rt5659->regmap, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e04);
3961 regmap_write(rt5659->regmap, RT5659_PWR_MIXER, 0x0000);
3962 regmap_write(rt5659->regmap, RT5659_PWR_VOL, 0x0000);
3963 regmap_write(rt5659->regmap, RT5659_PWR_DIG_1, 0x0000);
3964 regmap_write(rt5659->regmap, RT5659_PWR_DIG_2, 0x0000);
3965 regmap_write(rt5659->regmap, RT5659_PWR_ANLG_1, 0x003e);
3966 regmap_write(rt5659->regmap, RT5659_CLASSD_CTRL_1, 0x0060);
3967 regmap_write(rt5659->regmap, RT5659_CLASSD_0, 0x2021);
3968 regmap_write(rt5659->regmap, RT5659_GLB_CLK, 0x0000);
3969 regmap_write(rt5659->regmap, RT5659_MICBIAS_2, 0x0080);
3970 regmap_write(rt5659->regmap, RT5659_HP_VOL, 0x8080);
3971 regmap_write(rt5659->regmap, RT5659_HP_CHARGE_PUMP_1, 0x0c16);
3972}
3973
3974static int rt5659_i2c_probe(struct i2c_client *i2c,
3975 const struct i2c_device_id *id)
3976{
3977 struct rt5659_platform_data *pdata = dev_get_platdata(&i2c->dev);
3978 struct rt5659_priv *rt5659;
3979 int ret;
3980 unsigned int val;
3981
3982 rt5659 = devm_kzalloc(&i2c->dev, sizeof(struct rt5659_priv),
3983 GFP_KERNEL);
3984
3985 if (rt5659 == NULL)
3986 return -ENOMEM;
3987
3988 rt5659->i2c = i2c;
3989 i2c_set_clientdata(i2c, rt5659);
3990
3991 if (pdata)
3992 rt5659->pdata = *pdata;
3993 else
3994 rt5659_parse_dt(rt5659, &i2c->dev);
3995
3996 rt5659->gpiod_ldo1_en = devm_gpiod_get_optional(&i2c->dev, "ldo1-en",
3997 GPIOD_OUT_HIGH);
3998 if (IS_ERR(rt5659->gpiod_ldo1_en))
3999 dev_warn(&i2c->dev, "Request ldo1-en GPIO failed\n");
4000
4001 rt5659->gpiod_reset = devm_gpiod_get_optional(&i2c->dev, "reset",
4002 GPIOD_OUT_HIGH);
4003
4004 /* Sleep for 300 ms miniumum */
4005 usleep_range(300000, 350000);
4006
4007 rt5659->regmap = devm_regmap_init_i2c(i2c, &rt5659_regmap);
4008 if (IS_ERR(rt5659->regmap)) {
4009 ret = PTR_ERR(rt5659->regmap);
4010 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
4011 ret);
4012 return ret;
4013 }
4014
4015 regmap_read(rt5659->regmap, RT5659_DEVICE_ID, &val);
4016 if (val != DEVICE_ID) {
4017 dev_err(&i2c->dev,
4018 "Device with ID register %x is not rt5659\n", val);
4019 return -ENODEV;
4020 }
4021
4022 regmap_write(rt5659->regmap, RT5659_RESET, 0);
4023
4024 rt5659_calibrate(rt5659);
4025
4026 /* line in diff mode*/
4027 if (rt5659->pdata.in1_diff)
4028 regmap_update_bits(rt5659->regmap, RT5659_IN1_IN2,
4029 RT5659_IN1_DF_MASK, RT5659_IN1_DF_MASK);
4030 if (rt5659->pdata.in3_diff)
4031 regmap_update_bits(rt5659->regmap, RT5659_IN3_IN4,
4032 RT5659_IN3_DF_MASK, RT5659_IN3_DF_MASK);
4033 if (rt5659->pdata.in4_diff)
4034 regmap_update_bits(rt5659->regmap, RT5659_IN3_IN4,
4035 RT5659_IN4_DF_MASK, RT5659_IN4_DF_MASK);
4036
4037 /* DMIC pin*/
4038 if (rt5659->pdata.dmic1_data_pin != RT5659_DMIC1_NULL ||
4039 rt5659->pdata.dmic2_data_pin != RT5659_DMIC2_NULL) {
4040 regmap_update_bits(rt5659->regmap, RT5659_GPIO_CTRL_1,
4041 RT5659_GP2_PIN_MASK, RT5659_GP2_PIN_DMIC1_SCL);
4042
4043 switch (rt5659->pdata.dmic1_data_pin) {
4044 case RT5659_DMIC1_DATA_IN2N:
4045 regmap_update_bits(rt5659->regmap, RT5659_DMIC_CTRL_1,
4046 RT5659_DMIC_1_DP_MASK, RT5659_DMIC_1_DP_IN2N);
4047 break;
4048
4049 case RT5659_DMIC1_DATA_GPIO5:
4050 regmap_update_bits(rt5659->regmap,
4051 RT5659_GPIO_CTRL_3,
4052 RT5659_I2S2_PIN_MASK,
4053 RT5659_I2S2_PIN_GPIO);
4054 regmap_update_bits(rt5659->regmap, RT5659_DMIC_CTRL_1,
4055 RT5659_DMIC_1_DP_MASK, RT5659_DMIC_1_DP_GPIO5);
4056 regmap_update_bits(rt5659->regmap, RT5659_GPIO_CTRL_1,
4057 RT5659_GP5_PIN_MASK, RT5659_GP5_PIN_DMIC1_SDA);
4058 break;
4059
4060 case RT5659_DMIC1_DATA_GPIO9:
4061 regmap_update_bits(rt5659->regmap, RT5659_DMIC_CTRL_1,
4062 RT5659_DMIC_1_DP_MASK, RT5659_DMIC_1_DP_GPIO9);
4063 regmap_update_bits(rt5659->regmap, RT5659_GPIO_CTRL_1,
4064 RT5659_GP9_PIN_MASK, RT5659_GP9_PIN_DMIC1_SDA);
4065 break;
4066
4067 case RT5659_DMIC1_DATA_GPIO11:
4068 regmap_update_bits(rt5659->regmap, RT5659_DMIC_CTRL_1,
4069 RT5659_DMIC_1_DP_MASK, RT5659_DMIC_1_DP_GPIO11);
4070 regmap_update_bits(rt5659->regmap, RT5659_GPIO_CTRL_1,
4071 RT5659_GP11_PIN_MASK,
4072 RT5659_GP11_PIN_DMIC1_SDA);
4073 break;
4074
4075 default:
4076 dev_dbg(&i2c->dev, "no DMIC1\n");
4077 break;
4078 }
4079
4080 switch (rt5659->pdata.dmic2_data_pin) {
4081 case RT5659_DMIC2_DATA_IN2P:
4082 regmap_update_bits(rt5659->regmap,
4083 RT5659_DMIC_CTRL_1,
4084 RT5659_DMIC_2_DP_MASK,
4085 RT5659_DMIC_2_DP_IN2P);
4086 break;
4087
4088 case RT5659_DMIC2_DATA_GPIO6:
4089 regmap_update_bits(rt5659->regmap,
4090 RT5659_DMIC_CTRL_1,
4091 RT5659_DMIC_2_DP_MASK,
4092 RT5659_DMIC_2_DP_GPIO6);
4093 regmap_update_bits(rt5659->regmap,
4094 RT5659_GPIO_CTRL_1,
4095 RT5659_GP6_PIN_MASK,
4096 RT5659_GP6_PIN_DMIC2_SDA);
4097 break;
4098
4099 case RT5659_DMIC2_DATA_GPIO10:
4100 regmap_update_bits(rt5659->regmap,
4101 RT5659_DMIC_CTRL_1,
4102 RT5659_DMIC_2_DP_MASK,
4103 RT5659_DMIC_2_DP_GPIO10);
4104 regmap_update_bits(rt5659->regmap,
4105 RT5659_GPIO_CTRL_1,
4106 RT5659_GP10_PIN_MASK,
4107 RT5659_GP10_PIN_DMIC2_SDA);
4108 break;
4109
4110 case RT5659_DMIC2_DATA_GPIO12:
4111 regmap_update_bits(rt5659->regmap,
4112 RT5659_DMIC_CTRL_1,
4113 RT5659_DMIC_2_DP_MASK,
4114 RT5659_DMIC_2_DP_GPIO12);
4115 regmap_update_bits(rt5659->regmap,
4116 RT5659_GPIO_CTRL_1,
4117 RT5659_GP12_PIN_MASK,
4118 RT5659_GP12_PIN_DMIC2_SDA);
4119 break;
4120
4121 default:
4122 dev_dbg(&i2c->dev, "no DMIC2\n");
4123 break;
4124
4125 }
4126 } else {
4127 regmap_update_bits(rt5659->regmap, RT5659_GPIO_CTRL_1,
4128 RT5659_GP2_PIN_MASK | RT5659_GP5_PIN_MASK |
4129 RT5659_GP9_PIN_MASK | RT5659_GP11_PIN_MASK |
4130 RT5659_GP6_PIN_MASK | RT5659_GP10_PIN_MASK |
4131 RT5659_GP12_PIN_MASK,
4132 RT5659_GP2_PIN_GPIO2 | RT5659_GP5_PIN_GPIO5 |
4133 RT5659_GP9_PIN_GPIO9 | RT5659_GP11_PIN_GPIO11 |
4134 RT5659_GP6_PIN_GPIO6 | RT5659_GP10_PIN_GPIO10 |
4135 RT5659_GP12_PIN_GPIO12);
4136 regmap_update_bits(rt5659->regmap, RT5659_DMIC_CTRL_1,
4137 RT5659_DMIC_1_DP_MASK | RT5659_DMIC_2_DP_MASK,
4138 RT5659_DMIC_1_DP_IN2N | RT5659_DMIC_2_DP_IN2P);
4139 }
4140
4141 switch (rt5659->pdata.jd_src) {
4142 case RT5659_JD3:
4143 regmap_write(rt5659->regmap, RT5659_EJD_CTRL_1, 0xa880);
4144 regmap_write(rt5659->regmap, RT5659_RC_CLK_CTRL, 0x9000);
4145 regmap_write(rt5659->regmap, RT5659_GPIO_CTRL_1, 0xc800);
4146 regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1,
4147 RT5659_PWR_MB, RT5659_PWR_MB);
4148 regmap_write(rt5659->regmap, RT5659_PWR_ANLG_2, 0x0001);
4149 regmap_write(rt5659->regmap, RT5659_IRQ_CTRL_2, 0x0040);
4150 break;
4151 case RT5659_JD_NULL:
4152 break;
4153 default:
4154 dev_warn(&i2c->dev, "Currently, support JD3 only\n");
4155 break;
4156 }
4157
4158 INIT_DELAYED_WORK(&rt5659->jack_detect_work, rt5659_jack_detect_work);
4159
4160 if (rt5659->i2c->irq) {
4161 ret = request_threaded_irq(rt5659->i2c->irq, NULL, rt5659_irq,
4162 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
4163 | IRQF_ONESHOT, "rt5659", rt5659);
4164 if (ret)
4165 dev_err(&i2c->dev, "Failed to reguest IRQ: %d\n", ret);
4166
4167 }
4168
4169 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5659,
4170 rt5659_dai, ARRAY_SIZE(rt5659_dai));
4171
4172 if (ret) {
4173 if (rt5659->i2c->irq)
4174 free_irq(rt5659->i2c->irq, rt5659);
4175 }
4176
4177 return 0;
4178}
4179
4180static int rt5659_i2c_remove(struct i2c_client *i2c)
4181{
4182 snd_soc_unregister_codec(&i2c->dev);
4183
4184 return 0;
4185}
4186
4187void rt5659_i2c_shutdown(struct i2c_client *client)
4188{
4189 struct rt5659_priv *rt5659 = i2c_get_clientdata(client);
4190
4191 regmap_write(rt5659->regmap, RT5659_RESET, 0);
4192}
4193
4194static const struct of_device_id rt5659_of_match[] = {
4195 { .compatible = "realtek,rt5658", },
4196 { .compatible = "realtek,rt5659", },
4197 {},
4198};
4199
4200static struct acpi_device_id rt5659_acpi_match[] = {
4201 { "10EC5658", 0},
4202 { "10EC5659", 0},
4203 { },
4204};
4205MODULE_DEVICE_TABLE(acpi, rt5659_acpi_match);
4206
4207struct i2c_driver rt5659_i2c_driver = {
4208 .driver = {
4209 .name = "rt5659",
4210 .owner = THIS_MODULE,
4211 .of_match_table = rt5659_of_match,
4212 .acpi_match_table = ACPI_PTR(rt5659_acpi_match),
4213 },
4214 .probe = rt5659_i2c_probe,
4215 .remove = rt5659_i2c_remove,
4216 .shutdown = rt5659_i2c_shutdown,
4217 .id_table = rt5659_i2c_id,
4218};
4219module_i2c_driver(rt5659_i2c_driver);
4220
4221MODULE_DESCRIPTION("ASoC RT5659 driver");
4222MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
4223MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/codecs/rt5659.h b/sound/soc/codecs/rt5659.h
new file mode 100644
index 000000000000..8f07ee903eaa
--- /dev/null
+++ b/sound/soc/codecs/rt5659.h
@@ -0,0 +1,1819 @@
1/*
2 * rt5659.h -- RT5659/RT5658 ALSA SoC audio driver
3 *
4 * Copyright 2015 Realtek Microelectronics
5 * Author: Bard Liao <bardliao@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#ifndef __RT5659_H__
13#define __RT5659_H__
14
15#include <sound/rt5659.h>
16
17#define DEVICE_ID 0x6311
18
19/* Info */
20#define RT5659_RESET 0x0000
21#define RT5659_VENDOR_ID 0x00fd
22#define RT5659_VENDOR_ID_1 0x00fe
23#define RT5659_DEVICE_ID 0x00ff
24/* I/O - Output */
25#define RT5659_SPO_VOL 0x0001
26#define RT5659_HP_VOL 0x0002
27#define RT5659_LOUT 0x0003
28#define RT5659_MONO_OUT 0x0004
29#define RT5659_HPL_GAIN 0x0005
30#define RT5659_HPR_GAIN 0x0006
31#define RT5659_MONO_GAIN 0x0007
32#define RT5659_SPDIF_CTRL_1 0x0008
33#define RT5659_SPDIF_CTRL_2 0x0009
34/* I/O - Input */
35#define RT5659_CAL_BST_CTRL 0x000a
36#define RT5659_IN1_IN2 0x000c
37#define RT5659_IN3_IN4 0x000d
38#define RT5659_INL1_INR1_VOL 0x000f
39/* I/O - Speaker */
40#define RT5659_EJD_CTRL_1 0x0010
41#define RT5659_EJD_CTRL_2 0x0011
42#define RT5659_EJD_CTRL_3 0x0012
43#define RT5659_SILENCE_CTRL 0x0015
44#define RT5659_PSV_CTRL 0x0016
45/* I/O - Sidetone */
46#define RT5659_SIDETONE_CTRL 0x0018
47/* I/O - ADC/DAC/DMIC */
48#define RT5659_DAC1_DIG_VOL 0x0019
49#define RT5659_DAC2_DIG_VOL 0x001a
50#define RT5659_DAC_CTRL 0x001b
51#define RT5659_STO1_ADC_DIG_VOL 0x001c
52#define RT5659_MONO_ADC_DIG_VOL 0x001d
53#define RT5659_STO2_ADC_DIG_VOL 0x001e
54#define RT5659_STO1_BOOST 0x001f
55#define RT5659_MONO_BOOST 0x0020
56#define RT5659_STO2_BOOST 0x0021
57#define RT5659_HP_IMP_GAIN_1 0x0022
58#define RT5659_HP_IMP_GAIN_2 0x0023
59/* Mixer - D-D */
60#define RT5659_STO1_ADC_MIXER 0x0026
61#define RT5659_MONO_ADC_MIXER 0x0027
62#define RT5659_AD_DA_MIXER 0x0029
63#define RT5659_STO_DAC_MIXER 0x002a
64#define RT5659_MONO_DAC_MIXER 0x002b
65#define RT5659_DIG_MIXER 0x002c
66#define RT5659_A_DAC_MUX 0x002d
67#define RT5659_DIG_INF23_DATA 0x002f
68/* Mixer - PDM */
69#define RT5659_PDM_OUT_CTRL 0x0031
70#define RT5659_PDM_DATA_CTRL_1 0x0032
71#define RT5659_PDM_DATA_CTRL_2 0x0033
72#define RT5659_PDM_DATA_CTRL_3 0x0034
73#define RT5659_PDM_DATA_CTRL_4 0x0035
74#define RT5659_SPDIF_CTRL 0x0036
75
76/* Mixer - ADC */
77#define RT5659_REC1_GAIN 0x003a
78#define RT5659_REC1_L1_MIXER 0x003b
79#define RT5659_REC1_L2_MIXER 0x003c
80#define RT5659_REC1_R1_MIXER 0x003d
81#define RT5659_REC1_R2_MIXER 0x003e
82#define RT5659_CAL_REC 0x0040
83#define RT5659_REC2_L1_MIXER 0x009b
84#define RT5659_REC2_L2_MIXER 0x009c
85#define RT5659_REC2_R1_MIXER 0x009d
86#define RT5659_REC2_R2_MIXER 0x009e
87#define RT5659_RC_CLK_CTRL 0x009f
88/* Mixer - DAC */
89#define RT5659_SPK_L_MIXER 0x0046
90#define RT5659_SPK_R_MIXER 0x0047
91#define RT5659_SPO_AMP_GAIN 0x0048
92#define RT5659_ALC_BACK_GAIN 0x0049
93#define RT5659_MONOMIX_GAIN 0x004a
94#define RT5659_MONOMIX_IN_GAIN 0x004b
95#define RT5659_OUT_L_GAIN 0x004d
96#define RT5659_OUT_L_MIXER 0x004e
97#define RT5659_OUT_R_GAIN 0x004f
98#define RT5659_OUT_R_MIXER 0x0050
99#define RT5659_LOUT_MIXER 0x0052
100
101#define RT5659_HAPTIC_GEN_CTRL_1 0x0053
102#define RT5659_HAPTIC_GEN_CTRL_2 0x0054
103#define RT5659_HAPTIC_GEN_CTRL_3 0x0055
104#define RT5659_HAPTIC_GEN_CTRL_4 0x0056
105#define RT5659_HAPTIC_GEN_CTRL_5 0x0057
106#define RT5659_HAPTIC_GEN_CTRL_6 0x0058
107#define RT5659_HAPTIC_GEN_CTRL_7 0x0059
108#define RT5659_HAPTIC_GEN_CTRL_8 0x005a
109#define RT5659_HAPTIC_GEN_CTRL_9 0x005b
110#define RT5659_HAPTIC_GEN_CTRL_10 0x005c
111#define RT5659_HAPTIC_GEN_CTRL_11 0x005d
112#define RT5659_HAPTIC_LPF_CTRL_1 0x005e
113#define RT5659_HAPTIC_LPF_CTRL_2 0x005f
114#define RT5659_HAPTIC_LPF_CTRL_3 0x0060
115/* Power */
116#define RT5659_PWR_DIG_1 0x0061
117#define RT5659_PWR_DIG_2 0x0062
118#define RT5659_PWR_ANLG_1 0x0063
119#define RT5659_PWR_ANLG_2 0x0064
120#define RT5659_PWR_ANLG_3 0x0065
121#define RT5659_PWR_MIXER 0x0066
122#define RT5659_PWR_VOL 0x0067
123/* Private Register Control */
124#define RT5659_PRIV_INDEX 0x006a
125#define RT5659_CLK_DET 0x006b
126#define RT5659_PRIV_DATA 0x006c
127/* System Clock Pre Divider Gating Control */
128#define RT5659_PRE_DIV_1 0x006e
129#define RT5659_PRE_DIV_2 0x006f
130/* Format - ADC/DAC */
131#define RT5659_I2S1_SDP 0x0070
132#define RT5659_I2S2_SDP 0x0071
133#define RT5659_I2S3_SDP 0x0072
134#define RT5659_ADDA_CLK_1 0x0073
135#define RT5659_ADDA_CLK_2 0x0074
136#define RT5659_DMIC_CTRL_1 0x0075
137#define RT5659_DMIC_CTRL_2 0x0076
138/* Format - TDM Control */
139#define RT5659_TDM_CTRL_1 0x0077
140#define RT5659_TDM_CTRL_2 0x0078
141#define RT5659_TDM_CTRL_3 0x0079
142#define RT5659_TDM_CTRL_4 0x007a
143#define RT5659_TDM_CTRL_5 0x007b
144
145/* Function - Analog */
146#define RT5659_GLB_CLK 0x0080
147#define RT5659_PLL_CTRL_1 0x0081
148#define RT5659_PLL_CTRL_2 0x0082
149#define RT5659_ASRC_1 0x0083
150#define RT5659_ASRC_2 0x0084
151#define RT5659_ASRC_3 0x0085
152#define RT5659_ASRC_4 0x0086
153#define RT5659_ASRC_5 0x0087
154#define RT5659_ASRC_6 0x0088
155#define RT5659_ASRC_7 0x0089
156#define RT5659_ASRC_8 0x008a
157#define RT5659_ASRC_9 0x008b
158#define RT5659_ASRC_10 0x008c
159#define RT5659_DEPOP_1 0x008e
160#define RT5659_DEPOP_2 0x008f
161#define RT5659_DEPOP_3 0x0090
162#define RT5659_HP_CHARGE_PUMP_1 0x0091
163#define RT5659_HP_CHARGE_PUMP_2 0x0092
164#define RT5659_MICBIAS_1 0x0093
165#define RT5659_MICBIAS_2 0x0094
166#define RT5659_ASRC_11 0x0097
167#define RT5659_ASRC_12 0x0098
168#define RT5659_ASRC_13 0x0099
169#define RT5659_REC_M1_M2_GAIN_CTRL 0x009a
170#define RT5659_CLASSD_CTRL_1 0x00a0
171#define RT5659_CLASSD_CTRL_2 0x00a1
172
173/* Function - Digital */
174#define RT5659_ADC_EQ_CTRL_1 0x00ae
175#define RT5659_ADC_EQ_CTRL_2 0x00af
176#define RT5659_DAC_EQ_CTRL_1 0x00b0
177#define RT5659_DAC_EQ_CTRL_2 0x00b1
178#define RT5659_DAC_EQ_CTRL_3 0x00b2
179
180#define RT5659_IRQ_CTRL_1 0x00b6
181#define RT5659_IRQ_CTRL_2 0x00b7
182#define RT5659_IRQ_CTRL_3 0x00b8
183#define RT5659_IRQ_CTRL_4 0x00b9
184#define RT5659_IRQ_CTRL_5 0x00ba
185#define RT5659_IRQ_CTRL_6 0x00bb
186#define RT5659_INT_ST_1 0x00be
187#define RT5659_INT_ST_2 0x00bf
188#define RT5659_GPIO_CTRL_1 0x00c0
189#define RT5659_GPIO_CTRL_2 0x00c1
190#define RT5659_GPIO_CTRL_3 0x00c2
191#define RT5659_GPIO_CTRL_4 0x00c3
192#define RT5659_GPIO_CTRL_5 0x00c4
193#define RT5659_GPIO_STA 0x00c5
194#define RT5659_SINE_GEN_CTRL_1 0x00cb
195#define RT5659_SINE_GEN_CTRL_2 0x00cc
196#define RT5659_SINE_GEN_CTRL_3 0x00cd
197#define RT5659_HP_AMP_DET_CTRL_1 0x00d6
198#define RT5659_HP_AMP_DET_CTRL_2 0x00d7
199#define RT5659_SV_ZCD_1 0x00d9
200#define RT5659_SV_ZCD_2 0x00da
201#define RT5659_IL_CMD_1 0x00db
202#define RT5659_IL_CMD_2 0x00dc
203#define RT5659_IL_CMD_3 0x00dd
204#define RT5659_IL_CMD_4 0x00de
205#define RT5659_4BTN_IL_CMD_1 0x00df
206#define RT5659_4BTN_IL_CMD_2 0x00e0
207#define RT5659_4BTN_IL_CMD_3 0x00e1
208#define RT5659_PSV_IL_CMD_1 0x00e4
209#define RT5659_PSV_IL_CMD_2 0x00e5
210
211#define RT5659_ADC_STO1_HP_CTRL_1 0x00ea
212#define RT5659_ADC_STO1_HP_CTRL_2 0x00eb
213#define RT5659_ADC_MONO_HP_CTRL_1 0x00ec
214#define RT5659_ADC_MONO_HP_CTRL_2 0x00ed
215#define RT5659_AJD1_CTRL 0x00f0
216#define RT5659_AJD2_AJD3_CTRL 0x00f1
217#define RT5659_JD1_THD 0x00f2
218#define RT5659_JD2_THD 0x00f3
219#define RT5659_JD3_THD 0x00f4
220#define RT5659_JD_CTRL_1 0x00f6
221#define RT5659_JD_CTRL_2 0x00f7
222#define RT5659_JD_CTRL_3 0x00f8
223#define RT5659_JD_CTRL_4 0x00f9
224/* General Control */
225#define RT5659_DIG_MISC 0x00fa
226#define RT5659_DUMMY_2 0x00fb
227#define RT5659_DUMMY_3 0x00fc
228
229#define RT5659_DAC_ADC_DIG_VOL 0x0100
230#define RT5659_BIAS_CUR_CTRL_1 0x010a
231#define RT5659_BIAS_CUR_CTRL_2 0x010b
232#define RT5659_BIAS_CUR_CTRL_3 0x010c
233#define RT5659_BIAS_CUR_CTRL_4 0x010d
234#define RT5659_BIAS_CUR_CTRL_5 0x010e
235#define RT5659_BIAS_CUR_CTRL_6 0x010f
236#define RT5659_BIAS_CUR_CTRL_7 0x0110
237#define RT5659_BIAS_CUR_CTRL_8 0x0111
238#define RT5659_BIAS_CUR_CTRL_9 0x0112
239#define RT5659_BIAS_CUR_CTRL_10 0x0113
240#define RT5659_MEMORY_TEST 0x0116
241#define RT5659_VREF_REC_OP_FB_CAP_CTRL 0x0117
242#define RT5659_CLASSD_0 0x011a
243#define RT5659_CLASSD_1 0x011b
244#define RT5659_CLASSD_2 0x011c
245#define RT5659_CLASSD_3 0x011d
246#define RT5659_CLASSD_4 0x011e
247#define RT5659_CLASSD_5 0x011f
248#define RT5659_CLASSD_6 0x0120
249#define RT5659_CLASSD_7 0x0121
250#define RT5659_CLASSD_8 0x0122
251#define RT5659_CLASSD_9 0x0123
252#define RT5659_CLASSD_10 0x0124
253#define RT5659_CHARGE_PUMP_1 0x0125
254#define RT5659_CHARGE_PUMP_2 0x0126
255#define RT5659_DIG_IN_CTRL_1 0x0132
256#define RT5659_DIG_IN_CTRL_2 0x0133
257#define RT5659_PAD_DRIVING_CTRL 0x0137
258#define RT5659_SOFT_RAMP_DEPOP 0x0138
259#define RT5659_PLL 0x0139
260#define RT5659_CHOP_DAC 0x013a
261#define RT5659_CHOP_ADC 0x013b
262#define RT5659_CALIB_ADC_CTRL 0x013c
263#define RT5659_SOFT_RAMP_DEPOP_DAC_CLK_CTRL 0x013e
264#define RT5659_VOL_TEST 0x013f
265#define RT5659_TEST_MODE_CTRL_1 0x0145
266#define RT5659_TEST_MODE_CTRL_2 0x0146
267#define RT5659_TEST_MODE_CTRL_3 0x0147
268#define RT5659_TEST_MODE_CTRL_4 0x0148
269#define RT5659_BASSBACK_CTRL 0x0150
270#define RT5659_MP3_PLUS_CTRL_1 0x0151
271#define RT5659_MP3_PLUS_CTRL_2 0x0152
272#define RT5659_MP3_HPF_A1 0x0153
273#define RT5659_MP3_HPF_A2 0x0154
274#define RT5659_MP3_HPF_H0 0x0155
275#define RT5659_MP3_LPF_H0 0x0156
276#define RT5659_3D_SPK_CTRL 0x0157
277#define RT5659_3D_SPK_COEF_1 0x0158
278#define RT5659_3D_SPK_COEF_2 0x0159
279#define RT5659_3D_SPK_COEF_3 0x015a
280#define RT5659_3D_SPK_COEF_4 0x015b
281#define RT5659_3D_SPK_COEF_5 0x015c
282#define RT5659_3D_SPK_COEF_6 0x015d
283#define RT5659_3D_SPK_COEF_7 0x015e
284#define RT5659_STO_NG2_CTRL_1 0x0160
285#define RT5659_STO_NG2_CTRL_2 0x0161
286#define RT5659_STO_NG2_CTRL_3 0x0162
287#define RT5659_STO_NG2_CTRL_4 0x0163
288#define RT5659_STO_NG2_CTRL_5 0x0164
289#define RT5659_STO_NG2_CTRL_6 0x0165
290#define RT5659_STO_NG2_CTRL_7 0x0166
291#define RT5659_STO_NG2_CTRL_8 0x0167
292#define RT5659_MONO_NG2_CTRL_1 0x0170
293#define RT5659_MONO_NG2_CTRL_2 0x0171
294#define RT5659_MONO_NG2_CTRL_3 0x0172
295#define RT5659_MONO_NG2_CTRL_4 0x0173
296#define RT5659_MONO_NG2_CTRL_5 0x0174
297#define RT5659_MONO_NG2_CTRL_6 0x0175
298#define RT5659_MID_HP_AMP_DET 0x0190
299#define RT5659_LOW_HP_AMP_DET 0x0191
300#define RT5659_LDO_CTRL 0x0192
301#define RT5659_HP_DECROSS_CTRL_1 0x01b0
302#define RT5659_HP_DECROSS_CTRL_2 0x01b1
303#define RT5659_HP_DECROSS_CTRL_3 0x01b2
304#define RT5659_HP_DECROSS_CTRL_4 0x01b3
305#define RT5659_HP_IMP_SENS_CTRL_1 0x01c0
306#define RT5659_HP_IMP_SENS_CTRL_2 0x01c1
307#define RT5659_HP_IMP_SENS_CTRL_3 0x01c2
308#define RT5659_HP_IMP_SENS_CTRL_4 0x01c3
309#define RT5659_HP_IMP_SENS_MAP_1 0x01c7
310#define RT5659_HP_IMP_SENS_MAP_2 0x01c8
311#define RT5659_HP_IMP_SENS_MAP_3 0x01c9
312#define RT5659_HP_IMP_SENS_MAP_4 0x01ca
313#define RT5659_HP_IMP_SENS_MAP_5 0x01cb
314#define RT5659_HP_IMP_SENS_MAP_6 0x01cc
315#define RT5659_HP_IMP_SENS_MAP_7 0x01cd
316#define RT5659_HP_IMP_SENS_MAP_8 0x01ce
317#define RT5659_HP_LOGIC_CTRL_1 0x01da
318#define RT5659_HP_LOGIC_CTRL_2 0x01db
319#define RT5659_HP_CALIB_CTRL_1 0x01de
320#define RT5659_HP_CALIB_CTRL_2 0x01df
321#define RT5659_HP_CALIB_CTRL_3 0x01e0
322#define RT5659_HP_CALIB_CTRL_4 0x01e1
323#define RT5659_HP_CALIB_CTRL_5 0x01e2
324#define RT5659_HP_CALIB_CTRL_6 0x01e3
325#define RT5659_HP_CALIB_CTRL_7 0x01e4
326#define RT5659_HP_CALIB_CTRL_9 0x01e6
327#define RT5659_HP_CALIB_CTRL_10 0x01e7
328#define RT5659_HP_CALIB_CTRL_11 0x01e8
329#define RT5659_HP_CALIB_STA_1 0x01ea
330#define RT5659_HP_CALIB_STA_2 0x01eb
331#define RT5659_HP_CALIB_STA_3 0x01ec
332#define RT5659_HP_CALIB_STA_4 0x01ed
333#define RT5659_HP_CALIB_STA_5 0x01ee
334#define RT5659_HP_CALIB_STA_6 0x01ef
335#define RT5659_HP_CALIB_STA_7 0x01f0
336#define RT5659_HP_CALIB_STA_8 0x01f1
337#define RT5659_HP_CALIB_STA_9 0x01f2
338#define RT5659_MONO_AMP_CALIB_CTRL_1 0x01f6
339#define RT5659_MONO_AMP_CALIB_CTRL_2 0x01f7
340#define RT5659_MONO_AMP_CALIB_CTRL_3 0x01f8
341#define RT5659_MONO_AMP_CALIB_CTRL_4 0x01f9
342#define RT5659_MONO_AMP_CALIB_CTRL_5 0x01fa
343#define RT5659_MONO_AMP_CALIB_STA_1 0x01fb
344#define RT5659_MONO_AMP_CALIB_STA_2 0x01fc
345#define RT5659_MONO_AMP_CALIB_STA_3 0x01fd
346#define RT5659_MONO_AMP_CALIB_STA_4 0x01fe
347#define RT5659_SPK_PWR_LMT_CTRL_1 0x0200
348#define RT5659_SPK_PWR_LMT_CTRL_2 0x0201
349#define RT5659_SPK_PWR_LMT_CTRL_3 0x0202
350#define RT5659_SPK_PWR_LMT_STA_1 0x0203
351#define RT5659_SPK_PWR_LMT_STA_2 0x0204
352#define RT5659_SPK_PWR_LMT_STA_3 0x0205
353#define RT5659_SPK_PWR_LMT_STA_4 0x0206
354#define RT5659_SPK_PWR_LMT_STA_5 0x0207
355#define RT5659_SPK_PWR_LMT_STA_6 0x0208
356#define RT5659_FLEX_SPK_BST_CTRL_1 0x0256
357#define RT5659_FLEX_SPK_BST_CTRL_2 0x0257
358#define RT5659_FLEX_SPK_BST_CTRL_3 0x0258
359#define RT5659_FLEX_SPK_BST_CTRL_4 0x0259
360#define RT5659_SPK_EX_LMT_CTRL_1 0x025a
361#define RT5659_SPK_EX_LMT_CTRL_2 0x025b
362#define RT5659_SPK_EX_LMT_CTRL_3 0x025c
363#define RT5659_SPK_EX_LMT_CTRL_4 0x025d
364#define RT5659_SPK_EX_LMT_CTRL_5 0x025e
365#define RT5659_SPK_EX_LMT_CTRL_6 0x025f
366#define RT5659_SPK_EX_LMT_CTRL_7 0x0260
367#define RT5659_ADJ_HPF_CTRL_1 0x0261
368#define RT5659_ADJ_HPF_CTRL_2 0x0262
369#define RT5659_SPK_DC_CAILB_CTRL_1 0x0265
370#define RT5659_SPK_DC_CAILB_CTRL_2 0x0266
371#define RT5659_SPK_DC_CAILB_CTRL_3 0x0267
372#define RT5659_SPK_DC_CAILB_CTRL_4 0x0268
373#define RT5659_SPK_DC_CAILB_CTRL_5 0x0269
374#define RT5659_SPK_DC_CAILB_STA_1 0x026a
375#define RT5659_SPK_DC_CAILB_STA_2 0x026b
376#define RT5659_SPK_DC_CAILB_STA_3 0x026c
377#define RT5659_SPK_DC_CAILB_STA_4 0x026d
378#define RT5659_SPK_DC_CAILB_STA_5 0x026e
379#define RT5659_SPK_DC_CAILB_STA_6 0x026f
380#define RT5659_SPK_DC_CAILB_STA_7 0x0270
381#define RT5659_SPK_DC_CAILB_STA_8 0x0271
382#define RT5659_SPK_DC_CAILB_STA_9 0x0272
383#define RT5659_SPK_DC_CAILB_STA_10 0x0273
384#define RT5659_SPK_VDD_STA_1 0x0280
385#define RT5659_SPK_VDD_STA_2 0x0281
386#define RT5659_SPK_DC_DET_CTRL_1 0x0282
387#define RT5659_SPK_DC_DET_CTRL_2 0x0283
388#define RT5659_SPK_DC_DET_CTRL_3 0x0284
389#define RT5659_PURE_DC_DET_CTRL_1 0x0290
390#define RT5659_PURE_DC_DET_CTRL_2 0x0291
391#define RT5659_DUMMY_4 0x02fa
392#define RT5659_DUMMY_5 0x02fb
393#define RT5659_DUMMY_6 0x02fc
394#define RT5659_DRC1_CTRL_1 0x0300
395#define RT5659_DRC1_CTRL_2 0x0301
396#define RT5659_DRC1_CTRL_3 0x0302
397#define RT5659_DRC1_CTRL_4 0x0303
398#define RT5659_DRC1_CTRL_5 0x0304
399#define RT5659_DRC1_CTRL_6 0x0305
400#define RT5659_DRC1_HARD_LMT_CTRL_1 0x0306
401#define RT5659_DRC1_HARD_LMT_CTRL_2 0x0307
402#define RT5659_DRC2_CTRL_1 0x0308
403#define RT5659_DRC2_CTRL_2 0x0309
404#define RT5659_DRC2_CTRL_3 0x030a
405#define RT5659_DRC2_CTRL_4 0x030b
406#define RT5659_DRC2_CTRL_5 0x030c
407#define RT5659_DRC2_CTRL_6 0x030d
408#define RT5659_DRC2_HARD_LMT_CTRL_1 0x030e
409#define RT5659_DRC2_HARD_LMT_CTRL_2 0x030f
410#define RT5659_DRC1_PRIV_1 0x0310
411#define RT5659_DRC1_PRIV_2 0x0311
412#define RT5659_DRC1_PRIV_3 0x0312
413#define RT5659_DRC1_PRIV_4 0x0313
414#define RT5659_DRC1_PRIV_5 0x0314
415#define RT5659_DRC1_PRIV_6 0x0315
416#define RT5659_DRC1_PRIV_7 0x0316
417#define RT5659_DRC2_PRIV_1 0x0317
418#define RT5659_DRC2_PRIV_2 0x0318
419#define RT5659_DRC2_PRIV_3 0x0319
420#define RT5659_DRC2_PRIV_4 0x031a
421#define RT5659_DRC2_PRIV_5 0x031b
422#define RT5659_DRC2_PRIV_6 0x031c
423#define RT5659_DRC2_PRIV_7 0x031d
424#define RT5659_MULTI_DRC_CTRL 0x0320
425#define RT5659_CROSS_OVER_1 0x0321
426#define RT5659_CROSS_OVER_2 0x0322
427#define RT5659_CROSS_OVER_3 0x0323
428#define RT5659_CROSS_OVER_4 0x0324
429#define RT5659_CROSS_OVER_5 0x0325
430#define RT5659_CROSS_OVER_6 0x0326
431#define RT5659_CROSS_OVER_7 0x0327
432#define RT5659_CROSS_OVER_8 0x0328
433#define RT5659_CROSS_OVER_9 0x0329
434#define RT5659_CROSS_OVER_10 0x032a
435#define RT5659_ALC_PGA_CTRL_1 0x0330
436#define RT5659_ALC_PGA_CTRL_2 0x0331
437#define RT5659_ALC_PGA_CTRL_3 0x0332
438#define RT5659_ALC_PGA_CTRL_4 0x0333
439#define RT5659_ALC_PGA_CTRL_5 0x0334
440#define RT5659_ALC_PGA_CTRL_6 0x0335
441#define RT5659_ALC_PGA_CTRL_7 0x0336
442#define RT5659_ALC_PGA_CTRL_8 0x0337
443#define RT5659_ALC_PGA_STA_1 0x0338
444#define RT5659_ALC_PGA_STA_2 0x0339
445#define RT5659_ALC_PGA_STA_3 0x033a
446#define RT5659_DAC_L_EQ_PRE_VOL 0x0340
447#define RT5659_DAC_R_EQ_PRE_VOL 0x0341
448#define RT5659_DAC_L_EQ_POST_VOL 0x0342
449#define RT5659_DAC_R_EQ_POST_VOL 0x0343
450#define RT5659_DAC_L_EQ_LPF1_A1 0x0344
451#define RT5659_DAC_L_EQ_LPF1_H0 0x0345
452#define RT5659_DAC_R_EQ_LPF1_A1 0x0346
453#define RT5659_DAC_R_EQ_LPF1_H0 0x0347
454#define RT5659_DAC_L_EQ_BPF2_A1 0x0348
455#define RT5659_DAC_L_EQ_BPF2_A2 0x0349
456#define RT5659_DAC_L_EQ_BPF2_H0 0x034a
457#define RT5659_DAC_R_EQ_BPF2_A1 0x034b
458#define RT5659_DAC_R_EQ_BPF2_A2 0x034c
459#define RT5659_DAC_R_EQ_BPF2_H0 0x034d
460#define RT5659_DAC_L_EQ_BPF3_A1 0x034e
461#define RT5659_DAC_L_EQ_BPF3_A2 0x034f
462#define RT5659_DAC_L_EQ_BPF3_H0 0x0350
463#define RT5659_DAC_R_EQ_BPF3_A1 0x0351
464#define RT5659_DAC_R_EQ_BPF3_A2 0x0352
465#define RT5659_DAC_R_EQ_BPF3_H0 0x0353
466#define RT5659_DAC_L_EQ_BPF4_A1 0x0354
467#define RT5659_DAC_L_EQ_BPF4_A2 0x0355
468#define RT5659_DAC_L_EQ_BPF4_H0 0x0356
469#define RT5659_DAC_R_EQ_BPF4_A1 0x0357
470#define RT5659_DAC_R_EQ_BPF4_A2 0x0358
471#define RT5659_DAC_R_EQ_BPF4_H0 0x0359
472#define RT5659_DAC_L_EQ_HPF1_A1 0x035a
473#define RT5659_DAC_L_EQ_HPF1_H0 0x035b
474#define RT5659_DAC_R_EQ_HPF1_A1 0x035c
475#define RT5659_DAC_R_EQ_HPF1_H0 0x035d
476#define RT5659_DAC_L_EQ_HPF2_A1 0x035e
477#define RT5659_DAC_L_EQ_HPF2_A2 0x035f
478#define RT5659_DAC_L_EQ_HPF2_H0 0x0360
479#define RT5659_DAC_R_EQ_HPF2_A1 0x0361
480#define RT5659_DAC_R_EQ_HPF2_A2 0x0362
481#define RT5659_DAC_R_EQ_HPF2_H0 0x0363
482#define RT5659_DAC_L_BI_EQ_BPF1_H0_1 0x0364
483#define RT5659_DAC_L_BI_EQ_BPF1_H0_2 0x0365
484#define RT5659_DAC_L_BI_EQ_BPF1_B1_1 0x0366
485#define RT5659_DAC_L_BI_EQ_BPF1_B1_2 0x0367
486#define RT5659_DAC_L_BI_EQ_BPF1_B2_1 0x0368
487#define RT5659_DAC_L_BI_EQ_BPF1_B2_2 0x0369
488#define RT5659_DAC_L_BI_EQ_BPF1_A1_1 0x036a
489#define RT5659_DAC_L_BI_EQ_BPF1_A1_2 0x036b
490#define RT5659_DAC_L_BI_EQ_BPF1_A2_1 0x036c
491#define RT5659_DAC_L_BI_EQ_BPF1_A2_2 0x036d
492#define RT5659_DAC_R_BI_EQ_BPF1_H0_1 0x036e
493#define RT5659_DAC_R_BI_EQ_BPF1_H0_2 0x036f
494#define RT5659_DAC_R_BI_EQ_BPF1_B1_1 0x0370
495#define RT5659_DAC_R_BI_EQ_BPF1_B1_2 0x0371
496#define RT5659_DAC_R_BI_EQ_BPF1_B2_1 0x0372
497#define RT5659_DAC_R_BI_EQ_BPF1_B2_2 0x0373
498#define RT5659_DAC_R_BI_EQ_BPF1_A1_1 0x0374
499#define RT5659_DAC_R_BI_EQ_BPF1_A1_2 0x0375
500#define RT5659_DAC_R_BI_EQ_BPF1_A2_1 0x0376
501#define RT5659_DAC_R_BI_EQ_BPF1_A2_2 0x0377
502#define RT5659_ADC_L_EQ_LPF1_A1 0x03d0
503#define RT5659_ADC_R_EQ_LPF1_A1 0x03d1
504#define RT5659_ADC_L_EQ_LPF1_H0 0x03d2
505#define RT5659_ADC_R_EQ_LPF1_H0 0x03d3
506#define RT5659_ADC_L_EQ_BPF1_A1 0x03d4
507#define RT5659_ADC_R_EQ_BPF1_A1 0x03d5
508#define RT5659_ADC_L_EQ_BPF1_A2 0x03d6
509#define RT5659_ADC_R_EQ_BPF1_A2 0x03d7
510#define RT5659_ADC_L_EQ_BPF1_H0 0x03d8
511#define RT5659_ADC_R_EQ_BPF1_H0 0x03d9
512#define RT5659_ADC_L_EQ_BPF2_A1 0x03da
513#define RT5659_ADC_R_EQ_BPF2_A1 0x03db
514#define RT5659_ADC_L_EQ_BPF2_A2 0x03dc
515#define RT5659_ADC_R_EQ_BPF2_A2 0x03dd
516#define RT5659_ADC_L_EQ_BPF2_H0 0x03de
517#define RT5659_ADC_R_EQ_BPF2_H0 0x03df
518#define RT5659_ADC_L_EQ_BPF3_A1 0x03e0
519#define RT5659_ADC_R_EQ_BPF3_A1 0x03e1
520#define RT5659_ADC_L_EQ_BPF3_A2 0x03e2
521#define RT5659_ADC_R_EQ_BPF3_A2 0x03e3
522#define RT5659_ADC_L_EQ_BPF3_H0 0x03e4
523#define RT5659_ADC_R_EQ_BPF3_H0 0x03e5
524#define RT5659_ADC_L_EQ_BPF4_A1 0x03e6
525#define RT5659_ADC_R_EQ_BPF4_A1 0x03e7
526#define RT5659_ADC_L_EQ_BPF4_A2 0x03e8
527#define RT5659_ADC_R_EQ_BPF4_A2 0x03e9
528#define RT5659_ADC_L_EQ_BPF4_H0 0x03ea
529#define RT5659_ADC_R_EQ_BPF4_H0 0x03eb
530#define RT5659_ADC_L_EQ_HPF1_A1 0x03ec
531#define RT5659_ADC_R_EQ_HPF1_A1 0x03ed
532#define RT5659_ADC_L_EQ_HPF1_H0 0x03ee
533#define RT5659_ADC_R_EQ_HPF1_H0 0x03ef
534#define RT5659_ADC_L_EQ_PRE_VOL 0x03f0
535#define RT5659_ADC_R_EQ_PRE_VOL 0x03f1
536#define RT5659_ADC_L_EQ_POST_VOL 0x03f2
537#define RT5659_ADC_R_EQ_POST_VOL 0x03f3
538
539
540
541/* global definition */
542#define RT5659_L_MUTE (0x1 << 15)
543#define RT5659_L_MUTE_SFT 15
544#define RT5659_VOL_L_MUTE (0x1 << 14)
545#define RT5659_VOL_L_SFT 14
546#define RT5659_R_MUTE (0x1 << 7)
547#define RT5659_R_MUTE_SFT 7
548#define RT5659_VOL_R_MUTE (0x1 << 6)
549#define RT5659_VOL_R_SFT 6
550#define RT5659_L_VOL_MASK (0x3f << 8)
551#define RT5659_L_VOL_SFT 8
552#define RT5659_R_VOL_MASK (0x3f)
553#define RT5659_R_VOL_SFT 0
554
555/*Headphone Amp L/R Analog Gain and Digital NG2 Gain Control (0x0005 0x0006)*/
556#define RT5659_G_HP (0x1f << 8)
557#define RT5659_G_HP_SFT 8
558#define RT5659_G_STO_DA_DMIX (0x1f)
559#define RT5659_G_STO_DA_SFT 0
560
561/* IN1/IN2 Control (0x000c) */
562#define RT5659_IN1_DF_MASK (0x1 << 15)
563#define RT5659_IN1_DF 15
564#define RT5659_BST1_MASK (0x7f << 8)
565#define RT5659_BST1_SFT 8
566#define RT5659_BST2_MASK (0x7f)
567#define RT5659_BST2_SFT 0
568
569/* IN3/IN4 Control (0x000d) */
570#define RT5659_IN3_DF_MASK (0x1 << 15)
571#define RT5659_IN3_DF 15
572#define RT5659_BST3_MASK (0x7f << 8)
573#define RT5659_BST3_SFT 8
574#define RT5659_IN4_DF_MASK (0x1 << 7)
575#define RT5659_IN4_DF 7
576#define RT5659_BST4_MASK (0x7f)
577#define RT5659_BST4_SFT 0
578
579/* INL and INR Volume Control (0x000f) */
580#define RT5659_INL_VOL_MASK (0x1f << 8)
581#define RT5659_INL_VOL_SFT 8
582#define RT5659_INR_VOL_MASK (0x1f)
583#define RT5659_INR_VOL_SFT 0
584
585/* Embeeded Jack and Type Detection Control 1 (0x0010) */
586#define RT5659_EMB_JD_EN (0x1 << 15)
587#define RT5659_EMB_JD_EN_SFT 15
588#define RT5659_JD_MODE (0x1 << 13)
589#define RT5659_JD_MODE_SFT 13
590#define RT5659_EXT_JD_EN (0x1 << 11)
591#define RT5659_EXT_JD_EN_SFT 11
592#define RT5659_EXT_JD_DIG (0x1 << 9)
593
594/* Embeeded Jack and Type Detection Control 2 (0x0011) */
595#define RT5659_EXT_JD_SRC (0x7 << 4)
596#define RT5659_EXT_JD_SRC_SFT 4
597#define RT5659_EXT_JD_SRC_GPIO_JD1 (0x0 << 4)
598#define RT5659_EXT_JD_SRC_GPIO_JD2 (0x1 << 4)
599#define RT5659_EXT_JD_SRC_JD1_1 (0x2 << 4)
600#define RT5659_EXT_JD_SRC_JD1_2 (0x3 << 4)
601#define RT5659_EXT_JD_SRC_JD2 (0x4 << 4)
602#define RT5659_EXT_JD_SRC_JD3 (0x5 << 4)
603#define RT5659_EXT_JD_SRC_MANUAL (0x6 << 4)
604
605/* Slience Detection Control (0x0015) */
606#define RT5659_SIL_DET_MASK (0x1 << 15)
607#define RT5659_SIL_DET_DIS (0x0 << 15)
608#define RT5659_SIL_DET_EN (0x1 << 15)
609
610/* Sidetone Control (0x0018) */
611#define RT5659_ST_SEL_MASK (0x7 << 9)
612#define RT5659_ST_SEL_SFT 9
613#define RT5659_ST_EN (0x1 << 6)
614#define RT5659_ST_EN_SFT 6
615
616/* DAC1 Digital Volume (0x0019) */
617#define RT5659_DAC_L1_VOL_MASK (0xff << 8)
618#define RT5659_DAC_L1_VOL_SFT 8
619#define RT5659_DAC_R1_VOL_MASK (0xff)
620#define RT5659_DAC_R1_VOL_SFT 0
621
622/* DAC2 Digital Volume (0x001a) */
623#define RT5659_DAC_L2_VOL_MASK (0xff << 8)
624#define RT5659_DAC_L2_VOL_SFT 8
625#define RT5659_DAC_R2_VOL_MASK (0xff)
626#define RT5659_DAC_R2_VOL_SFT 0
627
628/* DAC2 Control (0x001b) */
629#define RT5659_M_DAC2_L_VOL (0x1 << 13)
630#define RT5659_M_DAC2_L_VOL_SFT 13
631#define RT5659_M_DAC2_R_VOL (0x1 << 12)
632#define RT5659_M_DAC2_R_VOL_SFT 12
633#define RT5659_DAC_L2_SEL_MASK (0x7 << 4)
634#define RT5659_DAC_L2_SEL_SFT 4
635#define RT5659_DAC_R2_SEL_MASK (0x7 << 0)
636#define RT5659_DAC_R2_SEL_SFT 0
637
638/* ADC Digital Volume Control (0x001c) */
639#define RT5659_ADC_L_VOL_MASK (0x7f << 8)
640#define RT5659_ADC_L_VOL_SFT 8
641#define RT5659_ADC_R_VOL_MASK (0x7f)
642#define RT5659_ADC_R_VOL_SFT 0
643
644/* Mono ADC Digital Volume Control (0x001d) */
645#define RT5659_MONO_ADC_L_VOL_MASK (0x7f << 8)
646#define RT5659_MONO_ADC_L_VOL_SFT 8
647#define RT5659_MONO_ADC_R_VOL_MASK (0x7f)
648#define RT5659_MONO_ADC_R_VOL_SFT 0
649
650/* Stereo1 ADC Boost Gain Control (0x001f) */
651#define RT5659_STO1_ADC_L_BST_MASK (0x3 << 14)
652#define RT5659_STO1_ADC_L_BST_SFT 14
653#define RT5659_STO1_ADC_R_BST_MASK (0x3 << 12)
654#define RT5659_STO1_ADC_R_BST_SFT 12
655
656/* Mono ADC Boost Gain Control (0x0020) */
657#define RT5659_MONO_ADC_L_BST_MASK (0x3 << 14)
658#define RT5659_MONO_ADC_L_BST_SFT 14
659#define RT5659_MONO_ADC_R_BST_MASK (0x3 << 12)
660#define RT5659_MONO_ADC_R_BST_SFT 12
661
662/* Stereo1 ADC Boost Gain Control (0x001f) */
663#define RT5659_STO2_ADC_L_BST_MASK (0x3 << 14)
664#define RT5659_STO2_ADC_L_BST_SFT 14
665#define RT5659_STO2_ADC_R_BST_MASK (0x3 << 12)
666#define RT5659_STO2_ADC_R_BST_SFT 12
667
668/* Stereo ADC Mixer Control (0x0026) */
669#define RT5659_M_STO1_ADC_L1 (0x1 << 15)
670#define RT5659_M_STO1_ADC_L1_SFT 15
671#define RT5659_M_STO1_ADC_L2 (0x1 << 14)
672#define RT5659_M_STO1_ADC_L2_SFT 14
673#define RT5659_STO1_ADC1_SRC_MASK (0x1 << 13)
674#define RT5659_STO1_ADC1_SRC_SFT 13
675#define RT5659_STO1_ADC1_SRC_ADC (0x1 << 13)
676#define RT5659_STO1_ADC1_SRC_DACMIX (0x0 << 13)
677#define RT5659_STO1_ADC_SRC_MASK (0x1 << 12)
678#define RT5659_STO1_ADC_SRC_SFT 12
679#define RT5659_STO1_ADC_SRC_ADC1 (0x1 << 12)
680#define RT5659_STO1_ADC_SRC_ADC2 (0x0 << 12)
681#define RT5659_STO1_ADC2_SRC_MASK (0x1 << 11)
682#define RT5659_STO1_ADC2_SRC_SFT 11
683#define RT5659_STO1_DMIC_SRC_MASK (0x1 << 8)
684#define RT5659_STO1_DMIC_SRC_SFT 8
685#define RT5659_STO1_DMIC_SRC_DMIC2 (0x1 << 8)
686#define RT5659_STO1_DMIC_SRC_DMIC1 (0x0 << 8)
687#define RT5659_M_STO1_ADC_R1 (0x1 << 6)
688#define RT5659_M_STO1_ADC_R1_SFT 6
689#define RT5659_M_STO1_ADC_R2 (0x1 << 5)
690#define RT5659_M_STO1_ADC_R2_SFT 5
691
692/* Mono1 ADC Mixer control (0x0027) */
693#define RT5659_M_MONO_ADC_L1 (0x1 << 15)
694#define RT5659_M_MONO_ADC_L1_SFT 15
695#define RT5659_M_MONO_ADC_L2 (0x1 << 14)
696#define RT5659_M_MONO_ADC_L2_SFT 14
697#define RT5659_MONO_ADC_L2_SRC_MASK (0x1 << 12)
698#define RT5659_MONO_ADC_L2_SRC_SFT 12
699#define RT5659_MONO_ADC_L1_SRC_MASK (0x1 << 11)
700#define RT5659_MONO_ADC_L1_SRC_SFT 11
701#define RT5659_MONO_ADC_L_SRC_MASK (0x3 << 9)
702#define RT5659_MONO_ADC_L_SRC_SFT 9
703#define RT5659_MONO_DMIC_L_SRC_MASK (0x1 << 8)
704#define RT5659_MONO_DMIC_L_SRC_SFT 8
705#define RT5659_M_MONO_ADC_R1 (0x1 << 7)
706#define RT5659_M_MONO_ADC_R1_SFT 7
707#define RT5659_M_MONO_ADC_R2 (0x1 << 6)
708#define RT5659_M_MONO_ADC_R2_SFT 6
709#define RT5659_STO2_ADC_SRC_MASK (0x1 << 5)
710#define RT5659_STO2_ADC_SRC_SFT 5
711#define RT5659_MONO_ADC_R2_SRC_MASK (0x1 << 4)
712#define RT5659_MONO_ADC_R2_SRC_SFT 4
713#define RT5659_MONO_ADC_R1_SRC_MASK (0x1 << 3)
714#define RT5659_MONO_ADC_R1_SRC_SFT 3
715#define RT5659_MONO_ADC_R_SRC_MASK (0x3 << 1)
716#define RT5659_MONO_ADC_R_SRC_SFT 1
717#define RT5659_MONO_DMIC_R_SRC_MASK 0x1
718#define RT5659_MONO_DMIC_R_SRC_SFT 0
719
720/* ADC Mixer to DAC Mixer Control (0x0029) */
721#define RT5659_M_ADCMIX_L (0x1 << 15)
722#define RT5659_M_ADCMIX_L_SFT 15
723#define RT5659_M_DAC1_L (0x1 << 14)
724#define RT5659_M_DAC1_L_SFT 14
725#define RT5659_DAC1_R_SEL_MASK (0x3 << 10)
726#define RT5659_DAC1_R_SEL_SFT 10
727#define RT5659_DAC1_R_SEL_IF1 (0x0 << 10)
728#define RT5659_DAC1_R_SEL_IF2 (0x1 << 10)
729#define RT5659_DAC1_R_SEL_IF3 (0x2 << 10)
730#define RT5659_DAC1_L_SEL_MASK (0x3 << 8)
731#define RT5659_DAC1_L_SEL_SFT 8
732#define RT5659_DAC1_L_SEL_IF1 (0x0 << 8)
733#define RT5659_DAC1_L_SEL_IF2 (0x1 << 8)
734#define RT5659_DAC1_L_SEL_IF3 (0x2 << 8)
735#define RT5659_M_ADCMIX_R (0x1 << 7)
736#define RT5659_M_ADCMIX_R_SFT 7
737#define RT5659_M_DAC1_R (0x1 << 6)
738#define RT5659_M_DAC1_R_SFT 6
739
740/* Stereo DAC Mixer Control (0x002a) */
741#define RT5659_M_DAC_L1_STO_L (0x1 << 15)
742#define RT5659_M_DAC_L1_STO_L_SFT 15
743#define RT5659_G_DAC_L1_STO_L_MASK (0x1 << 14)
744#define RT5659_G_DAC_L1_STO_L_SFT 14
745#define RT5659_M_DAC_R1_STO_L (0x1 << 13)
746#define RT5659_M_DAC_R1_STO_L_SFT 13
747#define RT5659_G_DAC_R1_STO_L_MASK (0x1 << 12)
748#define RT5659_G_DAC_R1_STO_L_SFT 12
749#define RT5659_M_DAC_L2_STO_L (0x1 << 11)
750#define RT5659_M_DAC_L2_STO_L_SFT 11
751#define RT5659_G_DAC_L2_STO_L_MASK (0x1 << 10)
752#define RT5659_G_DAC_L2_STO_L_SFT 10
753#define RT5659_M_DAC_R2_STO_L (0x1 << 9)
754#define RT5659_M_DAC_R2_STO_L_SFT 9
755#define RT5659_G_DAC_R2_STO_L_MASK (0x1 << 8)
756#define RT5659_G_DAC_R2_STO_L_SFT 8
757#define RT5659_M_DAC_L1_STO_R (0x1 << 7)
758#define RT5659_M_DAC_L1_STO_R_SFT 7
759#define RT5659_G_DAC_L1_STO_R_MASK (0x1 << 6)
760#define RT5659_G_DAC_L1_STO_R_SFT 6
761#define RT5659_M_DAC_R1_STO_R (0x1 << 5)
762#define RT5659_M_DAC_R1_STO_R_SFT 5
763#define RT5659_G_DAC_R1_STO_R_MASK (0x1 << 4)
764#define RT5659_G_DAC_R1_STO_R_SFT 4
765#define RT5659_M_DAC_L2_STO_R (0x1 << 3)
766#define RT5659_M_DAC_L2_STO_R_SFT 3
767#define RT5659_G_DAC_L2_STO_R_MASK (0x1 << 2)
768#define RT5659_G_DAC_L2_STO_R_SFT 2
769#define RT5659_M_DAC_R2_STO_R (0x1 << 1)
770#define RT5659_M_DAC_R2_STO_R_SFT 1
771#define RT5659_G_DAC_R2_STO_R_MASK (0x1)
772#define RT5659_G_DAC_R2_STO_R_SFT 0
773
774/* Mono DAC Mixer Control (0x002b) */
775#define RT5659_M_DAC_L1_MONO_L (0x1 << 15)
776#define RT5659_M_DAC_L1_MONO_L_SFT 15
777#define RT5659_G_DAC_L1_MONO_L_MASK (0x1 << 14)
778#define RT5659_G_DAC_L1_MONO_L_SFT 14
779#define RT5659_M_DAC_R1_MONO_L (0x1 << 13)
780#define RT5659_M_DAC_R1_MONO_L_SFT 13
781#define RT5659_G_DAC_R1_MONO_L_MASK (0x1 << 12)
782#define RT5659_G_DAC_R1_MONO_L_SFT 12
783#define RT5659_M_DAC_L2_MONO_L (0x1 << 11)
784#define RT5659_M_DAC_L2_MONO_L_SFT 11
785#define RT5659_G_DAC_L2_MONO_L_MASK (0x1 << 10)
786#define RT5659_G_DAC_L2_MONO_L_SFT 10
787#define RT5659_M_DAC_R2_MONO_L (0x1 << 9)
788#define RT5659_M_DAC_R2_MONO_L_SFT 9
789#define RT5659_G_DAC_R2_MONO_L_MASK (0x1 << 8)
790#define RT5659_G_DAC_R2_MONO_L_SFT 8
791#define RT5659_M_DAC_L1_MONO_R (0x1 << 7)
792#define RT5659_M_DAC_L1_MONO_R_SFT 7
793#define RT5659_G_DAC_L1_MONO_R_MASK (0x1 << 6)
794#define RT5659_G_DAC_L1_MONO_R_SFT 6
795#define RT5659_M_DAC_R1_MONO_R (0x1 << 5)
796#define RT5659_M_DAC_R1_MONO_R_SFT 5
797#define RT5659_G_DAC_R1_MONO_R_MASK (0x1 << 4)
798#define RT5659_G_DAC_R1_MONO_R_SFT 4
799#define RT5659_M_DAC_L2_MONO_R (0x1 << 3)
800#define RT5659_M_DAC_L2_MONO_R_SFT 3
801#define RT5659_G_DAC_L2_MONO_R_MASK (0x1 << 2)
802#define RT5659_G_DAC_L2_MONO_R_SFT 2
803#define RT5659_M_DAC_R2_MONO_R (0x1 << 1)
804#define RT5659_M_DAC_R2_MONO_R_SFT 1
805#define RT5659_G_DAC_R2_MONO_R_MASK (0x1)
806#define RT5659_G_DAC_R2_MONO_R_SFT 0
807
808/* Digital Mixer Control (0x002c) */
809#define RT5659_M_DAC_MIX_L (0x1 << 7)
810#define RT5659_M_DAC_MIX_L_SFT 7
811#define RT5659_DAC_MIX_L_MASK (0x1 << 6)
812#define RT5659_DAC_MIX_L_SFT 6
813#define RT5659_M_DAC_MIX_R (0x1 << 5)
814#define RT5659_M_DAC_MIX_R_SFT 5
815#define RT5659_DAC_MIX_R_MASK (0x1 << 4)
816#define RT5659_DAC_MIX_R_SFT 4
817
818/* Analog DAC Input Source Control (0x002d) */
819#define RT5659_A_DACL1_SEL (0x1 << 3)
820#define RT5659_A_DACL1_SFT 3
821#define RT5659_A_DACR1_SEL (0x1 << 2)
822#define RT5659_A_DACR1_SFT 2
823#define RT5659_A_DACL2_SEL (0x1 << 1)
824#define RT5659_A_DACL2_SFT 1
825#define RT5659_A_DACR2_SEL (0x1 << 0)
826#define RT5659_A_DACR2_SFT 0
827
828/* Digital Interface Data Control (0x002f) */
829#define RT5659_IF2_ADC3_IN_MASK (0x3 << 14)
830#define RT5659_IF2_ADC3_IN_SFT 14
831#define RT5659_IF2_ADC_IN_MASK (0x3 << 12)
832#define RT5659_IF2_ADC_IN_SFT 12
833#define RT5659_IF2_DAC_SEL_MASK (0x3 << 10)
834#define RT5659_IF2_DAC_SEL_SFT 10
835#define RT5659_IF2_ADC_SEL_MASK (0x3 << 8)
836#define RT5659_IF2_ADC_SEL_SFT 8
837#define RT5659_IF3_DAC_SEL_MASK (0x3 << 6)
838#define RT5659_IF3_DAC_SEL_SFT 6
839#define RT5659_IF3_ADC_SEL_MASK (0x3 << 4)
840#define RT5659_IF3_ADC_SEL_SFT 4
841#define RT5659_IF3_ADC_IN_MASK (0x3 << 0)
842#define RT5659_IF3_ADC_IN_SFT 0
843
844/* PDM Output Control (0x0031) */
845#define RT5659_PDM1_L_MASK (0x1 << 15)
846#define RT5659_PDM1_L_SFT 15
847#define RT5659_M_PDM1_L (0x1 << 14)
848#define RT5659_M_PDM1_L_SFT 14
849#define RT5659_PDM1_R_MASK (0x1 << 13)
850#define RT5659_PDM1_R_SFT 13
851#define RT5659_M_PDM1_R (0x1 << 12)
852#define RT5659_M_PDM1_R_SFT 12
853#define RT5659_PDM2_BUSY (0x1 << 7)
854#define RT5659_PDM1_BUSY (0x1 << 6)
855#define RT5659_PDM_PATTERN (0x1 << 5)
856#define RT5659_PDM_GAIN (0x1 << 4)
857#define RT5659_PDM_DIV_MASK (0x3)
858
859/*S/PDIF Output Control (0x0036) */
860#define RT5659_SPDIF_SEL_MASK (0x3 << 0)
861#define RT5659_SPDIF_SEL_SFT 0
862
863/* REC Left Mixer Control 2 (0x003c) */
864#define RT5659_M_BST1_RM1_L (0x1 << 5)
865#define RT5659_M_BST1_RM1_L_SFT 5
866#define RT5659_M_BST2_RM1_L (0x1 << 4)
867#define RT5659_M_BST2_RM1_L_SFT 4
868#define RT5659_M_BST3_RM1_L (0x1 << 3)
869#define RT5659_M_BST3_RM1_L_SFT 3
870#define RT5659_M_BST4_RM1_L (0x1 << 2)
871#define RT5659_M_BST4_RM1_L_SFT 2
872#define RT5659_M_INL_RM1_L (0x1 << 1)
873#define RT5659_M_INL_RM1_L_SFT 1
874#define RT5659_M_SPKVOLL_RM1_L (0x1)
875#define RT5659_M_SPKVOLL_RM1_L_SFT 0
876
877/* REC Right Mixer Control 2 (0x003e) */
878#define RT5659_M_BST1_RM1_R (0x1 << 5)
879#define RT5659_M_BST1_RM1_R_SFT 5
880#define RT5659_M_BST2_RM1_R (0x1 << 4)
881#define RT5659_M_BST2_RM1_R_SFT 4
882#define RT5659_M_BST3_RM1_R (0x1 << 3)
883#define RT5659_M_BST3_RM1_R_SFT 3
884#define RT5659_M_BST4_RM1_R (0x1 << 2)
885#define RT5659_M_BST4_RM1_R_SFT 2
886#define RT5659_M_INR_RM1_R (0x1 << 1)
887#define RT5659_M_INR_RM1_R_SFT 1
888#define RT5659_M_HPOVOLR_RM1_R (0x1)
889#define RT5659_M_HPOVOLR_RM1_R_SFT 0
890
891/* SPK Left Mixer Control (0x0046) */
892#define RT5659_M_BST3_SM_L (0x1 << 4)
893#define RT5659_M_BST3_SM_L_SFT 4
894#define RT5659_M_IN_R_SM_L (0x1 << 3)
895#define RT5659_M_IN_R_SM_L_SFT 3
896#define RT5659_M_IN_L_SM_L (0x1 << 2)
897#define RT5659_M_IN_L_SM_L_SFT 2
898#define RT5659_M_BST1_SM_L (0x1 << 1)
899#define RT5659_M_BST1_SM_L_SFT 1
900#define RT5659_M_DAC_L2_SM_L (0x1)
901#define RT5659_M_DAC_L2_SM_L_SFT 0
902
903/* SPK Right Mixer Control (0x0047) */
904#define RT5659_M_BST3_SM_R (0x1 << 4)
905#define RT5659_M_BST3_SM_R_SFT 4
906#define RT5659_M_IN_R_SM_R (0x1 << 3)
907#define RT5659_M_IN_R_SM_R_SFT 3
908#define RT5659_M_IN_L_SM_R (0x1 << 2)
909#define RT5659_M_IN_L_SM_R_SFT 2
910#define RT5659_M_BST4_SM_R (0x1 << 1)
911#define RT5659_M_BST4_SM_R_SFT 1
912#define RT5659_M_DAC_R2_SM_R (0x1)
913#define RT5659_M_DAC_R2_SM_R_SFT 0
914
915/* SPO Amp Input and Gain Control (0x0048) */
916#define RT5659_M_DAC_L2_SPKOMIX (0x1 << 13)
917#define RT5659_M_DAC_L2_SPKOMIX_SFT 13
918#define RT5659_M_SPKVOLL_SPKOMIX (0x1 << 12)
919#define RT5659_M_SPKVOLL_SPKOMIX_SFT 12
920#define RT5659_M_DAC_R2_SPKOMIX (0x1 << 9)
921#define RT5659_M_DAC_R2_SPKOMIX_SFT 9
922#define RT5659_M_SPKVOLR_SPKOMIX (0x1 << 8)
923#define RT5659_M_SPKVOLR_SPKOMIX_SFT 8
924
925/* MONOMIX Input and Gain Control (0x004b) */
926#define RT5659_M_MONOVOL_MA (0x1 << 9)
927#define RT5659_M_MONOVOL_MA_SFT 9
928#define RT5659_M_DAC_L2_MA (0x1 << 8)
929#define RT5659_M_DAC_L2_MA_SFT 8
930#define RT5659_M_BST3_MM (0x1 << 4)
931#define RT5659_M_BST3_MM_SFT 4
932#define RT5659_M_BST2_MM (0x1 << 3)
933#define RT5659_M_BST2_MM_SFT 3
934#define RT5659_M_BST1_MM (0x1 << 2)
935#define RT5659_M_BST1_MM_SFT 2
936#define RT5659_M_DAC_R2_MM (0x1 << 1)
937#define RT5659_M_DAC_R2_MM_SFT 1
938#define RT5659_M_DAC_L2_MM (0x1)
939#define RT5659_M_DAC_L2_MM_SFT 0
940
941/* Output Left Mixer Control 1 (0x004d) */
942#define RT5659_G_BST3_OM_L_MASK (0x7 << 12)
943#define RT5659_G_BST3_OM_L_SFT 12
944#define RT5659_G_BST2_OM_L_MASK (0x7 << 9)
945#define RT5659_G_BST2_OM_L_SFT 9
946#define RT5659_G_BST1_OM_L_MASK (0x7 << 6)
947#define RT5659_G_BST1_OM_L_SFT 6
948#define RT5659_G_IN_L_OM_L_MASK (0x7 << 3)
949#define RT5659_G_IN_L_OM_L_SFT 3
950#define RT5659_G_DAC_L2_OM_L_MASK (0x7 << 0)
951#define RT5659_G_DAC_L2_OM_L_SFT 0
952
953/* Output Left Mixer Input Control (0x004e) */
954#define RT5659_M_BST3_OM_L (0x1 << 4)
955#define RT5659_M_BST3_OM_L_SFT 4
956#define RT5659_M_BST2_OM_L (0x1 << 3)
957#define RT5659_M_BST2_OM_L_SFT 3
958#define RT5659_M_BST1_OM_L (0x1 << 2)
959#define RT5659_M_BST1_OM_L_SFT 2
960#define RT5659_M_IN_L_OM_L (0x1 << 1)
961#define RT5659_M_IN_L_OM_L_SFT 1
962#define RT5659_M_DAC_L2_OM_L (0x1)
963#define RT5659_M_DAC_L2_OM_L_SFT 0
964
965/* Output Right Mixer Input Control (0x0050) */
966#define RT5659_M_BST4_OM_R (0x1 << 4)
967#define RT5659_M_BST4_OM_R_SFT 4
968#define RT5659_M_BST3_OM_R (0x1 << 3)
969#define RT5659_M_BST3_OM_R_SFT 3
970#define RT5659_M_BST2_OM_R (0x1 << 2)
971#define RT5659_M_BST2_OM_R_SFT 2
972#define RT5659_M_IN_R_OM_R (0x1 << 1)
973#define RT5659_M_IN_R_OM_R_SFT 1
974#define RT5659_M_DAC_R2_OM_R (0x1)
975#define RT5659_M_DAC_R2_OM_R_SFT 0
976
977/* LOUT Mixer Control (0x0052) */
978#define RT5659_M_DAC_L2_LM (0x1 << 15)
979#define RT5659_M_DAC_L2_LM_SFT 15
980#define RT5659_M_DAC_R2_LM (0x1 << 14)
981#define RT5659_M_DAC_R2_LM_SFT 14
982#define RT5659_M_OV_L_LM (0x1 << 13)
983#define RT5659_M_OV_L_LM_SFT 13
984#define RT5659_M_OV_R_LM (0x1 << 12)
985#define RT5659_M_OV_R_LM_SFT 12
986
987/* Power Management for Digital 1 (0x0061) */
988#define RT5659_PWR_I2S1 (0x1 << 15)
989#define RT5659_PWR_I2S1_BIT 15
990#define RT5659_PWR_I2S2 (0x1 << 14)
991#define RT5659_PWR_I2S2_BIT 14
992#define RT5659_PWR_I2S3 (0x1 << 13)
993#define RT5659_PWR_I2S3_BIT 13
994#define RT5659_PWR_SPDIF (0x1 << 12)
995#define RT5659_PWR_SPDIF_BIT 12
996#define RT5659_PWR_DAC_L1 (0x1 << 11)
997#define RT5659_PWR_DAC_L1_BIT 11
998#define RT5659_PWR_DAC_R1 (0x1 << 10)
999#define RT5659_PWR_DAC_R1_BIT 10
1000#define RT5659_PWR_DAC_L2 (0x1 << 9)
1001#define RT5659_PWR_DAC_L2_BIT 9
1002#define RT5659_PWR_DAC_R2 (0x1 << 8)
1003#define RT5659_PWR_DAC_R2_BIT 8
1004#define RT5659_PWR_LDO (0x1 << 7)
1005#define RT5659_PWR_LDO_BIT 7
1006#define RT5659_PWR_ADC_L1 (0x1 << 4)
1007#define RT5659_PWR_ADC_L1_BIT 4
1008#define RT5659_PWR_ADC_R1 (0x1 << 3)
1009#define RT5659_PWR_ADC_R1_BIT 3
1010#define RT5659_PWR_ADC_L2 (0x1 << 2)
1011#define RT5659_PWR_ADC_L2_BIT 4
1012#define RT5659_PWR_ADC_R2 (0x1 << 1)
1013#define RT5659_PWR_ADC_R2_BIT 1
1014#define RT5659_PWR_CLS_D (0x1)
1015#define RT5659_PWR_CLS_D_BIT 0
1016
1017/* Power Management for Digital 2 (0x0062) */
1018#define RT5659_PWR_ADC_S1F (0x1 << 15)
1019#define RT5659_PWR_ADC_S1F_BIT 15
1020#define RT5659_PWR_ADC_S2F (0x1 << 14)
1021#define RT5659_PWR_ADC_S2F_BIT 14
1022#define RT5659_PWR_ADC_MF_L (0x1 << 13)
1023#define RT5659_PWR_ADC_MF_L_BIT 13
1024#define RT5659_PWR_ADC_MF_R (0x1 << 12)
1025#define RT5659_PWR_ADC_MF_R_BIT 12
1026#define RT5659_PWR_DAC_S1F (0x1 << 10)
1027#define RT5659_PWR_DAC_S1F_BIT 10
1028#define RT5659_PWR_DAC_MF_L (0x1 << 9)
1029#define RT5659_PWR_DAC_MF_L_BIT 9
1030#define RT5659_PWR_DAC_MF_R (0x1 << 8)
1031#define RT5659_PWR_DAC_MF_R_BIT 8
1032#define RT5659_PWR_PDM1 (0x1 << 7)
1033#define RT5659_PWR_PDM1_BIT 7
1034
1035/* Power Management for Analog 1 (0x0063) */
1036#define RT5659_PWR_VREF1 (0x1 << 15)
1037#define RT5659_PWR_VREF1_BIT 15
1038#define RT5659_PWR_FV1 (0x1 << 14)
1039#define RT5659_PWR_FV1_BIT 14
1040#define RT5659_PWR_VREF2 (0x1 << 13)
1041#define RT5659_PWR_VREF2_BIT 13
1042#define RT5659_PWR_FV2 (0x1 << 12)
1043#define RT5659_PWR_FV2_BIT 12
1044#define RT5659_PWR_VREF3 (0x1 << 11)
1045#define RT5659_PWR_VREF3_BIT 11
1046#define RT5659_PWR_FV3 (0x1 << 10)
1047#define RT5659_PWR_FV3_BIT 10
1048#define RT5659_PWR_MB (0x1 << 9)
1049#define RT5659_PWR_MB_BIT 9
1050#define RT5659_PWR_LM (0x1 << 8)
1051#define RT5659_PWR_LM_BIT 8
1052#define RT5659_PWR_BG (0x1 << 7)
1053#define RT5659_PWR_BG_BIT 7
1054#define RT5659_PWR_MA (0x1 << 6)
1055#define RT5659_PWR_MA_BIT 6
1056#define RT5659_PWR_HA_L (0x1 << 5)
1057#define RT5659_PWR_HA_L_BIT 5
1058#define RT5659_PWR_HA_R (0x1 << 4)
1059#define RT5659_PWR_HA_R_BIT 4
1060
1061/* Power Management for Analog 2 (0x0064) */
1062#define RT5659_PWR_BST1 (0x1 << 15)
1063#define RT5659_PWR_BST1_BIT 15
1064#define RT5659_PWR_BST2 (0x1 << 14)
1065#define RT5659_PWR_BST2_BIT 14
1066#define RT5659_PWR_BST3 (0x1 << 13)
1067#define RT5659_PWR_BST3_BIT 13
1068#define RT5659_PWR_BST4 (0x1 << 12)
1069#define RT5659_PWR_BST4_BIT 12
1070#define RT5659_PWR_MB1 (0x1 << 11)
1071#define RT5659_PWR_MB1_BIT 11
1072#define RT5659_PWR_MB2 (0x1 << 10)
1073#define RT5659_PWR_MB2_BIT 10
1074#define RT5659_PWR_MB3 (0x1 << 9)
1075#define RT5659_PWR_MB3_BIT 9
1076#define RT5659_PWR_BST1_P (0x1 << 6)
1077#define RT5659_PWR_BST1_P_BIT 6
1078#define RT5659_PWR_BST2_P (0x1 << 5)
1079#define RT5659_PWR_BST2_P_BIT 5
1080#define RT5659_PWR_BST3_P (0x1 << 4)
1081#define RT5659_PWR_BST3_P_BIT 4
1082#define RT5659_PWR_BST4_P (0x1 << 3)
1083#define RT5659_PWR_BST4_P_BIT 3
1084#define RT5659_PWR_JD1 (0x1 << 2)
1085#define RT5659_PWR_JD1_BIT 2
1086#define RT5659_PWR_JD2 (0x1 << 1)
1087#define RT5659_PWR_JD2_BIT 1
1088#define RT5659_PWR_JD3 (0x1)
1089#define RT5659_PWR_JD3_BIT 0
1090
1091/* Power Management for Analog 3 (0x0065) */
1092#define RT5659_PWR_BST_L (0x1 << 8)
1093#define RT5659_PWR_BST_L_BIT 8
1094#define RT5659_PWR_BST_R (0x1 << 7)
1095#define RT5659_PWR_BST_R_BIT 7
1096#define RT5659_PWR_PLL (0x1 << 6)
1097#define RT5659_PWR_PLL_BIT 6
1098#define RT5659_PWR_LDO5 (0x1 << 5)
1099#define RT5659_PWR_LDO5_BIT 5
1100#define RT5659_PWR_LDO4 (0x1 << 4)
1101#define RT5659_PWR_LDO4_BIT 4
1102#define RT5659_PWR_LDO3 (0x1 << 3)
1103#define RT5659_PWR_LDO3_BIT 3
1104#define RT5659_PWR_LDO2 (0x1 << 2)
1105#define RT5659_PWR_LDO2_BIT 2
1106#define RT5659_PWR_SVD (0x1 << 1)
1107#define RT5659_PWR_SVD_BIT 1
1108
1109/* Power Management for Mixer (0x0066) */
1110#define RT5659_PWR_OM_L (0x1 << 15)
1111#define RT5659_PWR_OM_L_BIT 15
1112#define RT5659_PWR_OM_R (0x1 << 14)
1113#define RT5659_PWR_OM_R_BIT 14
1114#define RT5659_PWR_SM_L (0x1 << 13)
1115#define RT5659_PWR_SM_L_BIT 13
1116#define RT5659_PWR_SM_R (0x1 << 12)
1117#define RT5659_PWR_SM_R_BIT 12
1118#define RT5659_PWR_RM1_L (0x1 << 11)
1119#define RT5659_PWR_RM1_L_BIT 11
1120#define RT5659_PWR_RM1_R (0x1 << 10)
1121#define RT5659_PWR_RM1_R_BIT 10
1122#define RT5659_PWR_MM (0x1 << 8)
1123#define RT5659_PWR_MM_BIT 8
1124#define RT5659_PWR_RM2_L (0x1 << 3)
1125#define RT5659_PWR_RM2_L_BIT 3
1126#define RT5659_PWR_RM2_R (0x1 << 2)
1127#define RT5659_PWR_RM2_R_BIT 2
1128
1129/* Power Management for Volume (0x0067) */
1130#define RT5659_PWR_SV_L (0x1 << 15)
1131#define RT5659_PWR_SV_L_BIT 15
1132#define RT5659_PWR_SV_R (0x1 << 14)
1133#define RT5659_PWR_SV_R_BIT 14
1134#define RT5659_PWR_OV_L (0x1 << 13)
1135#define RT5659_PWR_OV_L_BIT 13
1136#define RT5659_PWR_OV_R (0x1 << 12)
1137#define RT5659_PWR_OV_R_BIT 12
1138#define RT5659_PWR_IN_L (0x1 << 9)
1139#define RT5659_PWR_IN_L_BIT 9
1140#define RT5659_PWR_IN_R (0x1 << 8)
1141#define RT5659_PWR_IN_R_BIT 8
1142#define RT5659_PWR_MV (0x1 << 7)
1143#define RT5659_PWR_MV_BIT 7
1144#define RT5659_PWR_MIC_DET (0x1 << 5)
1145#define RT5659_PWR_MIC_DET_BIT 5
1146
1147/* I2S1/2/3 Audio Serial Data Port Control (0x0070 0x0071 0x0072) */
1148#define RT5659_I2S_MS_MASK (0x1 << 15)
1149#define RT5659_I2S_MS_SFT 15
1150#define RT5659_I2S_MS_M (0x0 << 15)
1151#define RT5659_I2S_MS_S (0x1 << 15)
1152#define RT5659_I2S_O_CP_MASK (0x3 << 12)
1153#define RT5659_I2S_O_CP_SFT 12
1154#define RT5659_I2S_O_CP_OFF (0x0 << 12)
1155#define RT5659_I2S_O_CP_U_LAW (0x1 << 12)
1156#define RT5659_I2S_O_CP_A_LAW (0x2 << 12)
1157#define RT5659_I2S_I_CP_MASK (0x3 << 10)
1158#define RT5659_I2S_I_CP_SFT 10
1159#define RT5659_I2S_I_CP_OFF (0x0 << 10)
1160#define RT5659_I2S_I_CP_U_LAW (0x1 << 10)
1161#define RT5659_I2S_I_CP_A_LAW (0x2 << 10)
1162#define RT5659_I2S_BP_MASK (0x1 << 8)
1163#define RT5659_I2S_BP_SFT 8
1164#define RT5659_I2S_BP_NOR (0x0 << 8)
1165#define RT5659_I2S_BP_INV (0x1 << 8)
1166#define RT5659_I2S_DL_MASK (0x3 << 4)
1167#define RT5659_I2S_DL_SFT 4
1168#define RT5659_I2S_DL_16 (0x0 << 4)
1169#define RT5659_I2S_DL_20 (0x1 << 4)
1170#define RT5659_I2S_DL_24 (0x2 << 4)
1171#define RT5659_I2S_DL_8 (0x3 << 4)
1172#define RT5659_I2S_DF_MASK (0x7)
1173#define RT5659_I2S_DF_SFT 0
1174#define RT5659_I2S_DF_I2S (0x0)
1175#define RT5659_I2S_DF_LEFT (0x1)
1176#define RT5659_I2S_DF_PCM_A (0x2)
1177#define RT5659_I2S_DF_PCM_B (0x3)
1178#define RT5659_I2S_DF_PCM_A_N (0x6)
1179#define RT5659_I2S_DF_PCM_B_N (0x7)
1180
1181/* ADC/DAC Clock Control 1 (0x0073) */
1182#define RT5659_I2S_PD1_MASK (0x7 << 12)
1183#define RT5659_I2S_PD1_SFT 12
1184#define RT5659_I2S_PD1_1 (0x0 << 12)
1185#define RT5659_I2S_PD1_2 (0x1 << 12)
1186#define RT5659_I2S_PD1_3 (0x2 << 12)
1187#define RT5659_I2S_PD1_4 (0x3 << 12)
1188#define RT5659_I2S_PD1_6 (0x4 << 12)
1189#define RT5659_I2S_PD1_8 (0x5 << 12)
1190#define RT5659_I2S_PD1_12 (0x6 << 12)
1191#define RT5659_I2S_PD1_16 (0x7 << 12)
1192#define RT5659_I2S_BCLK_MS2_MASK (0x1 << 11)
1193#define RT5659_I2S_BCLK_MS2_SFT 11
1194#define RT5659_I2S_BCLK_MS2_32 (0x0 << 11)
1195#define RT5659_I2S_BCLK_MS2_64 (0x1 << 11)
1196#define RT5659_I2S_PD2_MASK (0x7 << 8)
1197#define RT5659_I2S_PD2_SFT 8
1198#define RT5659_I2S_PD2_1 (0x0 << 8)
1199#define RT5659_I2S_PD2_2 (0x1 << 8)
1200#define RT5659_I2S_PD2_3 (0x2 << 8)
1201#define RT5659_I2S_PD2_4 (0x3 << 8)
1202#define RT5659_I2S_PD2_6 (0x4 << 8)
1203#define RT5659_I2S_PD2_8 (0x5 << 8)
1204#define RT5659_I2S_PD2_12 (0x6 << 8)
1205#define RT5659_I2S_PD2_16 (0x7 << 8)
1206#define RT5659_I2S_BCLK_MS3_MASK (0x1 << 7)
1207#define RT5659_I2S_BCLK_MS3_SFT 7
1208#define RT5659_I2S_BCLK_MS3_32 (0x0 << 7)
1209#define RT5659_I2S_BCLK_MS3_64 (0x1 << 7)
1210#define RT5659_I2S_PD3_MASK (0x7 << 4)
1211#define RT5659_I2S_PD3_SFT 4
1212#define RT5659_I2S_PD3_1 (0x0 << 4)
1213#define RT5659_I2S_PD3_2 (0x1 << 4)
1214#define RT5659_I2S_PD3_3 (0x2 << 4)
1215#define RT5659_I2S_PD3_4 (0x3 << 4)
1216#define RT5659_I2S_PD3_6 (0x4 << 4)
1217#define RT5659_I2S_PD3_8 (0x5 << 4)
1218#define RT5659_I2S_PD3_12 (0x6 << 4)
1219#define RT5659_I2S_PD3_16 (0x7 << 4)
1220#define RT5659_DAC_OSR_MASK (0x3 << 2)
1221#define RT5659_DAC_OSR_SFT 2
1222#define RT5659_DAC_OSR_128 (0x0 << 2)
1223#define RT5659_DAC_OSR_64 (0x1 << 2)
1224#define RT5659_DAC_OSR_32 (0x2 << 2)
1225#define RT5659_DAC_OSR_16 (0x3 << 2)
1226#define RT5659_ADC_OSR_MASK (0x3)
1227#define RT5659_ADC_OSR_SFT 0
1228#define RT5659_ADC_OSR_128 (0x0)
1229#define RT5659_ADC_OSR_64 (0x1)
1230#define RT5659_ADC_OSR_32 (0x2)
1231#define RT5659_ADC_OSR_16 (0x3)
1232
1233/* Digital Microphone Control (0x0075) */
1234#define RT5659_DMIC_1_EN_MASK (0x1 << 15)
1235#define RT5659_DMIC_1_EN_SFT 15
1236#define RT5659_DMIC_1_DIS (0x0 << 15)
1237#define RT5659_DMIC_1_EN (0x1 << 15)
1238#define RT5659_DMIC_2_EN_MASK (0x1 << 14)
1239#define RT5659_DMIC_2_EN_SFT 14
1240#define RT5659_DMIC_2_DIS (0x0 << 14)
1241#define RT5659_DMIC_2_EN (0x1 << 14)
1242#define RT5659_DMIC_1L_LH_MASK (0x1 << 13)
1243#define RT5659_DMIC_1L_LH_SFT 13
1244#define RT5659_DMIC_1L_LH_RISING (0x0 << 13)
1245#define RT5659_DMIC_1L_LH_FALLING (0x1 << 13)
1246#define RT5659_DMIC_1R_LH_MASK (0x1 << 12)
1247#define RT5659_DMIC_1R_LH_SFT 12
1248#define RT5659_DMIC_1R_LH_RISING (0x0 << 12)
1249#define RT5659_DMIC_1R_LH_FALLING (0x1 << 12)
1250#define RT5659_DMIC_2_DP_MASK (0x3 << 10)
1251#define RT5659_DMIC_2_DP_SFT 10
1252#define RT5659_DMIC_2_DP_GPIO6 (0x0 << 10)
1253#define RT5659_DMIC_2_DP_GPIO10 (0x1 << 10)
1254#define RT5659_DMIC_2_DP_GPIO12 (0x2 << 10)
1255#define RT5659_DMIC_2_DP_IN2P (0x3 << 10)
1256#define RT5659_DMIC_CLK_MASK (0x7 << 5)
1257#define RT5659_DMIC_CLK_SFT 5
1258#define RT5659_DMIC_1_DP_MASK (0x3 << 0)
1259#define RT5659_DMIC_1_DP_SFT 0
1260#define RT5659_DMIC_1_DP_GPIO5 (0x0 << 0)
1261#define RT5659_DMIC_1_DP_GPIO9 (0x1 << 0)
1262#define RT5659_DMIC_1_DP_GPIO11 (0x2 << 0)
1263#define RT5659_DMIC_1_DP_IN2N (0x3 << 0)
1264
1265/* TDM control 1 (0x0078)*/
1266#define RT5659_DS_ADC_SLOT01_SFT 14
1267#define RT5659_DS_ADC_SLOT23_SFT 12
1268#define RT5659_DS_ADC_SLOT45_SFT 10
1269#define RT5659_DS_ADC_SLOT67_SFT 8
1270#define RT5659_ADCDAT_SRC_MASK 0x1f
1271#define RT5659_ADCDAT_SRC_SFT 0
1272
1273/* Global Clock Control (0x0080) */
1274#define RT5659_SCLK_SRC_MASK (0x3 << 14)
1275#define RT5659_SCLK_SRC_SFT 14
1276#define RT5659_SCLK_SRC_MCLK (0x0 << 14)
1277#define RT5659_SCLK_SRC_PLL1 (0x1 << 14)
1278#define RT5659_SCLK_SRC_RCCLK (0x2 << 14)
1279#define RT5659_PLL1_SRC_MASK (0x7 << 11)
1280#define RT5659_PLL1_SRC_SFT 11
1281#define RT5659_PLL1_SRC_MCLK (0x0 << 11)
1282#define RT5659_PLL1_SRC_BCLK1 (0x1 << 11)
1283#define RT5659_PLL1_SRC_BCLK2 (0x2 << 11)
1284#define RT5659_PLL1_SRC_BCLK3 (0x3 << 11)
1285#define RT5659_PLL1_PD_MASK (0x1 << 3)
1286#define RT5659_PLL1_PD_SFT 3
1287#define RT5659_PLL1_PD_1 (0x0 << 3)
1288#define RT5659_PLL1_PD_2 (0x1 << 3)
1289
1290#define RT5659_PLL_INP_MAX 40000000
1291#define RT5659_PLL_INP_MIN 256000
1292/* PLL M/N/K Code Control 1 (0x0081) */
1293#define RT5659_PLL_N_MAX 0x001ff
1294#define RT5659_PLL_N_MASK (RT5659_PLL_N_MAX << 7)
1295#define RT5659_PLL_N_SFT 7
1296#define RT5659_PLL_K_MAX 0x001f
1297#define RT5659_PLL_K_MASK (RT5659_PLL_K_MAX)
1298#define RT5659_PLL_K_SFT 0
1299
1300/* PLL M/N/K Code Control 2 (0x0082) */
1301#define RT5659_PLL_M_MAX 0x00f
1302#define RT5659_PLL_M_MASK (RT5659_PLL_M_MAX << 12)
1303#define RT5659_PLL_M_SFT 12
1304#define RT5659_PLL_M_BP (0x1 << 11)
1305#define RT5659_PLL_M_BP_SFT 11
1306
1307/* PLL tracking mode 1 (0x0083) */
1308#define RT5659_I2S3_ASRC_MASK (0x1 << 13)
1309#define RT5659_I2S3_ASRC_SFT 13
1310#define RT5659_I2S2_ASRC_MASK (0x1 << 12)
1311#define RT5659_I2S2_ASRC_SFT 12
1312#define RT5659_I2S1_ASRC_MASK (0x1 << 11)
1313#define RT5659_I2S1_ASRC_SFT 11
1314#define RT5659_DAC_STO_ASRC_MASK (0x1 << 10)
1315#define RT5659_DAC_STO_ASRC_SFT 10
1316#define RT5659_DAC_MONO_L_ASRC_MASK (0x1 << 9)
1317#define RT5659_DAC_MONO_L_ASRC_SFT 9
1318#define RT5659_DAC_MONO_R_ASRC_MASK (0x1 << 8)
1319#define RT5659_DAC_MONO_R_ASRC_SFT 8
1320#define RT5659_DMIC_STO1_ASRC_MASK (0x1 << 7)
1321#define RT5659_DMIC_STO1_ASRC_SFT 7
1322#define RT5659_DMIC_MONO_L_ASRC_MASK (0x1 << 5)
1323#define RT5659_DMIC_MONO_L_ASRC_SFT 5
1324#define RT5659_DMIC_MONO_R_ASRC_MASK (0x1 << 4)
1325#define RT5659_DMIC_MONO_R_ASRC_SFT 4
1326#define RT5659_ADC_STO1_ASRC_MASK (0x1 << 3)
1327#define RT5659_ADC_STO1_ASRC_SFT 3
1328#define RT5659_ADC_MONO_L_ASRC_MASK (0x1 << 1)
1329#define RT5659_ADC_MONO_L_ASRC_SFT 1
1330#define RT5659_ADC_MONO_R_ASRC_MASK (0x1)
1331#define RT5659_ADC_MONO_R_ASRC_SFT 0
1332
1333/* PLL tracking mode 2 (0x0084)*/
1334#define RT5659_DA_STO_T_MASK (0x7 << 12)
1335#define RT5659_DA_STO_T_SFT 12
1336#define RT5659_DA_MONO_L_T_MASK (0x7 << 8)
1337#define RT5659_DA_MONO_L_T_SFT 8
1338#define RT5659_DA_MONO_R_T_MASK (0x7 << 4)
1339#define RT5659_DA_MONO_R_T_SFT 4
1340#define RT5659_AD_STO1_T_MASK (0x7)
1341#define RT5659_AD_STO1_T_SFT 0
1342
1343/* PLL tracking mode 3 (0x0085)*/
1344#define RT5659_AD_STO2_T_MASK (0x7 << 8)
1345#define RT5659_AD_STO2_T_SFT 8
1346#define RT5659_AD_MONO_L_T_MASK (0x7 << 4)
1347#define RT5659_AD_MONO_L_T_SFT 4
1348#define RT5659_AD_MONO_R_T_MASK (0x7)
1349#define RT5659_AD_MONO_R_T_SFT 0
1350
1351/* ASRC Control 4 (0x0086) */
1352#define RT5659_I2S1_RATE_MASK (0xf << 12)
1353#define RT5659_I2S1_RATE_SFT 12
1354#define RT5659_I2S2_RATE_MASK (0xf << 8)
1355#define RT5659_I2S2_RATE_SFT 8
1356#define RT5659_I2S3_RATE_MASK (0xf << 4)
1357#define RT5659_I2S3_RATE_SFT 4
1358
1359/* Depop Mode Control 1 (0x8e) */
1360#define RT5659_SMT_TRIG_MASK (0x1 << 15)
1361#define RT5659_SMT_TRIG_SFT 15
1362#define RT5659_SMT_TRIG_DIS (0x0 << 15)
1363#define RT5659_SMT_TRIG_EN (0x1 << 15)
1364#define RT5659_HP_L_SMT_MASK (0x1 << 9)
1365#define RT5659_HP_L_SMT_SFT 9
1366#define RT5659_HP_L_SMT_DIS (0x0 << 9)
1367#define RT5659_HP_L_SMT_EN (0x1 << 9)
1368#define RT5659_HP_R_SMT_MASK (0x1 << 8)
1369#define RT5659_HP_R_SMT_SFT 8
1370#define RT5659_HP_R_SMT_DIS (0x0 << 8)
1371#define RT5659_HP_R_SMT_EN (0x1 << 8)
1372#define RT5659_HP_CD_PD_MASK (0x1 << 7)
1373#define RT5659_HP_CD_PD_SFT 7
1374#define RT5659_HP_CD_PD_DIS (0x0 << 7)
1375#define RT5659_HP_CD_PD_EN (0x1 << 7)
1376#define RT5659_RSTN_MASK (0x1 << 6)
1377#define RT5659_RSTN_SFT 6
1378#define RT5659_RSTN_DIS (0x0 << 6)
1379#define RT5659_RSTN_EN (0x1 << 6)
1380#define RT5659_RSTP_MASK (0x1 << 5)
1381#define RT5659_RSTP_SFT 5
1382#define RT5659_RSTP_DIS (0x0 << 5)
1383#define RT5659_RSTP_EN (0x1 << 5)
1384#define RT5659_HP_CO_MASK (0x1 << 4)
1385#define RT5659_HP_CO_SFT 4
1386#define RT5659_HP_CO_DIS (0x0 << 4)
1387#define RT5659_HP_CO_EN (0x1 << 4)
1388#define RT5659_HP_CP_MASK (0x1 << 3)
1389#define RT5659_HP_CP_SFT 3
1390#define RT5659_HP_CP_PD (0x0 << 3)
1391#define RT5659_HP_CP_PU (0x1 << 3)
1392#define RT5659_HP_SG_MASK (0x1 << 2)
1393#define RT5659_HP_SG_SFT 2
1394#define RT5659_HP_SG_DIS (0x0 << 2)
1395#define RT5659_HP_SG_EN (0x1 << 2)
1396#define RT5659_HP_DP_MASK (0x1 << 1)
1397#define RT5659_HP_DP_SFT 1
1398#define RT5659_HP_DP_PD (0x0 << 1)
1399#define RT5659_HP_DP_PU (0x1 << 1)
1400#define RT5659_HP_CB_MASK (0x1)
1401#define RT5659_HP_CB_SFT 0
1402#define RT5659_HP_CB_PD (0x0)
1403#define RT5659_HP_CB_PU (0x1)
1404
1405/* Depop Mode Control 2 (0x8f) */
1406#define RT5659_DEPOP_MASK (0x1 << 13)
1407#define RT5659_DEPOP_SFT 13
1408#define RT5659_DEPOP_AUTO (0x0 << 13)
1409#define RT5659_DEPOP_MAN (0x1 << 13)
1410#define RT5659_RAMP_MASK (0x1 << 12)
1411#define RT5659_RAMP_SFT 12
1412#define RT5659_RAMP_DIS (0x0 << 12)
1413#define RT5659_RAMP_EN (0x1 << 12)
1414#define RT5659_BPS_MASK (0x1 << 11)
1415#define RT5659_BPS_SFT 11
1416#define RT5659_BPS_DIS (0x0 << 11)
1417#define RT5659_BPS_EN (0x1 << 11)
1418#define RT5659_FAST_UPDN_MASK (0x1 << 10)
1419#define RT5659_FAST_UPDN_SFT 10
1420#define RT5659_FAST_UPDN_DIS (0x0 << 10)
1421#define RT5659_FAST_UPDN_EN (0x1 << 10)
1422#define RT5659_MRES_MASK (0x3 << 8)
1423#define RT5659_MRES_SFT 8
1424#define RT5659_MRES_15MO (0x0 << 8)
1425#define RT5659_MRES_25MO (0x1 << 8)
1426#define RT5659_MRES_35MO (0x2 << 8)
1427#define RT5659_MRES_45MO (0x3 << 8)
1428#define RT5659_VLO_MASK (0x1 << 7)
1429#define RT5659_VLO_SFT 7
1430#define RT5659_VLO_3V (0x0 << 7)
1431#define RT5659_VLO_32V (0x1 << 7)
1432#define RT5659_DIG_DP_MASK (0x1 << 6)
1433#define RT5659_DIG_DP_SFT 6
1434#define RT5659_DIG_DP_DIS (0x0 << 6)
1435#define RT5659_DIG_DP_EN (0x1 << 6)
1436#define RT5659_DP_TH_MASK (0x3 << 4)
1437#define RT5659_DP_TH_SFT 4
1438
1439/* Depop Mode Control 3 (0x90) */
1440#define RT5659_CP_SYS_MASK (0x7 << 12)
1441#define RT5659_CP_SYS_SFT 12
1442#define RT5659_CP_FQ1_MASK (0x7 << 8)
1443#define RT5659_CP_FQ1_SFT 8
1444#define RT5659_CP_FQ2_MASK (0x7 << 4)
1445#define RT5659_CP_FQ2_SFT 4
1446#define RT5659_CP_FQ3_MASK (0x7)
1447#define RT5659_CP_FQ3_SFT 0
1448#define RT5659_CP_FQ_1_5_KHZ 0
1449#define RT5659_CP_FQ_3_KHZ 1
1450#define RT5659_CP_FQ_6_KHZ 2
1451#define RT5659_CP_FQ_12_KHZ 3
1452#define RT5659_CP_FQ_24_KHZ 4
1453#define RT5659_CP_FQ_48_KHZ 5
1454#define RT5659_CP_FQ_96_KHZ 6
1455#define RT5659_CP_FQ_192_KHZ 7
1456
1457/* HPOUT charge pump 1 (0x0091) */
1458#define RT5659_OSW_L_MASK (0x1 << 11)
1459#define RT5659_OSW_L_SFT 11
1460#define RT5659_OSW_L_DIS (0x0 << 11)
1461#define RT5659_OSW_L_EN (0x1 << 11)
1462#define RT5659_OSW_R_MASK (0x1 << 10)
1463#define RT5659_OSW_R_SFT 10
1464#define RT5659_OSW_R_DIS (0x0 << 10)
1465#define RT5659_OSW_R_EN (0x1 << 10)
1466#define RT5659_PM_HP_MASK (0x3 << 8)
1467#define RT5659_PM_HP_SFT 8
1468#define RT5659_PM_HP_LV (0x0 << 8)
1469#define RT5659_PM_HP_MV (0x1 << 8)
1470#define RT5659_PM_HP_HV (0x2 << 8)
1471#define RT5659_IB_HP_MASK (0x3 << 6)
1472#define RT5659_IB_HP_SFT 6
1473#define RT5659_IB_HP_125IL (0x0 << 6)
1474#define RT5659_IB_HP_25IL (0x1 << 6)
1475#define RT5659_IB_HP_5IL (0x2 << 6)
1476#define RT5659_IB_HP_1IL (0x3 << 6)
1477
1478/* PV detection and SPK gain control (0x92) */
1479#define RT5659_PVDD_DET_MASK (0x1 << 15)
1480#define RT5659_PVDD_DET_SFT 15
1481#define RT5659_PVDD_DET_DIS (0x0 << 15)
1482#define RT5659_PVDD_DET_EN (0x1 << 15)
1483#define RT5659_SPK_AG_MASK (0x1 << 14)
1484#define RT5659_SPK_AG_SFT 14
1485#define RT5659_SPK_AG_DIS (0x0 << 14)
1486#define RT5659_SPK_AG_EN (0x1 << 14)
1487
1488/* Micbias Control (0x93) */
1489#define RT5659_MIC1_BS_MASK (0x1 << 15)
1490#define RT5659_MIC1_BS_SFT 15
1491#define RT5659_MIC1_BS_9AV (0x0 << 15)
1492#define RT5659_MIC1_BS_75AV (0x1 << 15)
1493#define RT5659_MIC2_BS_MASK (0x1 << 14)
1494#define RT5659_MIC2_BS_SFT 14
1495#define RT5659_MIC2_BS_9AV (0x0 << 14)
1496#define RT5659_MIC2_BS_75AV (0x1 << 14)
1497#define RT5659_MIC1_CLK_MASK (0x1 << 13)
1498#define RT5659_MIC1_CLK_SFT 13
1499#define RT5659_MIC1_CLK_DIS (0x0 << 13)
1500#define RT5659_MIC1_CLK_EN (0x1 << 13)
1501#define RT5659_MIC2_CLK_MASK (0x1 << 12)
1502#define RT5659_MIC2_CLK_SFT 12
1503#define RT5659_MIC2_CLK_DIS (0x0 << 12)
1504#define RT5659_MIC2_CLK_EN (0x1 << 12)
1505#define RT5659_MIC1_OVCD_MASK (0x1 << 11)
1506#define RT5659_MIC1_OVCD_SFT 11
1507#define RT5659_MIC1_OVCD_DIS (0x0 << 11)
1508#define RT5659_MIC1_OVCD_EN (0x1 << 11)
1509#define RT5659_MIC1_OVTH_MASK (0x3 << 9)
1510#define RT5659_MIC1_OVTH_SFT 9
1511#define RT5659_MIC1_OVTH_600UA (0x0 << 9)
1512#define RT5659_MIC1_OVTH_1500UA (0x1 << 9)
1513#define RT5659_MIC1_OVTH_2000UA (0x2 << 9)
1514#define RT5659_MIC2_OVCD_MASK (0x1 << 8)
1515#define RT5659_MIC2_OVCD_SFT 8
1516#define RT5659_MIC2_OVCD_DIS (0x0 << 8)
1517#define RT5659_MIC2_OVCD_EN (0x1 << 8)
1518#define RT5659_MIC2_OVTH_MASK (0x3 << 6)
1519#define RT5659_MIC2_OVTH_SFT 6
1520#define RT5659_MIC2_OVTH_600UA (0x0 << 6)
1521#define RT5659_MIC2_OVTH_1500UA (0x1 << 6)
1522#define RT5659_MIC2_OVTH_2000UA (0x2 << 6)
1523#define RT5659_PWR_MB_MASK (0x1 << 5)
1524#define RT5659_PWR_MB_SFT 5
1525#define RT5659_PWR_MB_PD (0x0 << 5)
1526#define RT5659_PWR_MB_PU (0x1 << 5)
1527#define RT5659_PWR_CLK25M_MASK (0x1 << 4)
1528#define RT5659_PWR_CLK25M_SFT 4
1529#define RT5659_PWR_CLK25M_PD (0x0 << 4)
1530#define RT5659_PWR_CLK25M_PU (0x1 << 4)
1531
1532/* REC Mixer 2 Left Control 2 (0x009c) */
1533#define RT5659_M_BST1_RM2_L (0x1 << 5)
1534#define RT5659_M_BST1_RM2_L_SFT 5
1535#define RT5659_M_BST2_RM2_L (0x1 << 4)
1536#define RT5659_M_BST2_RM2_L_SFT 4
1537#define RT5659_M_BST3_RM2_L (0x1 << 3)
1538#define RT5659_M_BST3_RM2_L_SFT 3
1539#define RT5659_M_BST4_RM2_L (0x1 << 2)
1540#define RT5659_M_BST4_RM2_L_SFT 2
1541#define RT5659_M_OUTVOLL_RM2_L (0x1 << 1)
1542#define RT5659_M_OUTVOLL_RM2_L_SFT 1
1543#define RT5659_M_SPKVOL_RM2_L (0x1)
1544#define RT5659_M_SPKVOL_RM2_L_SFT 0
1545
1546/* REC Mixer 2 Right Control 2 (0x009e) */
1547#define RT5659_M_BST1_RM2_R (0x1 << 5)
1548#define RT5659_M_BST1_RM2_R_SFT 5
1549#define RT5659_M_BST2_RM2_R (0x1 << 4)
1550#define RT5659_M_BST2_RM2_R_SFT 4
1551#define RT5659_M_BST3_RM2_R (0x1 << 3)
1552#define RT5659_M_BST3_RM2_R_SFT 3
1553#define RT5659_M_BST4_RM2_R (0x1 << 2)
1554#define RT5659_M_BST4_RM2_R_SFT 2
1555#define RT5659_M_OUTVOLR_RM2_R (0x1 << 1)
1556#define RT5659_M_OUTVOLR_RM2_R_SFT 1
1557#define RT5659_M_MONOVOL_RM2_R (0x1)
1558#define RT5659_M_MONOVOL_RM2_R_SFT 0
1559
1560/* Class D Output Control (0x00a0) */
1561#define RT5659_POW_CLSD_DB_MASK (0x1 << 9)
1562#define RT5659_POW_CLSD_DB_EN (0x1 << 9)
1563#define RT5659_POW_CLSD_DB_DIS (0x0 << 9)
1564
1565/* EQ Control 1 (0x00b0) */
1566#define RT5659_EQ_SRC_DAC (0x0 << 15)
1567#define RT5659_EQ_SRC_ADC (0x1 << 15)
1568#define RT5659_EQ_UPD (0x1 << 14)
1569#define RT5659_EQ_UPD_BIT 14
1570#define RT5659_EQ_CD_MASK (0x1 << 13)
1571#define RT5659_EQ_CD_SFT 13
1572#define RT5659_EQ_CD_DIS (0x0 << 13)
1573#define RT5659_EQ_CD_EN (0x1 << 13)
1574#define RT5659_EQ_DITH_MASK (0x3 << 8)
1575#define RT5659_EQ_DITH_SFT 8
1576#define RT5659_EQ_DITH_NOR (0x0 << 8)
1577#define RT5659_EQ_DITH_LSB (0x1 << 8)
1578#define RT5659_EQ_DITH_LSB_1 (0x2 << 8)
1579#define RT5659_EQ_DITH_LSB_2 (0x3 << 8)
1580
1581/* IRQ Control 1 (0x00b7) */
1582#define RT5659_JD1_1_EN_MASK (0x1 << 15)
1583#define RT5659_JD1_1_EN_SFT 15
1584#define RT5659_JD1_1_DIS (0x0 << 15)
1585#define RT5659_JD1_1_EN (0x1 << 15)
1586#define RT5659_JD1_2_EN_MASK (0x1 << 12)
1587#define RT5659_JD1_2_EN_SFT 12
1588#define RT5659_JD1_2_DIS (0x0 << 12)
1589#define RT5659_JD1_2_EN (0x1 << 12)
1590#define RT5659_IL_IRQ_MASK (0x1 << 3)
1591#define RT5659_IL_IRQ_DIS (0x0 << 3)
1592#define RT5659_IL_IRQ_EN (0x1 << 3)
1593
1594/* IRQ Control 5 (0x00ba) */
1595#define RT5659_IRQ_JD_EN (0x1 << 3)
1596#define RT5659_IRQ_JD_EN_SFT 3
1597
1598/* GPIO Control 1 (0x00c0) */
1599#define RT5659_GP1_PIN_MASK (0x1 << 15)
1600#define RT5659_GP1_PIN_SFT 15
1601#define RT5659_GP1_PIN_GPIO1 (0x0 << 15)
1602#define RT5659_GP1_PIN_IRQ (0x1 << 15)
1603#define RT5659_GP2_PIN_MASK (0x1 << 14)
1604#define RT5659_GP2_PIN_SFT 14
1605#define RT5659_GP2_PIN_GPIO2 (0x0 << 14)
1606#define RT5659_GP2_PIN_DMIC1_SCL (0x1 << 14)
1607#define RT5659_GP3_PIN_MASK (0x1 << 13)
1608#define RT5659_GP3_PIN_SFT 13
1609#define RT5659_GP3_PIN_GPIO3 (0x0 << 13)
1610#define RT5659_GP3_PIN_PDM_SCL (0x1 << 13)
1611#define RT5659_GP4_PIN_MASK (0x1 << 12)
1612#define RT5659_GP4_PIN_SFT 12
1613#define RT5659_GP4_PIN_GPIO4 (0x0 << 12)
1614#define RT5659_GP4_PIN_PDM_SDA (0x1 << 12)
1615#define RT5659_GP5_PIN_MASK (0x1 << 11)
1616#define RT5659_GP5_PIN_SFT 11
1617#define RT5659_GP5_PIN_GPIO5 (0x0 << 11)
1618#define RT5659_GP5_PIN_DMIC1_SDA (0x1 << 11)
1619#define RT5659_GP6_PIN_MASK (0x1 << 10)
1620#define RT5659_GP6_PIN_SFT 10
1621#define RT5659_GP6_PIN_GPIO6 (0x0 << 10)
1622#define RT5659_GP6_PIN_DMIC2_SDA (0x1 << 10)
1623#define RT5659_GP7_PIN_MASK (0x1 << 9)
1624#define RT5659_GP7_PIN_SFT 9
1625#define RT5659_GP7_PIN_GPIO7 (0x0 << 9)
1626#define RT5659_GP7_PIN_PDM_SCL (0x1 << 9)
1627#define RT5659_GP8_PIN_MASK (0x1 << 8)
1628#define RT5659_GP8_PIN_SFT 8
1629#define RT5659_GP8_PIN_GPIO8 (0x0 << 8)
1630#define RT5659_GP8_PIN_PDM_SDA (0x1 << 8)
1631#define RT5659_GP9_PIN_MASK (0x1 << 7)
1632#define RT5659_GP9_PIN_SFT 7
1633#define RT5659_GP9_PIN_GPIO9 (0x0 << 7)
1634#define RT5659_GP9_PIN_DMIC1_SDA (0x1 << 7)
1635#define RT5659_GP10_PIN_MASK (0x1 << 6)
1636#define RT5659_GP10_PIN_SFT 6
1637#define RT5659_GP10_PIN_GPIO10 (0x0 << 6)
1638#define RT5659_GP10_PIN_DMIC2_SDA (0x1 << 6)
1639#define RT5659_GP11_PIN_MASK (0x1 << 5)
1640#define RT5659_GP11_PIN_SFT 5
1641#define RT5659_GP11_PIN_GPIO11 (0x0 << 5)
1642#define RT5659_GP11_PIN_DMIC1_SDA (0x1 << 5)
1643#define RT5659_GP12_PIN_MASK (0x1 << 4)
1644#define RT5659_GP12_PIN_SFT 4
1645#define RT5659_GP12_PIN_GPIO12 (0x0 << 4)
1646#define RT5659_GP12_PIN_DMIC2_SDA (0x1 << 4)
1647#define RT5659_GP13_PIN_MASK (0x3 << 2)
1648#define RT5659_GP13_PIN_SFT 2
1649#define RT5659_GP13_PIN_GPIO13 (0x0 << 2)
1650#define RT5659_GP13_PIN_SPDIF_SDA (0x1 << 2)
1651#define RT5659_GP13_PIN_DMIC2_SCL (0x2 << 2)
1652#define RT5659_GP13_PIN_PDM_SCL (0x3 << 2)
1653#define RT5659_GP15_PIN_MASK (0x3)
1654#define RT5659_GP15_PIN_SFT 0
1655#define RT5659_GP15_PIN_GPIO15 (0x0)
1656#define RT5659_GP15_PIN_DMIC3_SCL (0x1)
1657#define RT5659_GP15_PIN_PDM_SDA (0x2)
1658
1659/* GPIO Control 2 (0x00c1)*/
1660#define RT5659_GP1_PF_IN (0x0 << 2)
1661#define RT5659_GP1_PF_OUT (0x1 << 2)
1662#define RT5659_GP1_PF_MASK (0x1 << 2)
1663#define RT5659_GP1_PF_SFT 2
1664
1665/* GPIO Control 3 (0x00c2) */
1666#define RT5659_I2S2_PIN_MASK (0x1 << 15)
1667#define RT5659_I2S2_PIN_SFT 15
1668#define RT5659_I2S2_PIN_I2S (0x0 << 15)
1669#define RT5659_I2S2_PIN_GPIO (0x1 << 15)
1670
1671/* Soft volume and zero cross control 1 (0x00d9) */
1672#define RT5659_SV_MASK (0x1 << 15)
1673#define RT5659_SV_SFT 15
1674#define RT5659_SV_DIS (0x0 << 15)
1675#define RT5659_SV_EN (0x1 << 15)
1676#define RT5659_OUT_SV_MASK (0x1 << 13)
1677#define RT5659_OUT_SV_SFT 13
1678#define RT5659_OUT_SV_DIS (0x0 << 13)
1679#define RT5659_OUT_SV_EN (0x1 << 13)
1680#define RT5659_HP_SV_MASK (0x1 << 12)
1681#define RT5659_HP_SV_SFT 12
1682#define RT5659_HP_SV_DIS (0x0 << 12)
1683#define RT5659_HP_SV_EN (0x1 << 12)
1684#define RT5659_ZCD_DIG_MASK (0x1 << 11)
1685#define RT5659_ZCD_DIG_SFT 11
1686#define RT5659_ZCD_DIG_DIS (0x0 << 11)
1687#define RT5659_ZCD_DIG_EN (0x1 << 11)
1688#define RT5659_ZCD_MASK (0x1 << 10)
1689#define RT5659_ZCD_SFT 10
1690#define RT5659_ZCD_PD (0x0 << 10)
1691#define RT5659_ZCD_PU (0x1 << 10)
1692#define RT5659_SV_DLY_MASK (0xf)
1693#define RT5659_SV_DLY_SFT 0
1694
1695/* Soft volume and zero cross control 2 (0x00da) */
1696#define RT5659_ZCD_HP_MASK (0x1 << 15)
1697#define RT5659_ZCD_HP_SFT 15
1698#define RT5659_ZCD_HP_DIS (0x0 << 15)
1699#define RT5659_ZCD_HP_EN (0x1 << 15)
1700
1701/* 4 Button Inline Command Control 2 (0x00e0) */
1702#define RT5659_4BTN_IL_MASK (0x1 << 15)
1703#define RT5659_4BTN_IL_EN (0x1 << 15)
1704#define RT5659_4BTN_IL_DIS (0x0 << 15)
1705
1706/* Analog JD Control 1 (0x00f0) */
1707#define RT5659_JD1_MODE_MASK (0x3 << 0)
1708#define RT5659_JD1_MODE_0 (0x0 << 0)
1709#define RT5659_JD1_MODE_1 (0x1 << 0)
1710#define RT5659_JD1_MODE_2 (0x2 << 0)
1711
1712/* Jack Detect Control 3 (0x00f8) */
1713#define RT5659_JD_TRI_HPO_SEL_MASK (0x7)
1714#define RT5659_JD_TRI_HPO_SEL_SFT (0)
1715#define RT5659_JD_HPO_GPIO_JD1 (0x0)
1716#define RT5659_JD_HPO_JD1_1 (0x1)
1717#define RT5659_JD_HPO_JD1_2 (0x2)
1718#define RT5659_JD_HPO_JD2 (0x3)
1719#define RT5659_JD_HPO_GPIO_JD2 (0x4)
1720#define RT5659_JD_HPO_JD3 (0x5)
1721#define RT5659_JD_HPO_JD_D (0x6)
1722
1723/* Digital Misc Control (0x00fa) */
1724#define RT5659_AM_MASK (0x1 << 7)
1725#define RT5659_AM_EN (0x1 << 7)
1726#define RT5659_AM_DIS (0x1 << 7)
1727#define RT5659_DIG_GATE_CTRL 0x1
1728#define RT5659_DIG_GATE_CTRL_SFT (0)
1729
1730/* Chopper and Clock control for ADC (0x011c)*/
1731#define RT5659_M_RF_DIG_MASK (0x1 << 12)
1732#define RT5659_M_RF_DIG_SFT 12
1733#define RT5659_M_RI_DIG (0x1 << 11)
1734
1735/* Chopper and Clock control for DAC (0x013a)*/
1736#define RT5659_CKXEN_DAC1_MASK (0x1 << 13)
1737#define RT5659_CKXEN_DAC1_SFT 13
1738#define RT5659_CKGEN_DAC1_MASK (0x1 << 12)
1739#define RT5659_CKGEN_DAC1_SFT 12
1740#define RT5659_CKXEN_DAC2_MASK (0x1 << 5)
1741#define RT5659_CKXEN_DAC2_SFT 5
1742#define RT5659_CKGEN_DAC2_MASK (0x1 << 4)
1743#define RT5659_CKGEN_DAC2_SFT 4
1744
1745/* Chopper and Clock control for ADC (0x013b)*/
1746#define RT5659_CKXEN_ADCC_MASK (0x1 << 13)
1747#define RT5659_CKXEN_ADCC_SFT 13
1748#define RT5659_CKGEN_ADCC_MASK (0x1 << 12)
1749#define RT5659_CKGEN_ADCC_SFT 12
1750
1751/* Test Mode Control 1 (0x0145) */
1752#define RT5659_AD2DA_LB_MASK (0x1 << 9)
1753#define RT5659_AD2DA_LB_SFT 9
1754
1755/* Stereo Noise Gate Control 1 (0x0160) */
1756#define RT5659_NG2_EN_MASK (0x1 << 15)
1757#define RT5659_NG2_EN (0x1 << 15)
1758#define RT5659_NG2_DIS (0x0 << 15)
1759
1760/* System Clock Source */
1761enum {
1762 RT5659_SCLK_S_MCLK,
1763 RT5659_SCLK_S_PLL1,
1764 RT5659_SCLK_S_RCCLK,
1765};
1766
1767/* PLL1 Source */
1768enum {
1769 RT5659_PLL1_S_MCLK,
1770 RT5659_PLL1_S_BCLK1,
1771 RT5659_PLL1_S_BCLK2,
1772 RT5659_PLL1_S_BCLK3,
1773 RT5659_PLL1_S_BCLK4,
1774};
1775
1776enum {
1777 RT5659_AIF1,
1778 RT5659_AIF2,
1779 RT5659_AIF3,
1780 RT5659_AIF4,
1781 RT5659_AIFS,
1782};
1783
1784struct rt5659_pll_code {
1785 bool m_bp;
1786 int m_code;
1787 int n_code;
1788 int k_code;
1789};
1790
1791struct rt5659_priv {
1792 struct snd_soc_codec *codec;
1793 struct rt5659_platform_data pdata;
1794 struct regmap *regmap;
1795 struct i2c_client *i2c;
1796 struct gpio_desc *gpiod_ldo1_en;
1797 struct gpio_desc *gpiod_reset;
1798 struct snd_soc_jack *hs_jack;
1799 struct delayed_work jack_detect_work;
1800
1801 int sysclk;
1802 int sysclk_src;
1803 int lrck[RT5659_AIFS];
1804 int bclk[RT5659_AIFS];
1805 int master[RT5659_AIFS];
1806 int v_id;
1807
1808 int pll_src;
1809 int pll_in;
1810 int pll_out;
1811
1812 int jack_type;
1813
1814};
1815
1816int rt5659_set_jack_detect(struct snd_soc_codec *codec,
1817 struct snd_soc_jack *hs_jack);
1818
1819#endif /* __RT5659_H__ */
diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c
index 69d987a9935c..967678e7f48e 100644
--- a/sound/soc/codecs/rt5677.c
+++ b/sound/soc/codecs/rt5677.c
@@ -297,8 +297,6 @@ static bool rt5677_volatile_register(struct device *dev, unsigned int reg)
297 case RT5677_HAP_GENE_CTRL2: 297 case RT5677_HAP_GENE_CTRL2:
298 case RT5677_PWR_DSP_ST: 298 case RT5677_PWR_DSP_ST:
299 case RT5677_PRIV_DATA: 299 case RT5677_PRIV_DATA:
300 case RT5677_PLL1_CTRL2:
301 case RT5677_PLL2_CTRL2:
302 case RT5677_ASRC_22: 300 case RT5677_ASRC_22:
303 case RT5677_ASRC_23: 301 case RT5677_ASRC_23:
304 case RT5677_VAD_CTRL5: 302 case RT5677_VAD_CTRL5:
@@ -4788,7 +4786,7 @@ static int rt5677_remove(struct snd_soc_codec *codec)
4788 4786
4789 regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec); 4787 regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec);
4790 gpiod_set_value_cansleep(rt5677->pow_ldo2, 0); 4788 gpiod_set_value_cansleep(rt5677->pow_ldo2, 0);
4791 gpiod_set_value_cansleep(rt5677->reset_pin, 0); 4789 gpiod_set_value_cansleep(rt5677->reset_pin, 1);
4792 4790
4793 return 0; 4791 return 0;
4794} 4792}
@@ -4803,7 +4801,7 @@ static int rt5677_suspend(struct snd_soc_codec *codec)
4803 regcache_mark_dirty(rt5677->regmap); 4801 regcache_mark_dirty(rt5677->regmap);
4804 4802
4805 gpiod_set_value_cansleep(rt5677->pow_ldo2, 0); 4803 gpiod_set_value_cansleep(rt5677->pow_ldo2, 0);
4806 gpiod_set_value_cansleep(rt5677->reset_pin, 0); 4804 gpiod_set_value_cansleep(rt5677->reset_pin, 1);
4807 } 4805 }
4808 4806
4809 return 0; 4807 return 0;
@@ -4814,8 +4812,11 @@ static int rt5677_resume(struct snd_soc_codec *codec)
4814 struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); 4812 struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
4815 4813
4816 if (!rt5677->dsp_vad_en) { 4814 if (!rt5677->dsp_vad_en) {
4815 rt5677->pll_src = 0;
4816 rt5677->pll_in = 0;
4817 rt5677->pll_out = 0;
4817 gpiod_set_value_cansleep(rt5677->pow_ldo2, 1); 4818 gpiod_set_value_cansleep(rt5677->pow_ldo2, 1);
4818 gpiod_set_value_cansleep(rt5677->reset_pin, 1); 4819 gpiod_set_value_cansleep(rt5677->reset_pin, 0);
4819 if (rt5677->pow_ldo2 || rt5677->reset_pin) 4820 if (rt5677->pow_ldo2 || rt5677->reset_pin)
4820 msleep(10); 4821 msleep(10);
4821 4822
@@ -5160,7 +5161,7 @@ static int rt5677_i2c_probe(struct i2c_client *i2c,
5160 return ret; 5161 return ret;
5161 } 5162 }
5162 rt5677->reset_pin = devm_gpiod_get_optional(&i2c->dev, 5163 rt5677->reset_pin = devm_gpiod_get_optional(&i2c->dev,
5163 "realtek,reset", GPIOD_OUT_HIGH); 5164 "realtek,reset", GPIOD_OUT_LOW);
5164 if (IS_ERR(rt5677->reset_pin)) { 5165 if (IS_ERR(rt5677->reset_pin)) {
5165 ret = PTR_ERR(rt5677->reset_pin); 5166 ret = PTR_ERR(rt5677->reset_pin);
5166 dev_err(&i2c->dev, "Failed to request RESET: %d\n", ret); 5167 dev_err(&i2c->dev, "Failed to request RESET: %d\n", ret);
diff --git a/sound/soc/codecs/ssm2518.c b/sound/soc/codecs/ssm2518.c
index 86b81a60ac52..e2e0bfa7ec20 100644
--- a/sound/soc/codecs/ssm2518.c
+++ b/sound/soc/codecs/ssm2518.c
@@ -309,7 +309,7 @@ static const struct snd_pcm_hw_constraint_list ssm2518_constraints_12288000 = {
309 .count = ARRAY_SIZE(ssm2518_rates_12288000), 309 .count = ARRAY_SIZE(ssm2518_rates_12288000),
310}; 310};
311 311
312static unsigned int ssm2518_lookup_mcs(struct ssm2518 *ssm2518, 312static int ssm2518_lookup_mcs(struct ssm2518 *ssm2518,
313 unsigned int rate) 313 unsigned int rate)
314{ 314{
315 const unsigned int *sysclks = NULL; 315 const unsigned int *sysclks = NULL;
diff --git a/sound/soc/codecs/twl6040.c b/sound/soc/codecs/twl6040.c
index 4cad8929d262..bc3de2e844e6 100644
--- a/sound/soc/codecs/twl6040.c
+++ b/sound/soc/codecs/twl6040.c
@@ -1097,8 +1097,7 @@ static int twl6040_probe(struct snd_soc_codec *codec)
1097{ 1097{
1098 struct twl6040_data *priv; 1098 struct twl6040_data *priv;
1099 struct twl6040 *twl6040 = dev_get_drvdata(codec->dev->parent); 1099 struct twl6040 *twl6040 = dev_get_drvdata(codec->dev->parent);
1100 struct platform_device *pdev = container_of(codec->dev, 1100 struct platform_device *pdev = to_platform_device(codec->dev);
1101 struct platform_device, dev);
1102 int ret = 0; 1101 int ret = 0;
1103 1102
1104 priv = devm_kzalloc(codec->dev, sizeof(*priv), GFP_KERNEL); 1103 priv = devm_kzalloc(codec->dev, sizeof(*priv), GFP_KERNEL);
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c
index c04c0bc6f58a..6088d30962a9 100644
--- a/sound/soc/codecs/wm5110.c
+++ b/sound/soc/codecs/wm5110.c
@@ -360,15 +360,13 @@ static int wm5110_hp_ev(struct snd_soc_dapm_widget *w,
360 360
361static int wm5110_clear_pga_volume(struct arizona *arizona, int output) 361static int wm5110_clear_pga_volume(struct arizona *arizona, int output)
362{ 362{
363 struct reg_sequence clear_pga = { 363 unsigned int reg = ARIZONA_OUTPUT_PATH_CONFIG_1L + output * 4;
364 ARIZONA_OUTPUT_PATH_CONFIG_1L + output * 4, 0x80
365 };
366 int ret; 364 int ret;
367 365
368 ret = regmap_multi_reg_write_bypassed(arizona->regmap, &clear_pga, 1); 366 ret = regmap_write(arizona->regmap, reg, 0x80);
369 if (ret) 367 if (ret)
370 dev_err(arizona->dev, "Failed to clear PGA (0x%x): %d\n", 368 dev_err(arizona->dev, "Failed to clear PGA (0x%x): %d\n",
371 clear_pga.reg, ret); 369 reg, ret);
372 370
373 return ret; 371 return ret;
374} 372}
@@ -439,18 +437,17 @@ static int wm5110_in_pga_get(struct snd_kcontrol *kcontrol,
439{ 437{
440 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); 438 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
441 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 439 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
442 struct snd_soc_card *card = dapm->card;
443 int ret; 440 int ret;
444 441
445 /* 442 /*
446 * PGA Volume is also used as part of the enable sequence, so 443 * PGA Volume is also used as part of the enable sequence, so
447 * usage of it should be avoided whilst that is running. 444 * usage of it should be avoided whilst that is running.
448 */ 445 */
449 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 446 snd_soc_dapm_mutex_lock(dapm);
450 447
451 ret = snd_soc_get_volsw_range(kcontrol, ucontrol); 448 ret = snd_soc_get_volsw_range(kcontrol, ucontrol);
452 449
453 mutex_unlock(&card->dapm_mutex); 450 snd_soc_dapm_mutex_unlock(dapm);
454 451
455 return ret; 452 return ret;
456} 453}
@@ -460,18 +457,17 @@ static int wm5110_in_pga_put(struct snd_kcontrol *kcontrol,
460{ 457{
461 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); 458 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
462 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 459 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
463 struct snd_soc_card *card = dapm->card;
464 int ret; 460 int ret;
465 461
466 /* 462 /*
467 * PGA Volume is also used as part of the enable sequence, so 463 * PGA Volume is also used as part of the enable sequence, so
468 * usage of it should be avoided whilst that is running. 464 * usage of it should be avoided whilst that is running.
469 */ 465 */
470 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 466 snd_soc_dapm_mutex_lock(dapm);
471 467
472 ret = snd_soc_put_volsw_range(kcontrol, ucontrol); 468 ret = snd_soc_put_volsw_range(kcontrol, ucontrol);
473 469
474 mutex_unlock(&card->dapm_mutex); 470 snd_soc_dapm_mutex_unlock(dapm);
475 471
476 return ret; 472 return ret;
477} 473}
@@ -575,6 +571,33 @@ static DECLARE_TLV_DB_SCALE(ng_tlv, -10200, 600, 0);
575 SOC_SINGLE(name " NG SPKDAT2L Switch", base, 10, 1, 0), \ 571 SOC_SINGLE(name " NG SPKDAT2L Switch", base, 10, 1, 0), \
576 SOC_SINGLE(name " NG SPKDAT2R Switch", base, 11, 1, 0) 572 SOC_SINGLE(name " NG SPKDAT2R Switch", base, 11, 1, 0)
577 573
574#define WM5110_RXANC_INPUT_ROUTES(widget, name) \
575 { widget, NULL, name " NG Mux" }, \
576 { name " NG Internal", NULL, "RXANC NG Clock" }, \
577 { name " NG Internal", NULL, name " Channel" }, \
578 { name " NG External", NULL, "RXANC NG External Clock" }, \
579 { name " NG External", NULL, name " Channel" }, \
580 { name " NG Mux", "None", name " Channel" }, \
581 { name " NG Mux", "Internal", name " NG Internal" }, \
582 { name " NG Mux", "External", name " NG External" }, \
583 { name " Channel", "Left", name " Left Input" }, \
584 { name " Channel", "Combine", name " Left Input" }, \
585 { name " Channel", "Right", name " Right Input" }, \
586 { name " Channel", "Combine", name " Right Input" }, \
587 { name " Left Input", "IN1", "IN1L PGA" }, \
588 { name " Right Input", "IN1", "IN1R PGA" }, \
589 { name " Left Input", "IN2", "IN2L PGA" }, \
590 { name " Right Input", "IN2", "IN2R PGA" }, \
591 { name " Left Input", "IN3", "IN3L PGA" }, \
592 { name " Right Input", "IN3", "IN3R PGA" }, \
593 { name " Left Input", "IN4", "IN4L PGA" }, \
594 { name " Right Input", "IN4", "IN4R PGA" }
595
596#define WM5110_RXANC_OUTPUT_ROUTES(widget, name) \
597 { widget, NULL, name " ANC Source" }, \
598 { name " ANC Source", "RXANCL", "RXANCL" }, \
599 { name " ANC Source", "RXANCR", "RXANCR" }
600
578static const struct snd_kcontrol_new wm5110_snd_controls[] = { 601static const struct snd_kcontrol_new wm5110_snd_controls[] = {
579SOC_ENUM("IN1 OSR", arizona_in_dmic_osr[0]), 602SOC_ENUM("IN1 OSR", arizona_in_dmic_osr[0]),
580SOC_ENUM("IN2 OSR", arizona_in_dmic_osr[1]), 603SOC_ENUM("IN2 OSR", arizona_in_dmic_osr[1]),
@@ -639,6 +662,15 @@ SOC_SINGLE_TLV("IN4R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_4R,
639SOC_ENUM("Input Ramp Up", arizona_in_vi_ramp), 662SOC_ENUM("Input Ramp Up", arizona_in_vi_ramp),
640SOC_ENUM("Input Ramp Down", arizona_in_vd_ramp), 663SOC_ENUM("Input Ramp Down", arizona_in_vd_ramp),
641 664
665SND_SOC_BYTES("RXANC Coefficients", ARIZONA_ANC_COEFF_START,
666 ARIZONA_ANC_COEFF_END - ARIZONA_ANC_COEFF_START + 1),
667SND_SOC_BYTES("RXANCL Config", ARIZONA_FCL_FILTER_CONTROL, 1),
668SND_SOC_BYTES("RXANCL Coefficients", ARIZONA_FCL_COEFF_START,
669 ARIZONA_FCL_COEFF_END - ARIZONA_FCL_COEFF_START + 1),
670SND_SOC_BYTES("RXANCR Config", ARIZONA_FCR_FILTER_CONTROL, 1),
671SND_SOC_BYTES("RXANCR Coefficients", ARIZONA_FCR_COEFF_START,
672 ARIZONA_FCR_COEFF_END - ARIZONA_FCR_COEFF_START + 1),
673
642ARIZONA_MIXER_CONTROLS("EQ1", ARIZONA_EQ1MIX_INPUT_1_SOURCE), 674ARIZONA_MIXER_CONTROLS("EQ1", ARIZONA_EQ1MIX_INPUT_1_SOURCE),
643ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE), 675ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
644ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE), 676ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),
@@ -995,6 +1027,31 @@ static const struct soc_enum wm5110_aec_loopback =
995static const struct snd_kcontrol_new wm5110_aec_loopback_mux = 1027static const struct snd_kcontrol_new wm5110_aec_loopback_mux =
996 SOC_DAPM_ENUM("AEC Loopback", wm5110_aec_loopback); 1028 SOC_DAPM_ENUM("AEC Loopback", wm5110_aec_loopback);
997 1029
1030static const struct snd_kcontrol_new wm5110_anc_input_mux[] = {
1031 SOC_DAPM_ENUM("RXANCL Input", arizona_anc_input_src[0]),
1032 SOC_DAPM_ENUM("RXANCL Channel", arizona_anc_input_src[1]),
1033 SOC_DAPM_ENUM("RXANCR Input", arizona_anc_input_src[2]),
1034 SOC_DAPM_ENUM("RXANCR Channel", arizona_anc_input_src[3]),
1035};
1036
1037static const struct snd_kcontrol_new wm5110_anc_ng_mux =
1038 SOC_DAPM_ENUM("RXANC NG Source", arizona_anc_ng_enum);
1039
1040static const struct snd_kcontrol_new wm5110_output_anc_src[] = {
1041 SOC_DAPM_ENUM("HPOUT1L ANC Source", arizona_output_anc_src[0]),
1042 SOC_DAPM_ENUM("HPOUT1R ANC Source", arizona_output_anc_src[1]),
1043 SOC_DAPM_ENUM("HPOUT2L ANC Source", arizona_output_anc_src[2]),
1044 SOC_DAPM_ENUM("HPOUT2R ANC Source", arizona_output_anc_src[3]),
1045 SOC_DAPM_ENUM("HPOUT3L ANC Source", arizona_output_anc_src[4]),
1046 SOC_DAPM_ENUM("HPOUT3R ANC Source", arizona_output_anc_src[5]),
1047 SOC_DAPM_ENUM("SPKOUTL ANC Source", arizona_output_anc_src[6]),
1048 SOC_DAPM_ENUM("SPKOUTR ANC Source", arizona_output_anc_src[7]),
1049 SOC_DAPM_ENUM("SPKDAT1L ANC Source", arizona_output_anc_src[8]),
1050 SOC_DAPM_ENUM("SPKDAT1R ANC Source", arizona_output_anc_src[9]),
1051 SOC_DAPM_ENUM("SPKDAT2L ANC Source", arizona_output_anc_src[10]),
1052 SOC_DAPM_ENUM("SPKDAT2R ANC Source", arizona_output_anc_src[11]),
1053};
1054
998static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = { 1055static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = {
999SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT, 1056SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT,
1000 0, wm5110_sysclk_ev, SND_SOC_DAPM_POST_PMU), 1057 0, wm5110_sysclk_ev, SND_SOC_DAPM_POST_PMU),
@@ -1185,6 +1242,65 @@ SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
1185 ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, 1242 ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0,
1186 &wm5110_aec_loopback_mux), 1243 &wm5110_aec_loopback_mux),
1187 1244
1245SND_SOC_DAPM_SUPPLY("RXANC NG External Clock", SND_SOC_NOPM,
1246 ARIZONA_EXT_NG_SEL_SET_SHIFT, 0, arizona_anc_ev,
1247 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1248SND_SOC_DAPM_PGA("RXANCL NG External", SND_SOC_NOPM, 0, 0, NULL, 0),
1249SND_SOC_DAPM_PGA("RXANCR NG External", SND_SOC_NOPM, 0, 0, NULL, 0),
1250
1251SND_SOC_DAPM_SUPPLY("RXANC NG Clock", SND_SOC_NOPM,
1252 ARIZONA_CLK_NG_ENA_SET_SHIFT, 0, arizona_anc_ev,
1253 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1254SND_SOC_DAPM_PGA("RXANCL NG Internal", SND_SOC_NOPM, 0, 0, NULL, 0),
1255SND_SOC_DAPM_PGA("RXANCR NG Internal", SND_SOC_NOPM, 0, 0, NULL, 0),
1256
1257SND_SOC_DAPM_MUX("RXANCL Left Input", SND_SOC_NOPM, 0, 0,
1258 &wm5110_anc_input_mux[0]),
1259SND_SOC_DAPM_MUX("RXANCL Right Input", SND_SOC_NOPM, 0, 0,
1260 &wm5110_anc_input_mux[0]),
1261SND_SOC_DAPM_MUX("RXANCL Channel", SND_SOC_NOPM, 0, 0,
1262 &wm5110_anc_input_mux[1]),
1263SND_SOC_DAPM_MUX("RXANCL NG Mux", SND_SOC_NOPM, 0, 0, &wm5110_anc_ng_mux),
1264SND_SOC_DAPM_MUX("RXANCR Left Input", SND_SOC_NOPM, 0, 0,
1265 &wm5110_anc_input_mux[2]),
1266SND_SOC_DAPM_MUX("RXANCR Right Input", SND_SOC_NOPM, 0, 0,
1267 &wm5110_anc_input_mux[2]),
1268SND_SOC_DAPM_MUX("RXANCR Channel", SND_SOC_NOPM, 0, 0,
1269 &wm5110_anc_input_mux[3]),
1270SND_SOC_DAPM_MUX("RXANCR NG Mux", SND_SOC_NOPM, 0, 0, &wm5110_anc_ng_mux),
1271
1272SND_SOC_DAPM_PGA_E("RXANCL", SND_SOC_NOPM, ARIZONA_CLK_L_ENA_SET_SHIFT,
1273 0, NULL, 0, arizona_anc_ev,
1274 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1275SND_SOC_DAPM_PGA_E("RXANCR", SND_SOC_NOPM, ARIZONA_CLK_R_ENA_SET_SHIFT,
1276 0, NULL, 0, arizona_anc_ev,
1277 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1278
1279SND_SOC_DAPM_MUX("HPOUT1L ANC Source", SND_SOC_NOPM, 0, 0,
1280 &wm5110_output_anc_src[0]),
1281SND_SOC_DAPM_MUX("HPOUT1R ANC Source", SND_SOC_NOPM, 0, 0,
1282 &wm5110_output_anc_src[1]),
1283SND_SOC_DAPM_MUX("HPOUT2L ANC Source", SND_SOC_NOPM, 0, 0,
1284 &wm5110_output_anc_src[2]),
1285SND_SOC_DAPM_MUX("HPOUT2R ANC Source", SND_SOC_NOPM, 0, 0,
1286 &wm5110_output_anc_src[3]),
1287SND_SOC_DAPM_MUX("HPOUT3L ANC Source", SND_SOC_NOPM, 0, 0,
1288 &wm5110_output_anc_src[4]),
1289SND_SOC_DAPM_MUX("HPOUT3R ANC Source", SND_SOC_NOPM, 0, 0,
1290 &wm5110_output_anc_src[5]),
1291SND_SOC_DAPM_MUX("SPKOUTL ANC Source", SND_SOC_NOPM, 0, 0,
1292 &wm5110_output_anc_src[6]),
1293SND_SOC_DAPM_MUX("SPKOUTR ANC Source", SND_SOC_NOPM, 0, 0,
1294 &wm5110_output_anc_src[7]),
1295SND_SOC_DAPM_MUX("SPKDAT1L ANC Source", SND_SOC_NOPM, 0, 0,
1296 &wm5110_output_anc_src[8]),
1297SND_SOC_DAPM_MUX("SPKDAT1R ANC Source", SND_SOC_NOPM, 0, 0,
1298 &wm5110_output_anc_src[9]),
1299SND_SOC_DAPM_MUX("SPKDAT2L ANC Source", SND_SOC_NOPM, 0, 0,
1300 &wm5110_output_anc_src[10]),
1301SND_SOC_DAPM_MUX("SPKDAT2R ANC Source", SND_SOC_NOPM, 0, 0,
1302 &wm5110_output_anc_src[11]),
1303
1188SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0, 1304SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0,
1189 ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0), 1305 ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0),
1190SND_SOC_DAPM_AIF_OUT("AIF1TX2", NULL, 0, 1306SND_SOC_DAPM_AIF_OUT("AIF1TX2", NULL, 0,
@@ -1690,6 +1806,9 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {
1690 { "Slim2 Capture", NULL, "SYSCLK" }, 1806 { "Slim2 Capture", NULL, "SYSCLK" },
1691 { "Slim3 Capture", NULL, "SYSCLK" }, 1807 { "Slim3 Capture", NULL, "SYSCLK" },
1692 1808
1809 { "Voice Control DSP", NULL, "DSP3" },
1810 { "Voice Control DSP", NULL, "SYSCLK" },
1811
1693 { "IN1L PGA", NULL, "IN1L" }, 1812 { "IN1L PGA", NULL, "IN1L" },
1694 { "IN1R PGA", NULL, "IN1R" }, 1813 { "IN1R PGA", NULL, "IN1R" },
1695 1814
@@ -1838,6 +1957,22 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {
1838 { "SPKDAT2L", NULL, "OUT6L" }, 1957 { "SPKDAT2L", NULL, "OUT6L" },
1839 { "SPKDAT2R", NULL, "OUT6R" }, 1958 { "SPKDAT2R", NULL, "OUT6R" },
1840 1959
1960 WM5110_RXANC_INPUT_ROUTES("RXANCL", "RXANCL"),
1961 WM5110_RXANC_INPUT_ROUTES("RXANCR", "RXANCR"),
1962
1963 WM5110_RXANC_OUTPUT_ROUTES("OUT1L", "HPOUT1L"),
1964 WM5110_RXANC_OUTPUT_ROUTES("OUT1R", "HPOUT1R"),
1965 WM5110_RXANC_OUTPUT_ROUTES("OUT2L", "HPOUT2L"),
1966 WM5110_RXANC_OUTPUT_ROUTES("OUT2R", "HPOUT2R"),
1967 WM5110_RXANC_OUTPUT_ROUTES("OUT3L", "HPOUT3L"),
1968 WM5110_RXANC_OUTPUT_ROUTES("OUT3R", "HPOUT3R"),
1969 WM5110_RXANC_OUTPUT_ROUTES("OUT4L", "SPKOUTL"),
1970 WM5110_RXANC_OUTPUT_ROUTES("OUT4R", "SPKOUTR"),
1971 WM5110_RXANC_OUTPUT_ROUTES("OUT5L", "SPKDAT1L"),
1972 WM5110_RXANC_OUTPUT_ROUTES("OUT5R", "SPKDAT1R"),
1973 WM5110_RXANC_OUTPUT_ROUTES("OUT6L", "SPKDAT2L"),
1974 WM5110_RXANC_OUTPUT_ROUTES("OUT6R", "SPKDAT2R"),
1975
1841 { "MICSUPP", NULL, "SYSCLK" }, 1976 { "MICSUPP", NULL, "SYSCLK" },
1842 1977
1843 { "DRC1 Signal Activity", NULL, "DRC1L" }, 1978 { "DRC1 Signal Activity", NULL, "DRC1L" },
@@ -1996,12 +2131,65 @@ static struct snd_soc_dai_driver wm5110_dai[] = {
1996 }, 2131 },
1997 .ops = &arizona_simple_dai_ops, 2132 .ops = &arizona_simple_dai_ops,
1998 }, 2133 },
2134 {
2135 .name = "wm5110-cpu-voicectrl",
2136 .capture = {
2137 .stream_name = "Voice Control CPU",
2138 .channels_min = 1,
2139 .channels_max = 1,
2140 .rates = WM5110_RATES,
2141 .formats = WM5110_FORMATS,
2142 },
2143 .compress_new = snd_soc_new_compress,
2144 },
2145 {
2146 .name = "wm5110-dsp-voicectrl",
2147 .capture = {
2148 .stream_name = "Voice Control DSP",
2149 .channels_min = 1,
2150 .channels_max = 1,
2151 .rates = WM5110_RATES,
2152 .formats = WM5110_FORMATS,
2153 },
2154 },
1999}; 2155};
2000 2156
2157static int wm5110_open(struct snd_compr_stream *stream)
2158{
2159 struct snd_soc_pcm_runtime *rtd = stream->private_data;
2160 struct wm5110_priv *priv = snd_soc_codec_get_drvdata(rtd->codec);
2161 struct arizona *arizona = priv->core.arizona;
2162 int n_adsp;
2163
2164 if (strcmp(rtd->codec_dai->name, "wm5110-dsp-voicectrl") == 0) {
2165 n_adsp = 2;
2166 } else {
2167 dev_err(arizona->dev,
2168 "No suitable compressed stream for DAI '%s'\n",
2169 rtd->codec_dai->name);
2170 return -EINVAL;
2171 }
2172
2173 return wm_adsp_compr_open(&priv->core.adsp[n_adsp], stream);
2174}
2175
2176static irqreturn_t wm5110_adsp2_irq(int irq, void *data)
2177{
2178 struct wm5110_priv *florida = data;
2179 int ret;
2180
2181 ret = wm_adsp_compr_handle_irq(&florida->core.adsp[2]);
2182 if (ret == -ENODEV)
2183 return IRQ_NONE;
2184
2185 return IRQ_HANDLED;
2186}
2187
2001static int wm5110_codec_probe(struct snd_soc_codec *codec) 2188static int wm5110_codec_probe(struct snd_soc_codec *codec)
2002{ 2189{
2003 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 2190 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
2004 struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec); 2191 struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec);
2192 struct arizona *arizona = priv->core.arizona;
2005 int i, ret; 2193 int i, ret;
2006 2194
2007 priv->core.arizona->dapm = dapm; 2195 priv->core.arizona->dapm = dapm;
@@ -2010,6 +2198,14 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
2010 arizona_init_gpio(codec); 2198 arizona_init_gpio(codec);
2011 arizona_init_mono(codec); 2199 arizona_init_mono(codec);
2012 2200
2201 ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1,
2202 "ADSP2 Compressed IRQ", wm5110_adsp2_irq,
2203 priv);
2204 if (ret != 0) {
2205 dev_err(codec->dev, "Failed to request DSP IRQ: %d\n", ret);
2206 return ret;
2207 }
2208
2013 for (i = 0; i < WM5110_NUM_ADSP; ++i) { 2209 for (i = 0; i < WM5110_NUM_ADSP; ++i) {
2014 ret = wm_adsp2_codec_probe(&priv->core.adsp[i], codec); 2210 ret = wm_adsp2_codec_probe(&priv->core.adsp[i], codec);
2015 if (ret) 2211 if (ret)
@@ -2030,12 +2226,15 @@ err_adsp2_codec_probe:
2030 for (--i; i >= 0; --i) 2226 for (--i; i >= 0; --i)
2031 wm_adsp2_codec_remove(&priv->core.adsp[i], codec); 2227 wm_adsp2_codec_remove(&priv->core.adsp[i], codec);
2032 2228
2229 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
2230
2033 return ret; 2231 return ret;
2034} 2232}
2035 2233
2036static int wm5110_codec_remove(struct snd_soc_codec *codec) 2234static int wm5110_codec_remove(struct snd_soc_codec *codec)
2037{ 2235{
2038 struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec); 2236 struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec);
2237 struct arizona *arizona = priv->core.arizona;
2039 int i; 2238 int i;
2040 2239
2041 for (i = 0; i < WM5110_NUM_ADSP; ++i) 2240 for (i = 0; i < WM5110_NUM_ADSP; ++i)
@@ -2043,6 +2242,8 @@ static int wm5110_codec_remove(struct snd_soc_codec *codec)
2043 2242
2044 priv->core.arizona->dapm = NULL; 2243 priv->core.arizona->dapm = NULL;
2045 2244
2245 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
2246
2046 return 0; 2247 return 0;
2047} 2248}
2048 2249
@@ -2088,6 +2289,20 @@ static struct snd_soc_codec_driver soc_codec_dev_wm5110 = {
2088 .num_dapm_routes = ARRAY_SIZE(wm5110_dapm_routes), 2289 .num_dapm_routes = ARRAY_SIZE(wm5110_dapm_routes),
2089}; 2290};
2090 2291
2292static struct snd_compr_ops wm5110_compr_ops = {
2293 .open = wm5110_open,
2294 .free = wm_adsp_compr_free,
2295 .set_params = wm_adsp_compr_set_params,
2296 .get_caps = wm_adsp_compr_get_caps,
2297 .trigger = wm_adsp_compr_trigger,
2298 .pointer = wm_adsp_compr_pointer,
2299 .copy = wm_adsp_compr_copy,
2300};
2301
2302static struct snd_soc_platform_driver wm5110_compr_platform = {
2303 .compr_ops = &wm5110_compr_ops,
2304};
2305
2091static int wm5110_probe(struct platform_device *pdev) 2306static int wm5110_probe(struct platform_device *pdev)
2092{ 2307{
2093 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); 2308 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
@@ -2148,8 +2363,21 @@ static int wm5110_probe(struct platform_device *pdev)
2148 pm_runtime_enable(&pdev->dev); 2363 pm_runtime_enable(&pdev->dev);
2149 pm_runtime_idle(&pdev->dev); 2364 pm_runtime_idle(&pdev->dev);
2150 2365
2151 return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5110, 2366 ret = snd_soc_register_platform(&pdev->dev, &wm5110_compr_platform);
2367 if (ret < 0) {
2368 dev_err(&pdev->dev, "Failed to register platform: %d\n", ret);
2369 goto error;
2370 }
2371
2372 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5110,
2152 wm5110_dai, ARRAY_SIZE(wm5110_dai)); 2373 wm5110_dai, ARRAY_SIZE(wm5110_dai));
2374 if (ret < 0) {
2375 dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
2376 snd_soc_unregister_platform(&pdev->dev);
2377 }
2378
2379error:
2380 return ret;
2153} 2381}
2154 2382
2155static int wm5110_remove(struct platform_device *pdev) 2383static int wm5110_remove(struct platform_device *pdev)
diff --git a/sound/soc/codecs/wm8903.c b/sound/soc/codecs/wm8903.c
index e4cc41e6c23e..2ed6419c181e 100644
--- a/sound/soc/codecs/wm8903.c
+++ b/sound/soc/codecs/wm8903.c
@@ -1804,7 +1804,7 @@ static int wm8903_gpio_get(struct gpio_chip *chip, unsigned offset)
1804 1804
1805 regmap_read(wm8903->regmap, WM8903_GPIO_CONTROL_1 + offset, &reg); 1805 regmap_read(wm8903->regmap, WM8903_GPIO_CONTROL_1 + offset, &reg);
1806 1806
1807 return (reg & WM8903_GP1_LVL_MASK) >> WM8903_GP1_LVL_SHIFT; 1807 return !!((reg & WM8903_GP1_LVL_MASK) >> WM8903_GP1_LVL_SHIFT);
1808} 1808}
1809 1809
1810static int wm8903_gpio_direction_out(struct gpio_chip *chip, 1810static int wm8903_gpio_direction_out(struct gpio_chip *chip,
diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c
index 2aa23f1b9e3c..8172e499e6ed 100644
--- a/sound/soc/codecs/wm8904.c
+++ b/sound/soc/codecs/wm8904.c
@@ -312,7 +312,7 @@ static bool wm8904_readable_register(struct device *dev, unsigned int reg)
312 case WM8904_FLL_NCO_TEST_1: 312 case WM8904_FLL_NCO_TEST_1:
313 return true; 313 return true;
314 default: 314 default:
315 return true; 315 return false;
316 } 316 }
317} 317}
318 318
diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c
index 5380798883b5..ff237726775a 100644
--- a/sound/soc/codecs/wm8960.c
+++ b/sound/soc/codecs/wm8960.c
@@ -147,6 +147,13 @@ static const char *wm8960_3d_upper_cutoff[] = {"High", "Low"};
147static const char *wm8960_3d_lower_cutoff[] = {"Low", "High"}; 147static const char *wm8960_3d_lower_cutoff[] = {"Low", "High"};
148static const char *wm8960_alcfunc[] = {"Off", "Right", "Left", "Stereo"}; 148static const char *wm8960_alcfunc[] = {"Off", "Right", "Left", "Stereo"};
149static const char *wm8960_alcmode[] = {"ALC", "Limiter"}; 149static const char *wm8960_alcmode[] = {"ALC", "Limiter"};
150static const char *wm8960_adc_data_output_sel[] = {
151 "Left Data = Left ADC; Right Data = Right ADC",
152 "Left Data = Left ADC; Right Data = Left ADC",
153 "Left Data = Right ADC; Right Data = Right ADC",
154 "Left Data = Right ADC; Right Data = Left ADC",
155};
156static const char *wm8960_dmonomix[] = {"Stereo", "Mono"};
150 157
151static const struct soc_enum wm8960_enum[] = { 158static const struct soc_enum wm8960_enum[] = {
152 SOC_ENUM_SINGLE(WM8960_DACCTL1, 5, 4, wm8960_polarity), 159 SOC_ENUM_SINGLE(WM8960_DACCTL1, 5, 4, wm8960_polarity),
@@ -155,6 +162,8 @@ static const struct soc_enum wm8960_enum[] = {
155 SOC_ENUM_SINGLE(WM8960_3D, 5, 2, wm8960_3d_lower_cutoff), 162 SOC_ENUM_SINGLE(WM8960_3D, 5, 2, wm8960_3d_lower_cutoff),
156 SOC_ENUM_SINGLE(WM8960_ALC1, 7, 4, wm8960_alcfunc), 163 SOC_ENUM_SINGLE(WM8960_ALC1, 7, 4, wm8960_alcfunc),
157 SOC_ENUM_SINGLE(WM8960_ALC3, 8, 2, wm8960_alcmode), 164 SOC_ENUM_SINGLE(WM8960_ALC3, 8, 2, wm8960_alcmode),
165 SOC_ENUM_SINGLE(WM8960_ADDCTL1, 2, 4, wm8960_adc_data_output_sel),
166 SOC_ENUM_SINGLE(WM8960_ADDCTL1, 4, 2, wm8960_dmonomix),
158}; 167};
159 168
160static const int deemph_settings[] = { 0, 32000, 44100, 48000 }; 169static const int deemph_settings[] = { 0, 32000, 44100, 48000 };
@@ -295,6 +304,9 @@ SOC_SINGLE_TLV("Right Output Mixer Boost Bypass Volume",
295 WM8960_BYPASS2, 4, 7, 1, bypass_tlv), 304 WM8960_BYPASS2, 4, 7, 1, bypass_tlv),
296SOC_SINGLE_TLV("Right Output Mixer RINPUT3 Volume", 305SOC_SINGLE_TLV("Right Output Mixer RINPUT3 Volume",
297 WM8960_ROUTMIX, 4, 7, 1, bypass_tlv), 306 WM8960_ROUTMIX, 4, 7, 1, bypass_tlv),
307
308SOC_ENUM("ADC Data Output Select", wm8960_enum[6]),
309SOC_ENUM("DAC Mono Mix", wm8960_enum[7]),
298}; 310};
299 311
300static const struct snd_kcontrol_new wm8960_lin_boost[] = { 312static const struct snd_kcontrol_new wm8960_lin_boost[] = {
@@ -401,8 +413,8 @@ static const struct snd_soc_dapm_route audio_paths[] = {
401 { "Left Boost Mixer", "LINPUT2 Switch", "LINPUT2" }, 413 { "Left Boost Mixer", "LINPUT2 Switch", "LINPUT2" },
402 { "Left Boost Mixer", "LINPUT3 Switch", "LINPUT3" }, 414 { "Left Boost Mixer", "LINPUT3 Switch", "LINPUT3" },
403 415
404 { "Left Input Mixer", "Boost Switch", "Left Boost Mixer", }, 416 { "Left Input Mixer", "Boost Switch", "Left Boost Mixer" },
405 { "Left Input Mixer", NULL, "LINPUT1", }, /* Really Boost Switch */ 417 { "Left Input Mixer", "Boost Switch", "LINPUT1" }, /* Really Boost Switch */
406 { "Left Input Mixer", NULL, "LINPUT2" }, 418 { "Left Input Mixer", NULL, "LINPUT2" },
407 { "Left Input Mixer", NULL, "LINPUT3" }, 419 { "Left Input Mixer", NULL, "LINPUT3" },
408 420
@@ -410,8 +422,8 @@ static const struct snd_soc_dapm_route audio_paths[] = {
410 { "Right Boost Mixer", "RINPUT2 Switch", "RINPUT2" }, 422 { "Right Boost Mixer", "RINPUT2 Switch", "RINPUT2" },
411 { "Right Boost Mixer", "RINPUT3 Switch", "RINPUT3" }, 423 { "Right Boost Mixer", "RINPUT3 Switch", "RINPUT3" },
412 424
413 { "Right Input Mixer", "Boost Switch", "Right Boost Mixer", }, 425 { "Right Input Mixer", "Boost Switch", "Right Boost Mixer" },
414 { "Right Input Mixer", NULL, "RINPUT1", }, /* Really Boost Switch */ 426 { "Right Input Mixer", "Boost Switch", "RINPUT1" }, /* Really Boost Switch */
415 { "Right Input Mixer", NULL, "RINPUT2" }, 427 { "Right Input Mixer", NULL, "RINPUT2" },
416 { "Right Input Mixer", NULL, "RINPUT3" }, 428 { "Right Input Mixer", NULL, "RINPUT3" },
417 429
@@ -419,11 +431,11 @@ static const struct snd_soc_dapm_route audio_paths[] = {
419 { "Right ADC", NULL, "Right Input Mixer" }, 431 { "Right ADC", NULL, "Right Input Mixer" },
420 432
421 { "Left Output Mixer", "LINPUT3 Switch", "LINPUT3" }, 433 { "Left Output Mixer", "LINPUT3 Switch", "LINPUT3" },
422 { "Left Output Mixer", "Boost Bypass Switch", "Left Boost Mixer"} , 434 { "Left Output Mixer", "Boost Bypass Switch", "Left Boost Mixer" },
423 { "Left Output Mixer", "PCM Playback Switch", "Left DAC" }, 435 { "Left Output Mixer", "PCM Playback Switch", "Left DAC" },
424 436
425 { "Right Output Mixer", "RINPUT3 Switch", "RINPUT3" }, 437 { "Right Output Mixer", "RINPUT3 Switch", "RINPUT3" },
426 { "Right Output Mixer", "Boost Bypass Switch", "Right Boost Mixer" } , 438 { "Right Output Mixer", "Boost Bypass Switch", "Right Boost Mixer" },
427 { "Right Output Mixer", "PCM Playback Switch", "Right DAC" }, 439 { "Right Output Mixer", "PCM Playback Switch", "Right DAC" },
428 440
429 { "LOUT1 PGA", NULL, "Left Output Mixer" }, 441 { "LOUT1 PGA", NULL, "Left Output Mixer" },
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c
index a7e79784fc16..949f632fc3f8 100644
--- a/sound/soc/codecs/wm8962.c
+++ b/sound/soc/codecs/wm8962.c
@@ -131,7 +131,7 @@ static const struct reg_default wm8962_reg[] = {
131 { 15, 0x6243 }, /* R15 - Software Reset */ 131 { 15, 0x6243 }, /* R15 - Software Reset */
132 132
133 { 17, 0x007B }, /* R17 - ALC1 */ 133 { 17, 0x007B }, /* R17 - ALC1 */
134 134 { 18, 0x0000 }, /* R18 - ALC2 */
135 { 19, 0x1C32 }, /* R19 - ALC3 */ 135 { 19, 0x1C32 }, /* R19 - ALC3 */
136 { 20, 0x3200 }, /* R20 - Noise Gate */ 136 { 20, 0x3200 }, /* R20 - Noise Gate */
137 { 21, 0x00C0 }, /* R21 - Left ADC volume */ 137 { 21, 0x00C0 }, /* R21 - Left ADC volume */
@@ -794,7 +794,6 @@ static bool wm8962_volatile_register(struct device *dev, unsigned int reg)
794 case WM8962_CLOCKING1: 794 case WM8962_CLOCKING1:
795 case WM8962_CLOCKING2: 795 case WM8962_CLOCKING2:
796 case WM8962_SOFTWARE_RESET: 796 case WM8962_SOFTWARE_RESET:
797 case WM8962_ALC2:
798 case WM8962_THERMAL_SHUTDOWN_STATUS: 797 case WM8962_THERMAL_SHUTDOWN_STATUS:
799 case WM8962_ADDITIONAL_CONTROL_4: 798 case WM8962_ADDITIONAL_CONTROL_4:
800 case WM8962_DC_SERVO_6: 799 case WM8962_DC_SERVO_6:
diff --git a/sound/soc/codecs/wm8974.c b/sound/soc/codecs/wm8974.c
index 4c29bd2ae75c..c284c7b6db8b 100644
--- a/sound/soc/codecs/wm8974.c
+++ b/sound/soc/codecs/wm8974.c
@@ -632,9 +632,16 @@ static const struct i2c_device_id wm8974_i2c_id[] = {
632}; 632};
633MODULE_DEVICE_TABLE(i2c, wm8974_i2c_id); 633MODULE_DEVICE_TABLE(i2c, wm8974_i2c_id);
634 634
635static const struct of_device_id wm8974_of_match[] = {
636 { .compatible = "wlf,wm8974", },
637 { }
638};
639MODULE_DEVICE_TABLE(of, wm8974_of_match);
640
635static struct i2c_driver wm8974_i2c_driver = { 641static struct i2c_driver wm8974_i2c_driver = {
636 .driver = { 642 .driver = {
637 .name = "wm8974", 643 .name = "wm8974",
644 .of_match_table = wm8974_of_match,
638 }, 645 },
639 .probe = wm8974_i2c_probe, 646 .probe = wm8974_i2c_probe,
640 .remove = wm8974_i2c_remove, 647 .remove = wm8974_i2c_remove,
diff --git a/sound/soc/codecs/wm8998.c b/sound/soc/codecs/wm8998.c
index 8782dfb628ab..7719bc509e50 100644
--- a/sound/soc/codecs/wm8998.c
+++ b/sound/soc/codecs/wm8998.c
@@ -199,20 +199,20 @@ static const char * const wm8998_inmux_texts[] = {
199 "B", 199 "B",
200}; 200};
201 201
202static const SOC_ENUM_SINGLE_DECL(wm8998_in1muxl_enum, 202static SOC_ENUM_SINGLE_DECL(wm8998_in1muxl_enum,
203 ARIZONA_ADC_DIGITAL_VOLUME_1L, 203 ARIZONA_ADC_DIGITAL_VOLUME_1L,
204 ARIZONA_IN1L_SRC_SHIFT, 204 ARIZONA_IN1L_SRC_SHIFT,
205 wm8998_inmux_texts); 205 wm8998_inmux_texts);
206 206
207static const SOC_ENUM_SINGLE_DECL(wm8998_in1muxr_enum, 207static SOC_ENUM_SINGLE_DECL(wm8998_in1muxr_enum,
208 ARIZONA_ADC_DIGITAL_VOLUME_1R, 208 ARIZONA_ADC_DIGITAL_VOLUME_1R,
209 ARIZONA_IN1R_SRC_SHIFT, 209 ARIZONA_IN1R_SRC_SHIFT,
210 wm8998_inmux_texts); 210 wm8998_inmux_texts);
211 211
212static const SOC_ENUM_SINGLE_DECL(wm8998_in2mux_enum, 212static SOC_ENUM_SINGLE_DECL(wm8998_in2mux_enum,
213 ARIZONA_ADC_DIGITAL_VOLUME_2L, 213 ARIZONA_ADC_DIGITAL_VOLUME_2L,
214 ARIZONA_IN2L_SRC_SHIFT, 214 ARIZONA_IN2L_SRC_SHIFT,
215 wm8998_inmux_texts); 215 wm8998_inmux_texts);
216 216
217static const struct snd_kcontrol_new wm8998_in1mux[2] = { 217static const struct snd_kcontrol_new wm8998_in1mux[2] = {
218 SOC_DAPM_ENUM_EXT("IN1L Mux", wm8998_in1muxl_enum, 218 SOC_DAPM_ENUM_EXT("IN1L Mux", wm8998_in1muxl_enum,
@@ -522,17 +522,17 @@ static const unsigned int wm8998_aec_loopback_values[] = {
522 0, 1, 2, 3, 4, 6, 7, 8, 9, 522 0, 1, 2, 3, 4, 6, 7, 8, 9,
523}; 523};
524 524
525static const SOC_VALUE_ENUM_SINGLE_DECL(wm8998_aec1_loopback, 525static SOC_VALUE_ENUM_SINGLE_DECL(wm8998_aec1_loopback,
526 ARIZONA_DAC_AEC_CONTROL_1, 526 ARIZONA_DAC_AEC_CONTROL_1,
527 ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf, 527 ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf,
528 wm8998_aec_loopback_texts, 528 wm8998_aec_loopback_texts,
529 wm8998_aec_loopback_values); 529 wm8998_aec_loopback_values);
530 530
531static const SOC_VALUE_ENUM_SINGLE_DECL(wm8998_aec2_loopback, 531static SOC_VALUE_ENUM_SINGLE_DECL(wm8998_aec2_loopback,
532 ARIZONA_DAC_AEC_CONTROL_2, 532 ARIZONA_DAC_AEC_CONTROL_2,
533 ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf, 533 ARIZONA_AEC_LOOPBACK_SRC_SHIFT, 0xf,
534 wm8998_aec_loopback_texts, 534 wm8998_aec_loopback_texts,
535 wm8998_aec_loopback_values); 535 wm8998_aec_loopback_values);
536 536
537static const struct snd_kcontrol_new wm8998_aec_loopback_mux[] = { 537static const struct snd_kcontrol_new wm8998_aec_loopback_mux[] = {
538 SOC_DAPM_ENUM("AEC1 Loopback", wm8998_aec1_loopback), 538 SOC_DAPM_ENUM("AEC1 Loopback", wm8998_aec1_loopback),
diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c
index 4083a5130cbd..79e143625ac3 100644
--- a/sound/soc/codecs/wm9713.c
+++ b/sound/soc/codecs/wm9713.c
@@ -19,6 +19,7 @@
19#include <linux/slab.h> 19#include <linux/slab.h>
20#include <linux/module.h> 20#include <linux/module.h>
21#include <linux/device.h> 21#include <linux/device.h>
22#include <linux/regmap.h>
22#include <sound/core.h> 23#include <sound/core.h>
23#include <sound/pcm.h> 24#include <sound/pcm.h>
24#include <sound/ac97_codec.h> 25#include <sound/ac97_codec.h>
@@ -39,34 +40,6 @@ struct wm9713_priv {
39 struct mutex lock; 40 struct mutex lock;
40}; 41};
41 42
42static unsigned int ac97_read(struct snd_soc_codec *codec,
43 unsigned int reg);
44static int ac97_write(struct snd_soc_codec *codec,
45 unsigned int reg, unsigned int val);
46
47/*
48 * WM9713 register cache
49 * Reg 0x3c bit 15 is used by touch driver.
50 */
51static const u16 wm9713_reg[] = {
52 0x6174, 0x8080, 0x8080, 0x8080,
53 0xc880, 0xe808, 0xe808, 0x0808,
54 0x00da, 0x8000, 0xd600, 0xaaa0,
55 0xaaa0, 0xaaa0, 0x0000, 0x0000,
56 0x0f0f, 0x0040, 0x0000, 0x7f00,
57 0x0405, 0x0410, 0xbb80, 0xbb80,
58 0x0000, 0xbb80, 0x0000, 0x4523,
59 0x0000, 0x2000, 0x7eff, 0xffff,
60 0x0000, 0x0000, 0x0080, 0x0000,
61 0x0000, 0x0000, 0xfffe, 0xffff,
62 0x0000, 0x0000, 0x0000, 0xfffe,
63 0x4000, 0x0000, 0x0000, 0x0000,
64 0xb032, 0x3e00, 0x0000, 0x0000,
65 0x0000, 0x0000, 0x0000, 0x0000,
66 0x0000, 0x0000, 0x0000, 0x0006,
67 0x0001, 0x0000, 0x574d, 0x4c13,
68};
69
70#define HPL_MIXER 0 43#define HPL_MIXER 0
71#define HPR_MIXER 1 44#define HPR_MIXER 1
72 45
@@ -220,18 +193,15 @@ static int wm9713_voice_shutdown(struct snd_soc_dapm_widget *w,
220 struct snd_kcontrol *kcontrol, int event) 193 struct snd_kcontrol *kcontrol, int event)
221{ 194{
222 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); 195 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
223 u16 status, rate;
224 196
225 if (WARN_ON(event != SND_SOC_DAPM_PRE_PMD)) 197 if (WARN_ON(event != SND_SOC_DAPM_PRE_PMD))
226 return -EINVAL; 198 return -EINVAL;
227 199
228 /* Gracefully shut down the voice interface. */ 200 /* Gracefully shut down the voice interface. */
229 status = ac97_read(codec, AC97_EXTENDED_MID) | 0x1000; 201 snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0f00, 0x0200);
230 rate = ac97_read(codec, AC97_HANDSET_RATE) & 0xF0FF;
231 ac97_write(codec, AC97_HANDSET_RATE, rate | 0x0200);
232 schedule_timeout_interruptible(msecs_to_jiffies(1)); 202 schedule_timeout_interruptible(msecs_to_jiffies(1));
233 ac97_write(codec, AC97_HANDSET_RATE, rate | 0x0F00); 203 snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0f00, 0x0f00);
234 ac97_write(codec, AC97_EXTENDED_MID, status); 204 snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0x1000, 0x1000);
235 205
236 return 0; 206 return 0;
237} 207}
@@ -674,39 +644,97 @@ static const struct snd_soc_dapm_route wm9713_audio_map[] = {
674 {"Capture Mono Mux", "Right", "Right Capture Source"}, 644 {"Capture Mono Mux", "Right", "Right Capture Source"},
675}; 645};
676 646
677static unsigned int ac97_read(struct snd_soc_codec *codec, 647static bool wm9713_readable_reg(struct device *dev, unsigned int reg)
678 unsigned int reg)
679{ 648{
680 struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); 649 switch (reg) {
681 u16 *cache = codec->reg_cache; 650 case AC97_RESET ... AC97_PCM_SURR_DAC_RATE:
682 651 case AC97_PCM_LR_ADC_RATE:
683 if (reg == AC97_RESET || reg == AC97_GPIO_STATUS || 652 case AC97_CENTER_LFE_MASTER:
684 reg == AC97_VENDOR_ID1 || reg == AC97_VENDOR_ID2 || 653 case AC97_SPDIF ... AC97_LINE1_LEVEL:
685 reg == AC97_CD) 654 case AC97_GPIO_CFG ... 0x5c:
686 return soc_ac97_ops->read(wm9713->ac97, reg); 655 case AC97_CODEC_CLASS_REV ... AC97_PCI_SID:
687 else { 656 case 0x74 ... AC97_VENDOR_ID2:
688 reg = reg >> 1; 657 return true;
689 658 default:
690 if (reg >= (ARRAY_SIZE(wm9713_reg))) 659 return false;
691 return -EIO;
692
693 return cache[reg];
694 } 660 }
695} 661}
696 662
697static int ac97_write(struct snd_soc_codec *codec, unsigned int reg, 663static bool wm9713_writeable_reg(struct device *dev, unsigned int reg)
698 unsigned int val)
699{ 664{
700 struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); 665 switch (reg) {
666 case AC97_VENDOR_ID1:
667 case AC97_VENDOR_ID2:
668 return false;
669 default:
670 return wm9713_readable_reg(dev, reg);
671 }
672}
701 673
702 u16 *cache = codec->reg_cache; 674static const struct reg_default wm9713_reg_defaults[] = {
703 soc_ac97_ops->write(wm9713->ac97, reg, val); 675 { 0x02, 0x8080 }, /* Speaker Output Volume */
704 reg = reg >> 1; 676 { 0x04, 0x8080 }, /* Headphone Output Volume */
705 if (reg < (ARRAY_SIZE(wm9713_reg))) 677 { 0x06, 0x8080 }, /* Out3/OUT4 Volume */
706 cache[reg] = val; 678 { 0x08, 0xc880 }, /* Mono Volume */
679 { 0x0a, 0xe808 }, /* LINEIN Volume */
680 { 0x0c, 0xe808 }, /* DAC PGA Volume */
681 { 0x0e, 0x0808 }, /* MIC PGA Volume */
682 { 0x10, 0x00da }, /* MIC Routing Control */
683 { 0x12, 0x8000 }, /* Record PGA Volume */
684 { 0x14, 0xd600 }, /* Record Routing */
685 { 0x16, 0xaaa0 }, /* PCBEEP Volume */
686 { 0x18, 0xaaa0 }, /* VxDAC Volume */
687 { 0x1a, 0xaaa0 }, /* AUXDAC Volume */
688 { 0x1c, 0x0000 }, /* Output PGA Mux */
689 { 0x1e, 0x0000 }, /* DAC 3D control */
690 { 0x20, 0x0f0f }, /* DAC Tone Control*/
691 { 0x22, 0x0040 }, /* MIC Input Select & Bias */
692 { 0x24, 0x0000 }, /* Output Volume Mapping & Jack */
693 { 0x26, 0x7f00 }, /* Powerdown Ctrl/Stat*/
694 { 0x28, 0x0405 }, /* Extended Audio ID */
695 { 0x2a, 0x0410 }, /* Extended Audio Start/Ctrl */
696 { 0x2c, 0xbb80 }, /* Audio DACs Sample Rate */
697 { 0x2e, 0xbb80 }, /* AUXDAC Sample Rate */
698 { 0x32, 0xbb80 }, /* Audio ADCs Sample Rate */
699 { 0x36, 0x4523 }, /* PCM codec control */
700 { 0x3a, 0x2000 }, /* SPDIF control */
701 { 0x3c, 0xfdff }, /* Powerdown 1 */
702 { 0x3e, 0xffff }, /* Powerdown 2 */
703 { 0x40, 0x0000 }, /* General Purpose */
704 { 0x42, 0x0000 }, /* Fast Power-Up Control */
705 { 0x44, 0x0080 }, /* MCLK/PLL Control */
706 { 0x46, 0x0000 }, /* MCLK/PLL Control */
707 { 0x4c, 0xfffe }, /* GPIO Pin Configuration */
708 { 0x4e, 0xffff }, /* GPIO Pin Polarity / Type */
709 { 0x50, 0x0000 }, /* GPIO Pin Sticky */
710 { 0x52, 0x0000 }, /* GPIO Pin Wake-Up */
711 /* GPIO Pin Status */
712 { 0x56, 0xfffe }, /* GPIO Pin Sharing */
713 { 0x58, 0x4000 }, /* GPIO PullUp/PullDown */
714 { 0x5a, 0x0000 }, /* Additional Functions 1 */
715 { 0x5c, 0x0000 }, /* Additional Functions 2 */
716 { 0x60, 0xb032 }, /* ALC Control */
717 { 0x62, 0x3e00 }, /* ALC / Noise Gate Control */
718 { 0x64, 0x0000 }, /* AUXDAC input control */
719 { 0x74, 0x0000 }, /* Digitiser Reg 1 */
720 { 0x76, 0x0006 }, /* Digitiser Reg 2 */
721 { 0x78, 0x0001 }, /* Digitiser Reg 3 */
722 { 0x7a, 0x0000 }, /* Digitiser Read Back */
723};
707 724
708 return 0; 725static const struct regmap_config wm9713_regmap_config = {
709} 726 .reg_bits = 16,
727 .reg_stride = 2,
728 .val_bits = 16,
729 .max_register = 0x7e,
730 .cache_type = REGCACHE_RBTREE,
731
732 .reg_defaults = wm9713_reg_defaults,
733 .num_reg_defaults = ARRAY_SIZE(wm9713_reg_defaults),
734 .volatile_reg = regmap_ac97_default_volatile,
735 .readable_reg = wm9713_readable_reg,
736 .writeable_reg = wm9713_writeable_reg,
737};
710 738
711/* PLL divisors */ 739/* PLL divisors */
712struct _pll_div { 740struct _pll_div {
@@ -793,10 +821,8 @@ static int wm9713_set_pll(struct snd_soc_codec *codec,
793 /* turn PLL off ? */ 821 /* turn PLL off ? */
794 if (freq_in == 0) { 822 if (freq_in == 0) {
795 /* disable PLL power and select ext source */ 823 /* disable PLL power and select ext source */
796 reg = ac97_read(codec, AC97_HANDSET_RATE); 824 snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0080, 0x0080);
797 ac97_write(codec, AC97_HANDSET_RATE, reg | 0x0080); 825 snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0x0200, 0x0200);
798 reg = ac97_read(codec, AC97_EXTENDED_MID);
799 ac97_write(codec, AC97_EXTENDED_MID, reg | 0x0200);
800 wm9713->pll_in = 0; 826 wm9713->pll_in = 0;
801 return 0; 827 return 0;
802 } 828 }
@@ -806,7 +832,7 @@ static int wm9713_set_pll(struct snd_soc_codec *codec,
806 if (pll_div.k == 0) { 832 if (pll_div.k == 0) {
807 reg = (pll_div.n << 12) | (pll_div.lf << 11) | 833 reg = (pll_div.n << 12) | (pll_div.lf << 11) |
808 (pll_div.divsel << 9) | (pll_div.divctl << 8); 834 (pll_div.divsel << 9) | (pll_div.divctl << 8);
809 ac97_write(codec, AC97_LINE1_LEVEL, reg); 835 snd_soc_write(codec, AC97_LINE1_LEVEL, reg);
810 } else { 836 } else {
811 /* write the fractional k to the reg 0x46 pages */ 837 /* write the fractional k to the reg 0x46 pages */
812 reg2 = (pll_div.n << 12) | (pll_div.lf << 11) | (1 << 10) | 838 reg2 = (pll_div.n << 12) | (pll_div.lf << 11) | (1 << 10) |
@@ -814,33 +840,31 @@ static int wm9713_set_pll(struct snd_soc_codec *codec,
814 840
815 /* K [21:20] */ 841 /* K [21:20] */
816 reg = reg2 | (0x5 << 4) | (pll_div.k >> 20); 842 reg = reg2 | (0x5 << 4) | (pll_div.k >> 20);
817 ac97_write(codec, AC97_LINE1_LEVEL, reg); 843 snd_soc_write(codec, AC97_LINE1_LEVEL, reg);
818 844
819 /* K [19:16] */ 845 /* K [19:16] */
820 reg = reg2 | (0x4 << 4) | ((pll_div.k >> 16) & 0xf); 846 reg = reg2 | (0x4 << 4) | ((pll_div.k >> 16) & 0xf);
821 ac97_write(codec, AC97_LINE1_LEVEL, reg); 847 snd_soc_write(codec, AC97_LINE1_LEVEL, reg);
822 848
823 /* K [15:12] */ 849 /* K [15:12] */
824 reg = reg2 | (0x3 << 4) | ((pll_div.k >> 12) & 0xf); 850 reg = reg2 | (0x3 << 4) | ((pll_div.k >> 12) & 0xf);
825 ac97_write(codec, AC97_LINE1_LEVEL, reg); 851 snd_soc_write(codec, AC97_LINE1_LEVEL, reg);
826 852
827 /* K [11:8] */ 853 /* K [11:8] */
828 reg = reg2 | (0x2 << 4) | ((pll_div.k >> 8) & 0xf); 854 reg = reg2 | (0x2 << 4) | ((pll_div.k >> 8) & 0xf);
829 ac97_write(codec, AC97_LINE1_LEVEL, reg); 855 snd_soc_write(codec, AC97_LINE1_LEVEL, reg);
830 856
831 /* K [7:4] */ 857 /* K [7:4] */
832 reg = reg2 | (0x1 << 4) | ((pll_div.k >> 4) & 0xf); 858 reg = reg2 | (0x1 << 4) | ((pll_div.k >> 4) & 0xf);
833 ac97_write(codec, AC97_LINE1_LEVEL, reg); 859 snd_soc_write(codec, AC97_LINE1_LEVEL, reg);
834 860
835 reg = reg2 | (0x0 << 4) | (pll_div.k & 0xf); /* K [3:0] */ 861 reg = reg2 | (0x0 << 4) | (pll_div.k & 0xf); /* K [3:0] */
836 ac97_write(codec, AC97_LINE1_LEVEL, reg); 862 snd_soc_write(codec, AC97_LINE1_LEVEL, reg);
837 } 863 }
838 864
839 /* turn PLL on and select as source */ 865 /* turn PLL on and select as source */
840 reg = ac97_read(codec, AC97_EXTENDED_MID); 866 snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0x0200, 0x0000);
841 ac97_write(codec, AC97_EXTENDED_MID, reg & 0xfdff); 867 snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0080, 0x0000);
842 reg = ac97_read(codec, AC97_HANDSET_RATE);
843 ac97_write(codec, AC97_HANDSET_RATE, reg & 0xff7f);
844 wm9713->pll_in = freq_in; 868 wm9713->pll_in = freq_in;
845 869
846 /* wait 10ms AC97 link frames for the link to stabilise */ 870 /* wait 10ms AC97 link frames for the link to stabilise */
@@ -863,10 +887,10 @@ static int wm9713_set_dai_tristate(struct snd_soc_dai *codec_dai,
863 int tristate) 887 int tristate)
864{ 888{
865 struct snd_soc_codec *codec = codec_dai->codec; 889 struct snd_soc_codec *codec = codec_dai->codec;
866 u16 reg = ac97_read(codec, AC97_CENTER_LFE_MASTER) & 0x9fff;
867 890
868 if (tristate) 891 if (tristate)
869 ac97_write(codec, AC97_CENTER_LFE_MASTER, reg); 892 snd_soc_update_bits(codec, AC97_CENTER_LFE_MASTER,
893 0x6000, 0x0000);
870 894
871 return 0; 895 return 0;
872} 896}
@@ -879,36 +903,30 @@ static int wm9713_set_dai_clkdiv(struct snd_soc_dai *codec_dai,
879 int div_id, int div) 903 int div_id, int div)
880{ 904{
881 struct snd_soc_codec *codec = codec_dai->codec; 905 struct snd_soc_codec *codec = codec_dai->codec;
882 u16 reg;
883 906
884 switch (div_id) { 907 switch (div_id) {
885 case WM9713_PCMCLK_DIV: 908 case WM9713_PCMCLK_DIV:
886 reg = ac97_read(codec, AC97_HANDSET_RATE) & 0xf0ff; 909 snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0f00, div);
887 ac97_write(codec, AC97_HANDSET_RATE, reg | div);
888 break; 910 break;
889 case WM9713_CLKA_MULT: 911 case WM9713_CLKA_MULT:
890 reg = ac97_read(codec, AC97_HANDSET_RATE) & 0xfffd; 912 snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0002, div);
891 ac97_write(codec, AC97_HANDSET_RATE, reg | div);
892 break; 913 break;
893 case WM9713_CLKB_MULT: 914 case WM9713_CLKB_MULT:
894 reg = ac97_read(codec, AC97_HANDSET_RATE) & 0xfffb; 915 snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0004, div);
895 ac97_write(codec, AC97_HANDSET_RATE, reg | div);
896 break; 916 break;
897 case WM9713_HIFI_DIV: 917 case WM9713_HIFI_DIV:
898 reg = ac97_read(codec, AC97_HANDSET_RATE) & 0x8fff; 918 snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x7000, div);
899 ac97_write(codec, AC97_HANDSET_RATE, reg | div);
900 break; 919 break;
901 case WM9713_PCMBCLK_DIV: 920 case WM9713_PCMBCLK_DIV:
902 reg = ac97_read(codec, AC97_CENTER_LFE_MASTER) & 0xf1ff; 921 snd_soc_update_bits(codec, AC97_CENTER_LFE_MASTER, 0x0e00, div);
903 ac97_write(codec, AC97_CENTER_LFE_MASTER, reg | div);
904 break; 922 break;
905 case WM9713_PCMCLK_PLL_DIV: 923 case WM9713_PCMCLK_PLL_DIV:
906 reg = ac97_read(codec, AC97_LINE1_LEVEL) & 0xff80; 924 snd_soc_update_bits(codec, AC97_LINE1_LEVEL,
907 ac97_write(codec, AC97_LINE1_LEVEL, reg | 0x60 | div); 925 0x007f, div | 0x60);
908 break; 926 break;
909 case WM9713_HIFI_PLL_DIV: 927 case WM9713_HIFI_PLL_DIV:
910 reg = ac97_read(codec, AC97_LINE1_LEVEL) & 0xff80; 928 snd_soc_update_bits(codec, AC97_LINE1_LEVEL,
911 ac97_write(codec, AC97_LINE1_LEVEL, reg | 0x70 | div); 929 0x007f, div | 0x70);
912 break; 930 break;
913 default: 931 default:
914 return -EINVAL; 932 return -EINVAL;
@@ -921,7 +939,7 @@ static int wm9713_set_dai_fmt(struct snd_soc_dai *codec_dai,
921 unsigned int fmt) 939 unsigned int fmt)
922{ 940{
923 struct snd_soc_codec *codec = codec_dai->codec; 941 struct snd_soc_codec *codec = codec_dai->codec;
924 u16 gpio = ac97_read(codec, AC97_GPIO_CFG) & 0xffc5; 942 u16 gpio = snd_soc_read(codec, AC97_GPIO_CFG) & 0xffc5;
925 u16 reg = 0x8000; 943 u16 reg = 0x8000;
926 944
927 /* clock masters */ 945 /* clock masters */
@@ -974,8 +992,8 @@ static int wm9713_set_dai_fmt(struct snd_soc_dai *codec_dai,
974 break; 992 break;
975 } 993 }
976 994
977 ac97_write(codec, AC97_GPIO_CFG, gpio); 995 snd_soc_write(codec, AC97_GPIO_CFG, gpio);
978 ac97_write(codec, AC97_CENTER_LFE_MASTER, reg); 996 snd_soc_write(codec, AC97_CENTER_LFE_MASTER, reg);
979 return 0; 997 return 0;
980} 998}
981 999
@@ -984,24 +1002,24 @@ static int wm9713_pcm_hw_params(struct snd_pcm_substream *substream,
984 struct snd_soc_dai *dai) 1002 struct snd_soc_dai *dai)
985{ 1003{
986 struct snd_soc_codec *codec = dai->codec; 1004 struct snd_soc_codec *codec = dai->codec;
987 u16 reg = ac97_read(codec, AC97_CENTER_LFE_MASTER) & 0xfff3;
988 1005
1006 /* enable PCM interface in master mode */
989 switch (params_width(params)) { 1007 switch (params_width(params)) {
990 case 16: 1008 case 16:
991 break; 1009 break;
992 case 20: 1010 case 20:
993 reg |= 0x0004; 1011 snd_soc_update_bits(codec, AC97_CENTER_LFE_MASTER,
1012 0x000c, 0x0004);
994 break; 1013 break;
995 case 24: 1014 case 24:
996 reg |= 0x0008; 1015 snd_soc_update_bits(codec, AC97_CENTER_LFE_MASTER,
1016 0x000c, 0x0008);
997 break; 1017 break;
998 case 32: 1018 case 32:
999 reg |= 0x000c; 1019 snd_soc_update_bits(codec, AC97_CENTER_LFE_MASTER,
1020 0x000c, 0x000c);
1000 break; 1021 break;
1001 } 1022 }
1002
1003 /* enable PCM interface in master mode */
1004 ac97_write(codec, AC97_CENTER_LFE_MASTER, reg);
1005 return 0; 1023 return 0;
1006} 1024}
1007 1025
@@ -1011,17 +1029,15 @@ static int ac97_hifi_prepare(struct snd_pcm_substream *substream,
1011 struct snd_soc_codec *codec = dai->codec; 1029 struct snd_soc_codec *codec = dai->codec;
1012 struct snd_pcm_runtime *runtime = substream->runtime; 1030 struct snd_pcm_runtime *runtime = substream->runtime;
1013 int reg; 1031 int reg;
1014 u16 vra;
1015 1032
1016 vra = ac97_read(codec, AC97_EXTENDED_STATUS); 1033 snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x0001, 0x0001);
1017 ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1);
1018 1034
1019 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 1035 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1020 reg = AC97_PCM_FRONT_DAC_RATE; 1036 reg = AC97_PCM_FRONT_DAC_RATE;
1021 else 1037 else
1022 reg = AC97_PCM_LR_ADC_RATE; 1038 reg = AC97_PCM_LR_ADC_RATE;
1023 1039
1024 return ac97_write(codec, reg, runtime->rate); 1040 return snd_soc_write(codec, reg, runtime->rate);
1025} 1041}
1026 1042
1027static int ac97_aux_prepare(struct snd_pcm_substream *substream, 1043static int ac97_aux_prepare(struct snd_pcm_substream *substream,
@@ -1029,17 +1045,14 @@ static int ac97_aux_prepare(struct snd_pcm_substream *substream,
1029{ 1045{
1030 struct snd_soc_codec *codec = dai->codec; 1046 struct snd_soc_codec *codec = dai->codec;
1031 struct snd_pcm_runtime *runtime = substream->runtime; 1047 struct snd_pcm_runtime *runtime = substream->runtime;
1032 u16 vra, xsle;
1033 1048
1034 vra = ac97_read(codec, AC97_EXTENDED_STATUS); 1049 snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x0001, 0x0001);
1035 ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1); 1050 snd_soc_update_bits(codec, AC97_PCI_SID, 0x8000, 0x8000);
1036 xsle = ac97_read(codec, AC97_PCI_SID);
1037 ac97_write(codec, AC97_PCI_SID, xsle | 0x8000);
1038 1051
1039 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) 1052 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
1040 return -ENODEV; 1053 return -ENODEV;
1041 1054
1042 return ac97_write(codec, AC97_PCM_SURR_DAC_RATE, runtime->rate); 1055 return snd_soc_write(codec, AC97_PCM_SURR_DAC_RATE, runtime->rate);
1043} 1056}
1044 1057
1045#define WM9713_RATES (SNDRV_PCM_RATE_8000 | \ 1058#define WM9713_RATES (SNDRV_PCM_RATE_8000 | \
@@ -1128,27 +1141,23 @@ static struct snd_soc_dai_driver wm9713_dai[] = {
1128static int wm9713_set_bias_level(struct snd_soc_codec *codec, 1141static int wm9713_set_bias_level(struct snd_soc_codec *codec,
1129 enum snd_soc_bias_level level) 1142 enum snd_soc_bias_level level)
1130{ 1143{
1131 u16 reg;
1132
1133 switch (level) { 1144 switch (level) {
1134 case SND_SOC_BIAS_ON: 1145 case SND_SOC_BIAS_ON:
1135 /* enable thermal shutdown */ 1146 /* enable thermal shutdown */
1136 reg = ac97_read(codec, AC97_EXTENDED_MID) & 0x1bff; 1147 snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0xe400, 0x0000);
1137 ac97_write(codec, AC97_EXTENDED_MID, reg);
1138 break; 1148 break;
1139 case SND_SOC_BIAS_PREPARE: 1149 case SND_SOC_BIAS_PREPARE:
1140 break; 1150 break;
1141 case SND_SOC_BIAS_STANDBY: 1151 case SND_SOC_BIAS_STANDBY:
1142 /* enable master bias and vmid */ 1152 /* enable master bias and vmid */
1143 reg = ac97_read(codec, AC97_EXTENDED_MID) & 0x3bff; 1153 snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0xc400, 0x0000);
1144 ac97_write(codec, AC97_EXTENDED_MID, reg); 1154 snd_soc_write(codec, AC97_POWERDOWN, 0x0000);
1145 ac97_write(codec, AC97_POWERDOWN, 0x0000);
1146 break; 1155 break;
1147 case SND_SOC_BIAS_OFF: 1156 case SND_SOC_BIAS_OFF:
1148 /* disable everything including AC link */ 1157 /* disable everything including AC link */
1149 ac97_write(codec, AC97_EXTENDED_MID, 0xffff); 1158 snd_soc_write(codec, AC97_EXTENDED_MID, 0xffff);
1150 ac97_write(codec, AC97_EXTENDED_MSTATUS, 0xffff); 1159 snd_soc_write(codec, AC97_EXTENDED_MSTATUS, 0xffff);
1151 ac97_write(codec, AC97_POWERDOWN, 0xffff); 1160 snd_soc_write(codec, AC97_POWERDOWN, 0xffff);
1152 break; 1161 break;
1153 } 1162 }
1154 return 0; 1163 return 0;
@@ -1156,16 +1165,14 @@ static int wm9713_set_bias_level(struct snd_soc_codec *codec,
1156 1165
1157static int wm9713_soc_suspend(struct snd_soc_codec *codec) 1166static int wm9713_soc_suspend(struct snd_soc_codec *codec)
1158{ 1167{
1159 u16 reg;
1160
1161 /* Disable everything except touchpanel - that will be handled 1168 /* Disable everything except touchpanel - that will be handled
1162 * by the touch driver and left disabled if touch is not in 1169 * by the touch driver and left disabled if touch is not in
1163 * use. */ 1170 * use. */
1164 reg = ac97_read(codec, AC97_EXTENDED_MID); 1171 snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0x7fff,
1165 ac97_write(codec, AC97_EXTENDED_MID, reg | 0x7fff); 1172 0x7fff);
1166 ac97_write(codec, AC97_EXTENDED_MSTATUS, 0xffff); 1173 snd_soc_write(codec, AC97_EXTENDED_MSTATUS, 0xffff);
1167 ac97_write(codec, AC97_POWERDOWN, 0x6f00); 1174 snd_soc_write(codec, AC97_POWERDOWN, 0x6f00);
1168 ac97_write(codec, AC97_POWERDOWN, 0xffff); 1175 snd_soc_write(codec, AC97_POWERDOWN, 0xffff);
1169 1176
1170 return 0; 1177 return 0;
1171} 1178}
@@ -1173,8 +1180,7 @@ static int wm9713_soc_suspend(struct snd_soc_codec *codec)
1173static int wm9713_soc_resume(struct snd_soc_codec *codec) 1180static int wm9713_soc_resume(struct snd_soc_codec *codec)
1174{ 1181{
1175 struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); 1182 struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);
1176 int i, ret; 1183 int ret;
1177 u16 *cache = codec->reg_cache;
1178 1184
1179 ret = snd_ac97_reset(wm9713->ac97, true, WM9713_VENDOR_ID, 1185 ret = snd_ac97_reset(wm9713->ac97, true, WM9713_VENDOR_ID,
1180 WM9713_VENDOR_ID_MASK); 1186 WM9713_VENDOR_ID_MASK);
@@ -1189,12 +1195,8 @@ static int wm9713_soc_resume(struct snd_soc_codec *codec)
1189 1195
1190 /* only synchronise the codec if warm reset failed */ 1196 /* only synchronise the codec if warm reset failed */
1191 if (ret == 0) { 1197 if (ret == 0) {
1192 for (i = 2; i < ARRAY_SIZE(wm9713_reg) << 1; i += 2) { 1198 regcache_mark_dirty(codec->component.regmap);
1193 if (i == AC97_POWERDOWN || i == AC97_EXTENDED_MID || 1199 snd_soc_cache_sync(codec);
1194 i == AC97_EXTENDED_MSTATUS || i > 0x66)
1195 continue;
1196 soc_ac97_ops->write(wm9713->ac97, i, cache[i>>1]);
1197 }
1198 } 1200 }
1199 1201
1200 return ret; 1202 return ret;
@@ -1203,16 +1205,23 @@ static int wm9713_soc_resume(struct snd_soc_codec *codec)
1203static int wm9713_soc_probe(struct snd_soc_codec *codec) 1205static int wm9713_soc_probe(struct snd_soc_codec *codec)
1204{ 1206{
1205 struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); 1207 struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);
1206 int reg; 1208 struct regmap *regmap;
1207 1209
1208 wm9713->ac97 = snd_soc_new_ac97_codec(codec, WM9713_VENDOR_ID, 1210 wm9713->ac97 = snd_soc_new_ac97_codec(codec, WM9713_VENDOR_ID,
1209 WM9713_VENDOR_ID_MASK); 1211 WM9713_VENDOR_ID_MASK);
1210 if (IS_ERR(wm9713->ac97)) 1212 if (IS_ERR(wm9713->ac97))
1211 return PTR_ERR(wm9713->ac97); 1213 return PTR_ERR(wm9713->ac97);
1212 1214
1215 regmap = devm_regmap_init_ac97(wm9713->ac97, &wm9713_regmap_config);
1216 if (IS_ERR(regmap)) {
1217 snd_soc_free_ac97_codec(wm9713->ac97);
1218 return PTR_ERR(regmap);
1219 }
1220
1221 snd_soc_codec_init_regmap(codec, regmap);
1222
1213 /* unmute the adc - move to kcontrol */ 1223 /* unmute the adc - move to kcontrol */
1214 reg = ac97_read(codec, AC97_CD) & 0x7fff; 1224 snd_soc_update_bits(codec, AC97_CD, 0x7fff, 0x0000);
1215 ac97_write(codec, AC97_CD, reg);
1216 1225
1217 return 0; 1226 return 0;
1218} 1227}
@@ -1221,6 +1230,7 @@ static int wm9713_soc_remove(struct snd_soc_codec *codec)
1221{ 1230{
1222 struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); 1231 struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);
1223 1232
1233 snd_soc_codec_exit_regmap(codec);
1224 snd_soc_free_ac97_codec(wm9713->ac97); 1234 snd_soc_free_ac97_codec(wm9713->ac97);
1225 return 0; 1235 return 0;
1226} 1236}
@@ -1230,13 +1240,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm9713 = {
1230 .remove = wm9713_soc_remove, 1240 .remove = wm9713_soc_remove,
1231 .suspend = wm9713_soc_suspend, 1241 .suspend = wm9713_soc_suspend,
1232 .resume = wm9713_soc_resume, 1242 .resume = wm9713_soc_resume,
1233 .read = ac97_read,
1234 .write = ac97_write,
1235 .set_bias_level = wm9713_set_bias_level, 1243 .set_bias_level = wm9713_set_bias_level,
1236 .reg_cache_size = ARRAY_SIZE(wm9713_reg),
1237 .reg_word_size = sizeof(u16),
1238 .reg_cache_step = 2,
1239 .reg_cache_default = wm9713_reg,
1240 1244
1241 .controls = wm9713_snd_ac97_controls, 1245 .controls = wm9713_snd_ac97_controls,
1242 .num_controls = ARRAY_SIZE(wm9713_snd_ac97_controls), 1246 .num_controls = ARRAY_SIZE(wm9713_snd_ac97_controls),
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index 0bb415a28723..33806d487b8a 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -201,27 +201,194 @@ static void wm_adsp_buf_free(struct list_head *list)
201 } 201 }
202} 202}
203 203
204#define WM_ADSP_NUM_FW 4 204#define WM_ADSP_FW_MBC_VSS 0
205 205#define WM_ADSP_FW_HIFI 1
206#define WM_ADSP_FW_MBC_VSS 0 206#define WM_ADSP_FW_TX 2
207#define WM_ADSP_FW_TX 1 207#define WM_ADSP_FW_TX_SPK 3
208#define WM_ADSP_FW_TX_SPK 2 208#define WM_ADSP_FW_RX 4
209#define WM_ADSP_FW_RX_ANC 3 209#define WM_ADSP_FW_RX_ANC 5
210#define WM_ADSP_FW_CTRL 6
211#define WM_ADSP_FW_ASR 7
212#define WM_ADSP_FW_TRACE 8
213#define WM_ADSP_FW_SPK_PROT 9
214#define WM_ADSP_FW_MISC 10
215
216#define WM_ADSP_NUM_FW 11
210 217
211static const char *wm_adsp_fw_text[WM_ADSP_NUM_FW] = { 218static const char *wm_adsp_fw_text[WM_ADSP_NUM_FW] = {
212 [WM_ADSP_FW_MBC_VSS] = "MBC/VSS", 219 [WM_ADSP_FW_MBC_VSS] = "MBC/VSS",
213 [WM_ADSP_FW_TX] = "Tx", 220 [WM_ADSP_FW_HIFI] = "MasterHiFi",
214 [WM_ADSP_FW_TX_SPK] = "Tx Speaker", 221 [WM_ADSP_FW_TX] = "Tx",
215 [WM_ADSP_FW_RX_ANC] = "Rx ANC", 222 [WM_ADSP_FW_TX_SPK] = "Tx Speaker",
223 [WM_ADSP_FW_RX] = "Rx",
224 [WM_ADSP_FW_RX_ANC] = "Rx ANC",
225 [WM_ADSP_FW_CTRL] = "Voice Ctrl",
226 [WM_ADSP_FW_ASR] = "ASR Assist",
227 [WM_ADSP_FW_TRACE] = "Dbg Trace",
228 [WM_ADSP_FW_SPK_PROT] = "Protection",
229 [WM_ADSP_FW_MISC] = "Misc",
230};
231
232struct wm_adsp_system_config_xm_hdr {
233 __be32 sys_enable;
234 __be32 fw_id;
235 __be32 fw_rev;
236 __be32 boot_status;
237 __be32 watchdog;
238 __be32 dma_buffer_size;
239 __be32 rdma[6];
240 __be32 wdma[8];
241 __be32 build_job_name[3];
242 __be32 build_job_number;
243};
244
245struct wm_adsp_alg_xm_struct {
246 __be32 magic;
247 __be32 smoothing;
248 __be32 threshold;
249 __be32 host_buf_ptr;
250 __be32 start_seq;
251 __be32 high_water_mark;
252 __be32 low_water_mark;
253 __be64 smoothed_power;
254};
255
256struct wm_adsp_buffer {
257 __be32 X_buf_base; /* XM base addr of first X area */
258 __be32 X_buf_size; /* Size of 1st X area in words */
259 __be32 X_buf_base2; /* XM base addr of 2nd X area */
260 __be32 X_buf_brk; /* Total X size in words */
261 __be32 Y_buf_base; /* YM base addr of Y area */
262 __be32 wrap; /* Total size X and Y in words */
263 __be32 high_water_mark; /* Point at which IRQ is asserted */
264 __be32 irq_count; /* bits 1-31 count IRQ assertions */
265 __be32 irq_ack; /* acked IRQ count, bit 0 enables IRQ */
266 __be32 next_write_index; /* word index of next write */
267 __be32 next_read_index; /* word index of next read */
268 __be32 error; /* error if any */
269 __be32 oldest_block_index; /* word index of oldest surviving */
270 __be32 requested_rewind; /* how many blocks rewind was done */
271 __be32 reserved_space; /* internal */
272 __be32 min_free; /* min free space since stream start */
273 __be32 blocks_written[2]; /* total blocks written (64 bit) */
274 __be32 words_written[2]; /* total words written (64 bit) */
275};
276
277struct wm_adsp_compr_buf {
278 struct wm_adsp *dsp;
279
280 struct wm_adsp_buffer_region *regions;
281 u32 host_buf_ptr;
282
283 u32 error;
284 u32 irq_count;
285 int read_index;
286 int avail;
287};
288
289struct wm_adsp_compr {
290 struct wm_adsp *dsp;
291 struct wm_adsp_compr_buf *buf;
292
293 struct snd_compr_stream *stream;
294 struct snd_compressed_buffer size;
295
296 u32 *raw_buf;
297 unsigned int copied_total;
298};
299
300#define WM_ADSP_DATA_WORD_SIZE 3
301
302#define WM_ADSP_MIN_FRAGMENTS 1
303#define WM_ADSP_MAX_FRAGMENTS 256
304#define WM_ADSP_MIN_FRAGMENT_SIZE (64 * WM_ADSP_DATA_WORD_SIZE)
305#define WM_ADSP_MAX_FRAGMENT_SIZE (4096 * WM_ADSP_DATA_WORD_SIZE)
306
307#define WM_ADSP_ALG_XM_STRUCT_MAGIC 0x49aec7
308
309#define HOST_BUFFER_FIELD(field) \
310 (offsetof(struct wm_adsp_buffer, field) / sizeof(__be32))
311
312#define ALG_XM_FIELD(field) \
313 (offsetof(struct wm_adsp_alg_xm_struct, field) / sizeof(__be32))
314
315static int wm_adsp_buffer_init(struct wm_adsp *dsp);
316static int wm_adsp_buffer_free(struct wm_adsp *dsp);
317
318struct wm_adsp_buffer_region {
319 unsigned int offset;
320 unsigned int cumulative_size;
321 unsigned int mem_type;
322 unsigned int base_addr;
323};
324
325struct wm_adsp_buffer_region_def {
326 unsigned int mem_type;
327 unsigned int base_offset;
328 unsigned int size_offset;
216}; 329};
217 330
218static struct { 331static struct wm_adsp_buffer_region_def ez2control_regions[] = {
332 {
333 .mem_type = WMFW_ADSP2_XM,
334 .base_offset = HOST_BUFFER_FIELD(X_buf_base),
335 .size_offset = HOST_BUFFER_FIELD(X_buf_size),
336 },
337 {
338 .mem_type = WMFW_ADSP2_XM,
339 .base_offset = HOST_BUFFER_FIELD(X_buf_base2),
340 .size_offset = HOST_BUFFER_FIELD(X_buf_brk),
341 },
342 {
343 .mem_type = WMFW_ADSP2_YM,
344 .base_offset = HOST_BUFFER_FIELD(Y_buf_base),
345 .size_offset = HOST_BUFFER_FIELD(wrap),
346 },
347};
348
349struct wm_adsp_fw_caps {
350 u32 id;
351 struct snd_codec_desc desc;
352 int num_regions;
353 struct wm_adsp_buffer_region_def *region_defs;
354};
355
356static const struct wm_adsp_fw_caps ez2control_caps[] = {
357 {
358 .id = SND_AUDIOCODEC_BESPOKE,
359 .desc = {
360 .max_ch = 1,
361 .sample_rates = { 16000 },
362 .num_sample_rates = 1,
363 .formats = SNDRV_PCM_FMTBIT_S16_LE,
364 },
365 .num_regions = ARRAY_SIZE(ez2control_regions),
366 .region_defs = ez2control_regions,
367 },
368};
369
370static const struct {
219 const char *file; 371 const char *file;
372 int compr_direction;
373 int num_caps;
374 const struct wm_adsp_fw_caps *caps;
220} wm_adsp_fw[WM_ADSP_NUM_FW] = { 375} wm_adsp_fw[WM_ADSP_NUM_FW] = {
221 [WM_ADSP_FW_MBC_VSS] = { .file = "mbc-vss" }, 376 [WM_ADSP_FW_MBC_VSS] = { .file = "mbc-vss" },
222 [WM_ADSP_FW_TX] = { .file = "tx" }, 377 [WM_ADSP_FW_HIFI] = { .file = "hifi" },
223 [WM_ADSP_FW_TX_SPK] = { .file = "tx-spk" }, 378 [WM_ADSP_FW_TX] = { .file = "tx" },
224 [WM_ADSP_FW_RX_ANC] = { .file = "rx-anc" }, 379 [WM_ADSP_FW_TX_SPK] = { .file = "tx-spk" },
380 [WM_ADSP_FW_RX] = { .file = "rx" },
381 [WM_ADSP_FW_RX_ANC] = { .file = "rx-anc" },
382 [WM_ADSP_FW_CTRL] = {
383 .file = "ctrl",
384 .compr_direction = SND_COMPRESS_CAPTURE,
385 .num_caps = ARRAY_SIZE(ez2control_caps),
386 .caps = ez2control_caps,
387 },
388 [WM_ADSP_FW_ASR] = { .file = "asr" },
389 [WM_ADSP_FW_TRACE] = { .file = "trace" },
390 [WM_ADSP_FW_SPK_PROT] = { .file = "spk-prot" },
391 [WM_ADSP_FW_MISC] = { .file = "misc" },
225}; 392};
226 393
227struct wm_coeff_ctl_ops { 394struct wm_coeff_ctl_ops {
@@ -254,30 +421,24 @@ static void wm_adsp_debugfs_save_wmfwname(struct wm_adsp *dsp, const char *s)
254{ 421{
255 char *tmp = kasprintf(GFP_KERNEL, "%s\n", s); 422 char *tmp = kasprintf(GFP_KERNEL, "%s\n", s);
256 423
257 mutex_lock(&dsp->debugfs_lock);
258 kfree(dsp->wmfw_file_name); 424 kfree(dsp->wmfw_file_name);
259 dsp->wmfw_file_name = tmp; 425 dsp->wmfw_file_name = tmp;
260 mutex_unlock(&dsp->debugfs_lock);
261} 426}
262 427
263static void wm_adsp_debugfs_save_binname(struct wm_adsp *dsp, const char *s) 428static void wm_adsp_debugfs_save_binname(struct wm_adsp *dsp, const char *s)
264{ 429{
265 char *tmp = kasprintf(GFP_KERNEL, "%s\n", s); 430 char *tmp = kasprintf(GFP_KERNEL, "%s\n", s);
266 431
267 mutex_lock(&dsp->debugfs_lock);
268 kfree(dsp->bin_file_name); 432 kfree(dsp->bin_file_name);
269 dsp->bin_file_name = tmp; 433 dsp->bin_file_name = tmp;
270 mutex_unlock(&dsp->debugfs_lock);
271} 434}
272 435
273static void wm_adsp_debugfs_clear(struct wm_adsp *dsp) 436static void wm_adsp_debugfs_clear(struct wm_adsp *dsp)
274{ 437{
275 mutex_lock(&dsp->debugfs_lock);
276 kfree(dsp->wmfw_file_name); 438 kfree(dsp->wmfw_file_name);
277 kfree(dsp->bin_file_name); 439 kfree(dsp->bin_file_name);
278 dsp->wmfw_file_name = NULL; 440 dsp->wmfw_file_name = NULL;
279 dsp->bin_file_name = NULL; 441 dsp->bin_file_name = NULL;
280 mutex_unlock(&dsp->debugfs_lock);
281} 442}
282 443
283static ssize_t wm_adsp_debugfs_wmfw_read(struct file *file, 444static ssize_t wm_adsp_debugfs_wmfw_read(struct file *file,
@@ -287,7 +448,7 @@ static ssize_t wm_adsp_debugfs_wmfw_read(struct file *file,
287 struct wm_adsp *dsp = file->private_data; 448 struct wm_adsp *dsp = file->private_data;
288 ssize_t ret; 449 ssize_t ret;
289 450
290 mutex_lock(&dsp->debugfs_lock); 451 mutex_lock(&dsp->pwr_lock);
291 452
292 if (!dsp->wmfw_file_name || !dsp->running) 453 if (!dsp->wmfw_file_name || !dsp->running)
293 ret = 0; 454 ret = 0;
@@ -296,7 +457,7 @@ static ssize_t wm_adsp_debugfs_wmfw_read(struct file *file,
296 dsp->wmfw_file_name, 457 dsp->wmfw_file_name,
297 strlen(dsp->wmfw_file_name)); 458 strlen(dsp->wmfw_file_name));
298 459
299 mutex_unlock(&dsp->debugfs_lock); 460 mutex_unlock(&dsp->pwr_lock);
300 return ret; 461 return ret;
301} 462}
302 463
@@ -307,7 +468,7 @@ static ssize_t wm_adsp_debugfs_bin_read(struct file *file,
307 struct wm_adsp *dsp = file->private_data; 468 struct wm_adsp *dsp = file->private_data;
308 ssize_t ret; 469 ssize_t ret;
309 470
310 mutex_lock(&dsp->debugfs_lock); 471 mutex_lock(&dsp->pwr_lock);
311 472
312 if (!dsp->bin_file_name || !dsp->running) 473 if (!dsp->bin_file_name || !dsp->running)
313 ret = 0; 474 ret = 0;
@@ -316,7 +477,7 @@ static ssize_t wm_adsp_debugfs_bin_read(struct file *file,
316 dsp->bin_file_name, 477 dsp->bin_file_name,
317 strlen(dsp->bin_file_name)); 478 strlen(dsp->bin_file_name));
318 479
319 mutex_unlock(&dsp->debugfs_lock); 480 mutex_unlock(&dsp->pwr_lock);
320 return ret; 481 return ret;
321} 482}
322 483
@@ -436,6 +597,7 @@ static int wm_adsp_fw_put(struct snd_kcontrol *kcontrol,
436 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); 597 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
437 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 598 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
438 struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); 599 struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec);
600 int ret = 0;
439 601
440 if (ucontrol->value.integer.value[0] == dsp[e->shift_l].fw) 602 if (ucontrol->value.integer.value[0] == dsp[e->shift_l].fw)
441 return 0; 603 return 0;
@@ -443,12 +605,16 @@ static int wm_adsp_fw_put(struct snd_kcontrol *kcontrol,
443 if (ucontrol->value.integer.value[0] >= WM_ADSP_NUM_FW) 605 if (ucontrol->value.integer.value[0] >= WM_ADSP_NUM_FW)
444 return -EINVAL; 606 return -EINVAL;
445 607
446 if (dsp[e->shift_l].running) 608 mutex_lock(&dsp[e->shift_l].pwr_lock);
447 return -EBUSY;
448 609
449 dsp[e->shift_l].fw = ucontrol->value.integer.value[0]; 610 if (dsp[e->shift_l].running || dsp[e->shift_l].compr)
611 ret = -EBUSY;
612 else
613 dsp[e->shift_l].fw = ucontrol->value.integer.value[0];
450 614
451 return 0; 615 mutex_unlock(&dsp[e->shift_l].pwr_lock);
616
617 return ret;
452} 618}
453 619
454static const struct soc_enum wm_adsp_fw_enum[] = { 620static const struct soc_enum wm_adsp_fw_enum[] = {
@@ -523,10 +689,10 @@ static void wm_adsp2_show_fw_status(struct wm_adsp *dsp)
523 be16_to_cpu(scratch[3])); 689 be16_to_cpu(scratch[3]));
524} 690}
525 691
526static int wm_coeff_info(struct snd_kcontrol *kcontrol, 692static int wm_coeff_info(struct snd_kcontrol *kctl,
527 struct snd_ctl_elem_info *uinfo) 693 struct snd_ctl_elem_info *uinfo)
528{ 694{
529 struct wm_coeff_ctl *ctl = (struct wm_coeff_ctl *)kcontrol->private_value; 695 struct wm_coeff_ctl *ctl = (struct wm_coeff_ctl *)kctl->private_value;
530 696
531 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; 697 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
532 uinfo->count = ctl->len; 698 uinfo->count = ctl->len;
@@ -572,19 +738,24 @@ static int wm_coeff_write_control(struct wm_coeff_ctl *ctl,
572 return 0; 738 return 0;
573} 739}
574 740
575static int wm_coeff_put(struct snd_kcontrol *kcontrol, 741static int wm_coeff_put(struct snd_kcontrol *kctl,
576 struct snd_ctl_elem_value *ucontrol) 742 struct snd_ctl_elem_value *ucontrol)
577{ 743{
578 struct wm_coeff_ctl *ctl = (struct wm_coeff_ctl *)kcontrol->private_value; 744 struct wm_coeff_ctl *ctl = (struct wm_coeff_ctl *)kctl->private_value;
579 char *p = ucontrol->value.bytes.data; 745 char *p = ucontrol->value.bytes.data;
746 int ret = 0;
747
748 mutex_lock(&ctl->dsp->pwr_lock);
580 749
581 memcpy(ctl->cache, p, ctl->len); 750 memcpy(ctl->cache, p, ctl->len);
582 751
583 ctl->set = 1; 752 ctl->set = 1;
584 if (!ctl->enabled) 753 if (ctl->enabled)
585 return 0; 754 ret = wm_coeff_write_control(ctl, p, ctl->len);
755
756 mutex_unlock(&ctl->dsp->pwr_lock);
586 757
587 return wm_coeff_write_control(ctl, p, ctl->len); 758 return ret;
588} 759}
589 760
590static int wm_coeff_read_control(struct wm_coeff_ctl *ctl, 761static int wm_coeff_read_control(struct wm_coeff_ctl *ctl,
@@ -626,22 +797,30 @@ static int wm_coeff_read_control(struct wm_coeff_ctl *ctl,
626 return 0; 797 return 0;
627} 798}
628 799
629static int wm_coeff_get(struct snd_kcontrol *kcontrol, 800static int wm_coeff_get(struct snd_kcontrol *kctl,
630 struct snd_ctl_elem_value *ucontrol) 801 struct snd_ctl_elem_value *ucontrol)
631{ 802{
632 struct wm_coeff_ctl *ctl = (struct wm_coeff_ctl *)kcontrol->private_value; 803 struct wm_coeff_ctl *ctl = (struct wm_coeff_ctl *)kctl->private_value;
633 char *p = ucontrol->value.bytes.data; 804 char *p = ucontrol->value.bytes.data;
805 int ret = 0;
806
807 mutex_lock(&ctl->dsp->pwr_lock);
634 808
635 if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) { 809 if (ctl->flags & WMFW_CTL_FLAG_VOLATILE) {
636 if (ctl->enabled) 810 if (ctl->enabled)
637 return wm_coeff_read_control(ctl, p, ctl->len); 811 ret = wm_coeff_read_control(ctl, p, ctl->len);
638 else 812 else
639 return -EPERM; 813 ret = -EPERM;
814 } else {
815 if (!ctl->flags && ctl->enabled)
816 ret = wm_coeff_read_control(ctl, ctl->cache, ctl->len);
817
818 memcpy(p, ctl->cache, ctl->len);
640 } 819 }
641 820
642 memcpy(p, ctl->cache, ctl->len); 821 mutex_unlock(&ctl->dsp->pwr_lock);
643 822
644 return 0; 823 return ret;
645} 824}
646 825
647struct wmfw_ctl_work { 826struct wmfw_ctl_work {
@@ -808,8 +987,7 @@ static int wm_adsp_create_control(struct wm_adsp *dsp,
808 break; 987 break;
809 } 988 }
810 989
811 list_for_each_entry(ctl, &dsp->ctl_list, 990 list_for_each_entry(ctl, &dsp->ctl_list, list) {
812 list) {
813 if (!strcmp(ctl->name, name)) { 991 if (!strcmp(ctl->name, name)) {
814 if (!ctl->enabled) 992 if (!ctl->enabled)
815 ctl->enabled = 1; 993 ctl->enabled = 1;
@@ -1088,7 +1266,7 @@ static int wm_adsp_load(struct wm_adsp *dsp)
1088 goto out_fw; 1266 goto out_fw;
1089 } 1267 }
1090 1268
1091 header = (void*)&firmware->data[0]; 1269 header = (void *)&firmware->data[0];
1092 1270
1093 if (memcmp(&header->magic[0], "WMFW", 4) != 0) { 1271 if (memcmp(&header->magic[0], "WMFW", 4) != 0) {
1094 adsp_err(dsp, "%s: invalid magic\n", file); 1272 adsp_err(dsp, "%s: invalid magic\n", file);
@@ -1168,7 +1346,7 @@ static int wm_adsp_load(struct wm_adsp *dsp)
1168 offset = le32_to_cpu(region->offset) & 0xffffff; 1346 offset = le32_to_cpu(region->offset) & 0xffffff;
1169 type = be32_to_cpu(region->type) & 0xff; 1347 type = be32_to_cpu(region->type) & 0xff;
1170 mem = wm_adsp_find_region(dsp, type); 1348 mem = wm_adsp_find_region(dsp, type);
1171 1349
1172 switch (type) { 1350 switch (type) {
1173 case WMFW_NAME_TEXT: 1351 case WMFW_NAME_TEXT:
1174 region_name = "Firmware name"; 1352 region_name = "Firmware name";
@@ -1333,6 +1511,19 @@ static void *wm_adsp_read_algs(struct wm_adsp *dsp, size_t n_algs,
1333 return alg; 1511 return alg;
1334} 1512}
1335 1513
1514static struct wm_adsp_alg_region *
1515 wm_adsp_find_alg_region(struct wm_adsp *dsp, int type, unsigned int id)
1516{
1517 struct wm_adsp_alg_region *alg_region;
1518
1519 list_for_each_entry(alg_region, &dsp->alg_regions, list) {
1520 if (id == alg_region->alg && type == alg_region->type)
1521 return alg_region;
1522 }
1523
1524 return NULL;
1525}
1526
1336static struct wm_adsp_alg_region *wm_adsp_create_region(struct wm_adsp *dsp, 1527static struct wm_adsp_alg_region *wm_adsp_create_region(struct wm_adsp *dsp,
1337 int type, __be32 id, 1528 int type, __be32 id,
1338 __be32 base) 1529 __be32 base)
@@ -1625,7 +1816,7 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
1625 goto out_fw; 1816 goto out_fw;
1626 } 1817 }
1627 1818
1628 hdr = (void*)&firmware->data[0]; 1819 hdr = (void *)&firmware->data[0];
1629 if (memcmp(hdr->magic, "WMDR", 4) != 0) { 1820 if (memcmp(hdr->magic, "WMDR", 4) != 0) {
1630 adsp_err(dsp, "%s: invalid magic\n", file); 1821 adsp_err(dsp, "%s: invalid magic\n", file);
1631 goto out_fw; 1822 goto out_fw;
@@ -1651,7 +1842,7 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
1651 blocks = 0; 1842 blocks = 0;
1652 while (pos < firmware->size && 1843 while (pos < firmware->size &&
1653 pos - firmware->size > sizeof(*blk)) { 1844 pos - firmware->size > sizeof(*blk)) {
1654 blk = (void*)(&firmware->data[pos]); 1845 blk = (void *)(&firmware->data[pos]);
1655 1846
1656 type = le16_to_cpu(blk->type); 1847 type = le16_to_cpu(blk->type);
1657 offset = le16_to_cpu(blk->offset); 1848 offset = le16_to_cpu(blk->offset);
@@ -1705,22 +1896,16 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
1705 break; 1896 break;
1706 } 1897 }
1707 1898
1708 reg = 0; 1899 alg_region = wm_adsp_find_alg_region(dsp, type,
1709 list_for_each_entry(alg_region, 1900 le32_to_cpu(blk->id));
1710 &dsp->alg_regions, list) { 1901 if (alg_region) {
1711 if (le32_to_cpu(blk->id) == alg_region->alg && 1902 reg = alg_region->base;
1712 type == alg_region->type) { 1903 reg = wm_adsp_region_to_reg(mem, reg);
1713 reg = alg_region->base; 1904 reg += offset;
1714 reg = wm_adsp_region_to_reg(mem, 1905 } else {
1715 reg);
1716 reg += offset;
1717 break;
1718 }
1719 }
1720
1721 if (reg == 0)
1722 adsp_err(dsp, "No %x for algorithm %x\n", 1906 adsp_err(dsp, "No %x for algorithm %x\n",
1723 type, le32_to_cpu(blk->id)); 1907 type, le32_to_cpu(blk->id));
1908 }
1724 break; 1909 break;
1725 1910
1726 default: 1911 default:
@@ -1778,9 +1963,8 @@ int wm_adsp1_init(struct wm_adsp *dsp)
1778{ 1963{
1779 INIT_LIST_HEAD(&dsp->alg_regions); 1964 INIT_LIST_HEAD(&dsp->alg_regions);
1780 1965
1781#ifdef CONFIG_DEBUG_FS 1966 mutex_init(&dsp->pwr_lock);
1782 mutex_init(&dsp->debugfs_lock); 1967
1783#endif
1784 return 0; 1968 return 0;
1785} 1969}
1786EXPORT_SYMBOL_GPL(wm_adsp1_init); 1970EXPORT_SYMBOL_GPL(wm_adsp1_init);
@@ -1795,10 +1979,12 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
1795 struct wm_adsp_alg_region *alg_region; 1979 struct wm_adsp_alg_region *alg_region;
1796 struct wm_coeff_ctl *ctl; 1980 struct wm_coeff_ctl *ctl;
1797 int ret; 1981 int ret;
1798 int val; 1982 unsigned int val;
1799 1983
1800 dsp->card = codec->component.card; 1984 dsp->card = codec->component.card;
1801 1985
1986 mutex_lock(&dsp->pwr_lock);
1987
1802 switch (event) { 1988 switch (event) {
1803 case SND_SOC_DAPM_POST_PMU: 1989 case SND_SOC_DAPM_POST_PMU:
1804 regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, 1990 regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30,
@@ -1808,12 +1994,12 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
1808 * For simplicity set the DSP clock rate to be the 1994 * For simplicity set the DSP clock rate to be the
1809 * SYSCLK rate rather than making it configurable. 1995 * SYSCLK rate rather than making it configurable.
1810 */ 1996 */
1811 if(dsp->sysclk_reg) { 1997 if (dsp->sysclk_reg) {
1812 ret = regmap_read(dsp->regmap, dsp->sysclk_reg, &val); 1998 ret = regmap_read(dsp->regmap, dsp->sysclk_reg, &val);
1813 if (ret != 0) { 1999 if (ret != 0) {
1814 adsp_err(dsp, "Failed to read SYSCLK state: %d\n", 2000 adsp_err(dsp, "Failed to read SYSCLK state: %d\n",
1815 ret); 2001 ret);
1816 return ret; 2002 goto err_mutex;
1817 } 2003 }
1818 2004
1819 val = (val & dsp->sysclk_mask) 2005 val = (val & dsp->sysclk_mask)
@@ -1825,31 +2011,31 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
1825 if (ret != 0) { 2011 if (ret != 0) {
1826 adsp_err(dsp, "Failed to set clock rate: %d\n", 2012 adsp_err(dsp, "Failed to set clock rate: %d\n",
1827 ret); 2013 ret);
1828 return ret; 2014 goto err_mutex;
1829 } 2015 }
1830 } 2016 }
1831 2017
1832 ret = wm_adsp_load(dsp); 2018 ret = wm_adsp_load(dsp);
1833 if (ret != 0) 2019 if (ret != 0)
1834 goto err; 2020 goto err_ena;
1835 2021
1836 ret = wm_adsp1_setup_algs(dsp); 2022 ret = wm_adsp1_setup_algs(dsp);
1837 if (ret != 0) 2023 if (ret != 0)
1838 goto err; 2024 goto err_ena;
1839 2025
1840 ret = wm_adsp_load_coeff(dsp); 2026 ret = wm_adsp_load_coeff(dsp);
1841 if (ret != 0) 2027 if (ret != 0)
1842 goto err; 2028 goto err_ena;
1843 2029
1844 /* Initialize caches for enabled and unset controls */ 2030 /* Initialize caches for enabled and unset controls */
1845 ret = wm_coeff_init_control_caches(dsp); 2031 ret = wm_coeff_init_control_caches(dsp);
1846 if (ret != 0) 2032 if (ret != 0)
1847 goto err; 2033 goto err_ena;
1848 2034
1849 /* Sync set controls */ 2035 /* Sync set controls */
1850 ret = wm_coeff_sync_controls(dsp); 2036 ret = wm_coeff_sync_controls(dsp);
1851 if (ret != 0) 2037 if (ret != 0)
1852 goto err; 2038 goto err_ena;
1853 2039
1854 /* Start the core running */ 2040 /* Start the core running */
1855 regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, 2041 regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30,
@@ -1884,11 +2070,16 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
1884 break; 2070 break;
1885 } 2071 }
1886 2072
2073 mutex_unlock(&dsp->pwr_lock);
2074
1887 return 0; 2075 return 0;
1888 2076
1889err: 2077err_ena:
1890 regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, 2078 regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30,
1891 ADSP1_SYS_ENA, 0); 2079 ADSP1_SYS_ENA, 0);
2080err_mutex:
2081 mutex_unlock(&dsp->pwr_lock);
2082
1892 return ret; 2083 return ret;
1893} 2084}
1894EXPORT_SYMBOL_GPL(wm_adsp1_event); 2085EXPORT_SYMBOL_GPL(wm_adsp1_event);
@@ -1934,6 +2125,8 @@ static void wm_adsp2_boot_work(struct work_struct *work)
1934 int ret; 2125 int ret;
1935 unsigned int val; 2126 unsigned int val;
1936 2127
2128 mutex_lock(&dsp->pwr_lock);
2129
1937 /* 2130 /*
1938 * For simplicity set the DSP clock rate to be the 2131 * For simplicity set the DSP clock rate to be the
1939 * SYSCLK rate rather than making it configurable. 2132 * SYSCLK rate rather than making it configurable.
@@ -1941,7 +2134,7 @@ static void wm_adsp2_boot_work(struct work_struct *work)
1941 ret = regmap_read(dsp->regmap, ARIZONA_SYSTEM_CLOCK_1, &val); 2134 ret = regmap_read(dsp->regmap, ARIZONA_SYSTEM_CLOCK_1, &val);
1942 if (ret != 0) { 2135 if (ret != 0) {
1943 adsp_err(dsp, "Failed to read SYSCLK state: %d\n", ret); 2136 adsp_err(dsp, "Failed to read SYSCLK state: %d\n", ret);
1944 return; 2137 goto err_mutex;
1945 } 2138 }
1946 val = (val & ARIZONA_SYSCLK_FREQ_MASK) 2139 val = (val & ARIZONA_SYSCLK_FREQ_MASK)
1947 >> ARIZONA_SYSCLK_FREQ_SHIFT; 2140 >> ARIZONA_SYSCLK_FREQ_SHIFT;
@@ -1951,42 +2144,46 @@ static void wm_adsp2_boot_work(struct work_struct *work)
1951 ADSP2_CLK_SEL_MASK, val); 2144 ADSP2_CLK_SEL_MASK, val);
1952 if (ret != 0) { 2145 if (ret != 0) {
1953 adsp_err(dsp, "Failed to set clock rate: %d\n", ret); 2146 adsp_err(dsp, "Failed to set clock rate: %d\n", ret);
1954 return; 2147 goto err_mutex;
1955 } 2148 }
1956 2149
1957 ret = wm_adsp2_ena(dsp); 2150 ret = wm_adsp2_ena(dsp);
1958 if (ret != 0) 2151 if (ret != 0)
1959 return; 2152 goto err_mutex;
1960 2153
1961 ret = wm_adsp_load(dsp); 2154 ret = wm_adsp_load(dsp);
1962 if (ret != 0) 2155 if (ret != 0)
1963 goto err; 2156 goto err_ena;
1964 2157
1965 ret = wm_adsp2_setup_algs(dsp); 2158 ret = wm_adsp2_setup_algs(dsp);
1966 if (ret != 0) 2159 if (ret != 0)
1967 goto err; 2160 goto err_ena;
1968 2161
1969 ret = wm_adsp_load_coeff(dsp); 2162 ret = wm_adsp_load_coeff(dsp);
1970 if (ret != 0) 2163 if (ret != 0)
1971 goto err; 2164 goto err_ena;
1972 2165
1973 /* Initialize caches for enabled and unset controls */ 2166 /* Initialize caches for enabled and unset controls */
1974 ret = wm_coeff_init_control_caches(dsp); 2167 ret = wm_coeff_init_control_caches(dsp);
1975 if (ret != 0) 2168 if (ret != 0)
1976 goto err; 2169 goto err_ena;
1977 2170
1978 /* Sync set controls */ 2171 /* Sync set controls */
1979 ret = wm_coeff_sync_controls(dsp); 2172 ret = wm_coeff_sync_controls(dsp);
1980 if (ret != 0) 2173 if (ret != 0)
1981 goto err; 2174 goto err_ena;
1982 2175
1983 dsp->running = true; 2176 dsp->running = true;
1984 2177
2178 mutex_unlock(&dsp->pwr_lock);
2179
1985 return; 2180 return;
1986 2181
1987err: 2182err_ena:
1988 regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL, 2183 regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
1989 ADSP2_SYS_ENA | ADSP2_CORE_ENA | ADSP2_START, 0); 2184 ADSP2_SYS_ENA | ADSP2_CORE_ENA | ADSP2_START, 0);
2185err_mutex:
2186 mutex_unlock(&dsp->pwr_lock);
1990} 2187}
1991 2188
1992int wm_adsp2_early_event(struct snd_soc_dapm_widget *w, 2189int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
@@ -2033,12 +2230,18 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
2033 ADSP2_CORE_ENA | ADSP2_START); 2230 ADSP2_CORE_ENA | ADSP2_START);
2034 if (ret != 0) 2231 if (ret != 0)
2035 goto err; 2232 goto err;
2233
2234 if (wm_adsp_fw[dsp->fw].num_caps != 0)
2235 ret = wm_adsp_buffer_init(dsp);
2236
2036 break; 2237 break;
2037 2238
2038 case SND_SOC_DAPM_PRE_PMD: 2239 case SND_SOC_DAPM_PRE_PMD:
2039 /* Log firmware state, it can be useful for analysis */ 2240 /* Log firmware state, it can be useful for analysis */
2040 wm_adsp2_show_fw_status(dsp); 2241 wm_adsp2_show_fw_status(dsp);
2041 2242
2243 mutex_lock(&dsp->pwr_lock);
2244
2042 wm_adsp_debugfs_clear(dsp); 2245 wm_adsp_debugfs_clear(dsp);
2043 2246
2044 dsp->fw_id = 0; 2247 dsp->fw_id = 0;
@@ -2065,6 +2268,11 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
2065 kfree(alg_region); 2268 kfree(alg_region);
2066 } 2269 }
2067 2270
2271 if (wm_adsp_fw[dsp->fw].num_caps != 0)
2272 wm_adsp_buffer_free(dsp);
2273
2274 mutex_unlock(&dsp->pwr_lock);
2275
2068 adsp_dbg(dsp, "Shutdown complete\n"); 2276 adsp_dbg(dsp, "Shutdown complete\n");
2069 break; 2277 break;
2070 2278
@@ -2117,11 +2325,724 @@ int wm_adsp2_init(struct wm_adsp *dsp)
2117 INIT_LIST_HEAD(&dsp->ctl_list); 2325 INIT_LIST_HEAD(&dsp->ctl_list);
2118 INIT_WORK(&dsp->boot_work, wm_adsp2_boot_work); 2326 INIT_WORK(&dsp->boot_work, wm_adsp2_boot_work);
2119 2327
2120#ifdef CONFIG_DEBUG_FS 2328 mutex_init(&dsp->pwr_lock);
2121 mutex_init(&dsp->debugfs_lock); 2329
2122#endif
2123 return 0; 2330 return 0;
2124} 2331}
2125EXPORT_SYMBOL_GPL(wm_adsp2_init); 2332EXPORT_SYMBOL_GPL(wm_adsp2_init);
2126 2333
2334int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream)
2335{
2336 struct wm_adsp_compr *compr;
2337 int ret = 0;
2338
2339 mutex_lock(&dsp->pwr_lock);
2340
2341 if (wm_adsp_fw[dsp->fw].num_caps == 0) {
2342 adsp_err(dsp, "Firmware does not support compressed API\n");
2343 ret = -ENXIO;
2344 goto out;
2345 }
2346
2347 if (wm_adsp_fw[dsp->fw].compr_direction != stream->direction) {
2348 adsp_err(dsp, "Firmware does not support stream direction\n");
2349 ret = -EINVAL;
2350 goto out;
2351 }
2352
2353 if (dsp->compr) {
2354 /* It is expect this limitation will be removed in future */
2355 adsp_err(dsp, "Only a single stream supported per DSP\n");
2356 ret = -EBUSY;
2357 goto out;
2358 }
2359
2360 compr = kzalloc(sizeof(*compr), GFP_KERNEL);
2361 if (!compr) {
2362 ret = -ENOMEM;
2363 goto out;
2364 }
2365
2366 compr->dsp = dsp;
2367 compr->stream = stream;
2368
2369 dsp->compr = compr;
2370
2371 stream->runtime->private_data = compr;
2372
2373out:
2374 mutex_unlock(&dsp->pwr_lock);
2375
2376 return ret;
2377}
2378EXPORT_SYMBOL_GPL(wm_adsp_compr_open);
2379
2380int wm_adsp_compr_free(struct snd_compr_stream *stream)
2381{
2382 struct wm_adsp_compr *compr = stream->runtime->private_data;
2383 struct wm_adsp *dsp = compr->dsp;
2384
2385 mutex_lock(&dsp->pwr_lock);
2386
2387 dsp->compr = NULL;
2388
2389 kfree(compr->raw_buf);
2390 kfree(compr);
2391
2392 mutex_unlock(&dsp->pwr_lock);
2393
2394 return 0;
2395}
2396EXPORT_SYMBOL_GPL(wm_adsp_compr_free);
2397
2398static int wm_adsp_compr_check_params(struct snd_compr_stream *stream,
2399 struct snd_compr_params *params)
2400{
2401 struct wm_adsp_compr *compr = stream->runtime->private_data;
2402 struct wm_adsp *dsp = compr->dsp;
2403 const struct wm_adsp_fw_caps *caps;
2404 const struct snd_codec_desc *desc;
2405 int i, j;
2406
2407 if (params->buffer.fragment_size < WM_ADSP_MIN_FRAGMENT_SIZE ||
2408 params->buffer.fragment_size > WM_ADSP_MAX_FRAGMENT_SIZE ||
2409 params->buffer.fragments < WM_ADSP_MIN_FRAGMENTS ||
2410 params->buffer.fragments > WM_ADSP_MAX_FRAGMENTS ||
2411 params->buffer.fragment_size % WM_ADSP_DATA_WORD_SIZE) {
2412 adsp_err(dsp, "Invalid buffer fragsize=%d fragments=%d\n",
2413 params->buffer.fragment_size,
2414 params->buffer.fragments);
2415
2416 return -EINVAL;
2417 }
2418
2419 for (i = 0; i < wm_adsp_fw[dsp->fw].num_caps; i++) {
2420 caps = &wm_adsp_fw[dsp->fw].caps[i];
2421 desc = &caps->desc;
2422
2423 if (caps->id != params->codec.id)
2424 continue;
2425
2426 if (stream->direction == SND_COMPRESS_PLAYBACK) {
2427 if (desc->max_ch < params->codec.ch_out)
2428 continue;
2429 } else {
2430 if (desc->max_ch < params->codec.ch_in)
2431 continue;
2432 }
2433
2434 if (!(desc->formats & (1 << params->codec.format)))
2435 continue;
2436
2437 for (j = 0; j < desc->num_sample_rates; ++j)
2438 if (desc->sample_rates[j] == params->codec.sample_rate)
2439 return 0;
2440 }
2441
2442 adsp_err(dsp, "Invalid params id=%u ch=%u,%u rate=%u fmt=%u\n",
2443 params->codec.id, params->codec.ch_in, params->codec.ch_out,
2444 params->codec.sample_rate, params->codec.format);
2445 return -EINVAL;
2446}
2447
2448static inline unsigned int wm_adsp_compr_frag_words(struct wm_adsp_compr *compr)
2449{
2450 return compr->size.fragment_size / WM_ADSP_DATA_WORD_SIZE;
2451}
2452
2453int wm_adsp_compr_set_params(struct snd_compr_stream *stream,
2454 struct snd_compr_params *params)
2455{
2456 struct wm_adsp_compr *compr = stream->runtime->private_data;
2457 unsigned int size;
2458 int ret;
2459
2460 ret = wm_adsp_compr_check_params(stream, params);
2461 if (ret)
2462 return ret;
2463
2464 compr->size = params->buffer;
2465
2466 adsp_dbg(compr->dsp, "fragment_size=%d fragments=%d\n",
2467 compr->size.fragment_size, compr->size.fragments);
2468
2469 size = wm_adsp_compr_frag_words(compr) * sizeof(*compr->raw_buf);
2470 compr->raw_buf = kmalloc(size, GFP_DMA | GFP_KERNEL);
2471 if (!compr->raw_buf)
2472 return -ENOMEM;
2473
2474 return 0;
2475}
2476EXPORT_SYMBOL_GPL(wm_adsp_compr_set_params);
2477
2478int wm_adsp_compr_get_caps(struct snd_compr_stream *stream,
2479 struct snd_compr_caps *caps)
2480{
2481 struct wm_adsp_compr *compr = stream->runtime->private_data;
2482 int fw = compr->dsp->fw;
2483 int i;
2484
2485 if (wm_adsp_fw[fw].caps) {
2486 for (i = 0; i < wm_adsp_fw[fw].num_caps; i++)
2487 caps->codecs[i] = wm_adsp_fw[fw].caps[i].id;
2488
2489 caps->num_codecs = i;
2490 caps->direction = wm_adsp_fw[fw].compr_direction;
2491
2492 caps->min_fragment_size = WM_ADSP_MIN_FRAGMENT_SIZE;
2493 caps->max_fragment_size = WM_ADSP_MAX_FRAGMENT_SIZE;
2494 caps->min_fragments = WM_ADSP_MIN_FRAGMENTS;
2495 caps->max_fragments = WM_ADSP_MAX_FRAGMENTS;
2496 }
2497
2498 return 0;
2499}
2500EXPORT_SYMBOL_GPL(wm_adsp_compr_get_caps);
2501
2502static int wm_adsp_read_data_block(struct wm_adsp *dsp, int mem_type,
2503 unsigned int mem_addr,
2504 unsigned int num_words, u32 *data)
2505{
2506 struct wm_adsp_region const *mem = wm_adsp_find_region(dsp, mem_type);
2507 unsigned int i, reg;
2508 int ret;
2509
2510 if (!mem)
2511 return -EINVAL;
2512
2513 reg = wm_adsp_region_to_reg(mem, mem_addr);
2514
2515 ret = regmap_raw_read(dsp->regmap, reg, data,
2516 sizeof(*data) * num_words);
2517 if (ret < 0)
2518 return ret;
2519
2520 for (i = 0; i < num_words; ++i)
2521 data[i] = be32_to_cpu(data[i]) & 0x00ffffffu;
2522
2523 return 0;
2524}
2525
2526static inline int wm_adsp_read_data_word(struct wm_adsp *dsp, int mem_type,
2527 unsigned int mem_addr, u32 *data)
2528{
2529 return wm_adsp_read_data_block(dsp, mem_type, mem_addr, 1, data);
2530}
2531
2532static int wm_adsp_write_data_word(struct wm_adsp *dsp, int mem_type,
2533 unsigned int mem_addr, u32 data)
2534{
2535 struct wm_adsp_region const *mem = wm_adsp_find_region(dsp, mem_type);
2536 unsigned int reg;
2537
2538 if (!mem)
2539 return -EINVAL;
2540
2541 reg = wm_adsp_region_to_reg(mem, mem_addr);
2542
2543 data = cpu_to_be32(data & 0x00ffffffu);
2544
2545 return regmap_raw_write(dsp->regmap, reg, &data, sizeof(data));
2546}
2547
2548static inline int wm_adsp_buffer_read(struct wm_adsp_compr_buf *buf,
2549 unsigned int field_offset, u32 *data)
2550{
2551 return wm_adsp_read_data_word(buf->dsp, WMFW_ADSP2_XM,
2552 buf->host_buf_ptr + field_offset, data);
2553}
2554
2555static inline int wm_adsp_buffer_write(struct wm_adsp_compr_buf *buf,
2556 unsigned int field_offset, u32 data)
2557{
2558 return wm_adsp_write_data_word(buf->dsp, WMFW_ADSP2_XM,
2559 buf->host_buf_ptr + field_offset, data);
2560}
2561
2562static int wm_adsp_buffer_locate(struct wm_adsp_compr_buf *buf)
2563{
2564 struct wm_adsp_alg_region *alg_region;
2565 struct wm_adsp *dsp = buf->dsp;
2566 u32 xmalg, addr, magic;
2567 int i, ret;
2568
2569 alg_region = wm_adsp_find_alg_region(dsp, WMFW_ADSP2_XM, dsp->fw_id);
2570 xmalg = sizeof(struct wm_adsp_system_config_xm_hdr) / sizeof(__be32);
2571
2572 addr = alg_region->base + xmalg + ALG_XM_FIELD(magic);
2573 ret = wm_adsp_read_data_word(dsp, WMFW_ADSP2_XM, addr, &magic);
2574 if (ret < 0)
2575 return ret;
2576
2577 if (magic != WM_ADSP_ALG_XM_STRUCT_MAGIC)
2578 return -EINVAL;
2579
2580 addr = alg_region->base + xmalg + ALG_XM_FIELD(host_buf_ptr);
2581 for (i = 0; i < 5; ++i) {
2582 ret = wm_adsp_read_data_word(dsp, WMFW_ADSP2_XM, addr,
2583 &buf->host_buf_ptr);
2584 if (ret < 0)
2585 return ret;
2586
2587 if (buf->host_buf_ptr)
2588 break;
2589
2590 usleep_range(1000, 2000);
2591 }
2592
2593 if (!buf->host_buf_ptr)
2594 return -EIO;
2595
2596 adsp_dbg(dsp, "host_buf_ptr=%x\n", buf->host_buf_ptr);
2597
2598 return 0;
2599}
2600
2601static int wm_adsp_buffer_populate(struct wm_adsp_compr_buf *buf)
2602{
2603 const struct wm_adsp_fw_caps *caps = wm_adsp_fw[buf->dsp->fw].caps;
2604 struct wm_adsp_buffer_region *region;
2605 u32 offset = 0;
2606 int i, ret;
2607
2608 for (i = 0; i < caps->num_regions; ++i) {
2609 region = &buf->regions[i];
2610
2611 region->offset = offset;
2612 region->mem_type = caps->region_defs[i].mem_type;
2613
2614 ret = wm_adsp_buffer_read(buf, caps->region_defs[i].base_offset,
2615 &region->base_addr);
2616 if (ret < 0)
2617 return ret;
2618
2619 ret = wm_adsp_buffer_read(buf, caps->region_defs[i].size_offset,
2620 &offset);
2621 if (ret < 0)
2622 return ret;
2623
2624 region->cumulative_size = offset;
2625
2626 adsp_dbg(buf->dsp,
2627 "region=%d type=%d base=%04x off=%04x size=%04x\n",
2628 i, region->mem_type, region->base_addr,
2629 region->offset, region->cumulative_size);
2630 }
2631
2632 return 0;
2633}
2634
2635static int wm_adsp_buffer_init(struct wm_adsp *dsp)
2636{
2637 struct wm_adsp_compr_buf *buf;
2638 int ret;
2639
2640 buf = kzalloc(sizeof(*buf), GFP_KERNEL);
2641 if (!buf)
2642 return -ENOMEM;
2643
2644 buf->dsp = dsp;
2645 buf->read_index = -1;
2646 buf->irq_count = 0xFFFFFFFF;
2647
2648 ret = wm_adsp_buffer_locate(buf);
2649 if (ret < 0) {
2650 adsp_err(dsp, "Failed to acquire host buffer: %d\n", ret);
2651 goto err_buffer;
2652 }
2653
2654 buf->regions = kcalloc(wm_adsp_fw[dsp->fw].caps->num_regions,
2655 sizeof(*buf->regions), GFP_KERNEL);
2656 if (!buf->regions) {
2657 ret = -ENOMEM;
2658 goto err_buffer;
2659 }
2660
2661 ret = wm_adsp_buffer_populate(buf);
2662 if (ret < 0) {
2663 adsp_err(dsp, "Failed to populate host buffer: %d\n", ret);
2664 goto err_regions;
2665 }
2666
2667 dsp->buffer = buf;
2668
2669 return 0;
2670
2671err_regions:
2672 kfree(buf->regions);
2673err_buffer:
2674 kfree(buf);
2675 return ret;
2676}
2677
2678static int wm_adsp_buffer_free(struct wm_adsp *dsp)
2679{
2680 if (dsp->buffer) {
2681 kfree(dsp->buffer->regions);
2682 kfree(dsp->buffer);
2683
2684 dsp->buffer = NULL;
2685 }
2686
2687 return 0;
2688}
2689
2690static inline int wm_adsp_compr_attached(struct wm_adsp_compr *compr)
2691{
2692 return compr->buf != NULL;
2693}
2694
2695static int wm_adsp_compr_attach(struct wm_adsp_compr *compr)
2696{
2697 /*
2698 * Note this will be more complex once each DSP can support multiple
2699 * streams
2700 */
2701 if (!compr->dsp->buffer)
2702 return -EINVAL;
2703
2704 compr->buf = compr->dsp->buffer;
2705
2706 return 0;
2707}
2708
2709int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd)
2710{
2711 struct wm_adsp_compr *compr = stream->runtime->private_data;
2712 struct wm_adsp *dsp = compr->dsp;
2713 int ret = 0;
2714
2715 adsp_dbg(dsp, "Trigger: %d\n", cmd);
2716
2717 mutex_lock(&dsp->pwr_lock);
2718
2719 switch (cmd) {
2720 case SNDRV_PCM_TRIGGER_START:
2721 if (wm_adsp_compr_attached(compr))
2722 break;
2723
2724 ret = wm_adsp_compr_attach(compr);
2725 if (ret < 0) {
2726 adsp_err(dsp, "Failed to link buffer and stream: %d\n",
2727 ret);
2728 break;
2729 }
2730
2731 /* Trigger the IRQ at one fragment of data */
2732 ret = wm_adsp_buffer_write(compr->buf,
2733 HOST_BUFFER_FIELD(high_water_mark),
2734 wm_adsp_compr_frag_words(compr));
2735 if (ret < 0) {
2736 adsp_err(dsp, "Failed to set high water mark: %d\n",
2737 ret);
2738 break;
2739 }
2740 break;
2741 case SNDRV_PCM_TRIGGER_STOP:
2742 break;
2743 default:
2744 ret = -EINVAL;
2745 break;
2746 }
2747
2748 mutex_unlock(&dsp->pwr_lock);
2749
2750 return ret;
2751}
2752EXPORT_SYMBOL_GPL(wm_adsp_compr_trigger);
2753
2754static inline int wm_adsp_buffer_size(struct wm_adsp_compr_buf *buf)
2755{
2756 int last_region = wm_adsp_fw[buf->dsp->fw].caps->num_regions - 1;
2757
2758 return buf->regions[last_region].cumulative_size;
2759}
2760
2761static int wm_adsp_buffer_update_avail(struct wm_adsp_compr_buf *buf)
2762{
2763 u32 next_read_index, next_write_index;
2764 int write_index, read_index, avail;
2765 int ret;
2766
2767 /* Only sync read index if we haven't already read a valid index */
2768 if (buf->read_index < 0) {
2769 ret = wm_adsp_buffer_read(buf,
2770 HOST_BUFFER_FIELD(next_read_index),
2771 &next_read_index);
2772 if (ret < 0)
2773 return ret;
2774
2775 read_index = sign_extend32(next_read_index, 23);
2776
2777 if (read_index < 0) {
2778 adsp_dbg(buf->dsp, "Avail check on unstarted stream\n");
2779 return 0;
2780 }
2781
2782 buf->read_index = read_index;
2783 }
2784
2785 ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(next_write_index),
2786 &next_write_index);
2787 if (ret < 0)
2788 return ret;
2789
2790 write_index = sign_extend32(next_write_index, 23);
2791
2792 avail = write_index - buf->read_index;
2793 if (avail < 0)
2794 avail += wm_adsp_buffer_size(buf);
2795
2796 adsp_dbg(buf->dsp, "readindex=0x%x, writeindex=0x%x, avail=%d\n",
2797 buf->read_index, write_index, avail);
2798
2799 buf->avail = avail;
2800
2801 return 0;
2802}
2803
2804int wm_adsp_compr_handle_irq(struct wm_adsp *dsp)
2805{
2806 struct wm_adsp_compr_buf *buf = dsp->buffer;
2807 struct wm_adsp_compr *compr = dsp->compr;
2808 int ret = 0;
2809
2810 mutex_lock(&dsp->pwr_lock);
2811
2812 if (!buf) {
2813 adsp_err(dsp, "Spurious buffer IRQ\n");
2814 ret = -ENODEV;
2815 goto out;
2816 }
2817
2818 adsp_dbg(dsp, "Handling buffer IRQ\n");
2819
2820 ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(error), &buf->error);
2821 if (ret < 0) {
2822 adsp_err(dsp, "Failed to check buffer error: %d\n", ret);
2823 goto out;
2824 }
2825 if (buf->error != 0) {
2826 adsp_err(dsp, "Buffer error occurred: %d\n", buf->error);
2827 ret = -EIO;
2828 goto out;
2829 }
2830
2831 ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(irq_count),
2832 &buf->irq_count);
2833 if (ret < 0) {
2834 adsp_err(dsp, "Failed to get irq_count: %d\n", ret);
2835 goto out;
2836 }
2837
2838 ret = wm_adsp_buffer_update_avail(buf);
2839 if (ret < 0) {
2840 adsp_err(dsp, "Error reading avail: %d\n", ret);
2841 goto out;
2842 }
2843
2844 if (compr->stream)
2845 snd_compr_fragment_elapsed(compr->stream);
2846
2847out:
2848 mutex_unlock(&dsp->pwr_lock);
2849
2850 return ret;
2851}
2852EXPORT_SYMBOL_GPL(wm_adsp_compr_handle_irq);
2853
2854static int wm_adsp_buffer_reenable_irq(struct wm_adsp_compr_buf *buf)
2855{
2856 if (buf->irq_count & 0x01)
2857 return 0;
2858
2859 adsp_dbg(buf->dsp, "Enable IRQ(0x%x) for next fragment\n",
2860 buf->irq_count);
2861
2862 buf->irq_count |= 0x01;
2863
2864 return wm_adsp_buffer_write(buf, HOST_BUFFER_FIELD(irq_ack),
2865 buf->irq_count);
2866}
2867
2868int wm_adsp_compr_pointer(struct snd_compr_stream *stream,
2869 struct snd_compr_tstamp *tstamp)
2870{
2871 struct wm_adsp_compr *compr = stream->runtime->private_data;
2872 struct wm_adsp_compr_buf *buf = compr->buf;
2873 struct wm_adsp *dsp = compr->dsp;
2874 int ret = 0;
2875
2876 adsp_dbg(dsp, "Pointer request\n");
2877
2878 mutex_lock(&dsp->pwr_lock);
2879
2880 if (!compr->buf) {
2881 ret = -ENXIO;
2882 goto out;
2883 }
2884
2885 if (compr->buf->error) {
2886 ret = -EIO;
2887 goto out;
2888 }
2889
2890 if (buf->avail < wm_adsp_compr_frag_words(compr)) {
2891 ret = wm_adsp_buffer_update_avail(buf);
2892 if (ret < 0) {
2893 adsp_err(dsp, "Error reading avail: %d\n", ret);
2894 goto out;
2895 }
2896
2897 /*
2898 * If we really have less than 1 fragment available tell the
2899 * DSP to inform us once a whole fragment is available.
2900 */
2901 if (buf->avail < wm_adsp_compr_frag_words(compr)) {
2902 ret = wm_adsp_buffer_reenable_irq(buf);
2903 if (ret < 0) {
2904 adsp_err(dsp,
2905 "Failed to re-enable buffer IRQ: %d\n",
2906 ret);
2907 goto out;
2908 }
2909 }
2910 }
2911
2912 tstamp->copied_total = compr->copied_total;
2913 tstamp->copied_total += buf->avail * WM_ADSP_DATA_WORD_SIZE;
2914
2915out:
2916 mutex_unlock(&dsp->pwr_lock);
2917
2918 return ret;
2919}
2920EXPORT_SYMBOL_GPL(wm_adsp_compr_pointer);
2921
2922static int wm_adsp_buffer_capture_block(struct wm_adsp_compr *compr, int target)
2923{
2924 struct wm_adsp_compr_buf *buf = compr->buf;
2925 u8 *pack_in = (u8 *)compr->raw_buf;
2926 u8 *pack_out = (u8 *)compr->raw_buf;
2927 unsigned int adsp_addr;
2928 int mem_type, nwords, max_read;
2929 int i, j, ret;
2930
2931 /* Calculate read parameters */
2932 for (i = 0; i < wm_adsp_fw[buf->dsp->fw].caps->num_regions; ++i)
2933 if (buf->read_index < buf->regions[i].cumulative_size)
2934 break;
2935
2936 if (i == wm_adsp_fw[buf->dsp->fw].caps->num_regions)
2937 return -EINVAL;
2938
2939 mem_type = buf->regions[i].mem_type;
2940 adsp_addr = buf->regions[i].base_addr +
2941 (buf->read_index - buf->regions[i].offset);
2942
2943 max_read = wm_adsp_compr_frag_words(compr);
2944 nwords = buf->regions[i].cumulative_size - buf->read_index;
2945
2946 if (nwords > target)
2947 nwords = target;
2948 if (nwords > buf->avail)
2949 nwords = buf->avail;
2950 if (nwords > max_read)
2951 nwords = max_read;
2952 if (!nwords)
2953 return 0;
2954
2955 /* Read data from DSP */
2956 ret = wm_adsp_read_data_block(buf->dsp, mem_type, adsp_addr,
2957 nwords, compr->raw_buf);
2958 if (ret < 0)
2959 return ret;
2960
2961 /* Remove the padding bytes from the data read from the DSP */
2962 for (i = 0; i < nwords; i++) {
2963 for (j = 0; j < WM_ADSP_DATA_WORD_SIZE; j++)
2964 *pack_out++ = *pack_in++;
2965
2966 pack_in += sizeof(*(compr->raw_buf)) - WM_ADSP_DATA_WORD_SIZE;
2967 }
2968
2969 /* update read index to account for words read */
2970 buf->read_index += nwords;
2971 if (buf->read_index == wm_adsp_buffer_size(buf))
2972 buf->read_index = 0;
2973
2974 ret = wm_adsp_buffer_write(buf, HOST_BUFFER_FIELD(next_read_index),
2975 buf->read_index);
2976 if (ret < 0)
2977 return ret;
2978
2979 /* update avail to account for words read */
2980 buf->avail -= nwords;
2981
2982 return nwords;
2983}
2984
2985static int wm_adsp_compr_read(struct wm_adsp_compr *compr,
2986 char __user *buf, size_t count)
2987{
2988 struct wm_adsp *dsp = compr->dsp;
2989 int ntotal = 0;
2990 int nwords, nbytes;
2991
2992 adsp_dbg(dsp, "Requested read of %zu bytes\n", count);
2993
2994 if (!compr->buf)
2995 return -ENXIO;
2996
2997 if (compr->buf->error)
2998 return -EIO;
2999
3000 count /= WM_ADSP_DATA_WORD_SIZE;
3001
3002 do {
3003 nwords = wm_adsp_buffer_capture_block(compr, count);
3004 if (nwords < 0) {
3005 adsp_err(dsp, "Failed to capture block: %d\n", nwords);
3006 return nwords;
3007 }
3008
3009 nbytes = nwords * WM_ADSP_DATA_WORD_SIZE;
3010
3011 adsp_dbg(dsp, "Read %d bytes\n", nbytes);
3012
3013 if (copy_to_user(buf + ntotal, compr->raw_buf, nbytes)) {
3014 adsp_err(dsp, "Failed to copy data to user: %d, %d\n",
3015 ntotal, nbytes);
3016 return -EFAULT;
3017 }
3018
3019 count -= nwords;
3020 ntotal += nbytes;
3021 } while (nwords > 0 && count > 0);
3022
3023 compr->copied_total += ntotal;
3024
3025 return ntotal;
3026}
3027
3028int wm_adsp_compr_copy(struct snd_compr_stream *stream, char __user *buf,
3029 size_t count)
3030{
3031 struct wm_adsp_compr *compr = stream->runtime->private_data;
3032 struct wm_adsp *dsp = compr->dsp;
3033 int ret;
3034
3035 mutex_lock(&dsp->pwr_lock);
3036
3037 if (stream->direction == SND_COMPRESS_CAPTURE)
3038 ret = wm_adsp_compr_read(compr, buf, count);
3039 else
3040 ret = -ENOTSUPP;
3041
3042 mutex_unlock(&dsp->pwr_lock);
3043
3044 return ret;
3045}
3046EXPORT_SYMBOL_GPL(wm_adsp_compr_copy);
3047
2127MODULE_LICENSE("GPL v2"); 3048MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/codecs/wm_adsp.h b/sound/soc/codecs/wm_adsp.h
index 2d117cf0e953..1a928ec54741 100644
--- a/sound/soc/codecs/wm_adsp.h
+++ b/sound/soc/codecs/wm_adsp.h
@@ -15,6 +15,7 @@
15 15
16#include <sound/soc.h> 16#include <sound/soc.h>
17#include <sound/soc-dapm.h> 17#include <sound/soc-dapm.h>
18#include <sound/compress_driver.h>
18 19
19#include "wmfw.h" 20#include "wmfw.h"
20 21
@@ -30,6 +31,9 @@ struct wm_adsp_alg_region {
30 unsigned int base; 31 unsigned int base;
31}; 32};
32 33
34struct wm_adsp_compr;
35struct wm_adsp_compr_buf;
36
33struct wm_adsp { 37struct wm_adsp {
34 const char *part; 38 const char *part;
35 int num; 39 int num;
@@ -45,8 +49,8 @@ struct wm_adsp {
45 49
46 struct list_head alg_regions; 50 struct list_head alg_regions;
47 51
48 int fw_id; 52 unsigned int fw_id;
49 int fw_id_version; 53 unsigned int fw_id_version;
50 54
51 const struct wm_adsp_region *mem; 55 const struct wm_adsp_region *mem;
52 int num_mems; 56 int num_mems;
@@ -59,9 +63,13 @@ struct wm_adsp {
59 63
60 struct work_struct boot_work; 64 struct work_struct boot_work;
61 65
66 struct wm_adsp_compr *compr;
67 struct wm_adsp_compr_buf *buffer;
68
69 struct mutex pwr_lock;
70
62#ifdef CONFIG_DEBUG_FS 71#ifdef CONFIG_DEBUG_FS
63 struct dentry *debugfs_root; 72 struct dentry *debugfs_root;
64 struct mutex debugfs_lock;
65 char *wmfw_file_name; 73 char *wmfw_file_name;
66 char *bin_file_name; 74 char *bin_file_name;
67#endif 75#endif
@@ -96,4 +104,18 @@ int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
96int wm_adsp2_event(struct snd_soc_dapm_widget *w, 104int wm_adsp2_event(struct snd_soc_dapm_widget *w,
97 struct snd_kcontrol *kcontrol, int event); 105 struct snd_kcontrol *kcontrol, int event);
98 106
107extern int wm_adsp_compr_open(struct wm_adsp *dsp,
108 struct snd_compr_stream *stream);
109extern int wm_adsp_compr_free(struct snd_compr_stream *stream);
110extern int wm_adsp_compr_set_params(struct snd_compr_stream *stream,
111 struct snd_compr_params *params);
112extern int wm_adsp_compr_get_caps(struct snd_compr_stream *stream,
113 struct snd_compr_caps *caps);
114extern int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd);
115extern int wm_adsp_compr_handle_irq(struct wm_adsp *dsp);
116extern int wm_adsp_compr_pointer(struct snd_compr_stream *stream,
117 struct snd_compr_tstamp *tstamp);
118extern int wm_adsp_compr_copy(struct snd_compr_stream *stream,
119 char __user *buf, size_t count);
120
99#endif 121#endif
diff --git a/sound/soc/dwc/designware_i2s.c b/sound/soc/dwc/designware_i2s.c
index 6e6a70c5c2bd..ce664c239be3 100644
--- a/sound/soc/dwc/designware_i2s.c
+++ b/sound/soc/dwc/designware_i2s.c
@@ -18,6 +18,7 @@
18#include <linux/interrupt.h> 18#include <linux/interrupt.h>
19#include <linux/module.h> 19#include <linux/module.h>
20#include <linux/slab.h> 20#include <linux/slab.h>
21#include <linux/pm_runtime.h>
21#include <sound/designware_i2s.h> 22#include <sound/designware_i2s.h>
22#include <sound/pcm.h> 23#include <sound/pcm.h>
23#include <sound/pcm_params.h> 24#include <sound/pcm_params.h>
@@ -93,7 +94,12 @@ struct dw_i2s_dev {
93 struct clk *clk; 94 struct clk *clk;
94 int active; 95 int active;
95 unsigned int capability; 96 unsigned int capability;
97 unsigned int quirks;
98 unsigned int i2s_reg_comp1;
99 unsigned int i2s_reg_comp2;
96 struct device *dev; 100 struct device *dev;
101 u32 ccr;
102 u32 xfer_resolution;
97 103
98 /* data related to DMA transfers b/w i2s and DMAC */ 104 /* data related to DMA transfers b/w i2s and DMAC */
99 union dw_i2s_snd_dma_data play_dma_data; 105 union dw_i2s_snd_dma_data play_dma_data;
@@ -213,31 +219,58 @@ static int dw_i2s_startup(struct snd_pcm_substream *substream,
213 return 0; 219 return 0;
214} 220}
215 221
222static void dw_i2s_config(struct dw_i2s_dev *dev, int stream)
223{
224 u32 ch_reg, irq;
225 struct i2s_clk_config_data *config = &dev->config;
226
227
228 i2s_disable_channels(dev, stream);
229
230 for (ch_reg = 0; ch_reg < (config->chan_nr / 2); ch_reg++) {
231 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
232 i2s_write_reg(dev->i2s_base, TCR(ch_reg),
233 dev->xfer_resolution);
234 i2s_write_reg(dev->i2s_base, TFCR(ch_reg), 0x02);
235 irq = i2s_read_reg(dev->i2s_base, IMR(ch_reg));
236 i2s_write_reg(dev->i2s_base, IMR(ch_reg), irq & ~0x30);
237 i2s_write_reg(dev->i2s_base, TER(ch_reg), 1);
238 } else {
239 i2s_write_reg(dev->i2s_base, RCR(ch_reg),
240 dev->xfer_resolution);
241 i2s_write_reg(dev->i2s_base, RFCR(ch_reg), 0x07);
242 irq = i2s_read_reg(dev->i2s_base, IMR(ch_reg));
243 i2s_write_reg(dev->i2s_base, IMR(ch_reg), irq & ~0x03);
244 i2s_write_reg(dev->i2s_base, RER(ch_reg), 1);
245 }
246
247 }
248}
249
216static int dw_i2s_hw_params(struct snd_pcm_substream *substream, 250static int dw_i2s_hw_params(struct snd_pcm_substream *substream,
217 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) 251 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
218{ 252{
219 struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(dai); 253 struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
220 struct i2s_clk_config_data *config = &dev->config; 254 struct i2s_clk_config_data *config = &dev->config;
221 u32 ccr, xfer_resolution, ch_reg, irq;
222 int ret; 255 int ret;
223 256
224 switch (params_format(params)) { 257 switch (params_format(params)) {
225 case SNDRV_PCM_FORMAT_S16_LE: 258 case SNDRV_PCM_FORMAT_S16_LE:
226 config->data_width = 16; 259 config->data_width = 16;
227 ccr = 0x00; 260 dev->ccr = 0x00;
228 xfer_resolution = 0x02; 261 dev->xfer_resolution = 0x02;
229 break; 262 break;
230 263
231 case SNDRV_PCM_FORMAT_S24_LE: 264 case SNDRV_PCM_FORMAT_S24_LE:
232 config->data_width = 24; 265 config->data_width = 24;
233 ccr = 0x08; 266 dev->ccr = 0x08;
234 xfer_resolution = 0x04; 267 dev->xfer_resolution = 0x04;
235 break; 268 break;
236 269
237 case SNDRV_PCM_FORMAT_S32_LE: 270 case SNDRV_PCM_FORMAT_S32_LE:
238 config->data_width = 32; 271 config->data_width = 32;
239 ccr = 0x10; 272 dev->ccr = 0x10;
240 xfer_resolution = 0x05; 273 dev->xfer_resolution = 0x05;
241 break; 274 break;
242 275
243 default: 276 default:
@@ -258,27 +291,9 @@ static int dw_i2s_hw_params(struct snd_pcm_substream *substream,
258 return -EINVAL; 291 return -EINVAL;
259 } 292 }
260 293
261 i2s_disable_channels(dev, substream->stream); 294 dw_i2s_config(dev, substream->stream);
262
263 for (ch_reg = 0; ch_reg < (config->chan_nr / 2); ch_reg++) {
264 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
265 i2s_write_reg(dev->i2s_base, TCR(ch_reg),
266 xfer_resolution);
267 i2s_write_reg(dev->i2s_base, TFCR(ch_reg), 0x02);
268 irq = i2s_read_reg(dev->i2s_base, IMR(ch_reg));
269 i2s_write_reg(dev->i2s_base, IMR(ch_reg), irq & ~0x30);
270 i2s_write_reg(dev->i2s_base, TER(ch_reg), 1);
271 } else {
272 i2s_write_reg(dev->i2s_base, RCR(ch_reg),
273 xfer_resolution);
274 i2s_write_reg(dev->i2s_base, RFCR(ch_reg), 0x07);
275 irq = i2s_read_reg(dev->i2s_base, IMR(ch_reg));
276 i2s_write_reg(dev->i2s_base, IMR(ch_reg), irq & ~0x03);
277 i2s_write_reg(dev->i2s_base, RER(ch_reg), 1);
278 }
279 }
280 295
281 i2s_write_reg(dev->i2s_base, CCR, ccr); 296 i2s_write_reg(dev->i2s_base, CCR, dev->ccr);
282 297
283 config->sample_rate = params_rate(params); 298 config->sample_rate = params_rate(params);
284 299
@@ -394,6 +409,23 @@ static const struct snd_soc_component_driver dw_i2s_component = {
394}; 409};
395 410
396#ifdef CONFIG_PM 411#ifdef CONFIG_PM
412static int dw_i2s_runtime_suspend(struct device *dev)
413{
414 struct dw_i2s_dev *dw_dev = dev_get_drvdata(dev);
415
416 if (dw_dev->capability & DW_I2S_MASTER)
417 clk_disable(dw_dev->clk);
418 return 0;
419}
420
421static int dw_i2s_runtime_resume(struct device *dev)
422{
423 struct dw_i2s_dev *dw_dev = dev_get_drvdata(dev);
424
425 if (dw_dev->capability & DW_I2S_MASTER)
426 clk_enable(dw_dev->clk);
427 return 0;
428}
397 429
398static int dw_i2s_suspend(struct snd_soc_dai *dai) 430static int dw_i2s_suspend(struct snd_soc_dai *dai)
399{ 431{
@@ -410,6 +442,11 @@ static int dw_i2s_resume(struct snd_soc_dai *dai)
410 442
411 if (dev->capability & DW_I2S_MASTER) 443 if (dev->capability & DW_I2S_MASTER)
412 clk_enable(dev->clk); 444 clk_enable(dev->clk);
445
446 if (dai->playback_active)
447 dw_i2s_config(dev, SNDRV_PCM_STREAM_PLAYBACK);
448 if (dai->capture_active)
449 dw_i2s_config(dev, SNDRV_PCM_STREAM_CAPTURE);
413 return 0; 450 return 0;
414} 451}
415 452
@@ -459,10 +496,14 @@ static int dw_configure_dai(struct dw_i2s_dev *dev,
459 * Read component parameter registers to extract 496 * Read component parameter registers to extract
460 * the I2S block's configuration. 497 * the I2S block's configuration.
461 */ 498 */
462 u32 comp1 = i2s_read_reg(dev->i2s_base, I2S_COMP_PARAM_1); 499 u32 comp1 = i2s_read_reg(dev->i2s_base, dev->i2s_reg_comp1);
463 u32 comp2 = i2s_read_reg(dev->i2s_base, I2S_COMP_PARAM_2); 500 u32 comp2 = i2s_read_reg(dev->i2s_base, dev->i2s_reg_comp2);
464 u32 idx; 501 u32 idx;
465 502
503 if (dev->capability & DWC_I2S_RECORD &&
504 dev->quirks & DW_I2S_QUIRK_COMP_PARAM1)
505 comp1 = comp1 & ~BIT(5);
506
466 if (COMP1_TX_ENABLED(comp1)) { 507 if (COMP1_TX_ENABLED(comp1)) {
467 dev_dbg(dev->dev, " designware: play supported\n"); 508 dev_dbg(dev->dev, " designware: play supported\n");
468 idx = COMP1_TX_WORDSIZE_0(comp1); 509 idx = COMP1_TX_WORDSIZE_0(comp1);
@@ -503,7 +544,7 @@ static int dw_configure_dai_by_pd(struct dw_i2s_dev *dev,
503 struct resource *res, 544 struct resource *res,
504 const struct i2s_platform_data *pdata) 545 const struct i2s_platform_data *pdata)
505{ 546{
506 u32 comp1 = i2s_read_reg(dev->i2s_base, I2S_COMP_PARAM_1); 547 u32 comp1 = i2s_read_reg(dev->i2s_base, dev->i2s_reg_comp1);
507 u32 idx = COMP1_APB_DATA_WIDTH(comp1); 548 u32 idx = COMP1_APB_DATA_WIDTH(comp1);
508 int ret; 549 int ret;
509 550
@@ -607,6 +648,14 @@ static int dw_i2s_probe(struct platform_device *pdev)
607 if (pdata) { 648 if (pdata) {
608 dev->capability = pdata->cap; 649 dev->capability = pdata->cap;
609 clk_id = NULL; 650 clk_id = NULL;
651 dev->quirks = pdata->quirks;
652 if (dev->quirks & DW_I2S_QUIRK_COMP_REG_OFFSET) {
653 dev->i2s_reg_comp1 = pdata->i2s_reg_comp1;
654 dev->i2s_reg_comp2 = pdata->i2s_reg_comp2;
655 } else {
656 dev->i2s_reg_comp1 = I2S_COMP_PARAM_1;
657 dev->i2s_reg_comp2 = I2S_COMP_PARAM_2;
658 }
610 ret = dw_configure_dai_by_pd(dev, dw_i2s_dai, res, pdata); 659 ret = dw_configure_dai_by_pd(dev, dw_i2s_dai, res, pdata);
611 } else { 660 } else {
612 clk_id = "i2sclk"; 661 clk_id = "i2sclk";
@@ -649,7 +698,7 @@ static int dw_i2s_probe(struct platform_device *pdev)
649 goto err_clk_disable; 698 goto err_clk_disable;
650 } 699 }
651 } 700 }
652 701 pm_runtime_enable(&pdev->dev);
653 return 0; 702 return 0;
654 703
655err_clk_disable: 704err_clk_disable:
@@ -665,6 +714,7 @@ static int dw_i2s_remove(struct platform_device *pdev)
665 if (dev->capability & DW_I2S_MASTER) 714 if (dev->capability & DW_I2S_MASTER)
666 clk_disable_unprepare(dev->clk); 715 clk_disable_unprepare(dev->clk);
667 716
717 pm_runtime_disable(&pdev->dev);
668 return 0; 718 return 0;
669} 719}
670 720
@@ -677,12 +727,17 @@ static const struct of_device_id dw_i2s_of_match[] = {
677MODULE_DEVICE_TABLE(of, dw_i2s_of_match); 727MODULE_DEVICE_TABLE(of, dw_i2s_of_match);
678#endif 728#endif
679 729
730static const struct dev_pm_ops dwc_pm_ops = {
731 SET_RUNTIME_PM_OPS(dw_i2s_runtime_suspend, dw_i2s_runtime_resume, NULL)
732};
733
680static struct platform_driver dw_i2s_driver = { 734static struct platform_driver dw_i2s_driver = {
681 .probe = dw_i2s_probe, 735 .probe = dw_i2s_probe,
682 .remove = dw_i2s_remove, 736 .remove = dw_i2s_remove,
683 .driver = { 737 .driver = {
684 .name = "designware-i2s", 738 .name = "designware-i2s",
685 .of_match_table = of_match_ptr(dw_i2s_of_match), 739 .of_match_table = of_match_ptr(dw_i2s_of_match),
740 .pm = &dwc_pm_ops,
686 }, 741 },
687}; 742};
688 743
diff --git a/sound/soc/fsl/fsl-asoc-card.c b/sound/soc/fsl/fsl-asoc-card.c
index 1b05d1c5d9fd..562b3bd22d9a 100644
--- a/sound/soc/fsl/fsl-asoc-card.c
+++ b/sound/soc/fsl/fsl-asoc-card.c
@@ -107,6 +107,13 @@ static const struct snd_soc_dapm_route audio_map[] = {
107 {"CPU-Capture", NULL, "Capture"}, 107 {"CPU-Capture", NULL, "Capture"},
108}; 108};
109 109
110static const struct snd_soc_dapm_route audio_map_ac97[] = {
111 {"AC97 Playback", NULL, "ASRC-Playback"},
112 {"Playback", NULL, "AC97 Playback"},
113 {"ASRC-Capture", NULL, "AC97 Capture"},
114 {"AC97 Capture", NULL, "Capture"},
115};
116
110/* Add all possible widgets into here without being redundant */ 117/* Add all possible widgets into here without being redundant */
111static const struct snd_soc_dapm_widget fsl_asoc_card_dapm_widgets[] = { 118static const struct snd_soc_dapm_widget fsl_asoc_card_dapm_widgets[] = {
112 SND_SOC_DAPM_LINE("Line Out Jack", NULL), 119 SND_SOC_DAPM_LINE("Line Out Jack", NULL),
@@ -222,12 +229,15 @@ static int fsl_asoc_card_set_bias_level(struct snd_soc_card *card,
222 enum snd_soc_bias_level level) 229 enum snd_soc_bias_level level)
223{ 230{
224 struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(card); 231 struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(card);
225 struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; 232 struct snd_soc_pcm_runtime *rtd;
233 struct snd_soc_dai *codec_dai;
226 struct codec_priv *codec_priv = &priv->codec_priv; 234 struct codec_priv *codec_priv = &priv->codec_priv;
227 struct device *dev = card->dev; 235 struct device *dev = card->dev;
228 unsigned int pll_out; 236 unsigned int pll_out;
229 int ret; 237 int ret;
230 238
239 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
240 codec_dai = rtd->codec_dai;
231 if (dapm->dev != codec_dai->dev) 241 if (dapm->dev != codec_dai->dev)
232 return 0; 242 return 0;
233 243
@@ -414,14 +424,16 @@ static int fsl_asoc_card_audmux_init(struct device_node *np,
414static int fsl_asoc_card_late_probe(struct snd_soc_card *card) 424static int fsl_asoc_card_late_probe(struct snd_soc_card *card)
415{ 425{
416 struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(card); 426 struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(card);
417 struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; 427 struct snd_soc_pcm_runtime *rtd = list_first_entry(
428 &card->rtd_list, struct snd_soc_pcm_runtime, list);
429 struct snd_soc_dai *codec_dai = rtd->codec_dai;
418 struct codec_priv *codec_priv = &priv->codec_priv; 430 struct codec_priv *codec_priv = &priv->codec_priv;
419 struct device *dev = card->dev; 431 struct device *dev = card->dev;
420 int ret; 432 int ret;
421 433
422 if (fsl_asoc_card_is_ac97(priv)) { 434 if (fsl_asoc_card_is_ac97(priv)) {
423#if IS_ENABLED(CONFIG_SND_AC97_CODEC) 435#if IS_ENABLED(CONFIG_SND_AC97_CODEC)
424 struct snd_soc_codec *codec = card->rtd[0].codec; 436 struct snd_soc_codec *codec = rtd->codec;
425 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); 437 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
426 438
427 /* 439 /*
@@ -574,7 +586,8 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
574 priv->card.dev = &pdev->dev; 586 priv->card.dev = &pdev->dev;
575 priv->card.name = priv->name; 587 priv->card.name = priv->name;
576 priv->card.dai_link = priv->dai_link; 588 priv->card.dai_link = priv->dai_link;
577 priv->card.dapm_routes = audio_map; 589 priv->card.dapm_routes = fsl_asoc_card_is_ac97(priv) ?
590 audio_map_ac97 : audio_map;
578 priv->card.late_probe = fsl_asoc_card_late_probe; 591 priv->card.late_probe = fsl_asoc_card_late_probe;
579 priv->card.num_dapm_routes = ARRAY_SIZE(audio_map); 592 priv->card.num_dapm_routes = ARRAY_SIZE(audio_map);
580 priv->card.dapm_widgets = fsl_asoc_card_dapm_widgets; 593 priv->card.dapm_widgets = fsl_asoc_card_dapm_widgets;
diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c
index 9f087d4f73ed..c1a0e01cb8e7 100644
--- a/sound/soc/fsl/fsl_asrc.c
+++ b/sound/soc/fsl/fsl_asrc.c
@@ -31,21 +31,21 @@
31 dev_dbg(&asrc_priv->pdev->dev, "Pair %c: " fmt, 'A' + index, ##__VA_ARGS__) 31 dev_dbg(&asrc_priv->pdev->dev, "Pair %c: " fmt, 'A' + index, ##__VA_ARGS__)
32 32
33/* Sample rates are aligned with that defined in pcm.h file */ 33/* Sample rates are aligned with that defined in pcm.h file */
34static const u8 process_option[][8][2] = { 34static const u8 process_option[][12][2] = {
35 /* 32kHz 44.1kHz 48kHz 64kHz 88.2kHz 96kHz 176kHz 192kHz */ 35 /* 8kHz 11.025kHz 16kHz 22.05kHz 32kHz 44.1kHz 48kHz 64kHz 88.2kHz 96kHz 176kHz 192kHz */
36 {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},}, /* 5512Hz */ 36 {{0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},}, /* 5512Hz */
37 {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},}, /* 8kHz */ 37 {{0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},}, /* 8kHz */
38 {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},}, /* 11025Hz */ 38 {{0, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},}, /* 11025Hz */
39 {{0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},}, /* 16kHz */ 39 {{1, 2}, {0, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},}, /* 16kHz */
40 {{0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},}, /* 22050Hz */ 40 {{1, 2}, {1, 2}, {0, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0},}, /* 22050Hz */
41 {{0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0},}, /* 32kHz */ 41 {{1, 2}, {2, 1}, {2, 1}, {0, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0},}, /* 32kHz */
42 {{0, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0},}, /* 44.1kHz */ 42 {{2, 2}, {2, 2}, {2, 1}, {2, 1}, {0, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0},}, /* 44.1kHz */
43 {{0, 2}, {0, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0},}, /* 48kHz */ 43 {{2, 2}, {2, 2}, {2, 1}, {2, 1}, {0, 2}, {0, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 0}, {0, 0},}, /* 48kHz */
44 {{1, 2}, {0, 2}, {0, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 0},}, /* 64kHz */ 44 {{2, 2}, {2, 2}, {2, 2}, {2, 1}, {1, 2}, {0, 2}, {0, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 0},}, /* 64kHz */
45 {{1, 2}, {1, 2}, {1, 2}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1},}, /* 88.2kHz */ 45 {{2, 2}, {2, 2}, {2, 2}, {2, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1},}, /* 88.2kHz */
46 {{1, 2}, {1, 2}, {1, 2}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1},}, /* 96kHz */ 46 {{2, 2}, {2, 2}, {2, 2}, {2, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1},}, /* 96kHz */
47 {{2, 2}, {2, 2}, {2, 2}, {2, 1}, {2, 1}, {2, 1}, {2, 1}, {2, 1},}, /* 176kHz */ 47 {{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 1}, {2, 1}, {2, 1}, {2, 1}, {2, 1},}, /* 176kHz */
48 {{2, 2}, {2, 2}, {2, 2}, {2, 1}, {2, 1}, {2, 1}, {2, 1}, {2, 1},}, /* 192kHz */ 48 {{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 1}, {2, 1}, {2, 1}, {2, 1}, {2, 1},}, /* 192kHz */
49}; 49};
50 50
51/* Corresponding to process_option */ 51/* Corresponding to process_option */
@@ -55,7 +55,7 @@ static int supported_input_rate[] = {
55}; 55};
56 56
57static int supported_asrc_rate[] = { 57static int supported_asrc_rate[] = {
58 32000, 44100, 48000, 64000, 88200, 96000, 176400, 192000, 58 8000, 11025, 16000, 22050, 32000, 44100, 48000, 64000, 88200, 96000, 176400, 192000,
59}; 59};
60 60
61/** 61/**
@@ -286,6 +286,13 @@ static int fsl_asrc_config_pair(struct fsl_asrc_pair *pair)
286 return -EINVAL; 286 return -EINVAL;
287 } 287 }
288 288
289 if ((outrate > 8000 && outrate < 30000) &&
290 (outrate/inrate > 24 || inrate/outrate > 8)) {
291 pair_err("exceed supported ratio range [1/24, 8] for \
292 inrate/outrate: %d/%d\n", inrate, outrate);
293 return -EINVAL;
294 }
295
289 /* Validate input and output clock sources */ 296 /* Validate input and output clock sources */
290 clk_index[IN] = clk_map[IN][config->inclk]; 297 clk_index[IN] = clk_map[IN][config->inclk];
291 clk_index[OUT] = clk_map[OUT][config->outclk]; 298 clk_index[OUT] = clk_map[OUT][config->outclk];
@@ -447,7 +454,7 @@ static int fsl_asrc_dai_hw_params(struct snd_pcm_substream *substream,
447 struct snd_soc_dai *dai) 454 struct snd_soc_dai *dai)
448{ 455{
449 struct fsl_asrc *asrc_priv = snd_soc_dai_get_drvdata(dai); 456 struct fsl_asrc *asrc_priv = snd_soc_dai_get_drvdata(dai);
450 int width = snd_pcm_format_width(params_format(params)); 457 int width = params_width(params);
451 struct snd_pcm_runtime *runtime = substream->runtime; 458 struct snd_pcm_runtime *runtime = substream->runtime;
452 struct fsl_asrc_pair *pair = runtime->private_data; 459 struct fsl_asrc_pair *pair = runtime->private_data;
453 unsigned int channels = params_channels(params); 460 unsigned int channels = params_channels(params);
@@ -859,6 +866,10 @@ static int fsl_asrc_probe(struct platform_device *pdev)
859 return PTR_ERR(asrc_priv->ipg_clk); 866 return PTR_ERR(asrc_priv->ipg_clk);
860 } 867 }
861 868
869 asrc_priv->spba_clk = devm_clk_get(&pdev->dev, "spba");
870 if (IS_ERR(asrc_priv->spba_clk))
871 dev_warn(&pdev->dev, "failed to get spba clock\n");
872
862 for (i = 0; i < ASRC_CLK_MAX_NUM; i++) { 873 for (i = 0; i < ASRC_CLK_MAX_NUM; i++) {
863 sprintf(tmp, "asrck_%x", i); 874 sprintf(tmp, "asrck_%x", i);
864 asrc_priv->asrck_clk[i] = devm_clk_get(&pdev->dev, tmp); 875 asrc_priv->asrck_clk[i] = devm_clk_get(&pdev->dev, tmp);
@@ -939,6 +950,11 @@ static int fsl_asrc_runtime_resume(struct device *dev)
939 ret = clk_prepare_enable(asrc_priv->ipg_clk); 950 ret = clk_prepare_enable(asrc_priv->ipg_clk);
940 if (ret) 951 if (ret)
941 goto disable_mem_clk; 952 goto disable_mem_clk;
953 if (!IS_ERR(asrc_priv->spba_clk)) {
954 ret = clk_prepare_enable(asrc_priv->spba_clk);
955 if (ret)
956 goto disable_ipg_clk;
957 }
942 for (i = 0; i < ASRC_CLK_MAX_NUM; i++) { 958 for (i = 0; i < ASRC_CLK_MAX_NUM; i++) {
943 ret = clk_prepare_enable(asrc_priv->asrck_clk[i]); 959 ret = clk_prepare_enable(asrc_priv->asrck_clk[i]);
944 if (ret) 960 if (ret)
@@ -950,6 +966,9 @@ static int fsl_asrc_runtime_resume(struct device *dev)
950disable_asrck_clk: 966disable_asrck_clk:
951 for (i--; i >= 0; i--) 967 for (i--; i >= 0; i--)
952 clk_disable_unprepare(asrc_priv->asrck_clk[i]); 968 clk_disable_unprepare(asrc_priv->asrck_clk[i]);
969 if (!IS_ERR(asrc_priv->spba_clk))
970 clk_disable_unprepare(asrc_priv->spba_clk);
971disable_ipg_clk:
953 clk_disable_unprepare(asrc_priv->ipg_clk); 972 clk_disable_unprepare(asrc_priv->ipg_clk);
954disable_mem_clk: 973disable_mem_clk:
955 clk_disable_unprepare(asrc_priv->mem_clk); 974 clk_disable_unprepare(asrc_priv->mem_clk);
@@ -963,6 +982,8 @@ static int fsl_asrc_runtime_suspend(struct device *dev)
963 982
964 for (i = 0; i < ASRC_CLK_MAX_NUM; i++) 983 for (i = 0; i < ASRC_CLK_MAX_NUM; i++)
965 clk_disable_unprepare(asrc_priv->asrck_clk[i]); 984 clk_disable_unprepare(asrc_priv->asrck_clk[i]);
985 if (!IS_ERR(asrc_priv->spba_clk))
986 clk_disable_unprepare(asrc_priv->spba_clk);
966 clk_disable_unprepare(asrc_priv->ipg_clk); 987 clk_disable_unprepare(asrc_priv->ipg_clk);
967 clk_disable_unprepare(asrc_priv->mem_clk); 988 clk_disable_unprepare(asrc_priv->mem_clk);
968 989
@@ -975,6 +996,9 @@ static int fsl_asrc_suspend(struct device *dev)
975{ 996{
976 struct fsl_asrc *asrc_priv = dev_get_drvdata(dev); 997 struct fsl_asrc *asrc_priv = dev_get_drvdata(dev);
977 998
999 regmap_read(asrc_priv->regmap, REG_ASRCFG,
1000 &asrc_priv->regcache_cfg);
1001
978 regcache_cache_only(asrc_priv->regmap, true); 1002 regcache_cache_only(asrc_priv->regmap, true);
979 regcache_mark_dirty(asrc_priv->regmap); 1003 regcache_mark_dirty(asrc_priv->regmap);
980 1004
@@ -995,6 +1019,10 @@ static int fsl_asrc_resume(struct device *dev)
995 regcache_cache_only(asrc_priv->regmap, false); 1019 regcache_cache_only(asrc_priv->regmap, false);
996 regcache_sync(asrc_priv->regmap); 1020 regcache_sync(asrc_priv->regmap);
997 1021
1022 regmap_update_bits(asrc_priv->regmap, REG_ASRCFG,
1023 ASRCFG_NDPRi_ALL_MASK | ASRCFG_POSTMODi_ALL_MASK |
1024 ASRCFG_PREMODi_ALL_MASK, asrc_priv->regcache_cfg);
1025
998 /* Restart enabled pairs */ 1026 /* Restart enabled pairs */
999 regmap_update_bits(asrc_priv->regmap, REG_ASRCTR, 1027 regmap_update_bits(asrc_priv->regmap, REG_ASRCTR,
1000 ASRCTR_ASRCEi_ALL_MASK, asrctr); 1028 ASRCTR_ASRCEi_ALL_MASK, asrctr);
diff --git a/sound/soc/fsl/fsl_asrc.h b/sound/soc/fsl/fsl_asrc.h
index 4aed63c4b431..0f163abe4ba3 100644
--- a/sound/soc/fsl/fsl_asrc.h
+++ b/sound/soc/fsl/fsl_asrc.h
@@ -132,10 +132,13 @@
132#define ASRCFG_INIRQi (1 << ASRCFG_INIRQi_SHIFT(i)) 132#define ASRCFG_INIRQi (1 << ASRCFG_INIRQi_SHIFT(i))
133#define ASRCFG_NDPRi_SHIFT(i) (18 + i) 133#define ASRCFG_NDPRi_SHIFT(i) (18 + i)
134#define ASRCFG_NDPRi_MASK(i) (1 << ASRCFG_NDPRi_SHIFT(i)) 134#define ASRCFG_NDPRi_MASK(i) (1 << ASRCFG_NDPRi_SHIFT(i))
135#define ASRCFG_NDPRi_ALL_SHIFT 18
136#define ASRCFG_NDPRi_ALL_MASK (7 << ASRCFG_NDPRi_ALL_SHIFT)
135#define ASRCFG_NDPRi (1 << ASRCFG_NDPRi_SHIFT(i)) 137#define ASRCFG_NDPRi (1 << ASRCFG_NDPRi_SHIFT(i))
136#define ASRCFG_POSTMODi_SHIFT(i) (8 + (i << 2)) 138#define ASRCFG_POSTMODi_SHIFT(i) (8 + (i << 2))
137#define ASRCFG_POSTMODi_WIDTH 2 139#define ASRCFG_POSTMODi_WIDTH 2
138#define ASRCFG_POSTMODi_MASK(i) (((1 << ASRCFG_POSTMODi_WIDTH) - 1) << ASRCFG_POSTMODi_SHIFT(i)) 140#define ASRCFG_POSTMODi_MASK(i) (((1 << ASRCFG_POSTMODi_WIDTH) - 1) << ASRCFG_POSTMODi_SHIFT(i))
141#define ASRCFG_POSTMODi_ALL_MASK (ASRCFG_POSTMODi_MASK(0) | ASRCFG_POSTMODi_MASK(1) | ASRCFG_POSTMODi_MASK(2))
139#define ASRCFG_POSTMOD(i, v) ((v) << ASRCFG_POSTMODi_SHIFT(i)) 142#define ASRCFG_POSTMOD(i, v) ((v) << ASRCFG_POSTMODi_SHIFT(i))
140#define ASRCFG_POSTMODi_UP(i) (0 << ASRCFG_POSTMODi_SHIFT(i)) 143#define ASRCFG_POSTMODi_UP(i) (0 << ASRCFG_POSTMODi_SHIFT(i))
141#define ASRCFG_POSTMODi_DCON(i) (1 << ASRCFG_POSTMODi_SHIFT(i)) 144#define ASRCFG_POSTMODi_DCON(i) (1 << ASRCFG_POSTMODi_SHIFT(i))
@@ -143,6 +146,7 @@
143#define ASRCFG_PREMODi_SHIFT(i) (6 + (i << 2)) 146#define ASRCFG_PREMODi_SHIFT(i) (6 + (i << 2))
144#define ASRCFG_PREMODi_WIDTH 2 147#define ASRCFG_PREMODi_WIDTH 2
145#define ASRCFG_PREMODi_MASK(i) (((1 << ASRCFG_PREMODi_WIDTH) - 1) << ASRCFG_PREMODi_SHIFT(i)) 148#define ASRCFG_PREMODi_MASK(i) (((1 << ASRCFG_PREMODi_WIDTH) - 1) << ASRCFG_PREMODi_SHIFT(i))
149#define ASRCFG_PREMODi_ALL_MASK (ASRCFG_PREMODi_MASK(0) | ASRCFG_PREMODi_MASK(1) | ASRCFG_PREMODi_MASK(2))
146#define ASRCFG_PREMOD(i, v) ((v) << ASRCFG_PREMODi_SHIFT(i)) 150#define ASRCFG_PREMOD(i, v) ((v) << ASRCFG_PREMODi_SHIFT(i))
147#define ASRCFG_PREMODi_UP(i) (0 << ASRCFG_PREMODi_SHIFT(i)) 151#define ASRCFG_PREMODi_UP(i) (0 << ASRCFG_PREMODi_SHIFT(i))
148#define ASRCFG_PREMODi_DCON(i) (1 << ASRCFG_PREMODi_SHIFT(i)) 152#define ASRCFG_PREMODi_DCON(i) (1 << ASRCFG_PREMODi_SHIFT(i))
@@ -426,6 +430,7 @@ struct fsl_asrc_pair {
426 * @paddr: physical address to the base address of registers 430 * @paddr: physical address to the base address of registers
427 * @mem_clk: clock source to access register 431 * @mem_clk: clock source to access register
428 * @ipg_clk: clock source to drive peripheral 432 * @ipg_clk: clock source to drive peripheral
433 * @spba_clk: SPBA clock (optional, depending on SoC design)
429 * @asrck_clk: clock sources to driver ASRC internal logic 434 * @asrck_clk: clock sources to driver ASRC internal logic
430 * @lock: spin lock for resource protection 435 * @lock: spin lock for resource protection
431 * @pair: pair pointers 436 * @pair: pair pointers
@@ -433,6 +438,7 @@ struct fsl_asrc_pair {
433 * @channel_avail: non-occupied channel numbers 438 * @channel_avail: non-occupied channel numbers
434 * @asrc_rate: default sample rate for ASoC Back-Ends 439 * @asrc_rate: default sample rate for ASoC Back-Ends
435 * @asrc_width: default sample width for ASoC Back-Ends 440 * @asrc_width: default sample width for ASoC Back-Ends
441 * @regcache_cfg: store register value of REG_ASRCFG
436 */ 442 */
437struct fsl_asrc { 443struct fsl_asrc {
438 struct snd_dmaengine_dai_dma_data dma_params_rx; 444 struct snd_dmaengine_dai_dma_data dma_params_rx;
@@ -442,6 +448,7 @@ struct fsl_asrc {
442 unsigned long paddr; 448 unsigned long paddr;
443 struct clk *mem_clk; 449 struct clk *mem_clk;
444 struct clk *ipg_clk; 450 struct clk *ipg_clk;
451 struct clk *spba_clk;
445 struct clk *asrck_clk[ASRC_CLK_MAX_NUM]; 452 struct clk *asrck_clk[ASRC_CLK_MAX_NUM];
446 spinlock_t lock; 453 spinlock_t lock;
447 454
@@ -451,6 +458,8 @@ struct fsl_asrc {
451 458
452 int asrc_rate; 459 int asrc_rate;
453 int asrc_width; 460 int asrc_width;
461
462 u32 regcache_cfg;
454}; 463};
455 464
456extern struct snd_soc_platform_driver fsl_asrc_platform; 465extern struct snd_soc_platform_driver fsl_asrc_platform;
diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c
index 59f234e51971..26a90e12ede4 100644
--- a/sound/soc/fsl/fsl_esai.c
+++ b/sound/soc/fsl/fsl_esai.c
@@ -35,6 +35,7 @@
35 * @coreclk: clock source to access register 35 * @coreclk: clock source to access register
36 * @extalclk: esai clock source to derive HCK, SCK and FS 36 * @extalclk: esai clock source to derive HCK, SCK and FS
37 * @fsysclk: system clock source to derive HCK, SCK and FS 37 * @fsysclk: system clock source to derive HCK, SCK and FS
38 * @spbaclk: SPBA clock (optional, depending on SoC design)
38 * @fifo_depth: depth of tx/rx FIFO 39 * @fifo_depth: depth of tx/rx FIFO
39 * @slot_width: width of each DAI slot 40 * @slot_width: width of each DAI slot
40 * @slots: number of slots 41 * @slots: number of slots
@@ -54,6 +55,7 @@ struct fsl_esai {
54 struct clk *coreclk; 55 struct clk *coreclk;
55 struct clk *extalclk; 56 struct clk *extalclk;
56 struct clk *fsysclk; 57 struct clk *fsysclk;
58 struct clk *spbaclk;
57 u32 fifo_depth; 59 u32 fifo_depth;
58 u32 slot_width; 60 u32 slot_width;
59 u32 slots; 61 u32 slots;
@@ -469,6 +471,11 @@ static int fsl_esai_startup(struct snd_pcm_substream *substream,
469 ret = clk_prepare_enable(esai_priv->coreclk); 471 ret = clk_prepare_enable(esai_priv->coreclk);
470 if (ret) 472 if (ret)
471 return ret; 473 return ret;
474 if (!IS_ERR(esai_priv->spbaclk)) {
475 ret = clk_prepare_enable(esai_priv->spbaclk);
476 if (ret)
477 goto err_spbaclk;
478 }
472 if (!IS_ERR(esai_priv->extalclk)) { 479 if (!IS_ERR(esai_priv->extalclk)) {
473 ret = clk_prepare_enable(esai_priv->extalclk); 480 ret = clk_prepare_enable(esai_priv->extalclk);
474 if (ret) 481 if (ret)
@@ -499,6 +506,9 @@ err_fsysclk:
499 if (!IS_ERR(esai_priv->extalclk)) 506 if (!IS_ERR(esai_priv->extalclk))
500 clk_disable_unprepare(esai_priv->extalclk); 507 clk_disable_unprepare(esai_priv->extalclk);
501err_extalck: 508err_extalck:
509 if (!IS_ERR(esai_priv->spbaclk))
510 clk_disable_unprepare(esai_priv->spbaclk);
511err_spbaclk:
502 clk_disable_unprepare(esai_priv->coreclk); 512 clk_disable_unprepare(esai_priv->coreclk);
503 513
504 return ret; 514 return ret;
@@ -510,7 +520,7 @@ static int fsl_esai_hw_params(struct snd_pcm_substream *substream,
510{ 520{
511 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); 521 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai);
512 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 522 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
513 u32 width = snd_pcm_format_width(params_format(params)); 523 u32 width = params_width(params);
514 u32 channels = params_channels(params); 524 u32 channels = params_channels(params);
515 u32 pins = DIV_ROUND_UP(channels, esai_priv->slots); 525 u32 pins = DIV_ROUND_UP(channels, esai_priv->slots);
516 u32 slot_width = width; 526 u32 slot_width = width;
@@ -564,6 +574,8 @@ static void fsl_esai_shutdown(struct snd_pcm_substream *substream,
564 clk_disable_unprepare(esai_priv->fsysclk); 574 clk_disable_unprepare(esai_priv->fsysclk);
565 if (!IS_ERR(esai_priv->extalclk)) 575 if (!IS_ERR(esai_priv->extalclk))
566 clk_disable_unprepare(esai_priv->extalclk); 576 clk_disable_unprepare(esai_priv->extalclk);
577 if (!IS_ERR(esai_priv->spbaclk))
578 clk_disable_unprepare(esai_priv->spbaclk);
567 clk_disable_unprepare(esai_priv->coreclk); 579 clk_disable_unprepare(esai_priv->coreclk);
568} 580}
569 581
@@ -653,21 +665,28 @@ static const struct snd_soc_component_driver fsl_esai_component = {
653}; 665};
654 666
655static const struct reg_default fsl_esai_reg_defaults[] = { 667static const struct reg_default fsl_esai_reg_defaults[] = {
656 {0x8, 0x00000000}, 668 {REG_ESAI_ETDR, 0x00000000},
657 {0x10, 0x00000000}, 669 {REG_ESAI_ECR, 0x00000000},
658 {0x18, 0x00000000}, 670 {REG_ESAI_TFCR, 0x00000000},
659 {0x98, 0x00000000}, 671 {REG_ESAI_RFCR, 0x00000000},
660 {0xd0, 0x00000000}, 672 {REG_ESAI_TX0, 0x00000000},
661 {0xd4, 0x00000000}, 673 {REG_ESAI_TX1, 0x00000000},
662 {0xd8, 0x00000000}, 674 {REG_ESAI_TX2, 0x00000000},
663 {0xdc, 0x00000000}, 675 {REG_ESAI_TX3, 0x00000000},
664 {0xe0, 0x00000000}, 676 {REG_ESAI_TX4, 0x00000000},
665 {0xe4, 0x0000ffff}, 677 {REG_ESAI_TX5, 0x00000000},
666 {0xe8, 0x0000ffff}, 678 {REG_ESAI_TSR, 0x00000000},
667 {0xec, 0x0000ffff}, 679 {REG_ESAI_SAICR, 0x00000000},
668 {0xf0, 0x0000ffff}, 680 {REG_ESAI_TCR, 0x00000000},
669 {0xf8, 0x00000000}, 681 {REG_ESAI_TCCR, 0x00000000},
670 {0xfc, 0x00000000}, 682 {REG_ESAI_RCR, 0x00000000},
683 {REG_ESAI_RCCR, 0x00000000},
684 {REG_ESAI_TSMA, 0x0000ffff},
685 {REG_ESAI_TSMB, 0x0000ffff},
686 {REG_ESAI_RSMA, 0x0000ffff},
687 {REG_ESAI_RSMB, 0x0000ffff},
688 {REG_ESAI_PRRC, 0x00000000},
689 {REG_ESAI_PCRC, 0x00000000},
671}; 690};
672 691
673static bool fsl_esai_readable_reg(struct device *dev, unsigned int reg) 692static bool fsl_esai_readable_reg(struct device *dev, unsigned int reg)
@@ -705,17 +724,10 @@ static bool fsl_esai_readable_reg(struct device *dev, unsigned int reg)
705static bool fsl_esai_volatile_reg(struct device *dev, unsigned int reg) 724static bool fsl_esai_volatile_reg(struct device *dev, unsigned int reg)
706{ 725{
707 switch (reg) { 726 switch (reg) {
708 case REG_ESAI_ETDR:
709 case REG_ESAI_ERDR: 727 case REG_ESAI_ERDR:
710 case REG_ESAI_ESR: 728 case REG_ESAI_ESR:
711 case REG_ESAI_TFSR: 729 case REG_ESAI_TFSR:
712 case REG_ESAI_RFSR: 730 case REG_ESAI_RFSR:
713 case REG_ESAI_TX0:
714 case REG_ESAI_TX1:
715 case REG_ESAI_TX2:
716 case REG_ESAI_TX3:
717 case REG_ESAI_TX4:
718 case REG_ESAI_TX5:
719 case REG_ESAI_RX0: 731 case REG_ESAI_RX0:
720 case REG_ESAI_RX1: 732 case REG_ESAI_RX1:
721 case REG_ESAI_RX2: 733 case REG_ESAI_RX2:
@@ -819,6 +831,11 @@ static int fsl_esai_probe(struct platform_device *pdev)
819 dev_warn(&pdev->dev, "failed to get fsys clock: %ld\n", 831 dev_warn(&pdev->dev, "failed to get fsys clock: %ld\n",
820 PTR_ERR(esai_priv->fsysclk)); 832 PTR_ERR(esai_priv->fsysclk));
821 833
834 esai_priv->spbaclk = devm_clk_get(&pdev->dev, "spba");
835 if (IS_ERR(esai_priv->spbaclk))
836 dev_warn(&pdev->dev, "failed to get spba clock: %ld\n",
837 PTR_ERR(esai_priv->spbaclk));
838
822 irq = platform_get_irq(pdev, 0); 839 irq = platform_get_irq(pdev, 0);
823 if (irq < 0) { 840 if (irq < 0) {
824 dev_err(&pdev->dev, "no irq for node %s\n", pdev->name); 841 dev_err(&pdev->dev, "no irq for node %s\n", pdev->name);
diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c
index 08b460ba06ef..fef264d27fd3 100644
--- a/sound/soc/fsl/fsl_sai.c
+++ b/sound/soc/fsl/fsl_sai.c
@@ -126,6 +126,17 @@ out:
126 return IRQ_HANDLED; 126 return IRQ_HANDLED;
127} 127}
128 128
129static int fsl_sai_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask,
130 u32 rx_mask, int slots, int slot_width)
131{
132 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai);
133
134 sai->slots = slots;
135 sai->slot_width = slot_width;
136
137 return 0;
138}
139
129static int fsl_sai_set_dai_sysclk_tr(struct snd_soc_dai *cpu_dai, 140static int fsl_sai_set_dai_sysclk_tr(struct snd_soc_dai *cpu_dai,
130 int clk_id, unsigned int freq, int fsl_dir) 141 int clk_id, unsigned int freq, int fsl_dir)
131{ 142{
@@ -354,13 +365,25 @@ static int fsl_sai_set_bclk(struct snd_soc_dai *dai, bool tx, u32 freq)
354 return -EINVAL; 365 return -EINVAL;
355 } 366 }
356 367
357 if ((tx && sai->synchronous[TX]) || (!tx && !sai->synchronous[RX])) { 368 /*
369 * 1) For Asynchronous mode, we must set RCR2 register for capture, and
370 * set TCR2 register for playback.
371 * 2) For Tx sync with Rx clock, we must set RCR2 register for playback
372 * and capture.
373 * 3) For Rx sync with Tx clock, we must set TCR2 register for playback
374 * and capture.
375 * 4) For Tx and Rx are both Synchronous with another SAI, we just
376 * ignore it.
377 */
378 if ((sai->synchronous[TX] && !sai->synchronous[RX]) ||
379 (!tx && !sai->synchronous[RX])) {
358 regmap_update_bits(sai->regmap, FSL_SAI_RCR2, 380 regmap_update_bits(sai->regmap, FSL_SAI_RCR2,
359 FSL_SAI_CR2_MSEL_MASK, 381 FSL_SAI_CR2_MSEL_MASK,
360 FSL_SAI_CR2_MSEL(sai->mclk_id[tx])); 382 FSL_SAI_CR2_MSEL(sai->mclk_id[tx]));
361 regmap_update_bits(sai->regmap, FSL_SAI_RCR2, 383 regmap_update_bits(sai->regmap, FSL_SAI_RCR2,
362 FSL_SAI_CR2_DIV_MASK, savediv - 1); 384 FSL_SAI_CR2_DIV_MASK, savediv - 1);
363 } else { 385 } else if ((sai->synchronous[RX] && !sai->synchronous[TX]) ||
386 (tx && !sai->synchronous[TX])) {
364 regmap_update_bits(sai->regmap, FSL_SAI_TCR2, 387 regmap_update_bits(sai->regmap, FSL_SAI_TCR2,
365 FSL_SAI_CR2_MSEL_MASK, 388 FSL_SAI_CR2_MSEL_MASK,
366 FSL_SAI_CR2_MSEL(sai->mclk_id[tx])); 389 FSL_SAI_CR2_MSEL(sai->mclk_id[tx]));
@@ -381,13 +404,21 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
381 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai); 404 struct fsl_sai *sai = snd_soc_dai_get_drvdata(cpu_dai);
382 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 405 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
383 unsigned int channels = params_channels(params); 406 unsigned int channels = params_channels(params);
384 u32 word_width = snd_pcm_format_width(params_format(params)); 407 u32 word_width = params_width(params);
385 u32 val_cr4 = 0, val_cr5 = 0; 408 u32 val_cr4 = 0, val_cr5 = 0;
409 u32 slots = (channels == 1) ? 2 : channels;
410 u32 slot_width = word_width;
386 int ret; 411 int ret;
387 412
413 if (sai->slots)
414 slots = sai->slots;
415
416 if (sai->slot_width)
417 slot_width = sai->slot_width;
418
388 if (!sai->is_slave_mode) { 419 if (!sai->is_slave_mode) {
389 ret = fsl_sai_set_bclk(cpu_dai, tx, 420 ret = fsl_sai_set_bclk(cpu_dai, tx,
390 2 * word_width * params_rate(params)); 421 slots * slot_width * params_rate(params));
391 if (ret) 422 if (ret)
392 return ret; 423 return ret;
393 424
@@ -399,21 +430,49 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
399 430
400 sai->mclk_streams |= BIT(substream->stream); 431 sai->mclk_streams |= BIT(substream->stream);
401 } 432 }
402
403 } 433 }
404 434
405 if (!sai->is_dsp_mode) 435 if (!sai->is_dsp_mode)
406 val_cr4 |= FSL_SAI_CR4_SYWD(word_width); 436 val_cr4 |= FSL_SAI_CR4_SYWD(slot_width);
407 437
408 val_cr5 |= FSL_SAI_CR5_WNW(word_width); 438 val_cr5 |= FSL_SAI_CR5_WNW(slot_width);
409 val_cr5 |= FSL_SAI_CR5_W0W(word_width); 439 val_cr5 |= FSL_SAI_CR5_W0W(slot_width);
410 440
411 if (sai->is_lsb_first) 441 if (sai->is_lsb_first)
412 val_cr5 |= FSL_SAI_CR5_FBT(0); 442 val_cr5 |= FSL_SAI_CR5_FBT(0);
413 else 443 else
414 val_cr5 |= FSL_SAI_CR5_FBT(word_width - 1); 444 val_cr5 |= FSL_SAI_CR5_FBT(word_width - 1);
415 445
416 val_cr4 |= FSL_SAI_CR4_FRSZ(channels); 446 val_cr4 |= FSL_SAI_CR4_FRSZ(slots);
447
448 /*
449 * For SAI master mode, when Tx(Rx) sync with Rx(Tx) clock, Rx(Tx) will
450 * generate bclk and frame clock for Tx(Rx), we should set RCR4(TCR4),
451 * RCR5(TCR5) and RMR(TMR) for playback(capture), or there will be sync
452 * error.
453 */
454
455 if (!sai->is_slave_mode) {
456 if (!sai->synchronous[TX] && sai->synchronous[RX] && !tx) {
457 regmap_update_bits(sai->regmap, FSL_SAI_TCR4,
458 FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK,
459 val_cr4);
460 regmap_update_bits(sai->regmap, FSL_SAI_TCR5,
461 FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK |
462 FSL_SAI_CR5_FBT_MASK, val_cr5);
463 regmap_write(sai->regmap, FSL_SAI_TMR,
464 ~0UL - ((1 << channels) - 1));
465 } else if (!sai->synchronous[RX] && sai->synchronous[TX] && tx) {
466 regmap_update_bits(sai->regmap, FSL_SAI_RCR4,
467 FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK,
468 val_cr4);
469 regmap_update_bits(sai->regmap, FSL_SAI_RCR5,
470 FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK |
471 FSL_SAI_CR5_FBT_MASK, val_cr5);
472 regmap_write(sai->regmap, FSL_SAI_RMR,
473 ~0UL - ((1 << channels) - 1));
474 }
475 }
417 476
418 regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx), 477 regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx),
419 FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK, 478 FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK,
@@ -569,6 +628,7 @@ static void fsl_sai_shutdown(struct snd_pcm_substream *substream,
569static const struct snd_soc_dai_ops fsl_sai_pcm_dai_ops = { 628static const struct snd_soc_dai_ops fsl_sai_pcm_dai_ops = {
570 .set_sysclk = fsl_sai_set_dai_sysclk, 629 .set_sysclk = fsl_sai_set_dai_sysclk,
571 .set_fmt = fsl_sai_set_dai_fmt, 630 .set_fmt = fsl_sai_set_dai_fmt,
631 .set_tdm_slot = fsl_sai_set_dai_tdm_slot,
572 .hw_params = fsl_sai_hw_params, 632 .hw_params = fsl_sai_hw_params,
573 .hw_free = fsl_sai_hw_free, 633 .hw_free = fsl_sai_hw_free,
574 .trigger = fsl_sai_trigger, 634 .trigger = fsl_sai_trigger,
@@ -627,6 +687,22 @@ static const struct snd_soc_component_driver fsl_component = {
627 .name = "fsl-sai", 687 .name = "fsl-sai",
628}; 688};
629 689
690static struct reg_default fsl_sai_reg_defaults[] = {
691 {FSL_SAI_TCR1, 0},
692 {FSL_SAI_TCR2, 0},
693 {FSL_SAI_TCR3, 0},
694 {FSL_SAI_TCR4, 0},
695 {FSL_SAI_TCR5, 0},
696 {FSL_SAI_TDR, 0},
697 {FSL_SAI_TMR, 0},
698 {FSL_SAI_RCR1, 0},
699 {FSL_SAI_RCR2, 0},
700 {FSL_SAI_RCR3, 0},
701 {FSL_SAI_RCR4, 0},
702 {FSL_SAI_RCR5, 0},
703 {FSL_SAI_RMR, 0},
704};
705
630static bool fsl_sai_readable_reg(struct device *dev, unsigned int reg) 706static bool fsl_sai_readable_reg(struct device *dev, unsigned int reg)
631{ 707{
632 switch (reg) { 708 switch (reg) {
@@ -660,13 +736,11 @@ static bool fsl_sai_volatile_reg(struct device *dev, unsigned int reg)
660 case FSL_SAI_RCSR: 736 case FSL_SAI_RCSR:
661 case FSL_SAI_TFR: 737 case FSL_SAI_TFR:
662 case FSL_SAI_RFR: 738 case FSL_SAI_RFR:
663 case FSL_SAI_TDR:
664 case FSL_SAI_RDR: 739 case FSL_SAI_RDR:
665 return true; 740 return true;
666 default: 741 default:
667 return false; 742 return false;
668 } 743 }
669
670} 744}
671 745
672static bool fsl_sai_writeable_reg(struct device *dev, unsigned int reg) 746static bool fsl_sai_writeable_reg(struct device *dev, unsigned int reg)
@@ -699,6 +773,8 @@ static const struct regmap_config fsl_sai_regmap_config = {
699 .val_bits = 32, 773 .val_bits = 32,
700 774
701 .max_register = FSL_SAI_RMR, 775 .max_register = FSL_SAI_RMR,
776 .reg_defaults = fsl_sai_reg_defaults,
777 .num_reg_defaults = ARRAY_SIZE(fsl_sai_reg_defaults),
702 .readable_reg = fsl_sai_readable_reg, 778 .readable_reg = fsl_sai_readable_reg,
703 .volatile_reg = fsl_sai_volatile_reg, 779 .volatile_reg = fsl_sai_volatile_reg,
704 .writeable_reg = fsl_sai_writeable_reg, 780 .writeable_reg = fsl_sai_writeable_reg,
diff --git a/sound/soc/fsl/fsl_sai.h b/sound/soc/fsl/fsl_sai.h
index b95fbc3f68eb..d9ed7be8cb34 100644
--- a/sound/soc/fsl/fsl_sai.h
+++ b/sound/soc/fsl/fsl_sai.h
@@ -143,6 +143,9 @@ struct fsl_sai {
143 143
144 unsigned int mclk_id[2]; 144 unsigned int mclk_id[2];
145 unsigned int mclk_streams; 145 unsigned int mclk_streams;
146 unsigned int slots;
147 unsigned int slot_width;
148
146 struct snd_dmaengine_dai_dma_data dma_params_rx; 149 struct snd_dmaengine_dai_dma_data dma_params_rx;
147 struct snd_dmaengine_dai_dma_data dma_params_tx; 150 struct snd_dmaengine_dai_dma_data dma_params_tx;
148}; 151};
diff --git a/sound/soc/fsl/fsl_spdif.c b/sound/soc/fsl/fsl_spdif.c
index 3d59bb6719f2..151849f79863 100644
--- a/sound/soc/fsl/fsl_spdif.c
+++ b/sound/soc/fsl/fsl_spdif.c
@@ -88,6 +88,7 @@ struct spdif_mixer_control {
88 * @rxclk: rx clock sources for capture 88 * @rxclk: rx clock sources for capture
89 * @coreclk: core clock for register access via DMA 89 * @coreclk: core clock for register access via DMA
90 * @sysclk: system clock for rx clock rate measurement 90 * @sysclk: system clock for rx clock rate measurement
91 * @spbaclk: SPBA clock (optional, depending on SoC design)
91 * @dma_params_tx: DMA parameters for transmit channel 92 * @dma_params_tx: DMA parameters for transmit channel
92 * @dma_params_rx: DMA parameters for receive channel 93 * @dma_params_rx: DMA parameters for receive channel
93 */ 94 */
@@ -106,6 +107,7 @@ struct fsl_spdif_priv {
106 struct clk *rxclk; 107 struct clk *rxclk;
107 struct clk *coreclk; 108 struct clk *coreclk;
108 struct clk *sysclk; 109 struct clk *sysclk;
110 struct clk *spbaclk;
109 struct snd_dmaengine_dai_dma_data dma_params_tx; 111 struct snd_dmaengine_dai_dma_data dma_params_tx;
110 struct snd_dmaengine_dai_dma_data dma_params_rx; 112 struct snd_dmaengine_dai_dma_data dma_params_rx;
111 /* regcache for SRPC */ 113 /* regcache for SRPC */
@@ -474,6 +476,14 @@ static int fsl_spdif_startup(struct snd_pcm_substream *substream,
474 return ret; 476 return ret;
475 } 477 }
476 478
479 if (!IS_ERR(spdif_priv->spbaclk)) {
480 ret = clk_prepare_enable(spdif_priv->spbaclk);
481 if (ret) {
482 dev_err(&pdev->dev, "failed to enable spba clock\n");
483 goto err_spbaclk;
484 }
485 }
486
477 ret = spdif_softreset(spdif_priv); 487 ret = spdif_softreset(spdif_priv);
478 if (ret) { 488 if (ret) {
479 dev_err(&pdev->dev, "failed to soft reset\n"); 489 dev_err(&pdev->dev, "failed to soft reset\n");
@@ -515,6 +525,9 @@ disable_txclk:
515 for (i--; i >= 0; i--) 525 for (i--; i >= 0; i--)
516 clk_disable_unprepare(spdif_priv->txclk[i]); 526 clk_disable_unprepare(spdif_priv->txclk[i]);
517err: 527err:
528 if (!IS_ERR(spdif_priv->spbaclk))
529 clk_disable_unprepare(spdif_priv->spbaclk);
530err_spbaclk:
518 clk_disable_unprepare(spdif_priv->coreclk); 531 clk_disable_unprepare(spdif_priv->coreclk);
519 532
520 return ret; 533 return ret;
@@ -548,6 +561,8 @@ static void fsl_spdif_shutdown(struct snd_pcm_substream *substream,
548 spdif_intr_status_clear(spdif_priv); 561 spdif_intr_status_clear(spdif_priv);
549 regmap_update_bits(regmap, REG_SPDIF_SCR, 562 regmap_update_bits(regmap, REG_SPDIF_SCR,
550 SCR_LOW_POWER, SCR_LOW_POWER); 563 SCR_LOW_POWER, SCR_LOW_POWER);
564 if (!IS_ERR(spdif_priv->spbaclk))
565 clk_disable_unprepare(spdif_priv->spbaclk);
551 clk_disable_unprepare(spdif_priv->coreclk); 566 clk_disable_unprepare(spdif_priv->coreclk);
552 } 567 }
553} 568}
@@ -1006,12 +1021,14 @@ static const struct snd_soc_component_driver fsl_spdif_component = {
1006 1021
1007/* FSL SPDIF REGMAP */ 1022/* FSL SPDIF REGMAP */
1008static const struct reg_default fsl_spdif_reg_defaults[] = { 1023static const struct reg_default fsl_spdif_reg_defaults[] = {
1009 {0x0, 0x00000400}, 1024 {REG_SPDIF_SCR, 0x00000400},
1010 {0x4, 0x00000000}, 1025 {REG_SPDIF_SRCD, 0x00000000},
1011 {0xc, 0x00000000}, 1026 {REG_SPDIF_SIE, 0x00000000},
1012 {0x34, 0x00000000}, 1027 {REG_SPDIF_STL, 0x00000000},
1013 {0x38, 0x00000000}, 1028 {REG_SPDIF_STR, 0x00000000},
1014 {0x50, 0x00020f00}, 1029 {REG_SPDIF_STCSCH, 0x00000000},
1030 {REG_SPDIF_STCSCL, 0x00000000},
1031 {REG_SPDIF_STC, 0x00020f00},
1015}; 1032};
1016 1033
1017static bool fsl_spdif_readable_reg(struct device *dev, unsigned int reg) 1034static bool fsl_spdif_readable_reg(struct device *dev, unsigned int reg)
@@ -1049,8 +1066,6 @@ static bool fsl_spdif_volatile_reg(struct device *dev, unsigned int reg)
1049 case REG_SPDIF_SRCSL: 1066 case REG_SPDIF_SRCSL:
1050 case REG_SPDIF_SRU: 1067 case REG_SPDIF_SRU:
1051 case REG_SPDIF_SRQ: 1068 case REG_SPDIF_SRQ:
1052 case REG_SPDIF_STL:
1053 case REG_SPDIF_STR:
1054 case REG_SPDIF_SRFM: 1069 case REG_SPDIF_SRFM:
1055 return true; 1070 return true;
1056 default: 1071 default:
@@ -1261,6 +1276,10 @@ static int fsl_spdif_probe(struct platform_device *pdev)
1261 return PTR_ERR(spdif_priv->coreclk); 1276 return PTR_ERR(spdif_priv->coreclk);
1262 } 1277 }
1263 1278
1279 spdif_priv->spbaclk = devm_clk_get(&pdev->dev, "spba");
1280 if (IS_ERR(spdif_priv->spbaclk))
1281 dev_warn(&pdev->dev, "no spba clock in devicetree\n");
1282
1264 /* Select clock source for rx/tx clock */ 1283 /* Select clock source for rx/tx clock */
1265 spdif_priv->rxclk = devm_clk_get(&pdev->dev, "rxtx1"); 1284 spdif_priv->rxclk = devm_clk_get(&pdev->dev, "rxtx1");
1266 if (IS_ERR(spdif_priv->rxclk)) { 1285 if (IS_ERR(spdif_priv->rxclk)) {
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
index 95d2392303eb..40dfd8a36484 100644
--- a/sound/soc/fsl/fsl_ssi.c
+++ b/sound/soc/fsl/fsl_ssi.c
@@ -113,17 +113,17 @@ struct fsl_ssi_rxtx_reg_val {
113}; 113};
114 114
115static const struct reg_default fsl_ssi_reg_defaults[] = { 115static const struct reg_default fsl_ssi_reg_defaults[] = {
116 {0x10, 0x00000000}, 116 {CCSR_SSI_SCR, 0x00000000},
117 {0x18, 0x00003003}, 117 {CCSR_SSI_SIER, 0x00003003},
118 {0x1c, 0x00000200}, 118 {CCSR_SSI_STCR, 0x00000200},
119 {0x20, 0x00000200}, 119 {CCSR_SSI_SRCR, 0x00000200},
120 {0x24, 0x00040000}, 120 {CCSR_SSI_STCCR, 0x00040000},
121 {0x28, 0x00040000}, 121 {CCSR_SSI_SRCCR, 0x00040000},
122 {0x38, 0x00000000}, 122 {CCSR_SSI_SACNT, 0x00000000},
123 {0x48, 0x00000000}, 123 {CCSR_SSI_STMSK, 0x00000000},
124 {0x4c, 0x00000000}, 124 {CCSR_SSI_SRMSK, 0x00000000},
125 {0x54, 0x00000000}, 125 {CCSR_SSI_SACCEN, 0x00000000},
126 {0x58, 0x00000000}, 126 {CCSR_SSI_SACCDIS, 0x00000000},
127}; 127};
128 128
129static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg) 129static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg)
@@ -146,6 +146,7 @@ static bool fsl_ssi_volatile_reg(struct device *dev, unsigned int reg)
146 case CCSR_SSI_SRX1: 146 case CCSR_SSI_SRX1:
147 case CCSR_SSI_SISR: 147 case CCSR_SSI_SISR:
148 case CCSR_SSI_SFCSR: 148 case CCSR_SSI_SFCSR:
149 case CCSR_SSI_SACNT:
149 case CCSR_SSI_SACADD: 150 case CCSR_SSI_SACADD:
150 case CCSR_SSI_SACDAT: 151 case CCSR_SSI_SACDAT:
151 case CCSR_SSI_SATAG: 152 case CCSR_SSI_SATAG:
@@ -156,6 +157,21 @@ static bool fsl_ssi_volatile_reg(struct device *dev, unsigned int reg)
156 } 157 }
157} 158}
158 159
160static bool fsl_ssi_precious_reg(struct device *dev, unsigned int reg)
161{
162 switch (reg) {
163 case CCSR_SSI_SRX0:
164 case CCSR_SSI_SRX1:
165 case CCSR_SSI_SISR:
166 case CCSR_SSI_SACADD:
167 case CCSR_SSI_SACDAT:
168 case CCSR_SSI_SATAG:
169 return true;
170 default:
171 return false;
172 }
173}
174
159static bool fsl_ssi_writeable_reg(struct device *dev, unsigned int reg) 175static bool fsl_ssi_writeable_reg(struct device *dev, unsigned int reg)
160{ 176{
161 switch (reg) { 177 switch (reg) {
@@ -178,6 +194,7 @@ static const struct regmap_config fsl_ssi_regconfig = {
178 .num_reg_defaults = ARRAY_SIZE(fsl_ssi_reg_defaults), 194 .num_reg_defaults = ARRAY_SIZE(fsl_ssi_reg_defaults),
179 .readable_reg = fsl_ssi_readable_reg, 195 .readable_reg = fsl_ssi_readable_reg,
180 .volatile_reg = fsl_ssi_volatile_reg, 196 .volatile_reg = fsl_ssi_volatile_reg,
197 .precious_reg = fsl_ssi_precious_reg,
181 .writeable_reg = fsl_ssi_writeable_reg, 198 .writeable_reg = fsl_ssi_writeable_reg,
182 .cache_type = REGCACHE_RBTREE, 199 .cache_type = REGCACHE_RBTREE,
183}; 200};
@@ -239,8 +256,9 @@ struct fsl_ssi_private {
239 unsigned int baudclk_streams; 256 unsigned int baudclk_streams;
240 unsigned int bitclk_freq; 257 unsigned int bitclk_freq;
241 258
242 /*regcache for SFCSR*/ 259 /* regcache for volatile regs */
243 u32 regcache_sfcsr; 260 u32 regcache_sfcsr;
261 u32 regcache_sacnt;
244 262
245 /* DMA params */ 263 /* DMA params */
246 struct snd_dmaengine_dai_dma_data dma_params_tx; 264 struct snd_dmaengine_dai_dma_data dma_params_tx;
@@ -767,8 +785,7 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,
767 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); 785 struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);
768 struct regmap *regs = ssi_private->regs; 786 struct regmap *regs = ssi_private->regs;
769 unsigned int channels = params_channels(hw_params); 787 unsigned int channels = params_channels(hw_params);
770 unsigned int sample_size = 788 unsigned int sample_size = params_width(hw_params);
771 snd_pcm_format_width(params_format(hw_params));
772 u32 wl = CCSR_SSI_SxCCR_WL(sample_size); 789 u32 wl = CCSR_SSI_SxCCR_WL(sample_size);
773 int ret; 790 int ret;
774 u32 scr_val; 791 u32 scr_val;
@@ -1588,6 +1605,8 @@ static int fsl_ssi_suspend(struct device *dev)
1588 1605
1589 regmap_read(regs, CCSR_SSI_SFCSR, 1606 regmap_read(regs, CCSR_SSI_SFCSR,
1590 &ssi_private->regcache_sfcsr); 1607 &ssi_private->regcache_sfcsr);
1608 regmap_read(regs, CCSR_SSI_SACNT,
1609 &ssi_private->regcache_sacnt);
1591 1610
1592 regcache_cache_only(regs, true); 1611 regcache_cache_only(regs, true);
1593 regcache_mark_dirty(regs); 1612 regcache_mark_dirty(regs);
@@ -1606,6 +1625,8 @@ static int fsl_ssi_resume(struct device *dev)
1606 CCSR_SSI_SFCSR_RFWM1_MASK | CCSR_SSI_SFCSR_TFWM1_MASK | 1625 CCSR_SSI_SFCSR_RFWM1_MASK | CCSR_SSI_SFCSR_TFWM1_MASK |
1607 CCSR_SSI_SFCSR_RFWM0_MASK | CCSR_SSI_SFCSR_TFWM0_MASK, 1626 CCSR_SSI_SFCSR_RFWM0_MASK | CCSR_SSI_SFCSR_TFWM0_MASK,
1608 ssi_private->regcache_sfcsr); 1627 ssi_private->regcache_sfcsr);
1628 regmap_write(regs, CCSR_SSI_SACNT,
1629 ssi_private->regcache_sacnt);
1609 1630
1610 return regcache_sync(regs); 1631 return regcache_sync(regs);
1611} 1632}
diff --git a/sound/soc/fsl/imx-pcm-dma.c b/sound/soc/fsl/imx-pcm-dma.c
index 1fc01ed3279d..f3d3d1ffa84e 100644
--- a/sound/soc/fsl/imx-pcm-dma.c
+++ b/sound/soc/fsl/imx-pcm-dma.c
@@ -62,6 +62,8 @@ int imx_pcm_dma_init(struct platform_device *pdev, size_t size)
62 62
63 config = devm_kzalloc(&pdev->dev, 63 config = devm_kzalloc(&pdev->dev,
64 sizeof(struct snd_dmaengine_pcm_config), GFP_KERNEL); 64 sizeof(struct snd_dmaengine_pcm_config), GFP_KERNEL);
65 if (!config)
66 return -ENOMEM;
65 *config = imx_dmaengine_pcm_config; 67 *config = imx_dmaengine_pcm_config;
66 if (size) 68 if (size)
67 config->prealloc_buffer_size = size; 69 config->prealloc_buffer_size = size;
diff --git a/sound/soc/fsl/imx-pcm-fiq.c b/sound/soc/fsl/imx-pcm-fiq.c
index 7abf6a079574..49d7513f429e 100644
--- a/sound/soc/fsl/imx-pcm-fiq.c
+++ b/sound/soc/fsl/imx-pcm-fiq.c
@@ -220,9 +220,9 @@ static int snd_imx_pcm_mmap(struct snd_pcm_substream *substream,
220 ret = dma_mmap_writecombine(substream->pcm->card->dev, vma, 220 ret = dma_mmap_writecombine(substream->pcm->card->dev, vma,
221 runtime->dma_area, runtime->dma_addr, runtime->dma_bytes); 221 runtime->dma_area, runtime->dma_addr, runtime->dma_bytes);
222 222
223 pr_debug("%s: ret: %d %p 0x%08x 0x%08x\n", __func__, ret, 223 pr_debug("%s: ret: %d %p %pad 0x%08x\n", __func__, ret,
224 runtime->dma_area, 224 runtime->dma_area,
225 runtime->dma_addr, 225 &runtime->dma_addr,
226 runtime->dma_bytes); 226 runtime->dma_bytes);
227 return ret; 227 return ret;
228} 228}
diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c
index b38b98cae855..201a70d1027a 100644
--- a/sound/soc/fsl/imx-wm8962.c
+++ b/sound/soc/fsl/imx-wm8962.c
@@ -69,13 +69,16 @@ static int imx_wm8962_set_bias_level(struct snd_soc_card *card,
69 struct snd_soc_dapm_context *dapm, 69 struct snd_soc_dapm_context *dapm,
70 enum snd_soc_bias_level level) 70 enum snd_soc_bias_level level)
71{ 71{
72 struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; 72 struct snd_soc_pcm_runtime *rtd;
73 struct snd_soc_dai *codec_dai;
73 struct imx_priv *priv = &card_priv; 74 struct imx_priv *priv = &card_priv;
74 struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card); 75 struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card);
75 struct device *dev = &priv->pdev->dev; 76 struct device *dev = &priv->pdev->dev;
76 unsigned int pll_out; 77 unsigned int pll_out;
77 int ret; 78 int ret;
78 79
80 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
81 codec_dai = rtd->codec_dai;
79 if (dapm->dev != codec_dai->dev) 82 if (dapm->dev != codec_dai->dev)
80 return 0; 83 return 0;
81 84
@@ -135,12 +138,15 @@ static int imx_wm8962_set_bias_level(struct snd_soc_card *card,
135 138
136static int imx_wm8962_late_probe(struct snd_soc_card *card) 139static int imx_wm8962_late_probe(struct snd_soc_card *card)
137{ 140{
138 struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; 141 struct snd_soc_pcm_runtime *rtd;
142 struct snd_soc_dai *codec_dai;
139 struct imx_priv *priv = &card_priv; 143 struct imx_priv *priv = &card_priv;
140 struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card); 144 struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card);
141 struct device *dev = &priv->pdev->dev; 145 struct device *dev = &priv->pdev->dev;
142 int ret; 146 int ret;
143 147
148 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
149 codec_dai = rtd->codec_dai;
144 ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK, 150 ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK,
145 data->clk_frequency, SND_SOC_CLOCK_IN); 151 data->clk_frequency, SND_SOC_CLOCK_IN);
146 if (ret < 0) 152 if (ret < 0)
diff --git a/sound/soc/fsl/mpc8610_hpcd.c b/sound/soc/fsl/mpc8610_hpcd.c
index 6f236f170cf5..ddf49f30b23f 100644
--- a/sound/soc/fsl/mpc8610_hpcd.c
+++ b/sound/soc/fsl/mpc8610_hpcd.c
@@ -189,8 +189,7 @@ static int mpc8610_hpcd_probe(struct platform_device *pdev)
189{ 189{
190 struct device *dev = pdev->dev.parent; 190 struct device *dev = pdev->dev.parent;
191 /* ssi_pdev is the platform device for the SSI node that probed us */ 191 /* ssi_pdev is the platform device for the SSI node that probed us */
192 struct platform_device *ssi_pdev = 192 struct platform_device *ssi_pdev = to_platform_device(dev);
193 container_of(dev, struct platform_device, dev);
194 struct device_node *np = ssi_pdev->dev.of_node; 193 struct device_node *np = ssi_pdev->dev.of_node;
195 struct device_node *codec_np = NULL; 194 struct device_node *codec_np = NULL;
196 struct mpc8610_hpcd_data *machine_data; 195 struct mpc8610_hpcd_data *machine_data;
diff --git a/sound/soc/fsl/p1022_ds.c b/sound/soc/fsl/p1022_ds.c
index 747aab0602bd..a1f780ecadf5 100644
--- a/sound/soc/fsl/p1022_ds.c
+++ b/sound/soc/fsl/p1022_ds.c
@@ -199,8 +199,7 @@ static int p1022_ds_probe(struct platform_device *pdev)
199{ 199{
200 struct device *dev = pdev->dev.parent; 200 struct device *dev = pdev->dev.parent;
201 /* ssi_pdev is the platform device for the SSI node that probed us */ 201 /* ssi_pdev is the platform device for the SSI node that probed us */
202 struct platform_device *ssi_pdev = 202 struct platform_device *ssi_pdev = to_platform_device(dev);
203 container_of(dev, struct platform_device, dev);
204 struct device_node *np = ssi_pdev->dev.of_node; 203 struct device_node *np = ssi_pdev->dev.of_node;
205 struct device_node *codec_np = NULL; 204 struct device_node *codec_np = NULL;
206 struct machine_data *mdata; 205 struct machine_data *mdata;
diff --git a/sound/soc/fsl/p1022_rdk.c b/sound/soc/fsl/p1022_rdk.c
index 1dd49e5f9675..d4d88a8cb9c0 100644
--- a/sound/soc/fsl/p1022_rdk.c
+++ b/sound/soc/fsl/p1022_rdk.c
@@ -203,8 +203,7 @@ static int p1022_rdk_probe(struct platform_device *pdev)
203{ 203{
204 struct device *dev = pdev->dev.parent; 204 struct device *dev = pdev->dev.parent;
205 /* ssi_pdev is the platform device for the SSI node that probed us */ 205 /* ssi_pdev is the platform device for the SSI node that probed us */
206 struct platform_device *ssi_pdev = 206 struct platform_device *ssi_pdev = to_platform_device(dev);
207 container_of(dev, struct platform_device, dev);
208 struct device_node *np = ssi_pdev->dev.of_node; 207 struct device_node *np = ssi_pdev->dev.of_node;
209 struct device_node *codec_np = NULL; 208 struct device_node *codec_np = NULL;
210 struct machine_data *mdata; 209 struct machine_data *mdata;
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index 54c33204541f..1ded8811598e 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -45,7 +45,7 @@ static int asoc_simple_card_startup(struct snd_pcm_substream *substream)
45 struct snd_soc_pcm_runtime *rtd = substream->private_data; 45 struct snd_soc_pcm_runtime *rtd = substream->private_data;
46 struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card); 46 struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
47 struct simple_dai_props *dai_props = 47 struct simple_dai_props *dai_props =
48 &priv->dai_props[rtd - rtd->card->rtd]; 48 &priv->dai_props[rtd->num];
49 int ret; 49 int ret;
50 50
51 ret = clk_prepare_enable(dai_props->cpu_dai.clk); 51 ret = clk_prepare_enable(dai_props->cpu_dai.clk);
@@ -64,7 +64,7 @@ static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
64 struct snd_soc_pcm_runtime *rtd = substream->private_data; 64 struct snd_soc_pcm_runtime *rtd = substream->private_data;
65 struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card); 65 struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
66 struct simple_dai_props *dai_props = 66 struct simple_dai_props *dai_props =
67 &priv->dai_props[rtd - rtd->card->rtd]; 67 &priv->dai_props[rtd->num];
68 68
69 clk_disable_unprepare(dai_props->cpu_dai.clk); 69 clk_disable_unprepare(dai_props->cpu_dai.clk);
70 70
@@ -78,8 +78,7 @@ static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream,
78 struct snd_soc_dai *codec_dai = rtd->codec_dai; 78 struct snd_soc_dai *codec_dai = rtd->codec_dai;
79 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 79 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
80 struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card); 80 struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
81 struct simple_dai_props *dai_props = 81 struct simple_dai_props *dai_props = &priv->dai_props[rtd->num];
82 &priv->dai_props[rtd - rtd->card->rtd];
83 unsigned int mclk, mclk_fs = 0; 82 unsigned int mclk, mclk_fs = 0;
84 int ret = 0; 83 int ret = 0;
85 84
@@ -174,10 +173,9 @@ static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
174 struct snd_soc_dai *codec = rtd->codec_dai; 173 struct snd_soc_dai *codec = rtd->codec_dai;
175 struct snd_soc_dai *cpu = rtd->cpu_dai; 174 struct snd_soc_dai *cpu = rtd->cpu_dai;
176 struct simple_dai_props *dai_props; 175 struct simple_dai_props *dai_props;
177 int num, ret; 176 int ret;
178 177
179 num = rtd - rtd->card->rtd; 178 dai_props = &priv->dai_props[rtd->num];
180 dai_props = &priv->dai_props[num];
181 ret = __asoc_simple_card_dai_init(codec, &dai_props->codec_dai); 179 ret = __asoc_simple_card_dai_init(codec, &dai_props->codec_dai);
182 if (ret < 0) 180 if (ret < 0)
183 return ret; 181 return ret;
diff --git a/sound/soc/img/Kconfig b/sound/soc/img/Kconfig
new file mode 100644
index 000000000000..857a9510ee1c
--- /dev/null
+++ b/sound/soc/img/Kconfig
@@ -0,0 +1,52 @@
1config SND_SOC_IMG
2 bool "Audio support for Imagination Technologies designs"
3 help
4 Audio support for Imagination Technologies audio hardware
5
6config SND_SOC_IMG_I2S_IN
7 tristate "Imagination I2S Input Device Driver"
8 depends on SND_SOC_IMG
9 select SND_SOC_GENERIC_DMAENGINE_PCM
10 help
11 Say Y or M if you want to add support for I2S in driver for
12 Imagination Technologies I2S in device.
13
14config SND_SOC_IMG_I2S_OUT
15 tristate "Imagination I2S Output Device Driver"
16 depends on SND_SOC_IMG
17 select SND_SOC_GENERIC_DMAENGINE_PCM
18 help
19 Say Y or M if you want to add support for I2S out driver for
20 Imagination Technologies I2S out device.
21
22config SND_SOC_IMG_PARALLEL_OUT
23 tristate "Imagination Parallel Output Device Driver"
24 depends on SND_SOC_IMG
25 select SND_SOC_GENERIC_DMAENGINE_PCM
26 help
27 Say Y or M if you want to add support for parallel out driver for
28 Imagination Technologies parallel out device.
29
30config SND_SOC_IMG_SPDIF_IN
31 tristate "Imagination SPDIF Input Device Driver"
32 depends on SND_SOC_IMG
33 select SND_SOC_GENERIC_DMAENGINE_PCM
34 help
35 Say Y or M if you want to add support for SPDIF input driver for
36 Imagination Technologies SPDIF input device.
37
38config SND_SOC_IMG_SPDIF_OUT
39 tristate "Imagination SPDIF Output Device Driver"
40 depends on SND_SOC_IMG
41 select SND_SOC_GENERIC_DMAENGINE_PCM
42 help
43 Say Y or M if you want to add support for SPDIF out driver for
44 Imagination Technologies SPDIF out device.
45
46
47config SND_SOC_IMG_PISTACHIO_INTERNAL_DAC
48 tristate "Support for Pistachio SoC Internal DAC Driver"
49 depends on SND_SOC_IMG
50 help
51 Say Y or M if you want to add support for Pistachio internal DAC
52 driver for Imagination Technologies Pistachio internal DAC device.
diff --git a/sound/soc/img/Makefile b/sound/soc/img/Makefile
new file mode 100644
index 000000000000..0508c1ced636
--- /dev/null
+++ b/sound/soc/img/Makefile
@@ -0,0 +1,7 @@
1obj-$(CONFIG_SND_SOC_IMG_I2S_IN) += img-i2s-in.o
2obj-$(CONFIG_SND_SOC_IMG_I2S_OUT) += img-i2s-out.o
3obj-$(CONFIG_SND_SOC_IMG_PARALLEL_OUT) += img-parallel-out.o
4obj-$(CONFIG_SND_SOC_IMG_SPDIF_IN) += img-spdif-in.o
5obj-$(CONFIG_SND_SOC_IMG_SPDIF_OUT) += img-spdif-out.o
6
7obj-$(CONFIG_SND_SOC_IMG_PISTACHIO_INTERNAL_DAC) += pistachio-internal-dac.o
diff --git a/sound/soc/img/img-i2s-in.c b/sound/soc/img/img-i2s-in.c
new file mode 100644
index 000000000000..0389203f8560
--- /dev/null
+++ b/sound/soc/img/img-i2s-in.c
@@ -0,0 +1,516 @@
1/*
2 * IMG I2S input controller driver
3 *
4 * Copyright (C) 2015 Imagination Technologies Ltd.
5 *
6 * Author: Damien Horsley <Damien.Horsley@imgtec.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
11 */
12
13#include <linux/clk.h>
14#include <linux/init.h>
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/of.h>
18#include <linux/platform_device.h>
19#include <linux/reset.h>
20
21#include <sound/core.h>
22#include <sound/dmaengine_pcm.h>
23#include <sound/initval.h>
24#include <sound/pcm.h>
25#include <sound/pcm_params.h>
26#include <sound/soc.h>
27
28#define IMG_I2S_IN_RX_FIFO 0x0
29
30#define IMG_I2S_IN_CTL 0x4
31#define IMG_I2S_IN_CTL_ACTIVE_CHAN_MASK 0xfffffffc
32#define IMG_I2S_IN_CTL_ACTIVE_CH_SHIFT 2
33#define IMG_I2S_IN_CTL_16PACK_MASK BIT(1)
34#define IMG_I2S_IN_CTL_ME_MASK BIT(0)
35
36#define IMG_I2S_IN_CH_CTL 0x4
37#define IMG_I2S_IN_CH_CTL_CCDEL_MASK 0x38000
38#define IMG_I2S_IN_CH_CTL_CCDEL_SHIFT 15
39#define IMG_I2S_IN_CH_CTL_FEN_MASK BIT(14)
40#define IMG_I2S_IN_CH_CTL_FMODE_MASK BIT(13)
41#define IMG_I2S_IN_CH_CTL_16PACK_MASK BIT(12)
42#define IMG_I2S_IN_CH_CTL_JUST_MASK BIT(10)
43#define IMG_I2S_IN_CH_CTL_PACKH_MASK BIT(9)
44#define IMG_I2S_IN_CH_CTL_CLK_TRANS_MASK BIT(8)
45#define IMG_I2S_IN_CH_CTL_BLKP_MASK BIT(7)
46#define IMG_I2S_IN_CH_CTL_FIFO_FLUSH_MASK BIT(6)
47#define IMG_I2S_IN_CH_CTL_LRD_MASK BIT(3)
48#define IMG_I2S_IN_CH_CTL_FW_MASK BIT(2)
49#define IMG_I2S_IN_CH_CTL_SW_MASK BIT(1)
50#define IMG_I2S_IN_CH_CTL_ME_MASK BIT(0)
51
52#define IMG_I2S_IN_CH_STRIDE 0x20
53
54struct img_i2s_in {
55 void __iomem *base;
56 struct clk *clk_sys;
57 struct snd_dmaengine_dai_dma_data dma_data;
58 struct device *dev;
59 unsigned int max_i2s_chan;
60 void __iomem *channel_base;
61 unsigned int active_channels;
62 struct snd_soc_dai_driver dai_driver;
63};
64
65static inline void img_i2s_in_writel(struct img_i2s_in *i2s, u32 val, u32 reg)
66{
67 writel(val, i2s->base + reg);
68}
69
70static inline u32 img_i2s_in_readl(struct img_i2s_in *i2s, u32 reg)
71{
72 return readl(i2s->base + reg);
73}
74
75static inline void img_i2s_in_ch_writel(struct img_i2s_in *i2s, u32 chan,
76 u32 val, u32 reg)
77{
78 writel(val, i2s->channel_base + (chan * IMG_I2S_IN_CH_STRIDE) + reg);
79}
80
81static inline u32 img_i2s_in_ch_readl(struct img_i2s_in *i2s, u32 chan,
82 u32 reg)
83{
84 return readl(i2s->channel_base + (chan * IMG_I2S_IN_CH_STRIDE) + reg);
85}
86
87static inline void img_i2s_in_ch_disable(struct img_i2s_in *i2s, u32 chan)
88{
89 u32 reg;
90
91 reg = img_i2s_in_ch_readl(i2s, chan, IMG_I2S_IN_CH_CTL);
92 reg &= ~IMG_I2S_IN_CH_CTL_ME_MASK;
93 img_i2s_in_ch_writel(i2s, chan, reg, IMG_I2S_IN_CH_CTL);
94}
95
96static inline void img_i2s_in_ch_enable(struct img_i2s_in *i2s, u32 chan)
97{
98 u32 reg;
99
100 reg = img_i2s_in_ch_readl(i2s, chan, IMG_I2S_IN_CH_CTL);
101 reg |= IMG_I2S_IN_CH_CTL_ME_MASK;
102 img_i2s_in_ch_writel(i2s, chan, reg, IMG_I2S_IN_CH_CTL);
103}
104
105static inline void img_i2s_in_disable(struct img_i2s_in *i2s)
106{
107 u32 reg;
108
109 reg = img_i2s_in_readl(i2s, IMG_I2S_IN_CTL);
110 reg &= ~IMG_I2S_IN_CTL_ME_MASK;
111 img_i2s_in_writel(i2s, reg, IMG_I2S_IN_CTL);
112}
113
114static inline void img_i2s_in_enable(struct img_i2s_in *i2s)
115{
116 u32 reg;
117
118 reg = img_i2s_in_readl(i2s, IMG_I2S_IN_CTL);
119 reg |= IMG_I2S_IN_CTL_ME_MASK;
120 img_i2s_in_writel(i2s, reg, IMG_I2S_IN_CTL);
121}
122
123static inline void img_i2s_in_flush(struct img_i2s_in *i2s)
124{
125 int i;
126 u32 reg;
127
128 for (i = 0; i < i2s->active_channels; i++) {
129 reg = img_i2s_in_ch_readl(i2s, i, IMG_I2S_IN_CH_CTL);
130 reg |= IMG_I2S_IN_CH_CTL_FIFO_FLUSH_MASK;
131 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
132 reg &= ~IMG_I2S_IN_CH_CTL_FIFO_FLUSH_MASK;
133 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
134 }
135}
136
137static int img_i2s_in_trigger(struct snd_pcm_substream *substream, int cmd,
138 struct snd_soc_dai *dai)
139{
140 struct img_i2s_in *i2s = snd_soc_dai_get_drvdata(dai);
141
142 switch (cmd) {
143 case SNDRV_PCM_TRIGGER_START:
144 case SNDRV_PCM_TRIGGER_RESUME:
145 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
146 img_i2s_in_enable(i2s);
147 break;
148
149 case SNDRV_PCM_TRIGGER_STOP:
150 case SNDRV_PCM_TRIGGER_SUSPEND:
151 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
152 img_i2s_in_disable(i2s);
153 break;
154 default:
155 return -EINVAL;
156 }
157
158 return 0;
159}
160
161static int img_i2s_in_check_rate(struct img_i2s_in *i2s,
162 unsigned int sample_rate, unsigned int frame_size,
163 unsigned int *bclk_filter_enable,
164 unsigned int *bclk_filter_value)
165{
166 unsigned int bclk_freq, cur_freq;
167
168 bclk_freq = sample_rate * frame_size;
169
170 cur_freq = clk_get_rate(i2s->clk_sys);
171
172 if (cur_freq >= bclk_freq * 8) {
173 *bclk_filter_enable = 1;
174 *bclk_filter_value = 0;
175 } else if (cur_freq >= bclk_freq * 7) {
176 *bclk_filter_enable = 1;
177 *bclk_filter_value = 1;
178 } else if (cur_freq >= bclk_freq * 6) {
179 *bclk_filter_enable = 0;
180 *bclk_filter_value = 0;
181 } else {
182 dev_err(i2s->dev,
183 "Sys clock rate %u insufficient for sample rate %u\n",
184 cur_freq, sample_rate);
185 return -EINVAL;
186 }
187
188 return 0;
189}
190
191static int img_i2s_in_hw_params(struct snd_pcm_substream *substream,
192 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
193{
194 struct img_i2s_in *i2s = snd_soc_dai_get_drvdata(dai);
195 unsigned int rate, channels, i2s_channels, frame_size;
196 unsigned int bclk_filter_enable, bclk_filter_value;
197 int i, ret = 0;
198 u32 reg, control_mask, chan_control_mask;
199 u32 control_set = 0, chan_control_set = 0;
200 snd_pcm_format_t format;
201
202 rate = params_rate(params);
203 format = params_format(params);
204 channels = params_channels(params);
205 i2s_channels = channels / 2;
206
207 switch (format) {
208 case SNDRV_PCM_FORMAT_S32_LE:
209 frame_size = 64;
210 chan_control_set |= IMG_I2S_IN_CH_CTL_SW_MASK;
211 chan_control_set |= IMG_I2S_IN_CH_CTL_FW_MASK;
212 chan_control_set |= IMG_I2S_IN_CH_CTL_PACKH_MASK;
213 break;
214 case SNDRV_PCM_FORMAT_S24_LE:
215 frame_size = 64;
216 chan_control_set |= IMG_I2S_IN_CH_CTL_SW_MASK;
217 chan_control_set |= IMG_I2S_IN_CH_CTL_FW_MASK;
218 break;
219 case SNDRV_PCM_FORMAT_S16_LE:
220 frame_size = 32;
221 control_set |= IMG_I2S_IN_CTL_16PACK_MASK;
222 chan_control_set |= IMG_I2S_IN_CH_CTL_16PACK_MASK;
223 break;
224 default:
225 return -EINVAL;
226 }
227
228 if ((channels < 2) ||
229 (channels > (i2s->max_i2s_chan * 2)) ||
230 (channels % 2))
231 return -EINVAL;
232
233 control_set |= ((i2s_channels - 1) << IMG_I2S_IN_CTL_ACTIVE_CH_SHIFT);
234
235 ret = img_i2s_in_check_rate(i2s, rate, frame_size,
236 &bclk_filter_enable, &bclk_filter_value);
237 if (ret < 0)
238 return ret;
239
240 if (bclk_filter_enable)
241 chan_control_set |= IMG_I2S_IN_CH_CTL_FEN_MASK;
242
243 if (bclk_filter_value)
244 chan_control_set |= IMG_I2S_IN_CH_CTL_FMODE_MASK;
245
246 control_mask = IMG_I2S_IN_CTL_16PACK_MASK |
247 IMG_I2S_IN_CTL_ACTIVE_CHAN_MASK;
248
249 chan_control_mask = IMG_I2S_IN_CH_CTL_16PACK_MASK |
250 IMG_I2S_IN_CH_CTL_FEN_MASK |
251 IMG_I2S_IN_CH_CTL_FMODE_MASK |
252 IMG_I2S_IN_CH_CTL_SW_MASK |
253 IMG_I2S_IN_CH_CTL_FW_MASK |
254 IMG_I2S_IN_CH_CTL_PACKH_MASK;
255
256 reg = img_i2s_in_readl(i2s, IMG_I2S_IN_CTL);
257 reg = (reg & ~control_mask) | control_set;
258 img_i2s_in_writel(i2s, reg, IMG_I2S_IN_CTL);
259
260 for (i = 0; i < i2s->active_channels; i++)
261 img_i2s_in_ch_disable(i2s, i);
262
263 for (i = 0; i < i2s->max_i2s_chan; i++) {
264 reg = img_i2s_in_ch_readl(i2s, i, IMG_I2S_IN_CH_CTL);
265 reg = (reg & ~chan_control_mask) | chan_control_set;
266 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
267 }
268
269 i2s->active_channels = i2s_channels;
270
271 img_i2s_in_flush(i2s);
272
273 for (i = 0; i < i2s->active_channels; i++)
274 img_i2s_in_ch_enable(i2s, i);
275
276 return 0;
277}
278
279static int img_i2s_in_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
280{
281 struct img_i2s_in *i2s = snd_soc_dai_get_drvdata(dai);
282 int i;
283 u32 chan_control_mask, lrd_set = 0, blkp_set = 0, chan_control_set = 0;
284 u32 reg;
285
286 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
287 case SND_SOC_DAIFMT_NB_NF:
288 lrd_set |= IMG_I2S_IN_CH_CTL_LRD_MASK;
289 break;
290 case SND_SOC_DAIFMT_NB_IF:
291 break;
292 case SND_SOC_DAIFMT_IB_NF:
293 lrd_set |= IMG_I2S_IN_CH_CTL_LRD_MASK;
294 blkp_set |= IMG_I2S_IN_CH_CTL_BLKP_MASK;
295 break;
296 case SND_SOC_DAIFMT_IB_IF:
297 blkp_set |= IMG_I2S_IN_CH_CTL_BLKP_MASK;
298 break;
299 default:
300 return -EINVAL;
301 }
302
303 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
304 case SND_SOC_DAIFMT_I2S:
305 chan_control_set |= IMG_I2S_IN_CH_CTL_CLK_TRANS_MASK;
306 break;
307 case SND_SOC_DAIFMT_LEFT_J:
308 break;
309 default:
310 return -EINVAL;
311 }
312
313 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
314 case SND_SOC_DAIFMT_CBM_CFM:
315 break;
316 default:
317 return -EINVAL;
318 }
319
320 chan_control_mask = IMG_I2S_IN_CH_CTL_CLK_TRANS_MASK;
321
322 for (i = 0; i < i2s->active_channels; i++)
323 img_i2s_in_ch_disable(i2s, i);
324
325 /*
326 * BLKP and LRD must be set during separate register writes
327 */
328 for (i = 0; i < i2s->max_i2s_chan; i++) {
329 reg = img_i2s_in_ch_readl(i2s, i, IMG_I2S_IN_CH_CTL);
330 reg = (reg & ~chan_control_mask) | chan_control_set;
331 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
332 reg = (reg & ~IMG_I2S_IN_CH_CTL_BLKP_MASK) | blkp_set;
333 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
334 reg = (reg & ~IMG_I2S_IN_CH_CTL_LRD_MASK) | lrd_set;
335 img_i2s_in_ch_writel(i2s, i, reg, IMG_I2S_IN_CH_CTL);
336 }
337
338 for (i = 0; i < i2s->active_channels; i++)
339 img_i2s_in_ch_enable(i2s, i);
340
341 return 0;
342}
343
344static const struct snd_soc_dai_ops img_i2s_in_dai_ops = {
345 .trigger = img_i2s_in_trigger,
346 .hw_params = img_i2s_in_hw_params,
347 .set_fmt = img_i2s_in_set_fmt
348};
349
350static int img_i2s_in_dai_probe(struct snd_soc_dai *dai)
351{
352 struct img_i2s_in *i2s = snd_soc_dai_get_drvdata(dai);
353
354 snd_soc_dai_init_dma_data(dai, NULL, &i2s->dma_data);
355
356 return 0;
357}
358
359static const struct snd_soc_component_driver img_i2s_in_component = {
360 .name = "img-i2s-in"
361};
362
363static int img_i2s_in_dma_prepare_slave_config(struct snd_pcm_substream *st,
364 struct snd_pcm_hw_params *params, struct dma_slave_config *sc)
365{
366 unsigned int i2s_channels = params_channels(params) / 2;
367 struct snd_soc_pcm_runtime *rtd = st->private_data;
368 struct snd_dmaengine_dai_dma_data *dma_data;
369 int ret;
370
371 dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, st);
372
373 ret = snd_hwparams_to_dma_slave_config(st, params, sc);
374 if (ret)
375 return ret;
376
377 sc->src_addr = dma_data->addr;
378 sc->src_addr_width = dma_data->addr_width;
379 sc->src_maxburst = 4 * i2s_channels;
380
381 return 0;
382}
383
384static const struct snd_dmaengine_pcm_config img_i2s_in_dma_config = {
385 .prepare_slave_config = img_i2s_in_dma_prepare_slave_config
386};
387
388static int img_i2s_in_probe(struct platform_device *pdev)
389{
390 struct img_i2s_in *i2s;
391 struct resource *res;
392 void __iomem *base;
393 int ret, i;
394 struct reset_control *rst;
395 unsigned int max_i2s_chan_pow_2;
396 struct device *dev = &pdev->dev;
397
398 i2s = devm_kzalloc(dev, sizeof(*i2s), GFP_KERNEL);
399 if (!i2s)
400 return -ENOMEM;
401
402 platform_set_drvdata(pdev, i2s);
403
404 i2s->dev = dev;
405
406 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
407 base = devm_ioremap_resource(dev, res);
408 if (IS_ERR(base))
409 return PTR_ERR(base);
410
411 i2s->base = base;
412
413 if (of_property_read_u32(pdev->dev.of_node, "img,i2s-channels",
414 &i2s->max_i2s_chan)) {
415 dev_err(dev, "No img,i2s-channels property\n");
416 return -EINVAL;
417 }
418
419 max_i2s_chan_pow_2 = 1 << get_count_order(i2s->max_i2s_chan);
420
421 i2s->channel_base = base + (max_i2s_chan_pow_2 * 0x20);
422
423 i2s->clk_sys = devm_clk_get(dev, "sys");
424 if (IS_ERR(i2s->clk_sys)) {
425 if (PTR_ERR(i2s->clk_sys) != -EPROBE_DEFER)
426 dev_err(dev, "Failed to acquire clock 'sys'\n");
427 return PTR_ERR(i2s->clk_sys);
428 }
429
430 ret = clk_prepare_enable(i2s->clk_sys);
431 if (ret)
432 return ret;
433
434 i2s->active_channels = 1;
435 i2s->dma_data.addr = res->start + IMG_I2S_IN_RX_FIFO;
436 i2s->dma_data.addr_width = 4;
437
438 i2s->dai_driver.probe = img_i2s_in_dai_probe;
439 i2s->dai_driver.capture.channels_min = 2;
440 i2s->dai_driver.capture.channels_max = i2s->max_i2s_chan * 2;
441 i2s->dai_driver.capture.rates = SNDRV_PCM_RATE_8000_192000;
442 i2s->dai_driver.capture.formats = SNDRV_PCM_FMTBIT_S32_LE |
443 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE;
444 i2s->dai_driver.ops = &img_i2s_in_dai_ops;
445
446 rst = devm_reset_control_get(dev, "rst");
447 if (IS_ERR(rst)) {
448 if (PTR_ERR(rst) == -EPROBE_DEFER) {
449 ret = -EPROBE_DEFER;
450 goto err_clk_disable;
451 }
452
453 dev_dbg(dev, "No top level reset found\n");
454
455 img_i2s_in_disable(i2s);
456
457 for (i = 0; i < i2s->max_i2s_chan; i++)
458 img_i2s_in_ch_disable(i2s, i);
459 } else {
460 reset_control_assert(rst);
461 reset_control_deassert(rst);
462 }
463
464 img_i2s_in_writel(i2s, 0, IMG_I2S_IN_CTL);
465
466 for (i = 0; i < i2s->max_i2s_chan; i++)
467 img_i2s_in_ch_writel(i2s, i,
468 (4 << IMG_I2S_IN_CH_CTL_CCDEL_SHIFT) |
469 IMG_I2S_IN_CH_CTL_JUST_MASK |
470 IMG_I2S_IN_CH_CTL_FW_MASK, IMG_I2S_IN_CH_CTL);
471
472 ret = devm_snd_soc_register_component(dev, &img_i2s_in_component,
473 &i2s->dai_driver, 1);
474 if (ret)
475 goto err_clk_disable;
476
477 ret = devm_snd_dmaengine_pcm_register(dev, &img_i2s_in_dma_config, 0);
478 if (ret)
479 goto err_clk_disable;
480
481 return 0;
482
483err_clk_disable:
484 clk_disable_unprepare(i2s->clk_sys);
485
486 return ret;
487}
488
489static int img_i2s_in_dev_remove(struct platform_device *pdev)
490{
491 struct img_i2s_in *i2s = platform_get_drvdata(pdev);
492
493 clk_disable_unprepare(i2s->clk_sys);
494
495 return 0;
496}
497
498static const struct of_device_id img_i2s_in_of_match[] = {
499 { .compatible = "img,i2s-in" },
500 {}
501};
502MODULE_DEVICE_TABLE(of, img_i2s_in_of_match);
503
504static struct platform_driver img_i2s_in_driver = {
505 .driver = {
506 .name = "img-i2s-in",
507 .of_match_table = img_i2s_in_of_match
508 },
509 .probe = img_i2s_in_probe,
510 .remove = img_i2s_in_dev_remove
511};
512module_platform_driver(img_i2s_in_driver);
513
514MODULE_AUTHOR("Damien Horsley <Damien.Horsley@imgtec.com>");
515MODULE_DESCRIPTION("IMG I2S Input Driver");
516MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/img/img-i2s-out.c b/sound/soc/img/img-i2s-out.c
new file mode 100644
index 000000000000..5f997135a8ae
--- /dev/null
+++ b/sound/soc/img/img-i2s-out.c
@@ -0,0 +1,565 @@
1/*
2 * IMG I2S output controller driver
3 *
4 * Copyright (C) 2015 Imagination Technologies Ltd.
5 *
6 * Author: Damien Horsley <Damien.Horsley@imgtec.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
11 */
12
13#include <linux/clk.h>
14#include <linux/init.h>
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/of.h>
18#include <linux/platform_device.h>
19#include <linux/pm_runtime.h>
20#include <linux/reset.h>
21
22#include <sound/core.h>
23#include <sound/dmaengine_pcm.h>
24#include <sound/initval.h>
25#include <sound/pcm.h>
26#include <sound/pcm_params.h>
27#include <sound/soc.h>
28
29#define IMG_I2S_OUT_TX_FIFO 0x0
30
31#define IMG_I2S_OUT_CTL 0x4
32#define IMG_I2S_OUT_CTL_DATA_EN_MASK BIT(24)
33#define IMG_I2S_OUT_CTL_ACTIVE_CHAN_MASK 0xffe000
34#define IMG_I2S_OUT_CTL_ACTIVE_CHAN_SHIFT 13
35#define IMG_I2S_OUT_CTL_FRM_SIZE_MASK BIT(8)
36#define IMG_I2S_OUT_CTL_MASTER_MASK BIT(6)
37#define IMG_I2S_OUT_CTL_CLK_MASK BIT(5)
38#define IMG_I2S_OUT_CTL_CLK_EN_MASK BIT(4)
39#define IMG_I2S_OUT_CTL_FRM_CLK_POL_MASK BIT(3)
40#define IMG_I2S_OUT_CTL_BCLK_POL_MASK BIT(2)
41#define IMG_I2S_OUT_CTL_ME_MASK BIT(0)
42
43#define IMG_I2S_OUT_CH_CTL 0x4
44#define IMG_I2S_OUT_CHAN_CTL_CH_MASK BIT(11)
45#define IMG_I2S_OUT_CHAN_CTL_LT_MASK BIT(10)
46#define IMG_I2S_OUT_CHAN_CTL_FMT_MASK 0xf0
47#define IMG_I2S_OUT_CHAN_CTL_FMT_SHIFT 4
48#define IMG_I2S_OUT_CHAN_CTL_JUST_MASK BIT(3)
49#define IMG_I2S_OUT_CHAN_CTL_CLKT_MASK BIT(1)
50#define IMG_I2S_OUT_CHAN_CTL_ME_MASK BIT(0)
51
52#define IMG_I2S_OUT_CH_STRIDE 0x20
53
54struct img_i2s_out {
55 void __iomem *base;
56 struct clk *clk_sys;
57 struct clk *clk_ref;
58 struct snd_dmaengine_dai_dma_data dma_data;
59 struct device *dev;
60 unsigned int max_i2s_chan;
61 void __iomem *channel_base;
62 bool force_clk_active;
63 unsigned int active_channels;
64 struct reset_control *rst;
65 struct snd_soc_dai_driver dai_driver;
66};
67
68static int img_i2s_out_suspend(struct device *dev)
69{
70 struct img_i2s_out *i2s = dev_get_drvdata(dev);
71
72 if (!i2s->force_clk_active)
73 clk_disable_unprepare(i2s->clk_ref);
74
75 return 0;
76}
77
78static int img_i2s_out_resume(struct device *dev)
79{
80 struct img_i2s_out *i2s = dev_get_drvdata(dev);
81 int ret;
82
83 if (!i2s->force_clk_active) {
84 ret = clk_prepare_enable(i2s->clk_ref);
85 if (ret) {
86 dev_err(dev, "clk_enable failed: %d\n", ret);
87 return ret;
88 }
89 }
90
91 return 0;
92}
93
94static inline void img_i2s_out_writel(struct img_i2s_out *i2s, u32 val,
95 u32 reg)
96{
97 writel(val, i2s->base + reg);
98}
99
100static inline u32 img_i2s_out_readl(struct img_i2s_out *i2s, u32 reg)
101{
102 return readl(i2s->base + reg);
103}
104
105static inline void img_i2s_out_ch_writel(struct img_i2s_out *i2s,
106 u32 chan, u32 val, u32 reg)
107{
108 writel(val, i2s->channel_base + (chan * IMG_I2S_OUT_CH_STRIDE) + reg);
109}
110
111static inline u32 img_i2s_out_ch_readl(struct img_i2s_out *i2s, u32 chan,
112 u32 reg)
113{
114 return readl(i2s->channel_base + (chan * IMG_I2S_OUT_CH_STRIDE) + reg);
115}
116
117static inline void img_i2s_out_ch_disable(struct img_i2s_out *i2s, u32 chan)
118{
119 u32 reg;
120
121 reg = img_i2s_out_ch_readl(i2s, chan, IMG_I2S_OUT_CH_CTL);
122 reg &= ~IMG_I2S_OUT_CHAN_CTL_ME_MASK;
123 img_i2s_out_ch_writel(i2s, chan, reg, IMG_I2S_OUT_CH_CTL);
124}
125
126static inline void img_i2s_out_ch_enable(struct img_i2s_out *i2s, u32 chan)
127{
128 u32 reg;
129
130 reg = img_i2s_out_ch_readl(i2s, chan, IMG_I2S_OUT_CH_CTL);
131 reg |= IMG_I2S_OUT_CHAN_CTL_ME_MASK;
132 img_i2s_out_ch_writel(i2s, chan, reg, IMG_I2S_OUT_CH_CTL);
133}
134
135static inline void img_i2s_out_disable(struct img_i2s_out *i2s)
136{
137 u32 reg;
138
139 reg = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL);
140 reg &= ~IMG_I2S_OUT_CTL_ME_MASK;
141 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
142}
143
144static inline void img_i2s_out_enable(struct img_i2s_out *i2s)
145{
146 u32 reg;
147
148 reg = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL);
149 reg |= IMG_I2S_OUT_CTL_ME_MASK;
150 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
151}
152
153static void img_i2s_out_reset(struct img_i2s_out *i2s)
154{
155 int i;
156 u32 core_ctl, chan_ctl;
157
158 core_ctl = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL) &
159 ~IMG_I2S_OUT_CTL_ME_MASK &
160 ~IMG_I2S_OUT_CTL_DATA_EN_MASK;
161
162 if (!i2s->force_clk_active)
163 core_ctl &= ~IMG_I2S_OUT_CTL_CLK_EN_MASK;
164
165 chan_ctl = img_i2s_out_ch_readl(i2s, 0, IMG_I2S_OUT_CH_CTL) &
166 ~IMG_I2S_OUT_CHAN_CTL_ME_MASK;
167
168 reset_control_assert(i2s->rst);
169 reset_control_deassert(i2s->rst);
170
171 for (i = 0; i < i2s->max_i2s_chan; i++)
172 img_i2s_out_ch_writel(i2s, i, chan_ctl, IMG_I2S_OUT_CH_CTL);
173
174 for (i = 0; i < i2s->active_channels; i++)
175 img_i2s_out_ch_enable(i2s, i);
176
177 img_i2s_out_writel(i2s, core_ctl, IMG_I2S_OUT_CTL);
178 img_i2s_out_enable(i2s);
179}
180
181static int img_i2s_out_trigger(struct snd_pcm_substream *substream, int cmd,
182 struct snd_soc_dai *dai)
183{
184 struct img_i2s_out *i2s = snd_soc_dai_get_drvdata(dai);
185 u32 reg;
186
187 switch (cmd) {
188 case SNDRV_PCM_TRIGGER_START:
189 case SNDRV_PCM_TRIGGER_RESUME:
190 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
191 reg = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL);
192 if (!i2s->force_clk_active)
193 reg |= IMG_I2S_OUT_CTL_CLK_EN_MASK;
194 reg |= IMG_I2S_OUT_CTL_DATA_EN_MASK;
195 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
196 break;
197 case SNDRV_PCM_TRIGGER_STOP:
198 case SNDRV_PCM_TRIGGER_SUSPEND:
199 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
200 img_i2s_out_reset(i2s);
201 break;
202 default:
203 return -EINVAL;
204 }
205
206 return 0;
207}
208
209static int img_i2s_out_hw_params(struct snd_pcm_substream *substream,
210 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
211{
212 struct img_i2s_out *i2s = snd_soc_dai_get_drvdata(dai);
213 unsigned int channels, i2s_channels;
214 long pre_div_a, pre_div_b, diff_a, diff_b, rate, clk_rate;
215 int i;
216 u32 reg, control_mask, control_set = 0;
217 snd_pcm_format_t format;
218
219 rate = params_rate(params);
220 format = params_format(params);
221 channels = params_channels(params);
222 i2s_channels = channels / 2;
223
224 if (format != SNDRV_PCM_FORMAT_S32_LE)
225 return -EINVAL;
226
227 if ((channels < 2) ||
228 (channels > (i2s->max_i2s_chan * 2)) ||
229 (channels % 2))
230 return -EINVAL;
231
232 pre_div_a = clk_round_rate(i2s->clk_ref, rate * 256);
233 if (pre_div_a < 0)
234 return pre_div_a;
235 pre_div_b = clk_round_rate(i2s->clk_ref, rate * 384);
236 if (pre_div_b < 0)
237 return pre_div_b;
238
239 diff_a = abs((pre_div_a / 256) - rate);
240 diff_b = abs((pre_div_b / 384) - rate);
241
242 /* If diffs are equal, use lower clock rate */
243 if (diff_a > diff_b)
244 clk_set_rate(i2s->clk_ref, pre_div_b);
245 else
246 clk_set_rate(i2s->clk_ref, pre_div_a);
247
248 /*
249 * Another driver (eg alsa machine driver) may have rejected the above
250 * change. Get the current rate and set the register bit according to
251 * the new minimum diff
252 */
253 clk_rate = clk_get_rate(i2s->clk_ref);
254
255 diff_a = abs((clk_rate / 256) - rate);
256 diff_b = abs((clk_rate / 384) - rate);
257
258 if (diff_a > diff_b)
259 control_set |= IMG_I2S_OUT_CTL_CLK_MASK;
260
261 control_set |= ((i2s_channels - 1) <<
262 IMG_I2S_OUT_CTL_ACTIVE_CHAN_SHIFT) &
263 IMG_I2S_OUT_CTL_ACTIVE_CHAN_MASK;
264
265 control_mask = IMG_I2S_OUT_CTL_CLK_MASK |
266 IMG_I2S_OUT_CTL_ACTIVE_CHAN_MASK;
267
268 img_i2s_out_disable(i2s);
269
270 reg = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL);
271 reg = (reg & ~control_mask) | control_set;
272 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
273
274 for (i = 0; i < i2s_channels; i++)
275 img_i2s_out_ch_enable(i2s, i);
276
277 for (; i < i2s->max_i2s_chan; i++)
278 img_i2s_out_ch_disable(i2s, i);
279
280 img_i2s_out_enable(i2s);
281
282 i2s->active_channels = i2s_channels;
283
284 return 0;
285}
286
287static int img_i2s_out_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
288{
289 struct img_i2s_out *i2s = snd_soc_dai_get_drvdata(dai);
290 int i;
291 bool force_clk_active;
292 u32 chan_control_mask, control_mask, chan_control_set = 0;
293 u32 reg, control_set = 0;
294
295 force_clk_active = ((fmt & SND_SOC_DAIFMT_CLOCK_MASK) ==
296 SND_SOC_DAIFMT_CONT);
297
298 if (force_clk_active)
299 control_set |= IMG_I2S_OUT_CTL_CLK_EN_MASK;
300
301 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
302 case SND_SOC_DAIFMT_CBM_CFM:
303 break;
304 case SND_SOC_DAIFMT_CBS_CFS:
305 control_set |= IMG_I2S_OUT_CTL_MASTER_MASK;
306 break;
307 default:
308 return -EINVAL;
309 }
310
311 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
312 case SND_SOC_DAIFMT_NB_NF:
313 control_set |= IMG_I2S_OUT_CTL_BCLK_POL_MASK;
314 break;
315 case SND_SOC_DAIFMT_NB_IF:
316 control_set |= IMG_I2S_OUT_CTL_BCLK_POL_MASK;
317 control_set |= IMG_I2S_OUT_CTL_FRM_CLK_POL_MASK;
318 break;
319 case SND_SOC_DAIFMT_IB_NF:
320 break;
321 case SND_SOC_DAIFMT_IB_IF:
322 control_set |= IMG_I2S_OUT_CTL_FRM_CLK_POL_MASK;
323 break;
324 default:
325 return -EINVAL;
326 }
327
328 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
329 case SND_SOC_DAIFMT_I2S:
330 chan_control_set |= IMG_I2S_OUT_CHAN_CTL_CLKT_MASK;
331 break;
332 case SND_SOC_DAIFMT_LEFT_J:
333 break;
334 default:
335 return -EINVAL;
336 }
337
338 control_mask = IMG_I2S_OUT_CTL_CLK_EN_MASK |
339 IMG_I2S_OUT_CTL_MASTER_MASK |
340 IMG_I2S_OUT_CTL_BCLK_POL_MASK |
341 IMG_I2S_OUT_CTL_FRM_CLK_POL_MASK;
342
343 chan_control_mask = IMG_I2S_OUT_CHAN_CTL_CLKT_MASK;
344
345 img_i2s_out_disable(i2s);
346
347 reg = img_i2s_out_readl(i2s, IMG_I2S_OUT_CTL);
348 reg = (reg & ~control_mask) | control_set;
349 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
350
351 for (i = 0; i < i2s->active_channels; i++)
352 img_i2s_out_ch_disable(i2s, i);
353
354 for (i = 0; i < i2s->max_i2s_chan; i++) {
355 reg = img_i2s_out_ch_readl(i2s, i, IMG_I2S_OUT_CH_CTL);
356 reg = (reg & ~chan_control_mask) | chan_control_set;
357 img_i2s_out_ch_writel(i2s, i, reg, IMG_I2S_OUT_CH_CTL);
358 }
359
360 for (i = 0; i < i2s->active_channels; i++)
361 img_i2s_out_ch_enable(i2s, i);
362
363 img_i2s_out_enable(i2s);
364
365 i2s->force_clk_active = force_clk_active;
366
367 return 0;
368}
369
370static const struct snd_soc_dai_ops img_i2s_out_dai_ops = {
371 .trigger = img_i2s_out_trigger,
372 .hw_params = img_i2s_out_hw_params,
373 .set_fmt = img_i2s_out_set_fmt
374};
375
376static int img_i2s_out_dai_probe(struct snd_soc_dai *dai)
377{
378 struct img_i2s_out *i2s = snd_soc_dai_get_drvdata(dai);
379
380 snd_soc_dai_init_dma_data(dai, &i2s->dma_data, NULL);
381
382 return 0;
383}
384
385static const struct snd_soc_component_driver img_i2s_out_component = {
386 .name = "img-i2s-out"
387};
388
389static int img_i2s_out_dma_prepare_slave_config(struct snd_pcm_substream *st,
390 struct snd_pcm_hw_params *params, struct dma_slave_config *sc)
391{
392 unsigned int i2s_channels = params_channels(params) / 2;
393 struct snd_soc_pcm_runtime *rtd = st->private_data;
394 struct snd_dmaengine_dai_dma_data *dma_data;
395 int ret;
396
397 dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, st);
398
399 ret = snd_hwparams_to_dma_slave_config(st, params, sc);
400 if (ret)
401 return ret;
402
403 sc->dst_addr = dma_data->addr;
404 sc->dst_addr_width = dma_data->addr_width;
405 sc->dst_maxburst = 4 * i2s_channels;
406
407 return 0;
408}
409
410static const struct snd_dmaengine_pcm_config img_i2s_out_dma_config = {
411 .prepare_slave_config = img_i2s_out_dma_prepare_slave_config
412};
413
414static int img_i2s_out_probe(struct platform_device *pdev)
415{
416 struct img_i2s_out *i2s;
417 struct resource *res;
418 void __iomem *base;
419 int i, ret;
420 unsigned int max_i2s_chan_pow_2;
421 u32 reg;
422 struct device *dev = &pdev->dev;
423
424 i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL);
425 if (!i2s)
426 return -ENOMEM;
427
428 platform_set_drvdata(pdev, i2s);
429
430 i2s->dev = &pdev->dev;
431
432 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
433 base = devm_ioremap_resource(&pdev->dev, res);
434 if (IS_ERR(base))
435 return PTR_ERR(base);
436
437 i2s->base = base;
438
439 if (of_property_read_u32(pdev->dev.of_node, "img,i2s-channels",
440 &i2s->max_i2s_chan)) {
441 dev_err(&pdev->dev, "No img,i2s-channels property\n");
442 return -EINVAL;
443 }
444
445 max_i2s_chan_pow_2 = 1 << get_count_order(i2s->max_i2s_chan);
446
447 i2s->channel_base = base + (max_i2s_chan_pow_2 * 0x20);
448
449 i2s->rst = devm_reset_control_get(&pdev->dev, "rst");
450 if (IS_ERR(i2s->rst)) {
451 if (PTR_ERR(i2s->rst) != -EPROBE_DEFER)
452 dev_err(&pdev->dev, "No top level reset found\n");
453 return PTR_ERR(i2s->rst);
454 }
455
456 i2s->clk_sys = devm_clk_get(&pdev->dev, "sys");
457 if (IS_ERR(i2s->clk_sys)) {
458 if (PTR_ERR(i2s->clk_sys) != -EPROBE_DEFER)
459 dev_err(dev, "Failed to acquire clock 'sys'\n");
460 return PTR_ERR(i2s->clk_sys);
461 }
462
463 i2s->clk_ref = devm_clk_get(&pdev->dev, "ref");
464 if (IS_ERR(i2s->clk_ref)) {
465 if (PTR_ERR(i2s->clk_ref) != -EPROBE_DEFER)
466 dev_err(dev, "Failed to acquire clock 'ref'\n");
467 return PTR_ERR(i2s->clk_ref);
468 }
469
470 ret = clk_prepare_enable(i2s->clk_sys);
471 if (ret)
472 return ret;
473
474 reg = IMG_I2S_OUT_CTL_FRM_SIZE_MASK;
475 img_i2s_out_writel(i2s, reg, IMG_I2S_OUT_CTL);
476
477 reg = IMG_I2S_OUT_CHAN_CTL_JUST_MASK |
478 IMG_I2S_OUT_CHAN_CTL_LT_MASK |
479 IMG_I2S_OUT_CHAN_CTL_CH_MASK |
480 (8 << IMG_I2S_OUT_CHAN_CTL_FMT_SHIFT);
481
482 for (i = 0; i < i2s->max_i2s_chan; i++)
483 img_i2s_out_ch_writel(i2s, i, reg, IMG_I2S_OUT_CH_CTL);
484
485 img_i2s_out_reset(i2s);
486
487 pm_runtime_enable(&pdev->dev);
488 if (!pm_runtime_enabled(&pdev->dev)) {
489 ret = img_i2s_out_resume(&pdev->dev);
490 if (ret)
491 goto err_pm_disable;
492 }
493
494 i2s->active_channels = 1;
495 i2s->dma_data.addr = res->start + IMG_I2S_OUT_TX_FIFO;
496 i2s->dma_data.addr_width = 4;
497 i2s->dma_data.maxburst = 4;
498
499 i2s->dai_driver.probe = img_i2s_out_dai_probe;
500 i2s->dai_driver.playback.channels_min = 2;
501 i2s->dai_driver.playback.channels_max = i2s->max_i2s_chan * 2;
502 i2s->dai_driver.playback.rates = SNDRV_PCM_RATE_8000_192000;
503 i2s->dai_driver.playback.formats = SNDRV_PCM_FMTBIT_S32_LE;
504 i2s->dai_driver.ops = &img_i2s_out_dai_ops;
505
506 ret = devm_snd_soc_register_component(&pdev->dev,
507 &img_i2s_out_component, &i2s->dai_driver, 1);
508 if (ret)
509 goto err_suspend;
510
511 ret = devm_snd_dmaengine_pcm_register(&pdev->dev,
512 &img_i2s_out_dma_config, 0);
513 if (ret)
514 goto err_suspend;
515
516 return 0;
517
518err_suspend:
519 if (!pm_runtime_status_suspended(&pdev->dev))
520 img_i2s_out_suspend(&pdev->dev);
521err_pm_disable:
522 pm_runtime_disable(&pdev->dev);
523 clk_disable_unprepare(i2s->clk_sys);
524
525 return ret;
526}
527
528static int img_i2s_out_dev_remove(struct platform_device *pdev)
529{
530 struct img_i2s_out *i2s = platform_get_drvdata(pdev);
531
532 pm_runtime_disable(&pdev->dev);
533 if (!pm_runtime_status_suspended(&pdev->dev))
534 img_i2s_out_suspend(&pdev->dev);
535
536 clk_disable_unprepare(i2s->clk_sys);
537
538 return 0;
539}
540
541static const struct of_device_id img_i2s_out_of_match[] = {
542 { .compatible = "img,i2s-out" },
543 {}
544};
545MODULE_DEVICE_TABLE(of, img_i2s_out_of_match);
546
547static const struct dev_pm_ops img_i2s_out_pm_ops = {
548 SET_RUNTIME_PM_OPS(img_i2s_out_suspend,
549 img_i2s_out_resume, NULL)
550};
551
552static struct platform_driver img_i2s_out_driver = {
553 .driver = {
554 .name = "img-i2s-out",
555 .of_match_table = img_i2s_out_of_match,
556 .pm = &img_i2s_out_pm_ops
557 },
558 .probe = img_i2s_out_probe,
559 .remove = img_i2s_out_dev_remove
560};
561module_platform_driver(img_i2s_out_driver);
562
563MODULE_AUTHOR("Damien Horsley <Damien.Horsley@imgtec.com>");
564MODULE_DESCRIPTION("IMG I2S Output Driver");
565MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/img/img-parallel-out.c b/sound/soc/img/img-parallel-out.c
new file mode 100644
index 000000000000..c1610a054d65
--- /dev/null
+++ b/sound/soc/img/img-parallel-out.c
@@ -0,0 +1,327 @@
1/*
2 * IMG parallel output controller driver
3 *
4 * Copyright (C) 2015 Imagination Technologies Ltd.
5 *
6 * Author: Damien Horsley <Damien.Horsley@imgtec.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
11 */
12
13#include <linux/clk.h>
14#include <linux/init.h>
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/of.h>
18#include <linux/platform_device.h>
19#include <linux/pm_runtime.h>
20#include <linux/reset.h>
21
22#include <sound/core.h>
23#include <sound/dmaengine_pcm.h>
24#include <sound/initval.h>
25#include <sound/pcm.h>
26#include <sound/pcm_params.h>
27#include <sound/soc.h>
28
29#define IMG_PRL_OUT_TX_FIFO 0
30
31#define IMG_PRL_OUT_CTL 0x4
32#define IMG_PRL_OUT_CTL_CH_MASK BIT(4)
33#define IMG_PRL_OUT_CTL_PACKH_MASK BIT(3)
34#define IMG_PRL_OUT_CTL_EDGE_MASK BIT(2)
35#define IMG_PRL_OUT_CTL_ME_MASK BIT(1)
36#define IMG_PRL_OUT_CTL_SRST_MASK BIT(0)
37
38struct img_prl_out {
39 void __iomem *base;
40 struct clk *clk_sys;
41 struct clk *clk_ref;
42 struct snd_dmaengine_dai_dma_data dma_data;
43 struct device *dev;
44 struct reset_control *rst;
45};
46
47static int img_prl_out_suspend(struct device *dev)
48{
49 struct img_prl_out *prl = dev_get_drvdata(dev);
50
51 clk_disable_unprepare(prl->clk_ref);
52
53 return 0;
54}
55
56static int img_prl_out_resume(struct device *dev)
57{
58 struct img_prl_out *prl = dev_get_drvdata(dev);
59 int ret;
60
61 ret = clk_prepare_enable(prl->clk_ref);
62 if (ret) {
63 dev_err(dev, "clk_enable failed: %d\n", ret);
64 return ret;
65 }
66
67 return 0;
68}
69
70static inline void img_prl_out_writel(struct img_prl_out *prl,
71 u32 val, u32 reg)
72{
73 writel(val, prl->base + reg);
74}
75
76static inline u32 img_prl_out_readl(struct img_prl_out *prl, u32 reg)
77{
78 return readl(prl->base + reg);
79}
80
81static void img_prl_out_reset(struct img_prl_out *prl)
82{
83 u32 ctl;
84
85 ctl = img_prl_out_readl(prl, IMG_PRL_OUT_CTL) &
86 ~IMG_PRL_OUT_CTL_ME_MASK;
87
88 reset_control_assert(prl->rst);
89 reset_control_deassert(prl->rst);
90
91 img_prl_out_writel(prl, ctl, IMG_PRL_OUT_CTL);
92}
93
94static int img_prl_out_trigger(struct snd_pcm_substream *substream, int cmd,
95 struct snd_soc_dai *dai)
96{
97 struct img_prl_out *prl = snd_soc_dai_get_drvdata(dai);
98 u32 reg;
99
100 switch (cmd) {
101 case SNDRV_PCM_TRIGGER_START:
102 case SNDRV_PCM_TRIGGER_RESUME:
103 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
104 reg = img_prl_out_readl(prl, IMG_PRL_OUT_CTL);
105 reg |= IMG_PRL_OUT_CTL_ME_MASK;
106 img_prl_out_writel(prl, reg, IMG_PRL_OUT_CTL);
107 break;
108 case SNDRV_PCM_TRIGGER_STOP:
109 case SNDRV_PCM_TRIGGER_SUSPEND:
110 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
111 img_prl_out_reset(prl);
112 break;
113 default:
114 return -EINVAL;
115 }
116
117 return 0;
118}
119
120static int img_prl_out_hw_params(struct snd_pcm_substream *substream,
121 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
122{
123 struct img_prl_out *prl = snd_soc_dai_get_drvdata(dai);
124 unsigned int rate, channels;
125 u32 reg, control_set = 0;
126 snd_pcm_format_t format;
127
128 rate = params_rate(params);
129 format = params_format(params);
130 channels = params_channels(params);
131
132 switch (params_format(params)) {
133 case SNDRV_PCM_FORMAT_S32_LE:
134 control_set |= IMG_PRL_OUT_CTL_PACKH_MASK;
135 break;
136 case SNDRV_PCM_FORMAT_S24_LE:
137 break;
138 default:
139 return -EINVAL;
140 }
141
142 if (channels != 2)
143 return -EINVAL;
144
145 clk_set_rate(prl->clk_ref, rate * 256);
146
147 reg = img_prl_out_readl(prl, IMG_PRL_OUT_CTL);
148 reg = (reg & ~IMG_PRL_OUT_CTL_PACKH_MASK) | control_set;
149 img_prl_out_writel(prl, reg, IMG_PRL_OUT_CTL);
150
151 return 0;
152}
153
154static int img_prl_out_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
155{
156 struct img_prl_out *prl = snd_soc_dai_get_drvdata(dai);
157 u32 reg, control_set = 0;
158
159 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
160 case SND_SOC_DAIFMT_NB_NF:
161 break;
162 case SND_SOC_DAIFMT_NB_IF:
163 control_set |= IMG_PRL_OUT_CTL_EDGE_MASK;
164 break;
165 default:
166 return -EINVAL;
167 }
168
169 reg = img_prl_out_readl(prl, IMG_PRL_OUT_CTL);
170 reg = (reg & ~IMG_PRL_OUT_CTL_EDGE_MASK) | control_set;
171 img_prl_out_writel(prl, reg, IMG_PRL_OUT_CTL);
172
173 return 0;
174}
175
176static const struct snd_soc_dai_ops img_prl_out_dai_ops = {
177 .trigger = img_prl_out_trigger,
178 .hw_params = img_prl_out_hw_params,
179 .set_fmt = img_prl_out_set_fmt
180};
181
182static int img_prl_out_dai_probe(struct snd_soc_dai *dai)
183{
184 struct img_prl_out *prl = snd_soc_dai_get_drvdata(dai);
185
186 snd_soc_dai_init_dma_data(dai, &prl->dma_data, NULL);
187
188 return 0;
189}
190
191static struct snd_soc_dai_driver img_prl_out_dai = {
192 .probe = img_prl_out_dai_probe,
193 .playback = {
194 .channels_min = 2,
195 .channels_max = 2,
196 .rates = SNDRV_PCM_RATE_8000_192000,
197 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE
198 },
199 .ops = &img_prl_out_dai_ops
200};
201
202static const struct snd_soc_component_driver img_prl_out_component = {
203 .name = "img-prl-out"
204};
205
206static int img_prl_out_probe(struct platform_device *pdev)
207{
208 struct img_prl_out *prl;
209 struct resource *res;
210 void __iomem *base;
211 int ret;
212 struct device *dev = &pdev->dev;
213
214 prl = devm_kzalloc(&pdev->dev, sizeof(*prl), GFP_KERNEL);
215 if (!prl)
216 return -ENOMEM;
217
218 platform_set_drvdata(pdev, prl);
219
220 prl->dev = &pdev->dev;
221
222 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
223 base = devm_ioremap_resource(&pdev->dev, res);
224 if (IS_ERR(base))
225 return PTR_ERR(base);
226
227 prl->base = base;
228
229 prl->rst = devm_reset_control_get(&pdev->dev, "rst");
230 if (IS_ERR(prl->rst)) {
231 if (PTR_ERR(prl->rst) != -EPROBE_DEFER)
232 dev_err(&pdev->dev, "No top level reset found\n");
233 return PTR_ERR(prl->rst);
234 }
235
236 prl->clk_sys = devm_clk_get(&pdev->dev, "sys");
237 if (IS_ERR(prl->clk_sys)) {
238 if (PTR_ERR(prl->clk_sys) != -EPROBE_DEFER)
239 dev_err(dev, "Failed to acquire clock 'sys'\n");
240 return PTR_ERR(prl->clk_sys);
241 }
242
243 prl->clk_ref = devm_clk_get(&pdev->dev, "ref");
244 if (IS_ERR(prl->clk_ref)) {
245 if (PTR_ERR(prl->clk_ref) != -EPROBE_DEFER)
246 dev_err(dev, "Failed to acquire clock 'ref'\n");
247 return PTR_ERR(prl->clk_ref);
248 }
249
250 ret = clk_prepare_enable(prl->clk_sys);
251 if (ret)
252 return ret;
253
254 img_prl_out_writel(prl, IMG_PRL_OUT_CTL_EDGE_MASK, IMG_PRL_OUT_CTL);
255 img_prl_out_reset(prl);
256
257 pm_runtime_enable(&pdev->dev);
258 if (!pm_runtime_enabled(&pdev->dev)) {
259 ret = img_prl_out_resume(&pdev->dev);
260 if (ret)
261 goto err_pm_disable;
262 }
263
264 prl->dma_data.addr = res->start + IMG_PRL_OUT_TX_FIFO;
265 prl->dma_data.addr_width = 4;
266 prl->dma_data.maxburst = 4;
267
268 ret = devm_snd_soc_register_component(&pdev->dev,
269 &img_prl_out_component,
270 &img_prl_out_dai, 1);
271 if (ret)
272 goto err_suspend;
273
274 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
275 if (ret)
276 goto err_suspend;
277
278 return 0;
279
280err_suspend:
281 if (!pm_runtime_status_suspended(&pdev->dev))
282 img_prl_out_suspend(&pdev->dev);
283err_pm_disable:
284 pm_runtime_disable(&pdev->dev);
285 clk_disable_unprepare(prl->clk_sys);
286
287 return ret;
288}
289
290static int img_prl_out_dev_remove(struct platform_device *pdev)
291{
292 struct img_prl_out *prl = platform_get_drvdata(pdev);
293
294 pm_runtime_disable(&pdev->dev);
295 if (!pm_runtime_status_suspended(&pdev->dev))
296 img_prl_out_suspend(&pdev->dev);
297
298 clk_disable_unprepare(prl->clk_sys);
299
300 return 0;
301}
302
303static const struct of_device_id img_prl_out_of_match[] = {
304 { .compatible = "img,parallel-out" },
305 {}
306};
307MODULE_DEVICE_TABLE(of, img_prl_out_of_match);
308
309static const struct dev_pm_ops img_prl_out_pm_ops = {
310 SET_RUNTIME_PM_OPS(img_prl_out_suspend,
311 img_prl_out_resume, NULL)
312};
313
314static struct platform_driver img_prl_out_driver = {
315 .driver = {
316 .name = "img-parallel-out",
317 .of_match_table = img_prl_out_of_match,
318 .pm = &img_prl_out_pm_ops
319 },
320 .probe = img_prl_out_probe,
321 .remove = img_prl_out_dev_remove
322};
323module_platform_driver(img_prl_out_driver);
324
325MODULE_AUTHOR("Damien Horsley <Damien.Horsley@imgtec.com>");
326MODULE_DESCRIPTION("IMG Parallel Output Driver");
327MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/img/img-spdif-in.c b/sound/soc/img/img-spdif-in.c
new file mode 100644
index 000000000000..4d9953d318af
--- /dev/null
+++ b/sound/soc/img/img-spdif-in.c
@@ -0,0 +1,806 @@
1/*
2 * IMG SPDIF input controller driver
3 *
4 * Copyright (C) 2015 Imagination Technologies Ltd.
5 *
6 * Author: Damien Horsley <Damien.Horsley@imgtec.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
11 */
12
13#include <linux/clk.h>
14#include <linux/init.h>
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/of.h>
18#include <linux/platform_device.h>
19#include <linux/reset.h>
20
21#include <sound/core.h>
22#include <sound/dmaengine_pcm.h>
23#include <sound/initval.h>
24#include <sound/pcm.h>
25#include <sound/pcm_params.h>
26#include <sound/soc.h>
27
28#define IMG_SPDIF_IN_RX_FIFO_OFFSET 0
29
30#define IMG_SPDIF_IN_CTL 0x4
31#define IMG_SPDIF_IN_CTL_LOCKLO_MASK 0xff
32#define IMG_SPDIF_IN_CTL_LOCKLO_SHIFT 0
33#define IMG_SPDIF_IN_CTL_LOCKHI_MASK 0xff00
34#define IMG_SPDIF_IN_CTL_LOCKHI_SHIFT 8
35#define IMG_SPDIF_IN_CTL_TRK_MASK 0xff0000
36#define IMG_SPDIF_IN_CTL_TRK_SHIFT 16
37#define IMG_SPDIF_IN_CTL_SRD_MASK 0x70000000
38#define IMG_SPDIF_IN_CTL_SRD_SHIFT 28
39#define IMG_SPDIF_IN_CTL_SRT_MASK BIT(31)
40
41#define IMG_SPDIF_IN_STATUS 0x8
42#define IMG_SPDIF_IN_STATUS_SAM_MASK 0x7000
43#define IMG_SPDIF_IN_STATUS_SAM_SHIFT 12
44#define IMG_SPDIF_IN_STATUS_LOCK_MASK BIT(15)
45#define IMG_SPDIF_IN_STATUS_LOCK_SHIFT 15
46
47#define IMG_SPDIF_IN_CLKGEN 0x1c
48#define IMG_SPDIF_IN_CLKGEN_NOM_MASK 0x3ff
49#define IMG_SPDIF_IN_CLKGEN_NOM_SHIFT 0
50#define IMG_SPDIF_IN_CLKGEN_HLD_MASK 0x3ff0000
51#define IMG_SPDIF_IN_CLKGEN_HLD_SHIFT 16
52
53#define IMG_SPDIF_IN_CSL 0x20
54
55#define IMG_SPDIF_IN_CSH 0x24
56#define IMG_SPDIF_IN_CSH_MASK 0xff
57#define IMG_SPDIF_IN_CSH_SHIFT 0
58
59#define IMG_SPDIF_IN_SOFT_RESET 0x28
60#define IMG_SPDIF_IN_SOFT_RESET_MASK BIT(0)
61
62#define IMG_SPDIF_IN_ACLKGEN_START 0x2c
63#define IMG_SPDIF_IN_ACLKGEN_NOM_MASK 0x3ff
64#define IMG_SPDIF_IN_ACLKGEN_NOM_SHIFT 0
65#define IMG_SPDIF_IN_ACLKGEN_HLD_MASK 0xffc00
66#define IMG_SPDIF_IN_ACLKGEN_HLD_SHIFT 10
67#define IMG_SPDIF_IN_ACLKGEN_TRK_MASK 0xff00000
68#define IMG_SPDIF_IN_ACLKGEN_TRK_SHIFT 20
69
70#define IMG_SPDIF_IN_NUM_ACLKGEN 4
71
72struct img_spdif_in {
73 spinlock_t lock;
74 void __iomem *base;
75 struct clk *clk_sys;
76 struct snd_dmaengine_dai_dma_data dma_data;
77 struct device *dev;
78 unsigned int trk;
79 bool multi_freq;
80 int lock_acquire;
81 int lock_release;
82 unsigned int single_freq;
83 unsigned int multi_freqs[IMG_SPDIF_IN_NUM_ACLKGEN];
84 bool active;
85
86 /* Write-only registers */
87 unsigned int aclkgen_regs[IMG_SPDIF_IN_NUM_ACLKGEN];
88};
89
90static inline void img_spdif_in_writel(struct img_spdif_in *spdif,
91 u32 val, u32 reg)
92{
93 writel(val, spdif->base + reg);
94}
95
96static inline u32 img_spdif_in_readl(struct img_spdif_in *spdif, u32 reg)
97{
98 return readl(spdif->base + reg);
99}
100
101static inline void img_spdif_in_aclkgen_writel(struct img_spdif_in *spdif,
102 u32 index)
103{
104 img_spdif_in_writel(spdif, spdif->aclkgen_regs[index],
105 IMG_SPDIF_IN_ACLKGEN_START + (index * 0x4));
106}
107
108static int img_spdif_in_check_max_rate(struct img_spdif_in *spdif,
109 unsigned int sample_rate, unsigned long *actual_freq)
110{
111 unsigned long min_freq, freq_t;
112
113 /* Clock rate must be at least 24x the bit rate */
114 min_freq = sample_rate * 2 * 32 * 24;
115
116 freq_t = clk_get_rate(spdif->clk_sys);
117
118 if (freq_t < min_freq)
119 return -EINVAL;
120
121 *actual_freq = freq_t;
122
123 return 0;
124}
125
126static int img_spdif_in_do_clkgen_calc(unsigned int rate, unsigned int *pnom,
127 unsigned int *phld, unsigned long clk_rate)
128{
129 unsigned int ori, nom, hld;
130
131 /*
132 * Calculate oversampling ratio, nominal phase increment and hold
133 * increment for the given rate / frequency
134 */
135
136 if (!rate)
137 return -EINVAL;
138
139 ori = clk_rate / (rate * 64);
140
141 if (!ori)
142 return -EINVAL;
143
144 nom = (4096 / ori) + 1;
145 do
146 hld = 4096 - (--nom * (ori - 1));
147 while (hld < 120);
148
149 *pnom = nom;
150 *phld = hld;
151
152 return 0;
153}
154
155static int img_spdif_in_do_clkgen_single(struct img_spdif_in *spdif,
156 unsigned int rate)
157{
158 unsigned int nom, hld;
159 unsigned long flags, clk_rate;
160 int ret = 0;
161 u32 reg;
162
163 ret = img_spdif_in_check_max_rate(spdif, rate, &clk_rate);
164 if (ret)
165 return ret;
166
167 ret = img_spdif_in_do_clkgen_calc(rate, &nom, &hld, clk_rate);
168 if (ret)
169 return ret;
170
171 reg = (nom << IMG_SPDIF_IN_CLKGEN_NOM_SHIFT) &
172 IMG_SPDIF_IN_CLKGEN_NOM_MASK;
173 reg |= (hld << IMG_SPDIF_IN_CLKGEN_HLD_SHIFT) &
174 IMG_SPDIF_IN_CLKGEN_HLD_MASK;
175
176 spin_lock_irqsave(&spdif->lock, flags);
177
178 if (spdif->active) {
179 spin_unlock_irqrestore(&spdif->lock, flags);
180 return -EBUSY;
181 }
182
183 img_spdif_in_writel(spdif, reg, IMG_SPDIF_IN_CLKGEN);
184
185 spdif->single_freq = rate;
186
187 spin_unlock_irqrestore(&spdif->lock, flags);
188
189 return 0;
190}
191
192static int img_spdif_in_do_clkgen_multi(struct img_spdif_in *spdif,
193 unsigned int multi_freqs[])
194{
195 unsigned int nom, hld, rate, max_rate = 0;
196 unsigned long flags, clk_rate;
197 int i, ret = 0;
198 u32 reg, trk_reg, temp_regs[IMG_SPDIF_IN_NUM_ACLKGEN];
199
200 for (i = 0; i < IMG_SPDIF_IN_NUM_ACLKGEN; i++)
201 if (multi_freqs[i] > max_rate)
202 max_rate = multi_freqs[i];
203
204 ret = img_spdif_in_check_max_rate(spdif, max_rate, &clk_rate);
205 if (ret)
206 return ret;
207
208 for (i = 0; i < IMG_SPDIF_IN_NUM_ACLKGEN; i++) {
209 rate = multi_freqs[i];
210
211 ret = img_spdif_in_do_clkgen_calc(rate, &nom, &hld, clk_rate);
212 if (ret)
213 return ret;
214
215 reg = (nom << IMG_SPDIF_IN_ACLKGEN_NOM_SHIFT) &
216 IMG_SPDIF_IN_ACLKGEN_NOM_MASK;
217 reg |= (hld << IMG_SPDIF_IN_ACLKGEN_HLD_SHIFT) &
218 IMG_SPDIF_IN_ACLKGEN_HLD_MASK;
219 temp_regs[i] = reg;
220 }
221
222 spin_lock_irqsave(&spdif->lock, flags);
223
224 if (spdif->active) {
225 spin_unlock_irqrestore(&spdif->lock, flags);
226 return -EBUSY;
227 }
228
229 trk_reg = spdif->trk << IMG_SPDIF_IN_ACLKGEN_TRK_SHIFT;
230
231 for (i = 0; i < IMG_SPDIF_IN_NUM_ACLKGEN; i++) {
232 spdif->aclkgen_regs[i] = temp_regs[i] | trk_reg;
233 img_spdif_in_aclkgen_writel(spdif, i);
234 }
235
236 spdif->multi_freq = true;
237 spdif->multi_freqs[0] = multi_freqs[0];
238 spdif->multi_freqs[1] = multi_freqs[1];
239 spdif->multi_freqs[2] = multi_freqs[2];
240 spdif->multi_freqs[3] = multi_freqs[3];
241
242 spin_unlock_irqrestore(&spdif->lock, flags);
243
244 return 0;
245}
246
247static int img_spdif_in_iec958_info(struct snd_kcontrol *kcontrol,
248 struct snd_ctl_elem_info *uinfo)
249{
250 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
251 uinfo->count = 1;
252
253 return 0;
254}
255
256static int img_spdif_in_get_status_mask(struct snd_kcontrol *kcontrol,
257 struct snd_ctl_elem_value *ucontrol)
258{
259 ucontrol->value.iec958.status[0] = 0xff;
260 ucontrol->value.iec958.status[1] = 0xff;
261 ucontrol->value.iec958.status[2] = 0xff;
262 ucontrol->value.iec958.status[3] = 0xff;
263 ucontrol->value.iec958.status[4] = 0xff;
264
265 return 0;
266}
267
268static int img_spdif_in_get_status(struct snd_kcontrol *kcontrol,
269 struct snd_ctl_elem_value *ucontrol)
270{
271 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
272 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(cpu_dai);
273 u32 reg;
274
275 reg = img_spdif_in_readl(spdif, IMG_SPDIF_IN_CSL);
276 ucontrol->value.iec958.status[0] = reg & 0xff;
277 ucontrol->value.iec958.status[1] = (reg >> 8) & 0xff;
278 ucontrol->value.iec958.status[2] = (reg >> 16) & 0xff;
279 ucontrol->value.iec958.status[3] = (reg >> 24) & 0xff;
280 reg = img_spdif_in_readl(spdif, IMG_SPDIF_IN_CSH);
281 ucontrol->value.iec958.status[4] = (reg & IMG_SPDIF_IN_CSH_MASK)
282 >> IMG_SPDIF_IN_CSH_SHIFT;
283
284 return 0;
285}
286
287static int img_spdif_in_info_multi_freq(struct snd_kcontrol *kcontrol,
288 struct snd_ctl_elem_info *uinfo)
289{
290 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
291 uinfo->count = IMG_SPDIF_IN_NUM_ACLKGEN;
292 uinfo->value.integer.min = 0;
293 uinfo->value.integer.max = LONG_MAX;
294
295 return 0;
296}
297
298static int img_spdif_in_get_multi_freq(struct snd_kcontrol *kcontrol,
299 struct snd_ctl_elem_value *ucontrol)
300{
301 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
302 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(cpu_dai);
303 unsigned long flags;
304
305 spin_lock_irqsave(&spdif->lock, flags);
306 if (spdif->multi_freq) {
307 ucontrol->value.integer.value[0] = spdif->multi_freqs[0];
308 ucontrol->value.integer.value[1] = spdif->multi_freqs[1];
309 ucontrol->value.integer.value[2] = spdif->multi_freqs[2];
310 ucontrol->value.integer.value[3] = spdif->multi_freqs[3];
311 } else {
312 ucontrol->value.integer.value[0] = 0;
313 ucontrol->value.integer.value[1] = 0;
314 ucontrol->value.integer.value[2] = 0;
315 ucontrol->value.integer.value[3] = 0;
316 }
317 spin_unlock_irqrestore(&spdif->lock, flags);
318
319 return 0;
320}
321
322static int img_spdif_in_set_multi_freq(struct snd_kcontrol *kcontrol,
323 struct snd_ctl_elem_value *ucontrol)
324{
325 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
326 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(cpu_dai);
327 unsigned int multi_freqs[IMG_SPDIF_IN_NUM_ACLKGEN];
328 bool multi_freq;
329 unsigned long flags;
330
331 if ((ucontrol->value.integer.value[0] == 0) &&
332 (ucontrol->value.integer.value[1] == 0) &&
333 (ucontrol->value.integer.value[2] == 0) &&
334 (ucontrol->value.integer.value[3] == 0)) {
335 multi_freq = false;
336 } else {
337 multi_freqs[0] = ucontrol->value.integer.value[0];
338 multi_freqs[1] = ucontrol->value.integer.value[1];
339 multi_freqs[2] = ucontrol->value.integer.value[2];
340 multi_freqs[3] = ucontrol->value.integer.value[3];
341 multi_freq = true;
342 }
343
344 if (multi_freq)
345 return img_spdif_in_do_clkgen_multi(spdif, multi_freqs);
346
347 spin_lock_irqsave(&spdif->lock, flags);
348
349 if (spdif->active) {
350 spin_unlock_irqrestore(&spdif->lock, flags);
351 return -EBUSY;
352 }
353
354 spdif->multi_freq = false;
355
356 spin_unlock_irqrestore(&spdif->lock, flags);
357
358 return 0;
359}
360
361static int img_spdif_in_info_lock_freq(struct snd_kcontrol *kcontrol,
362 struct snd_ctl_elem_info *uinfo)
363{
364 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
365 uinfo->count = 1;
366 uinfo->value.integer.min = 0;
367 uinfo->value.integer.max = LONG_MAX;
368
369 return 0;
370}
371
372static int img_spdif_in_get_lock_freq(struct snd_kcontrol *kcontrol,
373 struct snd_ctl_elem_value *uc)
374{
375 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
376 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(cpu_dai);
377 u32 reg;
378 int i;
379 unsigned long flags;
380
381 spin_lock_irqsave(&spdif->lock, flags);
382
383 reg = img_spdif_in_readl(spdif, IMG_SPDIF_IN_STATUS);
384 if (reg & IMG_SPDIF_IN_STATUS_LOCK_MASK) {
385 if (spdif->multi_freq) {
386 i = ((reg & IMG_SPDIF_IN_STATUS_SAM_MASK) >>
387 IMG_SPDIF_IN_STATUS_SAM_SHIFT) - 1;
388 uc->value.integer.value[0] = spdif->multi_freqs[i];
389 } else {
390 uc->value.integer.value[0] = spdif->single_freq;
391 }
392 } else {
393 uc->value.integer.value[0] = 0;
394 }
395
396 spin_unlock_irqrestore(&spdif->lock, flags);
397
398 return 0;
399}
400
401static int img_spdif_in_info_trk(struct snd_kcontrol *kcontrol,
402 struct snd_ctl_elem_info *uinfo)
403{
404 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
405 uinfo->count = 1;
406 uinfo->value.integer.min = 0;
407 uinfo->value.integer.max = 255;
408
409 return 0;
410}
411
412static int img_spdif_in_get_trk(struct snd_kcontrol *kcontrol,
413 struct snd_ctl_elem_value *ucontrol)
414{
415 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
416 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(cpu_dai);
417
418 ucontrol->value.integer.value[0] = spdif->trk;
419
420 return 0;
421}
422
423static int img_spdif_in_set_trk(struct snd_kcontrol *kcontrol,
424 struct snd_ctl_elem_value *ucontrol)
425{
426 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
427 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(cpu_dai);
428 unsigned long flags;
429 int i;
430 u32 reg;
431
432 spin_lock_irqsave(&spdif->lock, flags);
433
434 if (spdif->active) {
435 spin_unlock_irqrestore(&spdif->lock, flags);
436 return -EBUSY;
437 }
438
439 spdif->trk = ucontrol->value.integer.value[0];
440
441 reg = img_spdif_in_readl(spdif, IMG_SPDIF_IN_CTL);
442 reg &= ~IMG_SPDIF_IN_CTL_TRK_MASK;
443 reg |= spdif->trk << IMG_SPDIF_IN_CTL_TRK_SHIFT;
444 img_spdif_in_writel(spdif, reg, IMG_SPDIF_IN_CTL);
445
446 for (i = 0; i < IMG_SPDIF_IN_NUM_ACLKGEN; i++) {
447 spdif->aclkgen_regs[i] = (spdif->aclkgen_regs[i] &
448 ~IMG_SPDIF_IN_ACLKGEN_TRK_MASK) |
449 (spdif->trk << IMG_SPDIF_IN_ACLKGEN_TRK_SHIFT);
450
451 img_spdif_in_aclkgen_writel(spdif, i);
452 }
453
454 spin_unlock_irqrestore(&spdif->lock, flags);
455
456 return 0;
457}
458
459static int img_spdif_in_info_lock(struct snd_kcontrol *kcontrol,
460 struct snd_ctl_elem_info *uinfo)
461{
462 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
463 uinfo->count = 1;
464 uinfo->value.integer.min = -128;
465 uinfo->value.integer.max = 127;
466
467 return 0;
468}
469
470static int img_spdif_in_get_lock_acquire(struct snd_kcontrol *kcontrol,
471 struct snd_ctl_elem_value *ucontrol)
472{
473 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
474 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(cpu_dai);
475
476 ucontrol->value.integer.value[0] = spdif->lock_acquire;
477
478 return 0;
479}
480
481static int img_spdif_in_set_lock_acquire(struct snd_kcontrol *kcontrol,
482 struct snd_ctl_elem_value *ucontrol)
483{
484 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
485 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(cpu_dai);
486 unsigned long flags;
487 u32 reg;
488
489 spin_lock_irqsave(&spdif->lock, flags);
490
491 if (spdif->active) {
492 spin_unlock_irqrestore(&spdif->lock, flags);
493 return -EBUSY;
494 }
495
496 spdif->lock_acquire = ucontrol->value.integer.value[0];
497
498 reg = img_spdif_in_readl(spdif, IMG_SPDIF_IN_CTL);
499 reg &= ~IMG_SPDIF_IN_CTL_LOCKHI_MASK;
500 reg |= (spdif->lock_acquire << IMG_SPDIF_IN_CTL_LOCKHI_SHIFT) &
501 IMG_SPDIF_IN_CTL_LOCKHI_MASK;
502 img_spdif_in_writel(spdif, reg, IMG_SPDIF_IN_CTL);
503
504 spin_unlock_irqrestore(&spdif->lock, flags);
505
506 return 0;
507}
508
509static int img_spdif_in_get_lock_release(struct snd_kcontrol *kcontrol,
510 struct snd_ctl_elem_value *ucontrol)
511{
512 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
513 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(cpu_dai);
514
515 ucontrol->value.integer.value[0] = spdif->lock_release;
516
517 return 0;
518}
519
520static int img_spdif_in_set_lock_release(struct snd_kcontrol *kcontrol,
521 struct snd_ctl_elem_value *ucontrol)
522{
523 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
524 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(cpu_dai);
525 unsigned long flags;
526 u32 reg;
527
528 spin_lock_irqsave(&spdif->lock, flags);
529
530 if (spdif->active) {
531 spin_unlock_irqrestore(&spdif->lock, flags);
532 return -EBUSY;
533 }
534
535 spdif->lock_release = ucontrol->value.integer.value[0];
536
537 reg = img_spdif_in_readl(spdif, IMG_SPDIF_IN_CTL);
538 reg &= ~IMG_SPDIF_IN_CTL_LOCKLO_MASK;
539 reg |= (spdif->lock_release << IMG_SPDIF_IN_CTL_LOCKLO_SHIFT) &
540 IMG_SPDIF_IN_CTL_LOCKLO_MASK;
541 img_spdif_in_writel(spdif, reg, IMG_SPDIF_IN_CTL);
542
543 spin_unlock_irqrestore(&spdif->lock, flags);
544
545 return 0;
546}
547
548static struct snd_kcontrol_new img_spdif_in_controls[] = {
549 {
550 .access = SNDRV_CTL_ELEM_ACCESS_READ,
551 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
552 .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, MASK),
553 .info = img_spdif_in_iec958_info,
554 .get = img_spdif_in_get_status_mask
555 },
556 {
557 .access = SNDRV_CTL_ELEM_ACCESS_READ |
558 SNDRV_CTL_ELEM_ACCESS_VOLATILE,
559 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
560 .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT),
561 .info = img_spdif_in_iec958_info,
562 .get = img_spdif_in_get_status
563 },
564 {
565 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
566 .name = "SPDIF In Multi Frequency Acquire",
567 .info = img_spdif_in_info_multi_freq,
568 .get = img_spdif_in_get_multi_freq,
569 .put = img_spdif_in_set_multi_freq
570 },
571 {
572 .access = SNDRV_CTL_ELEM_ACCESS_READ |
573 SNDRV_CTL_ELEM_ACCESS_VOLATILE,
574 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
575 .name = "SPDIF In Lock Frequency",
576 .info = img_spdif_in_info_lock_freq,
577 .get = img_spdif_in_get_lock_freq
578 },
579 {
580 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
581 .name = "SPDIF In Lock TRK",
582 .info = img_spdif_in_info_trk,
583 .get = img_spdif_in_get_trk,
584 .put = img_spdif_in_set_trk
585 },
586 {
587 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
588 .name = "SPDIF In Lock Acquire Threshold",
589 .info = img_spdif_in_info_lock,
590 .get = img_spdif_in_get_lock_acquire,
591 .put = img_spdif_in_set_lock_acquire
592 },
593 {
594 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
595 .name = "SPDIF In Lock Release Threshold",
596 .info = img_spdif_in_info_lock,
597 .get = img_spdif_in_get_lock_release,
598 .put = img_spdif_in_set_lock_release
599 }
600};
601
602static int img_spdif_in_trigger(struct snd_pcm_substream *substream, int cmd,
603 struct snd_soc_dai *dai)
604{
605 unsigned long flags;
606 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(dai);
607 int ret = 0;
608 u32 reg;
609
610 spin_lock_irqsave(&spdif->lock, flags);
611
612 switch (cmd) {
613 case SNDRV_PCM_TRIGGER_START:
614 case SNDRV_PCM_TRIGGER_RESUME:
615 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
616 reg = img_spdif_in_readl(spdif, IMG_SPDIF_IN_CTL);
617 if (spdif->multi_freq)
618 reg &= ~IMG_SPDIF_IN_CTL_SRD_MASK;
619 else
620 reg |= (1UL << IMG_SPDIF_IN_CTL_SRD_SHIFT);
621 reg |= IMG_SPDIF_IN_CTL_SRT_MASK;
622 img_spdif_in_writel(spdif, reg, IMG_SPDIF_IN_CTL);
623 spdif->active = true;
624 break;
625 case SNDRV_PCM_TRIGGER_STOP:
626 case SNDRV_PCM_TRIGGER_SUSPEND:
627 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
628 reg = img_spdif_in_readl(spdif, IMG_SPDIF_IN_CTL);
629 reg &= ~IMG_SPDIF_IN_CTL_SRT_MASK;
630 img_spdif_in_writel(spdif, reg, IMG_SPDIF_IN_CTL);
631 spdif->active = false;
632 break;
633 default:
634 ret = -EINVAL;
635 }
636
637 spin_unlock_irqrestore(&spdif->lock, flags);
638
639 return ret;
640}
641
642static int img_spdif_in_hw_params(struct snd_pcm_substream *substream,
643 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
644{
645 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(dai);
646 unsigned int rate, channels;
647 snd_pcm_format_t format;
648
649 rate = params_rate(params);
650 channels = params_channels(params);
651 format = params_format(params);
652
653 if (format != SNDRV_PCM_FORMAT_S32_LE)
654 return -EINVAL;
655
656 if (channels != 2)
657 return -EINVAL;
658
659 return img_spdif_in_do_clkgen_single(spdif, rate);
660}
661
662static const struct snd_soc_dai_ops img_spdif_in_dai_ops = {
663 .trigger = img_spdif_in_trigger,
664 .hw_params = img_spdif_in_hw_params
665};
666
667static int img_spdif_in_dai_probe(struct snd_soc_dai *dai)
668{
669 struct img_spdif_in *spdif = snd_soc_dai_get_drvdata(dai);
670
671 snd_soc_dai_init_dma_data(dai, NULL, &spdif->dma_data);
672
673 snd_soc_add_dai_controls(dai, img_spdif_in_controls,
674 ARRAY_SIZE(img_spdif_in_controls));
675
676 return 0;
677}
678
679static struct snd_soc_dai_driver img_spdif_in_dai = {
680 .probe = img_spdif_in_dai_probe,
681 .capture = {
682 .channels_min = 2,
683 .channels_max = 2,
684 .rates = SNDRV_PCM_RATE_8000_192000,
685 .formats = SNDRV_PCM_FMTBIT_S32_LE
686 },
687 .ops = &img_spdif_in_dai_ops
688};
689
690static const struct snd_soc_component_driver img_spdif_in_component = {
691 .name = "img-spdif-in"
692};
693
694static int img_spdif_in_probe(struct platform_device *pdev)
695{
696 struct img_spdif_in *spdif;
697 struct resource *res;
698 void __iomem *base;
699 int ret;
700 struct reset_control *rst;
701 u32 reg;
702 struct device *dev = &pdev->dev;
703
704 spdif = devm_kzalloc(&pdev->dev, sizeof(*spdif), GFP_KERNEL);
705 if (!spdif)
706 return -ENOMEM;
707
708 platform_set_drvdata(pdev, spdif);
709
710 spdif->dev = &pdev->dev;
711
712 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
713 base = devm_ioremap_resource(&pdev->dev, res);
714 if (IS_ERR(base))
715 return PTR_ERR(base);
716
717 spdif->base = base;
718
719 spdif->clk_sys = devm_clk_get(dev, "sys");
720 if (IS_ERR(spdif->clk_sys)) {
721 if (PTR_ERR(spdif->clk_sys) != -EPROBE_DEFER)
722 dev_err(dev, "Failed to acquire clock 'sys'\n");
723 return PTR_ERR(spdif->clk_sys);
724 }
725
726 ret = clk_prepare_enable(spdif->clk_sys);
727 if (ret)
728 return ret;
729
730 rst = devm_reset_control_get(&pdev->dev, "rst");
731 if (IS_ERR(rst)) {
732 if (PTR_ERR(rst) == -EPROBE_DEFER) {
733 ret = -EPROBE_DEFER;
734 goto err_clk_disable;
735 }
736 dev_dbg(dev, "No top level reset found\n");
737 img_spdif_in_writel(spdif, IMG_SPDIF_IN_SOFT_RESET_MASK,
738 IMG_SPDIF_IN_SOFT_RESET);
739 img_spdif_in_writel(spdif, 0, IMG_SPDIF_IN_SOFT_RESET);
740 } else {
741 reset_control_assert(rst);
742 reset_control_deassert(rst);
743 }
744
745 spin_lock_init(&spdif->lock);
746
747 spdif->dma_data.addr = res->start + IMG_SPDIF_IN_RX_FIFO_OFFSET;
748 spdif->dma_data.addr_width = 4;
749 spdif->dma_data.maxburst = 4;
750 spdif->trk = 0x80;
751 spdif->lock_acquire = 4;
752 spdif->lock_release = -128;
753
754 reg = (spdif->lock_acquire << IMG_SPDIF_IN_CTL_LOCKHI_SHIFT) &
755 IMG_SPDIF_IN_CTL_LOCKHI_MASK;
756 reg |= (spdif->lock_release << IMG_SPDIF_IN_CTL_LOCKLO_SHIFT) &
757 IMG_SPDIF_IN_CTL_LOCKLO_MASK;
758 reg |= (spdif->trk << IMG_SPDIF_IN_CTL_TRK_SHIFT) &
759 IMG_SPDIF_IN_CTL_TRK_MASK;
760 img_spdif_in_writel(spdif, reg, IMG_SPDIF_IN_CTL);
761
762 ret = devm_snd_soc_register_component(&pdev->dev,
763 &img_spdif_in_component, &img_spdif_in_dai, 1);
764 if (ret)
765 goto err_clk_disable;
766
767 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
768 if (ret)
769 goto err_clk_disable;
770
771 return 0;
772
773err_clk_disable:
774 clk_disable_unprepare(spdif->clk_sys);
775
776 return ret;
777}
778
779static int img_spdif_in_dev_remove(struct platform_device *pdev)
780{
781 struct img_spdif_in *spdif = platform_get_drvdata(pdev);
782
783 clk_disable_unprepare(spdif->clk_sys);
784
785 return 0;
786}
787
788static const struct of_device_id img_spdif_in_of_match[] = {
789 { .compatible = "img,spdif-in" },
790 {}
791};
792MODULE_DEVICE_TABLE(of, img_spdif_in_of_match);
793
794static struct platform_driver img_spdif_in_driver = {
795 .driver = {
796 .name = "img-spdif-in",
797 .of_match_table = img_spdif_in_of_match
798 },
799 .probe = img_spdif_in_probe,
800 .remove = img_spdif_in_dev_remove
801};
802module_platform_driver(img_spdif_in_driver);
803
804MODULE_AUTHOR("Damien Horsley <Damien.Horsley@imgtec.com>");
805MODULE_DESCRIPTION("IMG SPDIF Input driver");
806MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/img/img-spdif-out.c b/sound/soc/img/img-spdif-out.c
new file mode 100644
index 000000000000..08f93a5dadfe
--- /dev/null
+++ b/sound/soc/img/img-spdif-out.c
@@ -0,0 +1,441 @@
1/*
2 * IMG SPDIF output controller driver
3 *
4 * Copyright (C) 2015 Imagination Technologies Ltd.
5 *
6 * Author: Damien Horsley <Damien.Horsley@imgtec.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
11 */
12
13#include <linux/clk.h>
14#include <linux/init.h>
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/of.h>
18#include <linux/platform_device.h>
19#include <linux/pm_runtime.h>
20#include <linux/reset.h>
21
22#include <sound/core.h>
23#include <sound/dmaengine_pcm.h>
24#include <sound/initval.h>
25#include <sound/pcm.h>
26#include <sound/pcm_params.h>
27#include <sound/soc.h>
28
29#define IMG_SPDIF_OUT_TX_FIFO 0x0
30
31#define IMG_SPDIF_OUT_CTL 0x4
32#define IMG_SPDIF_OUT_CTL_FS_MASK BIT(4)
33#define IMG_SPDIF_OUT_CTL_CLK_MASK BIT(2)
34#define IMG_SPDIF_OUT_CTL_SRT_MASK BIT(0)
35
36#define IMG_SPDIF_OUT_CSL 0x14
37
38#define IMG_SPDIF_OUT_CSH_UV 0x18
39#define IMG_SPDIF_OUT_CSH_UV_CSH_SHIFT 0
40#define IMG_SPDIF_OUT_CSH_UV_CSH_MASK 0xff
41
42struct img_spdif_out {
43 spinlock_t lock;
44 void __iomem *base;
45 struct clk *clk_sys;
46 struct clk *clk_ref;
47 struct snd_dmaengine_dai_dma_data dma_data;
48 struct device *dev;
49 struct reset_control *rst;
50};
51
52static int img_spdif_out_suspend(struct device *dev)
53{
54 struct img_spdif_out *spdif = dev_get_drvdata(dev);
55
56 clk_disable_unprepare(spdif->clk_ref);
57
58 return 0;
59}
60
61static int img_spdif_out_resume(struct device *dev)
62{
63 struct img_spdif_out *spdif = dev_get_drvdata(dev);
64 int ret;
65
66 ret = clk_prepare_enable(spdif->clk_ref);
67 if (ret) {
68 dev_err(dev, "clk_enable failed: %d\n", ret);
69 return ret;
70 }
71
72 return 0;
73}
74
75static inline void img_spdif_out_writel(struct img_spdif_out *spdif, u32 val,
76 u32 reg)
77{
78 writel(val, spdif->base + reg);
79}
80
81static inline u32 img_spdif_out_readl(struct img_spdif_out *spdif, u32 reg)
82{
83 return readl(spdif->base + reg);
84}
85
86static void img_spdif_out_reset(struct img_spdif_out *spdif)
87{
88 u32 ctl, status_low, status_high;
89
90 ctl = img_spdif_out_readl(spdif, IMG_SPDIF_OUT_CTL) &
91 ~IMG_SPDIF_OUT_CTL_SRT_MASK;
92 status_low = img_spdif_out_readl(spdif, IMG_SPDIF_OUT_CSL);
93 status_high = img_spdif_out_readl(spdif, IMG_SPDIF_OUT_CSH_UV);
94
95 reset_control_assert(spdif->rst);
96 reset_control_deassert(spdif->rst);
97
98 img_spdif_out_writel(spdif, ctl, IMG_SPDIF_OUT_CTL);
99 img_spdif_out_writel(spdif, status_low, IMG_SPDIF_OUT_CSL);
100 img_spdif_out_writel(spdif, status_high, IMG_SPDIF_OUT_CSH_UV);
101}
102
103static int img_spdif_out_info(struct snd_kcontrol *kcontrol,
104 struct snd_ctl_elem_info *uinfo)
105{
106 uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
107 uinfo->count = 1;
108
109 return 0;
110}
111
112static int img_spdif_out_get_status_mask(struct snd_kcontrol *kcontrol,
113 struct snd_ctl_elem_value *ucontrol)
114{
115 ucontrol->value.iec958.status[0] = 0xff;
116 ucontrol->value.iec958.status[1] = 0xff;
117 ucontrol->value.iec958.status[2] = 0xff;
118 ucontrol->value.iec958.status[3] = 0xff;
119 ucontrol->value.iec958.status[4] = 0xff;
120
121 return 0;
122}
123
124static int img_spdif_out_get_status(struct snd_kcontrol *kcontrol,
125 struct snd_ctl_elem_value *ucontrol)
126{
127 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
128 struct img_spdif_out *spdif = snd_soc_dai_get_drvdata(cpu_dai);
129 u32 reg;
130 unsigned long flags;
131
132 spin_lock_irqsave(&spdif->lock, flags);
133
134 reg = img_spdif_out_readl(spdif, IMG_SPDIF_OUT_CSL);
135 ucontrol->value.iec958.status[0] = reg & 0xff;
136 ucontrol->value.iec958.status[1] = (reg >> 8) & 0xff;
137 ucontrol->value.iec958.status[2] = (reg >> 16) & 0xff;
138 ucontrol->value.iec958.status[3] = (reg >> 24) & 0xff;
139
140 reg = img_spdif_out_readl(spdif, IMG_SPDIF_OUT_CSH_UV);
141 ucontrol->value.iec958.status[4] =
142 (reg & IMG_SPDIF_OUT_CSH_UV_CSH_MASK) >>
143 IMG_SPDIF_OUT_CSH_UV_CSH_SHIFT;
144
145 spin_unlock_irqrestore(&spdif->lock, flags);
146
147 return 0;
148}
149
150static int img_spdif_out_set_status(struct snd_kcontrol *kcontrol,
151 struct snd_ctl_elem_value *ucontrol)
152{
153 struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
154 struct img_spdif_out *spdif = snd_soc_dai_get_drvdata(cpu_dai);
155 u32 reg;
156 unsigned long flags;
157
158 reg = ((u32)ucontrol->value.iec958.status[3] << 24);
159 reg |= ((u32)ucontrol->value.iec958.status[2] << 16);
160 reg |= ((u32)ucontrol->value.iec958.status[1] << 8);
161 reg |= (u32)ucontrol->value.iec958.status[0];
162
163 spin_lock_irqsave(&spdif->lock, flags);
164
165 img_spdif_out_writel(spdif, reg, IMG_SPDIF_OUT_CSL);
166
167 reg = img_spdif_out_readl(spdif, IMG_SPDIF_OUT_CSH_UV);
168 reg &= ~IMG_SPDIF_OUT_CSH_UV_CSH_MASK;
169 reg |= (u32)ucontrol->value.iec958.status[4] <<
170 IMG_SPDIF_OUT_CSH_UV_CSH_SHIFT;
171 img_spdif_out_writel(spdif, reg, IMG_SPDIF_OUT_CSH_UV);
172
173 spin_unlock_irqrestore(&spdif->lock, flags);
174
175 return 0;
176}
177
178static struct snd_kcontrol_new img_spdif_out_controls[] = {
179 {
180 .access = SNDRV_CTL_ELEM_ACCESS_READ,
181 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
182 .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, MASK),
183 .info = img_spdif_out_info,
184 .get = img_spdif_out_get_status_mask
185 },
186 {
187 .iface = SNDRV_CTL_ELEM_IFACE_PCM,
188 .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
189 .info = img_spdif_out_info,
190 .get = img_spdif_out_get_status,
191 .put = img_spdif_out_set_status
192 }
193};
194
195static int img_spdif_out_trigger(struct snd_pcm_substream *substream, int cmd,
196 struct snd_soc_dai *dai)
197{
198 struct img_spdif_out *spdif = snd_soc_dai_get_drvdata(dai);
199 u32 reg;
200 unsigned long flags;
201
202 switch (cmd) {
203 case SNDRV_PCM_TRIGGER_START:
204 case SNDRV_PCM_TRIGGER_RESUME:
205 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
206 reg = img_spdif_out_readl(spdif, IMG_SPDIF_OUT_CTL);
207 reg |= IMG_SPDIF_OUT_CTL_SRT_MASK;
208 img_spdif_out_writel(spdif, reg, IMG_SPDIF_OUT_CTL);
209 break;
210 case SNDRV_PCM_TRIGGER_STOP:
211 case SNDRV_PCM_TRIGGER_SUSPEND:
212 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
213 spin_lock_irqsave(&spdif->lock, flags);
214 img_spdif_out_reset(spdif);
215 spin_unlock_irqrestore(&spdif->lock, flags);
216 break;
217 default:
218 return -EINVAL;
219 }
220
221 return 0;
222}
223
224static int img_spdif_out_hw_params(struct snd_pcm_substream *substream,
225 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
226{
227 struct img_spdif_out *spdif = snd_soc_dai_get_drvdata(dai);
228 unsigned int channels;
229 long pre_div_a, pre_div_b, diff_a, diff_b, rate, clk_rate;
230 u32 reg;
231 snd_pcm_format_t format;
232
233 rate = params_rate(params);
234 format = params_format(params);
235 channels = params_channels(params);
236
237 dev_dbg(spdif->dev, "hw_params rate %ld channels %u format %u\n",
238 rate, channels, format);
239
240 if (format != SNDRV_PCM_FORMAT_S32_LE)
241 return -EINVAL;
242
243 if (channels != 2)
244 return -EINVAL;
245
246 pre_div_a = clk_round_rate(spdif->clk_ref, rate * 256);
247 if (pre_div_a < 0)
248 return pre_div_a;
249 pre_div_b = clk_round_rate(spdif->clk_ref, rate * 384);
250 if (pre_div_b < 0)
251 return pre_div_b;
252
253 diff_a = abs((pre_div_a / 256) - rate);
254 diff_b = abs((pre_div_b / 384) - rate);
255
256 /* If diffs are equal, use lower clock rate */
257 if (diff_a > diff_b)
258 clk_set_rate(spdif->clk_ref, pre_div_b);
259 else
260 clk_set_rate(spdif->clk_ref, pre_div_a);
261
262 /*
263 * Another driver (eg machine driver) may have rejected the above
264 * change. Get the current rate and set the register bit according to
265 * the new min diff
266 */
267 clk_rate = clk_get_rate(spdif->clk_ref);
268
269 diff_a = abs((clk_rate / 256) - rate);
270 diff_b = abs((clk_rate / 384) - rate);
271
272 reg = img_spdif_out_readl(spdif, IMG_SPDIF_OUT_CTL);
273 if (diff_a <= diff_b)
274 reg &= ~IMG_SPDIF_OUT_CTL_CLK_MASK;
275 else
276 reg |= IMG_SPDIF_OUT_CTL_CLK_MASK;
277 img_spdif_out_writel(spdif, reg, IMG_SPDIF_OUT_CTL);
278
279 return 0;
280}
281
282static const struct snd_soc_dai_ops img_spdif_out_dai_ops = {
283 .trigger = img_spdif_out_trigger,
284 .hw_params = img_spdif_out_hw_params
285};
286
287static int img_spdif_out_dai_probe(struct snd_soc_dai *dai)
288{
289 struct img_spdif_out *spdif = snd_soc_dai_get_drvdata(dai);
290
291 snd_soc_dai_init_dma_data(dai, &spdif->dma_data, NULL);
292
293 snd_soc_add_dai_controls(dai, img_spdif_out_controls,
294 ARRAY_SIZE(img_spdif_out_controls));
295
296 return 0;
297}
298
299static struct snd_soc_dai_driver img_spdif_out_dai = {
300 .probe = img_spdif_out_dai_probe,
301 .playback = {
302 .channels_min = 2,
303 .channels_max = 2,
304 .rates = SNDRV_PCM_RATE_8000_192000,
305 .formats = SNDRV_PCM_FMTBIT_S32_LE
306 },
307 .ops = &img_spdif_out_dai_ops
308};
309
310static const struct snd_soc_component_driver img_spdif_out_component = {
311 .name = "img-spdif-out"
312};
313
314static int img_spdif_out_probe(struct platform_device *pdev)
315{
316 struct img_spdif_out *spdif;
317 struct resource *res;
318 void __iomem *base;
319 int ret;
320 struct device *dev = &pdev->dev;
321
322 spdif = devm_kzalloc(&pdev->dev, sizeof(*spdif), GFP_KERNEL);
323 if (!spdif)
324 return -ENOMEM;
325
326 platform_set_drvdata(pdev, spdif);
327
328 spdif->dev = &pdev->dev;
329
330 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
331 base = devm_ioremap_resource(&pdev->dev, res);
332 if (IS_ERR(base))
333 return PTR_ERR(base);
334
335 spdif->base = base;
336
337 spdif->rst = devm_reset_control_get(&pdev->dev, "rst");
338 if (IS_ERR(spdif->rst)) {
339 if (PTR_ERR(spdif->rst) != -EPROBE_DEFER)
340 dev_err(&pdev->dev, "No top level reset found\n");
341 return PTR_ERR(spdif->rst);
342 }
343
344 spdif->clk_sys = devm_clk_get(&pdev->dev, "sys");
345 if (IS_ERR(spdif->clk_sys)) {
346 if (PTR_ERR(spdif->clk_sys) != -EPROBE_DEFER)
347 dev_err(dev, "Failed to acquire clock 'sys'\n");
348 return PTR_ERR(spdif->clk_sys);
349 }
350
351 spdif->clk_ref = devm_clk_get(&pdev->dev, "ref");
352 if (IS_ERR(spdif->clk_ref)) {
353 if (PTR_ERR(spdif->clk_ref) != -EPROBE_DEFER)
354 dev_err(dev, "Failed to acquire clock 'ref'\n");
355 return PTR_ERR(spdif->clk_ref);
356 }
357
358 ret = clk_prepare_enable(spdif->clk_sys);
359 if (ret)
360 return ret;
361
362 img_spdif_out_writel(spdif, IMG_SPDIF_OUT_CTL_FS_MASK,
363 IMG_SPDIF_OUT_CTL);
364
365 img_spdif_out_reset(spdif);
366
367 pm_runtime_enable(&pdev->dev);
368 if (!pm_runtime_enabled(&pdev->dev)) {
369 ret = img_spdif_out_resume(&pdev->dev);
370 if (ret)
371 goto err_pm_disable;
372 }
373
374 spin_lock_init(&spdif->lock);
375
376 spdif->dma_data.addr = res->start + IMG_SPDIF_OUT_TX_FIFO;
377 spdif->dma_data.addr_width = 4;
378 spdif->dma_data.maxburst = 4;
379
380 ret = devm_snd_soc_register_component(&pdev->dev,
381 &img_spdif_out_component,
382 &img_spdif_out_dai, 1);
383 if (ret)
384 goto err_suspend;
385
386 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
387 if (ret)
388 goto err_suspend;
389
390 dev_dbg(&pdev->dev, "Probe successful\n");
391
392 return 0;
393
394err_suspend:
395 if (!pm_runtime_status_suspended(&pdev->dev))
396 img_spdif_out_suspend(&pdev->dev);
397err_pm_disable:
398 pm_runtime_disable(&pdev->dev);
399 clk_disable_unprepare(spdif->clk_sys);
400
401 return ret;
402}
403
404static int img_spdif_out_dev_remove(struct platform_device *pdev)
405{
406 struct img_spdif_out *spdif = platform_get_drvdata(pdev);
407
408 pm_runtime_disable(&pdev->dev);
409 if (!pm_runtime_status_suspended(&pdev->dev))
410 img_spdif_out_suspend(&pdev->dev);
411
412 clk_disable_unprepare(spdif->clk_sys);
413
414 return 0;
415}
416
417static const struct of_device_id img_spdif_out_of_match[] = {
418 { .compatible = "img,spdif-out" },
419 {}
420};
421MODULE_DEVICE_TABLE(of, img_spdif_out_of_match);
422
423static const struct dev_pm_ops img_spdif_out_pm_ops = {
424 SET_RUNTIME_PM_OPS(img_spdif_out_suspend,
425 img_spdif_out_resume, NULL)
426};
427
428static struct platform_driver img_spdif_out_driver = {
429 .driver = {
430 .name = "img-spdif-out",
431 .of_match_table = img_spdif_out_of_match,
432 .pm = &img_spdif_out_pm_ops
433 },
434 .probe = img_spdif_out_probe,
435 .remove = img_spdif_out_dev_remove
436};
437module_platform_driver(img_spdif_out_driver);
438
439MODULE_AUTHOR("Damien Horsley <Damien.Horsley@imgtec.com>");
440MODULE_DESCRIPTION("IMG SPDIF Output driver");
441MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/img/pistachio-internal-dac.c b/sound/soc/img/pistachio-internal-dac.c
new file mode 100644
index 000000000000..162a0fd68c7b
--- /dev/null
+++ b/sound/soc/img/pistachio-internal-dac.c
@@ -0,0 +1,287 @@
1/*
2 * Pistachio internal dac driver
3 *
4 * Copyright (C) 2015 Imagination Technologies Ltd.
5 *
6 * Author: Damien Horsley <Damien.Horsley@imgtec.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
11 */
12
13#include <linux/clk.h>
14#include <linux/delay.h>
15#include <linux/mfd/syscon.h>
16#include <linux/module.h>
17#include <linux/pm_runtime.h>
18#include <linux/regmap.h>
19#include <linux/regulator/consumer.h>
20
21#include <sound/pcm_params.h>
22#include <sound/soc.h>
23
24#define PISTACHIO_INTERNAL_DAC_CTRL 0x40
25#define PISTACHIO_INTERNAL_DAC_CTRL_PWR_SEL_MASK 0x2
26#define PISTACHIO_INTERNAL_DAC_CTRL_PWRDN_MASK 0x1
27
28#define PISTACHIO_INTERNAL_DAC_SRST 0x44
29#define PISTACHIO_INTERNAL_DAC_SRST_MASK 0x1
30
31#define PISTACHIO_INTERNAL_DAC_GTI_CTRL 0x48
32#define PISTACHIO_INTERNAL_DAC_GTI_CTRL_ADDR_SHIFT 0
33#define PISTACHIO_INTERNAL_DAC_GTI_CTRL_ADDR_MASK 0xFFF
34#define PISTACHIO_INTERNAL_DAC_GTI_CTRL_WE_MASK 0x1000
35#define PISTACHIO_INTERNAL_DAC_GTI_CTRL_WDATA_SHIFT 13
36#define PISTACHIO_INTERNAL_DAC_GTI_CTRL_WDATA_MASK 0x1FE000
37
38#define PISTACHIO_INTERNAL_DAC_PWR 0x1
39#define PISTACHIO_INTERNAL_DAC_PWR_MASK 0x1
40
41#define PISTACHIO_INTERNAL_DAC_FORMATS (SNDRV_PCM_FMTBIT_S24_LE | \
42 SNDRV_PCM_FMTBIT_S32_LE)
43
44/* codec private data */
45struct pistachio_internal_dac {
46 struct regmap *regmap;
47 struct regulator *supply;
48 bool mute;
49};
50
51static const struct snd_kcontrol_new pistachio_internal_dac_snd_controls[] = {
52 SOC_SINGLE("Playback Switch", PISTACHIO_INTERNAL_DAC_CTRL, 2, 1, 1)
53};
54
55static const struct snd_soc_dapm_widget pistachio_internal_dac_widgets[] = {
56 SND_SOC_DAPM_DAC("DAC", "Playback", SND_SOC_NOPM, 0, 0),
57 SND_SOC_DAPM_OUTPUT("AOUTL"),
58 SND_SOC_DAPM_OUTPUT("AOUTR"),
59};
60
61static const struct snd_soc_dapm_route pistachio_internal_dac_routes[] = {
62 { "AOUTL", NULL, "DAC" },
63 { "AOUTR", NULL, "DAC" },
64};
65
66static void pistachio_internal_dac_reg_writel(struct regmap *top_regs,
67 u32 val, u32 reg)
68{
69 regmap_update_bits(top_regs, PISTACHIO_INTERNAL_DAC_GTI_CTRL,
70 PISTACHIO_INTERNAL_DAC_GTI_CTRL_ADDR_MASK,
71 reg << PISTACHIO_INTERNAL_DAC_GTI_CTRL_ADDR_SHIFT);
72
73 regmap_update_bits(top_regs, PISTACHIO_INTERNAL_DAC_GTI_CTRL,
74 PISTACHIO_INTERNAL_DAC_GTI_CTRL_WDATA_MASK,
75 val << PISTACHIO_INTERNAL_DAC_GTI_CTRL_WDATA_SHIFT);
76
77 regmap_update_bits(top_regs, PISTACHIO_INTERNAL_DAC_GTI_CTRL,
78 PISTACHIO_INTERNAL_DAC_GTI_CTRL_WE_MASK,
79 PISTACHIO_INTERNAL_DAC_GTI_CTRL_WE_MASK);
80
81 regmap_update_bits(top_regs, PISTACHIO_INTERNAL_DAC_GTI_CTRL,
82 PISTACHIO_INTERNAL_DAC_GTI_CTRL_WE_MASK, 0);
83}
84
85static void pistachio_internal_dac_pwr_off(struct pistachio_internal_dac *dac)
86{
87 regmap_update_bits(dac->regmap, PISTACHIO_INTERNAL_DAC_CTRL,
88 PISTACHIO_INTERNAL_DAC_CTRL_PWRDN_MASK,
89 PISTACHIO_INTERNAL_DAC_CTRL_PWRDN_MASK);
90
91 pistachio_internal_dac_reg_writel(dac->regmap, 0,
92 PISTACHIO_INTERNAL_DAC_PWR);
93}
94
95static void pistachio_internal_dac_pwr_on(struct pistachio_internal_dac *dac)
96{
97 regmap_update_bits(dac->regmap, PISTACHIO_INTERNAL_DAC_SRST,
98 PISTACHIO_INTERNAL_DAC_SRST_MASK,
99 PISTACHIO_INTERNAL_DAC_SRST_MASK);
100
101 regmap_update_bits(dac->regmap, PISTACHIO_INTERNAL_DAC_SRST,
102 PISTACHIO_INTERNAL_DAC_SRST_MASK, 0);
103
104 pistachio_internal_dac_reg_writel(dac->regmap,
105 PISTACHIO_INTERNAL_DAC_PWR_MASK,
106 PISTACHIO_INTERNAL_DAC_PWR);
107
108 regmap_update_bits(dac->regmap, PISTACHIO_INTERNAL_DAC_CTRL,
109 PISTACHIO_INTERNAL_DAC_CTRL_PWRDN_MASK, 0);
110}
111
112static struct snd_soc_dai_driver pistachio_internal_dac_dais[] = {
113 {
114 .name = "pistachio_internal_dac",
115 .playback = {
116 .stream_name = "Playback",
117 .channels_min = 2,
118 .channels_max = 2,
119 .rates = SNDRV_PCM_RATE_8000_48000,
120 .formats = PISTACHIO_INTERNAL_DAC_FORMATS,
121 }
122 },
123};
124
125static int pistachio_internal_dac_codec_probe(struct snd_soc_codec *codec)
126{
127 struct pistachio_internal_dac *dac = snd_soc_codec_get_drvdata(codec);
128
129 snd_soc_codec_init_regmap(codec, dac->regmap);
130
131 return 0;
132}
133
134static const struct snd_soc_codec_driver pistachio_internal_dac_driver = {
135 .probe = pistachio_internal_dac_codec_probe,
136 .idle_bias_off = true,
137 .controls = pistachio_internal_dac_snd_controls,
138 .num_controls = ARRAY_SIZE(pistachio_internal_dac_snd_controls),
139 .dapm_widgets = pistachio_internal_dac_widgets,
140 .num_dapm_widgets = ARRAY_SIZE(pistachio_internal_dac_widgets),
141 .dapm_routes = pistachio_internal_dac_routes,
142 .num_dapm_routes = ARRAY_SIZE(pistachio_internal_dac_routes),
143};
144
145static int pistachio_internal_dac_probe(struct platform_device *pdev)
146{
147 struct pistachio_internal_dac *dac;
148 int ret, voltage;
149 struct device *dev = &pdev->dev;
150 u32 reg;
151
152 dac = devm_kzalloc(dev, sizeof(*dac), GFP_KERNEL);
153
154 if (!dac)
155 return -ENOMEM;
156
157 platform_set_drvdata(pdev, dac);
158
159 dac->regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
160 "img,cr-top");
161 if (IS_ERR(dac->regmap))
162 return PTR_ERR(dac->regmap);
163
164 dac->supply = devm_regulator_get(dev, "VDD");
165 if (IS_ERR(dac->supply)) {
166 ret = PTR_ERR(dac->supply);
167 if (ret != -EPROBE_DEFER)
168 dev_err(dev, "failed to acquire supply 'VDD-supply': %d\n", ret);
169 return ret;
170 }
171
172 ret = regulator_enable(dac->supply);
173 if (ret) {
174 dev_err(dev, "failed to enable supply: %d\n", ret);
175 return ret;
176 }
177
178 voltage = regulator_get_voltage(dac->supply);
179
180 switch (voltage) {
181 case 1800000:
182 reg = 0;
183 break;
184 case 3300000:
185 reg = PISTACHIO_INTERNAL_DAC_CTRL_PWR_SEL_MASK;
186 break;
187 default:
188 dev_err(dev, "invalid voltage: %d\n", voltage);
189 ret = -EINVAL;
190 goto err_regulator;
191 }
192
193 regmap_update_bits(dac->regmap, PISTACHIO_INTERNAL_DAC_CTRL,
194 PISTACHIO_INTERNAL_DAC_CTRL_PWR_SEL_MASK, reg);
195
196 pistachio_internal_dac_pwr_off(dac);
197 pistachio_internal_dac_pwr_on(dac);
198
199 pm_runtime_set_active(dev);
200 pm_runtime_enable(dev);
201 pm_runtime_idle(dev);
202
203 ret = snd_soc_register_codec(dev, &pistachio_internal_dac_driver,
204 pistachio_internal_dac_dais,
205 ARRAY_SIZE(pistachio_internal_dac_dais));
206 if (ret) {
207 dev_err(dev, "failed to register codec: %d\n", ret);
208 goto err_pwr;
209 }
210
211 return 0;
212
213err_pwr:
214 pm_runtime_disable(&pdev->dev);
215 pistachio_internal_dac_pwr_off(dac);
216err_regulator:
217 regulator_disable(dac->supply);
218
219 return ret;
220}
221
222static int pistachio_internal_dac_remove(struct platform_device *pdev)
223{
224 struct pistachio_internal_dac *dac = dev_get_drvdata(&pdev->dev);
225
226 snd_soc_unregister_codec(&pdev->dev);
227 pm_runtime_disable(&pdev->dev);
228 pistachio_internal_dac_pwr_off(dac);
229 regulator_disable(dac->supply);
230
231 return 0;
232}
233
234#ifdef CONFIG_PM
235static int pistachio_internal_dac_rt_resume(struct device *dev)
236{
237 struct pistachio_internal_dac *dac = dev_get_drvdata(dev);
238 int ret;
239
240 ret = regulator_enable(dac->supply);
241 if (ret) {
242 dev_err(dev, "failed to enable supply: %d\n", ret);
243 return ret;
244 }
245
246 pistachio_internal_dac_pwr_on(dac);
247
248 return 0;
249}
250
251static int pistachio_internal_dac_rt_suspend(struct device *dev)
252{
253 struct pistachio_internal_dac *dac = dev_get_drvdata(dev);
254
255 pistachio_internal_dac_pwr_off(dac);
256
257 regulator_disable(dac->supply);
258
259 return 0;
260}
261#endif
262
263static const struct dev_pm_ops pistachio_internal_dac_pm_ops = {
264 SET_RUNTIME_PM_OPS(pistachio_internal_dac_rt_suspend,
265 pistachio_internal_dac_rt_resume, NULL)
266};
267
268static const struct of_device_id pistachio_internal_dac_of_match[] = {
269 { .compatible = "img,pistachio-internal-dac" },
270 {}
271};
272MODULE_DEVICE_TABLE(of, pistachio_internal_dac_of_match);
273
274static struct platform_driver pistachio_internal_dac_plat_driver = {
275 .driver = {
276 .name = "img-pistachio-internal-dac",
277 .of_match_table = pistachio_internal_dac_of_match,
278 .pm = &pistachio_internal_dac_pm_ops
279 },
280 .probe = pistachio_internal_dac_probe,
281 .remove = pistachio_internal_dac_remove
282};
283module_platform_driver(pistachio_internal_dac_plat_driver);
284
285MODULE_DESCRIPTION("Pistachio Internal DAC driver");
286MODULE_AUTHOR("Damien Horsley <Damien.Horsley@imgtec.com>");
287MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig
index d430ef5a4f38..803f95e40679 100644
--- a/sound/soc/intel/Kconfig
+++ b/sound/soc/intel/Kconfig
@@ -24,6 +24,7 @@ config SND_SST_IPC_PCI
24config SND_SST_IPC_ACPI 24config SND_SST_IPC_ACPI
25 tristate 25 tristate
26 select SND_SST_IPC 26 select SND_SST_IPC
27 select SND_SOC_INTEL_SST
27 depends on ACPI 28 depends on ACPI
28 29
29config SND_SOC_INTEL_SST 30config SND_SOC_INTEL_SST
@@ -43,7 +44,7 @@ config SND_SOC_INTEL_BAYTRAIL
43config SND_SOC_INTEL_HASWELL_MACH 44config SND_SOC_INTEL_HASWELL_MACH
44 tristate "ASoC Audio DSP support for Intel Haswell Lynxpoint" 45 tristate "ASoC Audio DSP support for Intel Haswell Lynxpoint"
45 depends on X86_INTEL_LPSS && I2C && I2C_DESIGNWARE_PLATFORM 46 depends on X86_INTEL_LPSS && I2C && I2C_DESIGNWARE_PLATFORM
46 depends on DW_DMAC_CORE 47 depends on DW_DMAC_CORE=y
47 select SND_SOC_INTEL_SST 48 select SND_SOC_INTEL_SST
48 select SND_SOC_INTEL_HASWELL 49 select SND_SOC_INTEL_HASWELL
49 select SND_SOC_RT5640 50 select SND_SOC_RT5640
@@ -56,18 +57,19 @@ config SND_SOC_INTEL_HASWELL_MACH
56config SND_SOC_INTEL_BYT_RT5640_MACH 57config SND_SOC_INTEL_BYT_RT5640_MACH
57 tristate "ASoC Audio driver for Intel Baytrail with RT5640 codec" 58 tristate "ASoC Audio driver for Intel Baytrail with RT5640 codec"
58 depends on X86_INTEL_LPSS && I2C 59 depends on X86_INTEL_LPSS && I2C
59 depends on DW_DMAC_CORE 60 depends on DW_DMAC_CORE=y && (SND_SOC_INTEL_BYTCR_RT5640_MACH = n)
60 select SND_SOC_INTEL_SST 61 select SND_SOC_INTEL_SST
61 select SND_SOC_INTEL_BAYTRAIL 62 select SND_SOC_INTEL_BAYTRAIL
62 select SND_SOC_RT5640 63 select SND_SOC_RT5640
63 help 64 help
64 This adds audio driver for Intel Baytrail platform based boards 65 This adds audio driver for Intel Baytrail platform based boards
65 with the RT5640 audio codec. 66 with the RT5640 audio codec. This driver is deprecated, use
67 SND_SOC_INTEL_BYTCR_RT5640_MACH instead for better functionality
66 68
67config SND_SOC_INTEL_BYT_MAX98090_MACH 69config SND_SOC_INTEL_BYT_MAX98090_MACH
68 tristate "ASoC Audio driver for Intel Baytrail with MAX98090 codec" 70 tristate "ASoC Audio driver for Intel Baytrail with MAX98090 codec"
69 depends on X86_INTEL_LPSS && I2C 71 depends on X86_INTEL_LPSS && I2C
70 depends on DW_DMAC_CORE 72 depends on DW_DMAC_CORE=y
71 select SND_SOC_INTEL_SST 73 select SND_SOC_INTEL_SST
72 select SND_SOC_INTEL_BAYTRAIL 74 select SND_SOC_INTEL_BAYTRAIL
73 select SND_SOC_MAX98090 75 select SND_SOC_MAX98090
@@ -79,7 +81,7 @@ config SND_SOC_INTEL_BROADWELL_MACH
79 tristate "ASoC Audio DSP support for Intel Broadwell Wildcatpoint" 81 tristate "ASoC Audio DSP support for Intel Broadwell Wildcatpoint"
80 depends on X86_INTEL_LPSS && I2C && DW_DMAC && \ 82 depends on X86_INTEL_LPSS && I2C && DW_DMAC && \
81 I2C_DESIGNWARE_PLATFORM 83 I2C_DESIGNWARE_PLATFORM
82 depends on DW_DMAC_CORE 84 depends on DW_DMAC_CORE=y
83 select SND_SOC_INTEL_SST 85 select SND_SOC_INTEL_SST
84 select SND_SOC_INTEL_HASWELL 86 select SND_SOC_INTEL_HASWELL
85 select SND_SOC_RT286 87 select SND_SOC_RT286
@@ -90,14 +92,26 @@ config SND_SOC_INTEL_BROADWELL_MACH
90 If unsure select "N". 92 If unsure select "N".
91 93
92config SND_SOC_INTEL_BYTCR_RT5640_MACH 94config SND_SOC_INTEL_BYTCR_RT5640_MACH
93 tristate "ASoC Audio DSP Support for MID BYT Platform" 95 tristate "ASoC Audio driver for Intel Baytrail and Baytrail-CR with RT5640 codec"
94 depends on X86 && I2C 96 depends on X86 && I2C
95 select SND_SOC_RT5640 97 select SND_SOC_RT5640
96 select SND_SST_MFLD_PLATFORM 98 select SND_SST_MFLD_PLATFORM
97 select SND_SST_IPC_ACPI 99 select SND_SST_IPC_ACPI
98 help 100 help
99 This adds support for ASoC machine driver for Intel(R) MID Baytrail platform 101 This adds support for ASoC machine driver for Intel(R) Baytrail and Baytrail-CR
100 used as alsa device in audio substem in Intel(R) MID devices 102 platforms with RT5640 audio codec.
103 Say Y if you have such a device
104 If unsure select "N".
105
106config SND_SOC_INTEL_BYTCR_RT5651_MACH
107 tristate "ASoC Audio driver for Intel Baytrail and Baytrail-CR with RT5651 codec"
108 depends on X86 && I2C
109 select SND_SOC_RT5651
110 select SND_SST_MFLD_PLATFORM
111 select SND_SST_IPC_ACPI
112 help
113 This adds support for ASoC machine driver for Intel(R) Baytrail and Baytrail-CR
114 platforms with RT5651 audio codec.
101 Say Y if you have such a device 115 Say Y if you have such a device
102 If unsure select "N". 116 If unsure select "N".
103 117
@@ -154,3 +168,31 @@ config SND_SOC_INTEL_SKL_RT286_MACH
154 with RT286 I2S audio codec. 168 with RT286 I2S audio codec.
155 Say Y if you have such a device 169 Say Y if you have such a device
156 If unsure select "N". 170 If unsure select "N".
171
172config SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH
173 tristate "ASoC Audio driver for SKL with NAU88L25 and SSM4567 in I2S Mode"
174 depends on X86_INTEL_LPSS && I2C
175 select SND_SOC_INTEL_SST
176 select SND_SOC_INTEL_SKYLAKE
177 select SND_SOC_NAU8825
178 select SND_SOC_SSM4567
179 select SND_SOC_DMIC
180 help
181 This adds support for ASoC Onboard Codec I2S machine driver. This will
182 create an alsa sound card for NAU88L25 + SSM4567.
183 Say Y if you have such a device
184 If unsure select "N".
185
186config SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH
187 tristate "ASoC Audio driver for SKL with NAU88L25 and MAX98357A in I2S Mode"
188 depends on X86_INTEL_LPSS && I2C
189 select SND_SOC_INTEL_SST
190 select SND_SOC_INTEL_SKYLAKE
191 select SND_SOC_NAU8825
192 select SND_SOC_MAX98357A
193 select SND_SOC_DMIC
194 help
195 This adds support for ASoC Onboard Codec I2S machine driver. This will
196 create an alsa sound card for NAU88L25 + MAX98357A.
197 Say Y if you have such a device
198 If unsure select "N".
diff --git a/sound/soc/intel/atom/sst-atom-controls.c b/sound/soc/intel/atom/sst-atom-controls.c
index d55388e082e1..b97e6adcf1b2 100644
--- a/sound/soc/intel/atom/sst-atom-controls.c
+++ b/sound/soc/intel/atom/sst-atom-controls.c
@@ -443,7 +443,7 @@ static int sst_gain_get(struct snd_kcontrol *kcontrol,
443 break; 443 break;
444 444
445 case SST_GAIN_MUTE: 445 case SST_GAIN_MUTE:
446 ucontrol->value.integer.value[0] = gv->mute ? 1 : 0; 446 ucontrol->value.integer.value[0] = gv->mute ? 0 : 1;
447 break; 447 break;
448 448
449 case SST_GAIN_RAMP_DURATION: 449 case SST_GAIN_RAMP_DURATION:
@@ -479,7 +479,7 @@ static int sst_gain_put(struct snd_kcontrol *kcontrol,
479 break; 479 break;
480 480
481 case SST_GAIN_MUTE: 481 case SST_GAIN_MUTE:
482 gv->mute = !!ucontrol->value.integer.value[0]; 482 gv->mute = !ucontrol->value.integer.value[0];
483 dev_dbg(cmpnt->dev, "%s: Mute %d\n", mc->pname, gv->mute); 483 dev_dbg(cmpnt->dev, "%s: Mute %d\n", mc->pname, gv->mute);
484 break; 484 break;
485 485
@@ -1109,6 +1109,7 @@ static const struct snd_soc_dapm_route intercon[] = {
1109 {"media0_in", NULL, "Compress Playback"}, 1109 {"media0_in", NULL, "Compress Playback"},
1110 {"media1_in", NULL, "Headset Playback"}, 1110 {"media1_in", NULL, "Headset Playback"},
1111 {"media2_in", NULL, "pcm0_out"}, 1111 {"media2_in", NULL, "pcm0_out"},
1112 {"media3_in", NULL, "Deepbuffer Playback"},
1112 1113
1113 {"media0_out mix 0", "media0_in Switch", "media0_in"}, 1114 {"media0_out mix 0", "media0_in Switch", "media0_in"},
1114 {"media0_out mix 0", "media1_in Switch", "media1_in"}, 1115 {"media0_out mix 0", "media1_in Switch", "media1_in"},
diff --git a/sound/soc/intel/atom/sst-atom-controls.h b/sound/soc/intel/atom/sst-atom-controls.h
index 93de8045d4e1..e0113112f668 100644
--- a/sound/soc/intel/atom/sst-atom-controls.h
+++ b/sound/soc/intel/atom/sst-atom-controls.h
@@ -28,6 +28,7 @@
28 28
29enum { 29enum {
30 MERR_DPCM_AUDIO = 0, 30 MERR_DPCM_AUDIO = 0,
31 MERR_DPCM_DEEP_BUFFER,
31 MERR_DPCM_COMPR, 32 MERR_DPCM_COMPR,
32}; 33};
33 34
diff --git a/sound/soc/intel/atom/sst-mfld-platform-pcm.c b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
index 0487cfaac538..55c33dc76ce4 100644
--- a/sound/soc/intel/atom/sst-mfld-platform-pcm.c
+++ b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
@@ -98,6 +98,7 @@ static struct sst_dev_stream_map dpcm_strm_map[] = {
98 {MERR_DPCM_AUDIO, 0, SNDRV_PCM_STREAM_PLAYBACK, PIPE_MEDIA1_IN, SST_TASK_ID_MEDIA, 0}, 98 {MERR_DPCM_AUDIO, 0, SNDRV_PCM_STREAM_PLAYBACK, PIPE_MEDIA1_IN, SST_TASK_ID_MEDIA, 0},
99 {MERR_DPCM_COMPR, 0, SNDRV_PCM_STREAM_PLAYBACK, PIPE_MEDIA0_IN, SST_TASK_ID_MEDIA, 0}, 99 {MERR_DPCM_COMPR, 0, SNDRV_PCM_STREAM_PLAYBACK, PIPE_MEDIA0_IN, SST_TASK_ID_MEDIA, 0},
100 {MERR_DPCM_AUDIO, 0, SNDRV_PCM_STREAM_CAPTURE, PIPE_PCM1_OUT, SST_TASK_ID_MEDIA, 0}, 100 {MERR_DPCM_AUDIO, 0, SNDRV_PCM_STREAM_CAPTURE, PIPE_PCM1_OUT, SST_TASK_ID_MEDIA, 0},
101 {MERR_DPCM_DEEP_BUFFER, 0, SNDRV_PCM_STREAM_PLAYBACK, PIPE_MEDIA3_IN, SST_TASK_ID_MEDIA, 0},
101}; 102};
102 103
103static int sst_media_digital_mute(struct snd_soc_dai *dai, int mute, int stream) 104static int sst_media_digital_mute(struct snd_soc_dai *dai, int mute, int stream)
@@ -500,14 +501,25 @@ static struct snd_soc_dai_driver sst_platform_dai[] = {
500 .channels_min = SST_STEREO, 501 .channels_min = SST_STEREO,
501 .channels_max = SST_STEREO, 502 .channels_max = SST_STEREO,
502 .rates = SNDRV_PCM_RATE_44100|SNDRV_PCM_RATE_48000, 503 .rates = SNDRV_PCM_RATE_44100|SNDRV_PCM_RATE_48000,
503 .formats = SNDRV_PCM_FMTBIT_S16_LE, 504 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
504 }, 505 },
505 .capture = { 506 .capture = {
506 .stream_name = "Headset Capture", 507 .stream_name = "Headset Capture",
507 .channels_min = 1, 508 .channels_min = 1,
508 .channels_max = 2, 509 .channels_max = 2,
509 .rates = SNDRV_PCM_RATE_44100|SNDRV_PCM_RATE_48000, 510 .rates = SNDRV_PCM_RATE_44100|SNDRV_PCM_RATE_48000,
510 .formats = SNDRV_PCM_FMTBIT_S16_LE, 511 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
512 },
513},
514{
515 .name = "deepbuffer-cpu-dai",
516 .ops = &sst_media_dai_ops,
517 .playback = {
518 .stream_name = "Deepbuffer Playback",
519 .channels_min = SST_STEREO,
520 .channels_max = SST_STEREO,
521 .rates = SNDRV_PCM_RATE_44100|SNDRV_PCM_RATE_48000,
522 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
511 }, 523 },
512}, 524},
513{ 525{
@@ -516,10 +528,6 @@ static struct snd_soc_dai_driver sst_platform_dai[] = {
516 .ops = &sst_compr_dai_ops, 528 .ops = &sst_compr_dai_ops,
517 .playback = { 529 .playback = {
518 .stream_name = "Compress Playback", 530 .stream_name = "Compress Playback",
519 .channels_min = SST_STEREO,
520 .channels_max = SST_STEREO,
521 .rates = SNDRV_PCM_RATE_48000,
522 .formats = SNDRV_PCM_FMTBIT_S16_LE,
523 }, 531 },
524}, 532},
525/* BE CPU Dais */ 533/* BE CPU Dais */
@@ -760,15 +768,15 @@ static int sst_platform_remove(struct platform_device *pdev)
760static int sst_soc_prepare(struct device *dev) 768static int sst_soc_prepare(struct device *dev)
761{ 769{
762 struct sst_data *drv = dev_get_drvdata(dev); 770 struct sst_data *drv = dev_get_drvdata(dev);
763 int i; 771 struct snd_soc_pcm_runtime *rtd;
764 772
765 /* suspend all pcms first */ 773 /* suspend all pcms first */
766 snd_soc_suspend(drv->soc_card->dev); 774 snd_soc_suspend(drv->soc_card->dev);
767 snd_soc_poweroff(drv->soc_card->dev); 775 snd_soc_poweroff(drv->soc_card->dev);
768 776
769 /* set the SSPs to idle */ 777 /* set the SSPs to idle */
770 for (i = 0; i < drv->soc_card->num_rtd; i++) { 778 list_for_each_entry(rtd, &drv->soc_card->rtd_list, list) {
771 struct snd_soc_dai *dai = drv->soc_card->rtd[i].cpu_dai; 779 struct snd_soc_dai *dai = rtd->cpu_dai;
772 780
773 if (dai->active) { 781 if (dai->active) {
774 send_ssp_cmd(dai, dai->name, 0); 782 send_ssp_cmd(dai, dai->name, 0);
@@ -782,11 +790,11 @@ static int sst_soc_prepare(struct device *dev)
782static void sst_soc_complete(struct device *dev) 790static void sst_soc_complete(struct device *dev)
783{ 791{
784 struct sst_data *drv = dev_get_drvdata(dev); 792 struct sst_data *drv = dev_get_drvdata(dev);
785 int i; 793 struct snd_soc_pcm_runtime *rtd;
786 794
787 /* restart SSPs */ 795 /* restart SSPs */
788 for (i = 0; i < drv->soc_card->num_rtd; i++) { 796 list_for_each_entry(rtd, &drv->soc_card->rtd_list, list) {
789 struct snd_soc_dai *dai = drv->soc_card->rtd[i].cpu_dai; 797 struct snd_soc_dai *dai = rtd->cpu_dai;
790 798
791 if (dai->active) { 799 if (dai->active) {
792 sst_handle_vb_timer(dai, true); 800 sst_handle_vb_timer(dai, true);
diff --git a/sound/soc/intel/atom/sst/sst_acpi.c b/sound/soc/intel/atom/sst/sst_acpi.c
index bb19b5801466..4fce03fc1870 100644
--- a/sound/soc/intel/atom/sst/sst_acpi.c
+++ b/sound/soc/intel/atom/sst/sst_acpi.c
@@ -40,18 +40,9 @@
40#include <acpi/acpi_bus.h> 40#include <acpi/acpi_bus.h>
41#include "../sst-mfld-platform.h" 41#include "../sst-mfld-platform.h"
42#include "../../common/sst-dsp.h" 42#include "../../common/sst-dsp.h"
43#include "../../common/sst-acpi.h"
43#include "sst.h" 44#include "sst.h"
44 45
45struct sst_machines {
46 char *codec_id;
47 char board[32];
48 char machine[32];
49 void (*machine_quirk)(void);
50 char firmware[FW_NAME_SIZE];
51 struct sst_platform_info *pdata;
52
53};
54
55/* LPE viewpoint addresses */ 46/* LPE viewpoint addresses */
56#define SST_BYT_IRAM_PHY_START 0xff2c0000 47#define SST_BYT_IRAM_PHY_START 0xff2c0000
57#define SST_BYT_IRAM_PHY_END 0xff2d4000 48#define SST_BYT_IRAM_PHY_END 0xff2d4000
@@ -223,37 +214,16 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
223 return 0; 214 return 0;
224} 215}
225 216
226static acpi_status sst_acpi_mach_match(acpi_handle handle, u32 level,
227 void *context, void **ret)
228{
229 *(bool *)context = true;
230 return AE_OK;
231}
232
233static struct sst_machines *sst_acpi_find_machine(
234 struct sst_machines *machines)
235{
236 struct sst_machines *mach;
237 bool found = false;
238
239 for (mach = machines; mach->codec_id; mach++)
240 if (ACPI_SUCCESS(acpi_get_devices(mach->codec_id,
241 sst_acpi_mach_match,
242 &found, NULL)) && found)
243 return mach;
244
245 return NULL;
246}
247
248static int sst_acpi_probe(struct platform_device *pdev) 217static int sst_acpi_probe(struct platform_device *pdev)
249{ 218{
250 struct device *dev = &pdev->dev; 219 struct device *dev = &pdev->dev;
251 int ret = 0; 220 int ret = 0;
252 struct intel_sst_drv *ctx; 221 struct intel_sst_drv *ctx;
253 const struct acpi_device_id *id; 222 const struct acpi_device_id *id;
254 struct sst_machines *mach; 223 struct sst_acpi_mach *mach;
255 struct platform_device *mdev; 224 struct platform_device *mdev;
256 struct platform_device *plat_dev; 225 struct platform_device *plat_dev;
226 struct sst_platform_info *pdata;
257 unsigned int dev_id; 227 unsigned int dev_id;
258 228
259 id = acpi_match_device(dev->driver->acpi_match_table, dev); 229 id = acpi_match_device(dev->driver->acpi_match_table, dev);
@@ -261,12 +231,13 @@ static int sst_acpi_probe(struct platform_device *pdev)
261 return -ENODEV; 231 return -ENODEV;
262 dev_dbg(dev, "for %s", id->id); 232 dev_dbg(dev, "for %s", id->id);
263 233
264 mach = (struct sst_machines *)id->driver_data; 234 mach = (struct sst_acpi_mach *)id->driver_data;
265 mach = sst_acpi_find_machine(mach); 235 mach = sst_acpi_find_machine(mach);
266 if (mach == NULL) { 236 if (mach == NULL) {
267 dev_err(dev, "No matching machine driver found\n"); 237 dev_err(dev, "No matching machine driver found\n");
268 return -ENODEV; 238 return -ENODEV;
269 } 239 }
240 pdata = mach->pdata;
270 241
271 ret = kstrtouint(id->id, 16, &dev_id); 242 ret = kstrtouint(id->id, 16, &dev_id);
272 if (ret < 0) { 243 if (ret < 0) {
@@ -276,16 +247,23 @@ static int sst_acpi_probe(struct platform_device *pdev)
276 247
277 dev_dbg(dev, "ACPI device id: %x\n", dev_id); 248 dev_dbg(dev, "ACPI device id: %x\n", dev_id);
278 249
279 plat_dev = platform_device_register_data(dev, mach->pdata->platform, -1, NULL, 0); 250 plat_dev = platform_device_register_data(dev, pdata->platform, -1,
251 NULL, 0);
280 if (IS_ERR(plat_dev)) { 252 if (IS_ERR(plat_dev)) {
281 dev_err(dev, "Failed to create machine device: %s\n", mach->pdata->platform); 253 dev_err(dev, "Failed to create machine device: %s\n",
254 pdata->platform);
282 return PTR_ERR(plat_dev); 255 return PTR_ERR(plat_dev);
283 } 256 }
284 257
285 /* Create platform device for sst machine driver */ 258 /*
286 mdev = platform_device_register_data(dev, mach->machine, -1, NULL, 0); 259 * Create platform device for sst machine driver,
260 * pass machine info as pdata
261 */
262 mdev = platform_device_register_data(dev, mach->drv_name, -1,
263 (const void *)mach, sizeof(*mach));
287 if (IS_ERR(mdev)) { 264 if (IS_ERR(mdev)) {
288 dev_err(dev, "Failed to create machine device: %s\n", mach->machine); 265 dev_err(dev, "Failed to create machine device: %s\n",
266 mach->drv_name);
289 return PTR_ERR(mdev); 267 return PTR_ERR(mdev);
290 } 268 }
291 269
@@ -294,8 +272,8 @@ static int sst_acpi_probe(struct platform_device *pdev)
294 return ret; 272 return ret;
295 273
296 /* Fill sst platform data */ 274 /* Fill sst platform data */
297 ctx->pdata = mach->pdata; 275 ctx->pdata = pdata;
298 strcpy(ctx->firmware_name, mach->firmware); 276 strcpy(ctx->firmware_name, mach->fw_filename);
299 277
300 ret = sst_platform_get_resources(ctx); 278 ret = sst_platform_get_resources(ctx);
301 if (ret) 279 if (ret)
@@ -342,22 +320,28 @@ static int sst_acpi_remove(struct platform_device *pdev)
342 return 0; 320 return 0;
343} 321}
344 322
345static struct sst_machines sst_acpi_bytcr[] = { 323static struct sst_acpi_mach sst_acpi_bytcr[] = {
346 {"10EC5640", "T100", "bytt100_rt5640", NULL, "intel/fw_sst_0f28.bin", 324 {"10EC5640", "bytcr_rt5640", "intel/fw_sst_0f28.bin", "bytcr_rt5640", NULL,
325 &byt_rvp_platform_data },
326 {"10EC5642", "bytcr_rt5640", "intel/fw_sst_0f28.bin", "bytcr_rt5640", NULL,
327 &byt_rvp_platform_data },
328 {"INTCCFFD", "bytcr_rt5640", "intel/fw_sst_0f28.bin", "bytcr_rt5640", NULL,
329 &byt_rvp_platform_data },
330 {"10EC5651", "bytcr_rt5651", "intel/fw_sst_0f28.bin", "bytcr_rt5651", NULL,
347 &byt_rvp_platform_data }, 331 &byt_rvp_platform_data },
348 {}, 332 {},
349}; 333};
350 334
351/* Cherryview-based platforms: CherryTrail and Braswell */ 335/* Cherryview-based platforms: CherryTrail and Braswell */
352static struct sst_machines sst_acpi_chv[] = { 336static struct sst_acpi_mach sst_acpi_chv[] = {
353 {"10EC5670", "cht-bsw", "cht-bsw-rt5672", NULL, "intel/fw_sst_22a8.bin", 337 {"10EC5670", "cht-bsw-rt5672", "intel/fw_sst_22a8.bin", "cht-bsw", NULL,
338 &chv_platform_data },
339 {"10EC5645", "cht-bsw-rt5645", "intel/fw_sst_22a8.bin", "cht-bsw", NULL,
354 &chv_platform_data }, 340 &chv_platform_data },
355 {"10EC5645", "cht-bsw", "cht-bsw-rt5645", NULL, "intel/fw_sst_22a8.bin", 341 {"10EC5650", "cht-bsw-rt5645", "intel/fw_sst_22a8.bin", "cht-bsw", NULL,
356 &chv_platform_data }, 342 &chv_platform_data },
357 {"10EC5650", "cht-bsw", "cht-bsw-rt5645", NULL, "intel/fw_sst_22a8.bin", 343 {"193C9890", "cht-bsw-max98090", "intel/fw_sst_22a8.bin", "cht-bsw", NULL,
358 &chv_platform_data }, 344 &chv_platform_data },
359 {"193C9890", "cht-bsw", "cht-bsw-max98090", NULL,
360 "intel/fw_sst_22a8.bin", &chv_platform_data },
361 {}, 345 {},
362}; 346};
363 347
diff --git a/sound/soc/intel/atom/sst/sst_stream.c b/sound/soc/intel/atom/sst/sst_stream.c
index a74c64c7053c..4ccc80e5e8cc 100644
--- a/sound/soc/intel/atom/sst/sst_stream.c
+++ b/sound/soc/intel/atom/sst/sst_stream.c
@@ -108,7 +108,7 @@ int sst_alloc_stream_mrfld(struct intel_sst_drv *sst_drv_ctx, void *params)
108 str_id, pipe_id); 108 str_id, pipe_id);
109 ret = sst_prepare_and_post_msg(sst_drv_ctx, task_id, IPC_CMD, 109 ret = sst_prepare_and_post_msg(sst_drv_ctx, task_id, IPC_CMD,
110 IPC_IA_ALLOC_STREAM_MRFLD, pipe_id, sizeof(alloc_param), 110 IPC_IA_ALLOC_STREAM_MRFLD, pipe_id, sizeof(alloc_param),
111 &alloc_param, data, true, true, false, true); 111 &alloc_param, &data, true, true, false, true);
112 112
113 if (ret < 0) { 113 if (ret < 0) {
114 dev_err(sst_drv_ctx->dev, "FW alloc failed ret %d\n", ret); 114 dev_err(sst_drv_ctx->dev, "FW alloc failed ret %d\n", ret);
diff --git a/sound/soc/intel/baytrail/sst-baytrail-pcm.c b/sound/soc/intel/baytrail/sst-baytrail-pcm.c
index 79547bec558b..4765ad474544 100644
--- a/sound/soc/intel/baytrail/sst-baytrail-pcm.c
+++ b/sound/soc/intel/baytrail/sst-baytrail-pcm.c
@@ -377,6 +377,8 @@ static int sst_byt_pcm_probe(struct snd_soc_platform *platform)
377 377
378 priv_data = devm_kzalloc(platform->dev, sizeof(*priv_data), 378 priv_data = devm_kzalloc(platform->dev, sizeof(*priv_data),
379 GFP_KERNEL); 379 GFP_KERNEL);
380 if (!priv_data)
381 return -ENOMEM;
380 priv_data->byt = plat_data->dsp; 382 priv_data->byt = plat_data->dsp;
381 snd_soc_platform_set_drvdata(platform, priv_data); 383 snd_soc_platform_set_drvdata(platform, priv_data);
382 384
diff --git a/sound/soc/intel/boards/Makefile b/sound/soc/intel/boards/Makefile
index 371c4565cad8..3310c0f9c356 100644
--- a/sound/soc/intel/boards/Makefile
+++ b/sound/soc/intel/boards/Makefile
@@ -3,17 +3,23 @@ snd-soc-sst-byt-rt5640-mach-objs := byt-rt5640.o
3snd-soc-sst-byt-max98090-mach-objs := byt-max98090.o 3snd-soc-sst-byt-max98090-mach-objs := byt-max98090.o
4snd-soc-sst-broadwell-objs := broadwell.o 4snd-soc-sst-broadwell-objs := broadwell.o
5snd-soc-sst-bytcr-rt5640-objs := bytcr_rt5640.o 5snd-soc-sst-bytcr-rt5640-objs := bytcr_rt5640.o
6snd-soc-sst-bytcr-rt5651-objs := bytcr_rt5651.o
6snd-soc-sst-cht-bsw-rt5672-objs := cht_bsw_rt5672.o 7snd-soc-sst-cht-bsw-rt5672-objs := cht_bsw_rt5672.o
7snd-soc-sst-cht-bsw-rt5645-objs := cht_bsw_rt5645.o 8snd-soc-sst-cht-bsw-rt5645-objs := cht_bsw_rt5645.o
8snd-soc-sst-cht-bsw-max98090_ti-objs := cht_bsw_max98090_ti.o 9snd-soc-sst-cht-bsw-max98090_ti-objs := cht_bsw_max98090_ti.o
9snd-soc-skl_rt286-objs := skl_rt286.o 10snd-soc-skl_rt286-objs := skl_rt286.o
11snd-skl_nau88l25_max98357a-objs := skl_nau88l25_max98357a.o
12snd-soc-skl_nau88l25_ssm4567-objs := skl_nau88l25_ssm4567.o
10 13
11obj-$(CONFIG_SND_SOC_INTEL_HASWELL_MACH) += snd-soc-sst-haswell.o 14obj-$(CONFIG_SND_SOC_INTEL_HASWELL_MACH) += snd-soc-sst-haswell.o
12obj-$(CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH) += snd-soc-sst-byt-rt5640-mach.o 15obj-$(CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH) += snd-soc-sst-byt-rt5640-mach.o
13obj-$(CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH) += snd-soc-sst-byt-max98090-mach.o 16obj-$(CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH) += snd-soc-sst-byt-max98090-mach.o
14obj-$(CONFIG_SND_SOC_INTEL_BROADWELL_MACH) += snd-soc-sst-broadwell.o 17obj-$(CONFIG_SND_SOC_INTEL_BROADWELL_MACH) += snd-soc-sst-broadwell.o
15obj-$(CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH) += snd-soc-sst-bytcr-rt5640.o 18obj-$(CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH) += snd-soc-sst-bytcr-rt5640.o
19obj-$(CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH) += snd-soc-sst-bytcr-rt5651.o
16obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH) += snd-soc-sst-cht-bsw-rt5672.o 20obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH) += snd-soc-sst-cht-bsw-rt5672.o
17obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH) += snd-soc-sst-cht-bsw-rt5645.o 21obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH) += snd-soc-sst-cht-bsw-rt5645.o
18obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH) += snd-soc-sst-cht-bsw-max98090_ti.o 22obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH) += snd-soc-sst-cht-bsw-max98090_ti.o
19obj-$(CONFIG_SND_SOC_INTEL_SKL_RT286_MACH) += snd-soc-skl_rt286.o 23obj-$(CONFIG_SND_SOC_INTEL_SKL_RT286_MACH) += snd-soc-skl_rt286.o
24obj-$(CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH) += snd-skl_nau88l25_max98357a.o
25obj-$(CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH) += snd-soc-skl_nau88l25_ssm4567.o
diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
index 7a5c9a36c1db..9a1752df45a9 100644
--- a/sound/soc/intel/boards/bytcr_rt5640.c
+++ b/sound/soc/intel/boards/bytcr_rt5640.c
@@ -20,51 +20,76 @@
20#include <linux/init.h> 20#include <linux/init.h>
21#include <linux/module.h> 21#include <linux/module.h>
22#include <linux/platform_device.h> 22#include <linux/platform_device.h>
23#include <linux/acpi.h>
23#include <linux/device.h> 24#include <linux/device.h>
25#include <linux/dmi.h>
24#include <linux/slab.h> 26#include <linux/slab.h>
25#include <linux/input.h>
26#include <sound/pcm.h> 27#include <sound/pcm.h>
27#include <sound/pcm_params.h> 28#include <sound/pcm_params.h>
28#include <sound/soc.h> 29#include <sound/soc.h>
30#include <sound/jack.h>
29#include "../../codecs/rt5640.h" 31#include "../../codecs/rt5640.h"
30#include "../atom/sst-atom-controls.h" 32#include "../atom/sst-atom-controls.h"
33#include "../common/sst-acpi.h"
31 34
32static const struct snd_soc_dapm_widget byt_dapm_widgets[] = { 35static const struct snd_soc_dapm_widget byt_rt5640_widgets[] = {
33 SND_SOC_DAPM_HP("Headphone", NULL), 36 SND_SOC_DAPM_HP("Headphone", NULL),
34 SND_SOC_DAPM_MIC("Headset Mic", NULL), 37 SND_SOC_DAPM_MIC("Headset Mic", NULL),
35 SND_SOC_DAPM_MIC("Int Mic", NULL), 38 SND_SOC_DAPM_MIC("Internal Mic", NULL),
36 SND_SOC_DAPM_SPK("Ext Spk", NULL), 39 SND_SOC_DAPM_SPK("Speaker", NULL),
37}; 40};
38 41
39static const struct snd_soc_dapm_route byt_audio_map[] = { 42static const struct snd_soc_dapm_route byt_rt5640_audio_map[] = {
40 {"IN2P", NULL, "Headset Mic"},
41 {"IN2N", NULL, "Headset Mic"},
42 {"Headset Mic", NULL, "MICBIAS1"},
43 {"IN1P", NULL, "MICBIAS1"},
44 {"LDO2", NULL, "Int Mic"},
45 {"Headphone", NULL, "HPOL"},
46 {"Headphone", NULL, "HPOR"},
47 {"Ext Spk", NULL, "SPOLP"},
48 {"Ext Spk", NULL, "SPOLN"},
49 {"Ext Spk", NULL, "SPORP"},
50 {"Ext Spk", NULL, "SPORN"},
51
52 {"AIF1 Playback", NULL, "ssp2 Tx"}, 43 {"AIF1 Playback", NULL, "ssp2 Tx"},
53 {"ssp2 Tx", NULL, "codec_out0"}, 44 {"ssp2 Tx", NULL, "codec_out0"},
54 {"ssp2 Tx", NULL, "codec_out1"}, 45 {"ssp2 Tx", NULL, "codec_out1"},
55 {"codec_in0", NULL, "ssp2 Rx"}, 46 {"codec_in0", NULL, "ssp2 Rx"},
56 {"codec_in1", NULL, "ssp2 Rx"}, 47 {"codec_in1", NULL, "ssp2 Rx"},
57 {"ssp2 Rx", NULL, "AIF1 Capture"}, 48 {"ssp2 Rx", NULL, "AIF1 Capture"},
49
50 {"Headset Mic", NULL, "MICBIAS1"},
51 {"IN2P", NULL, "Headset Mic"},
52 {"Headphone", NULL, "HPOL"},
53 {"Headphone", NULL, "HPOR"},
54 {"Speaker", NULL, "SPOLP"},
55 {"Speaker", NULL, "SPOLN"},
56 {"Speaker", NULL, "SPORP"},
57 {"Speaker", NULL, "SPORN"},
58};
59
60static const struct snd_soc_dapm_route byt_rt5640_intmic_dmic1_map[] = {
61 {"DMIC1", NULL, "Internal Mic"},
62};
63
64static const struct snd_soc_dapm_route byt_rt5640_intmic_dmic2_map[] = {
65 {"DMIC2", NULL, "Internal Mic"},
66};
67
68static const struct snd_soc_dapm_route byt_rt5640_intmic_in1_map[] = {
69 {"Internal Mic", NULL, "MICBIAS1"},
70 {"IN1P", NULL, "Internal Mic"},
71};
72
73enum {
74 BYT_RT5640_DMIC1_MAP,
75 BYT_RT5640_DMIC2_MAP,
76 BYT_RT5640_IN1_MAP,
58}; 77};
59 78
60static const struct snd_kcontrol_new byt_mc_controls[] = { 79#define BYT_RT5640_MAP(quirk) ((quirk) & 0xff)
80#define BYT_RT5640_DMIC_EN BIT(16)
81
82static unsigned long byt_rt5640_quirk = BYT_RT5640_DMIC1_MAP |
83 BYT_RT5640_DMIC_EN;
84
85static const struct snd_kcontrol_new byt_rt5640_controls[] = {
61 SOC_DAPM_PIN_SWITCH("Headphone"), 86 SOC_DAPM_PIN_SWITCH("Headphone"),
62 SOC_DAPM_PIN_SWITCH("Headset Mic"), 87 SOC_DAPM_PIN_SWITCH("Headset Mic"),
63 SOC_DAPM_PIN_SWITCH("Int Mic"), 88 SOC_DAPM_PIN_SWITCH("Internal Mic"),
64 SOC_DAPM_PIN_SWITCH("Ext Spk"), 89 SOC_DAPM_PIN_SWITCH("Speaker"),
65}; 90};
66 91
67static int byt_aif1_hw_params(struct snd_pcm_substream *substream, 92static int byt_rt5640_aif1_hw_params(struct snd_pcm_substream *substream,
68 struct snd_pcm_hw_params *params) 93 struct snd_pcm_hw_params *params)
69{ 94{
70 struct snd_soc_pcm_runtime *rtd = substream->private_data; 95 struct snd_soc_pcm_runtime *rtd = substream->private_data;
@@ -92,7 +117,95 @@ static int byt_aif1_hw_params(struct snd_pcm_substream *substream,
92 return 0; 117 return 0;
93} 118}
94 119
95static const struct snd_soc_pcm_stream byt_dai_params = { 120static int byt_rt5640_quirk_cb(const struct dmi_system_id *id)
121{
122 byt_rt5640_quirk = (unsigned long)id->driver_data;
123 return 1;
124}
125
126static const struct dmi_system_id byt_rt5640_quirk_table[] = {
127 {
128 .callback = byt_rt5640_quirk_cb,
129 .matches = {
130 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
131 DMI_MATCH(DMI_PRODUCT_NAME, "T100TA"),
132 },
133 .driver_data = (unsigned long *)BYT_RT5640_IN1_MAP,
134 },
135 {
136 .callback = byt_rt5640_quirk_cb,
137 .matches = {
138 DMI_MATCH(DMI_SYS_VENDOR, "DellInc."),
139 DMI_MATCH(DMI_PRODUCT_NAME, "Venue 8 Pro 5830"),
140 },
141 .driver_data = (unsigned long *)(BYT_RT5640_DMIC2_MAP |
142 BYT_RT5640_DMIC_EN),
143 },
144 {
145 .callback = byt_rt5640_quirk_cb,
146 .matches = {
147 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
148 DMI_MATCH(DMI_PRODUCT_NAME, "HP ElitePad 1000 G2"),
149 },
150 .driver_data = (unsigned long *)BYT_RT5640_IN1_MAP,
151 },
152 {}
153};
154
155static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime)
156{
157 int ret;
158 struct snd_soc_codec *codec = runtime->codec;
159 struct snd_soc_card *card = runtime->card;
160 const struct snd_soc_dapm_route *custom_map;
161 int num_routes;
162
163 card->dapm.idle_bias_off = true;
164
165 rt5640_sel_asrc_clk_src(codec,
166 RT5640_DA_STEREO_FILTER |
167 RT5640_AD_STEREO_FILTER,
168 RT5640_CLK_SEL_ASRC);
169
170 ret = snd_soc_add_card_controls(card, byt_rt5640_controls,
171 ARRAY_SIZE(byt_rt5640_controls));
172 if (ret) {
173 dev_err(card->dev, "unable to add card controls\n");
174 return ret;
175 }
176
177 dmi_check_system(byt_rt5640_quirk_table);
178 switch (BYT_RT5640_MAP(byt_rt5640_quirk)) {
179 case BYT_RT5640_IN1_MAP:
180 custom_map = byt_rt5640_intmic_in1_map;
181 num_routes = ARRAY_SIZE(byt_rt5640_intmic_in1_map);
182 break;
183 case BYT_RT5640_DMIC2_MAP:
184 custom_map = byt_rt5640_intmic_dmic2_map;
185 num_routes = ARRAY_SIZE(byt_rt5640_intmic_dmic2_map);
186 break;
187 default:
188 custom_map = byt_rt5640_intmic_dmic1_map;
189 num_routes = ARRAY_SIZE(byt_rt5640_intmic_dmic1_map);
190 }
191
192 ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes);
193 if (ret)
194 return ret;
195
196 if (byt_rt5640_quirk & BYT_RT5640_DMIC_EN) {
197 ret = rt5640_dmic_enable(codec, 0, 0);
198 if (ret)
199 return ret;
200 }
201
202 snd_soc_dapm_ignore_suspend(&card->dapm, "Headphone");
203 snd_soc_dapm_ignore_suspend(&card->dapm, "Speaker");
204
205 return ret;
206}
207
208static const struct snd_soc_pcm_stream byt_rt5640_dai_params = {
96 .formats = SNDRV_PCM_FMTBIT_S24_LE, 209 .formats = SNDRV_PCM_FMTBIT_S24_LE,
97 .rate_min = 48000, 210 .rate_min = 48000,
98 .rate_max = 48000, 211 .rate_max = 48000,
@@ -100,13 +213,14 @@ static const struct snd_soc_pcm_stream byt_dai_params = {
100 .channels_max = 2, 213 .channels_max = 2,
101}; 214};
102 215
103static int byt_codec_fixup(struct snd_soc_pcm_runtime *rtd, 216static int byt_rt5640_codec_fixup(struct snd_soc_pcm_runtime *rtd,
104 struct snd_pcm_hw_params *params) 217 struct snd_pcm_hw_params *params)
105{ 218{
106 struct snd_interval *rate = hw_param_interval(params, 219 struct snd_interval *rate = hw_param_interval(params,
107 SNDRV_PCM_HW_PARAM_RATE); 220 SNDRV_PCM_HW_PARAM_RATE);
108 struct snd_interval *channels = hw_param_interval(params, 221 struct snd_interval *channels = hw_param_interval(params,
109 SNDRV_PCM_HW_PARAM_CHANNELS); 222 SNDRV_PCM_HW_PARAM_CHANNELS);
223 int ret;
110 224
111 /* The DSP will covert the FE rate to 48k, stereo, 24bits */ 225 /* The DSP will covert the FE rate to 48k, stereo, 24bits */
112 rate->min = rate->max = 48000; 226 rate->min = rate->max = 48000;
@@ -114,24 +228,46 @@ static int byt_codec_fixup(struct snd_soc_pcm_runtime *rtd,
114 228
115 /* set SSP2 to 24-bit */ 229 /* set SSP2 to 24-bit */
116 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); 230 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
231
232 /*
233 * Default mode for SSP configuration is TDM 4 slot, override config
234 * with explicit setting to I2S 2ch 24-bit. The word length is set with
235 * dai_set_tdm_slot() since there is no other API exposed
236 */
237 ret = snd_soc_dai_set_fmt(rtd->cpu_dai,
238 SND_SOC_DAIFMT_I2S |
239 SND_SOC_DAIFMT_NB_IF |
240 SND_SOC_DAIFMT_CBS_CFS
241 );
242 if (ret < 0) {
243 dev_err(rtd->dev, "can't set format to I2S, err %d\n", ret);
244 return ret;
245 }
246
247 ret = snd_soc_dai_set_tdm_slot(rtd->cpu_dai, 0x3, 0x3, 2, 24);
248 if (ret < 0) {
249 dev_err(rtd->dev, "can't set I2S config, err %d\n", ret);
250 return ret;
251 }
252
117 return 0; 253 return 0;
118} 254}
119 255
120static int byt_aif1_startup(struct snd_pcm_substream *substream) 256static int byt_rt5640_aif1_startup(struct snd_pcm_substream *substream)
121{ 257{
122 return snd_pcm_hw_constraint_single(substream->runtime, 258 return snd_pcm_hw_constraint_single(substream->runtime,
123 SNDRV_PCM_HW_PARAM_RATE, 48000); 259 SNDRV_PCM_HW_PARAM_RATE, 48000);
124} 260}
125 261
126static struct snd_soc_ops byt_aif1_ops = { 262static struct snd_soc_ops byt_rt5640_aif1_ops = {
127 .startup = byt_aif1_startup, 263 .startup = byt_rt5640_aif1_startup,
128}; 264};
129 265
130static struct snd_soc_ops byt_be_ssp2_ops = { 266static struct snd_soc_ops byt_rt5640_be_ssp2_ops = {
131 .hw_params = byt_aif1_hw_params, 267 .hw_params = byt_rt5640_aif1_hw_params,
132}; 268};
133 269
134static struct snd_soc_dai_link byt_dailink[] = { 270static struct snd_soc_dai_link byt_rt5640_dais[] = {
135 [MERR_DPCM_AUDIO] = { 271 [MERR_DPCM_AUDIO] = {
136 .name = "Baytrail Audio Port", 272 .name = "Baytrail Audio Port",
137 .stream_name = "Baytrail Audio", 273 .stream_name = "Baytrail Audio",
@@ -143,7 +279,20 @@ static struct snd_soc_dai_link byt_dailink[] = {
143 .dynamic = 1, 279 .dynamic = 1,
144 .dpcm_playback = 1, 280 .dpcm_playback = 1,
145 .dpcm_capture = 1, 281 .dpcm_capture = 1,
146 .ops = &byt_aif1_ops, 282 .ops = &byt_rt5640_aif1_ops,
283 },
284 [MERR_DPCM_DEEP_BUFFER] = {
285 .name = "Deep-Buffer Audio Port",
286 .stream_name = "Deep-Buffer Audio",
287 .cpu_dai_name = "deepbuffer-cpu-dai",
288 .codec_dai_name = "snd-soc-dummy-dai",
289 .codec_name = "snd-soc-dummy",
290 .platform_name = "sst-mfld-platform",
291 .ignore_suspend = 1,
292 .nonatomic = true,
293 .dynamic = 1,
294 .dpcm_playback = 1,
295 .ops = &byt_rt5640_aif1_ops,
147 }, 296 },
148 [MERR_DPCM_COMPR] = { 297 [MERR_DPCM_COMPR] = {
149 .name = "Baytrail Compressed Port", 298 .name = "Baytrail Compressed Port",
@@ -161,58 +310,69 @@ static struct snd_soc_dai_link byt_dailink[] = {
161 .platform_name = "sst-mfld-platform", 310 .platform_name = "sst-mfld-platform",
162 .no_pcm = 1, 311 .no_pcm = 1,
163 .codec_dai_name = "rt5640-aif1", 312 .codec_dai_name = "rt5640-aif1",
164 .codec_name = "i2c-10EC5640:00", 313 .codec_name = "i2c-10EC5640:00", /* overwritten with HID */
165 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF 314 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
166 | SND_SOC_DAIFMT_CBS_CFS, 315 | SND_SOC_DAIFMT_CBS_CFS,
167 .be_hw_params_fixup = byt_codec_fixup, 316 .be_hw_params_fixup = byt_rt5640_codec_fixup,
168 .ignore_suspend = 1, 317 .ignore_suspend = 1,
169 .dpcm_playback = 1, 318 .dpcm_playback = 1,
170 .dpcm_capture = 1, 319 .dpcm_capture = 1,
171 .ops = &byt_be_ssp2_ops, 320 .init = byt_rt5640_init,
321 .ops = &byt_rt5640_be_ssp2_ops,
172 }, 322 },
173}; 323};
174 324
175/* SoC card */ 325/* SoC card */
176static struct snd_soc_card snd_soc_card_byt = { 326static struct snd_soc_card byt_rt5640_card = {
177 .name = "baytrailcraudio", 327 .name = "bytcr-rt5640",
178 .owner = THIS_MODULE, 328 .owner = THIS_MODULE,
179 .dai_link = byt_dailink, 329 .dai_link = byt_rt5640_dais,
180 .num_links = ARRAY_SIZE(byt_dailink), 330 .num_links = ARRAY_SIZE(byt_rt5640_dais),
181 .dapm_widgets = byt_dapm_widgets, 331 .dapm_widgets = byt_rt5640_widgets,
182 .num_dapm_widgets = ARRAY_SIZE(byt_dapm_widgets), 332 .num_dapm_widgets = ARRAY_SIZE(byt_rt5640_widgets),
183 .dapm_routes = byt_audio_map, 333 .dapm_routes = byt_rt5640_audio_map,
184 .num_dapm_routes = ARRAY_SIZE(byt_audio_map), 334 .num_dapm_routes = ARRAY_SIZE(byt_rt5640_audio_map),
185 .controls = byt_mc_controls, 335 .fully_routed = true,
186 .num_controls = ARRAY_SIZE(byt_mc_controls),
187}; 336};
188 337
189static int snd_byt_mc_probe(struct platform_device *pdev) 338static char byt_rt5640_codec_name[16]; /* i2c-<HID>:00 with HID being 8 chars */
339
340static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
190{ 341{
191 int ret_val = 0; 342 int ret_val = 0;
343 struct sst_acpi_mach *mach;
192 344
193 /* register the soc card */ 345 /* register the soc card */
194 snd_soc_card_byt.dev = &pdev->dev; 346 byt_rt5640_card.dev = &pdev->dev;
347 mach = byt_rt5640_card.dev->platform_data;
348
349 /* fixup codec name based on HID */
350 snprintf(byt_rt5640_codec_name, sizeof(byt_rt5640_codec_name),
351 "%s%s%s", "i2c-", mach->id, ":00");
352 byt_rt5640_dais[MERR_DPCM_COMPR+1].codec_name = byt_rt5640_codec_name;
353
354 ret_val = devm_snd_soc_register_card(&pdev->dev, &byt_rt5640_card);
195 355
196 ret_val = devm_snd_soc_register_card(&pdev->dev, &snd_soc_card_byt);
197 if (ret_val) { 356 if (ret_val) {
198 dev_err(&pdev->dev, "devm_snd_soc_register_card failed %d\n", ret_val); 357 dev_err(&pdev->dev, "devm_snd_soc_register_card failed %d\n",
358 ret_val);
199 return ret_val; 359 return ret_val;
200 } 360 }
201 platform_set_drvdata(pdev, &snd_soc_card_byt); 361 platform_set_drvdata(pdev, &byt_rt5640_card);
202 return ret_val; 362 return ret_val;
203} 363}
204 364
205static struct platform_driver snd_byt_mc_driver = { 365static struct platform_driver snd_byt_rt5640_mc_driver = {
206 .driver = { 366 .driver = {
207 .name = "bytt100_rt5640", 367 .name = "bytcr_rt5640",
208 .pm = &snd_soc_pm_ops, 368 .pm = &snd_soc_pm_ops,
209 }, 369 },
210 .probe = snd_byt_mc_probe, 370 .probe = snd_byt_rt5640_mc_probe,
211}; 371};
212 372
213module_platform_driver(snd_byt_mc_driver); 373module_platform_driver(snd_byt_rt5640_mc_driver);
214 374
215MODULE_DESCRIPTION("ASoC Intel(R) Baytrail CR Machine driver"); 375MODULE_DESCRIPTION("ASoC Intel(R) Baytrail CR Machine driver");
216MODULE_AUTHOR("Subhransu S. Prusty <subhransu.s.prusty@intel.com>"); 376MODULE_AUTHOR("Subhransu S. Prusty <subhransu.s.prusty@intel.com>");
217MODULE_LICENSE("GPL v2"); 377MODULE_LICENSE("GPL v2");
218MODULE_ALIAS("platform:bytt100_rt5640"); 378MODULE_ALIAS("platform:bytcr_rt5640");
diff --git a/sound/soc/intel/boards/bytcr_rt5651.c b/sound/soc/intel/boards/bytcr_rt5651.c
new file mode 100644
index 000000000000..1c95ccc886c4
--- /dev/null
+++ b/sound/soc/intel/boards/bytcr_rt5651.c
@@ -0,0 +1,332 @@
1/*
2 * bytcr_rt5651.c - ASoc Machine driver for Intel Byt CR platform
3 * (derived from bytcr_rt5640.c)
4 *
5 * Copyright (C) 2015 Intel Corp
6 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; version 2 of the License.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18 */
19
20#include <linux/init.h>
21#include <linux/module.h>
22#include <linux/platform_device.h>
23#include <linux/acpi.h>
24#include <linux/device.h>
25#include <linux/dmi.h>
26#include <linux/slab.h>
27#include <sound/pcm.h>
28#include <sound/pcm_params.h>
29#include <sound/soc.h>
30#include <sound/jack.h>
31#include "../../codecs/rt5651.h"
32#include "../atom/sst-atom-controls.h"
33
34static const struct snd_soc_dapm_widget byt_rt5651_widgets[] = {
35 SND_SOC_DAPM_HP("Headphone", NULL),
36 SND_SOC_DAPM_MIC("Headset Mic", NULL),
37 SND_SOC_DAPM_MIC("Internal Mic", NULL),
38 SND_SOC_DAPM_SPK("Speaker", NULL),
39};
40
41static const struct snd_soc_dapm_route byt_rt5651_audio_map[] = {
42 {"AIF1 Playback", NULL, "ssp2 Tx"},
43 {"ssp2 Tx", NULL, "codec_out0"},
44 {"ssp2 Tx", NULL, "codec_out1"},
45 {"codec_in0", NULL, "ssp2 Rx"},
46 {"codec_in1", NULL, "ssp2 Rx"},
47 {"ssp2 Rx", NULL, "AIF1 Capture"},
48
49 {"Headset Mic", NULL, "micbias1"}, /* lowercase for rt5651 */
50 {"IN2P", NULL, "Headset Mic"},
51 {"Headphone", NULL, "HPOL"},
52 {"Headphone", NULL, "HPOR"},
53 {"Speaker", NULL, "LOUTL"},
54 {"Speaker", NULL, "LOUTR"},
55};
56
57static const struct snd_soc_dapm_route byt_rt5651_intmic_dmic1_map[] = {
58 {"DMIC1", NULL, "Internal Mic"},
59};
60
61static const struct snd_soc_dapm_route byt_rt5651_intmic_dmic2_map[] = {
62 {"DMIC2", NULL, "Internal Mic"},
63};
64
65static const struct snd_soc_dapm_route byt_rt5651_intmic_in1_map[] = {
66 {"Internal Mic", NULL, "micbias1"},
67 {"IN1P", NULL, "Internal Mic"},
68};
69
70enum {
71 BYT_RT5651_DMIC1_MAP,
72 BYT_RT5651_DMIC2_MAP,
73 BYT_RT5651_IN1_MAP,
74};
75
76#define BYT_RT5651_MAP(quirk) ((quirk) & 0xff)
77#define BYT_RT5651_DMIC_EN BIT(16)
78
79static unsigned long byt_rt5651_quirk = BYT_RT5651_DMIC1_MAP |
80 BYT_RT5651_DMIC_EN;
81
82static const struct snd_kcontrol_new byt_rt5651_controls[] = {
83 SOC_DAPM_PIN_SWITCH("Headphone"),
84 SOC_DAPM_PIN_SWITCH("Headset Mic"),
85 SOC_DAPM_PIN_SWITCH("Internal Mic"),
86 SOC_DAPM_PIN_SWITCH("Speaker"),
87};
88
89static int byt_rt5651_aif1_hw_params(struct snd_pcm_substream *substream,
90 struct snd_pcm_hw_params *params)
91{
92 struct snd_soc_pcm_runtime *rtd = substream->private_data;
93 struct snd_soc_dai *codec_dai = rtd->codec_dai;
94 int ret;
95
96 snd_soc_dai_set_bclk_ratio(codec_dai, 50);
97
98 ret = snd_soc_dai_set_sysclk(codec_dai, RT5651_SCLK_S_PLL1,
99 params_rate(params) * 512,
100 SND_SOC_CLOCK_IN);
101 if (ret < 0) {
102 dev_err(rtd->dev, "can't set codec clock %d\n", ret);
103 return ret;
104 }
105
106 ret = snd_soc_dai_set_pll(codec_dai, 0, RT5651_PLL1_S_BCLK1,
107 params_rate(params) * 50,
108 params_rate(params) * 512);
109 if (ret < 0) {
110 dev_err(rtd->dev, "can't set codec pll: %d\n", ret);
111 return ret;
112 }
113
114 return 0;
115}
116
117static const struct dmi_system_id byt_rt5651_quirk_table[] = {
118 {}
119};
120
121static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime)
122{
123 int ret;
124 struct snd_soc_card *card = runtime->card;
125 const struct snd_soc_dapm_route *custom_map;
126 int num_routes;
127
128 card->dapm.idle_bias_off = true;
129
130 dmi_check_system(byt_rt5651_quirk_table);
131 switch (BYT_RT5651_MAP(byt_rt5651_quirk)) {
132 case BYT_RT5651_IN1_MAP:
133 custom_map = byt_rt5651_intmic_in1_map;
134 num_routes = ARRAY_SIZE(byt_rt5651_intmic_in1_map);
135 break;
136 case BYT_RT5651_DMIC2_MAP:
137 custom_map = byt_rt5651_intmic_dmic2_map;
138 num_routes = ARRAY_SIZE(byt_rt5651_intmic_dmic2_map);
139 break;
140 default:
141 custom_map = byt_rt5651_intmic_dmic1_map;
142 num_routes = ARRAY_SIZE(byt_rt5651_intmic_dmic1_map);
143 }
144
145 ret = snd_soc_add_card_controls(card, byt_rt5651_controls,
146 ARRAY_SIZE(byt_rt5651_controls));
147 if (ret) {
148 dev_err(card->dev, "unable to add card controls\n");
149 return ret;
150 }
151 snd_soc_dapm_ignore_suspend(&card->dapm, "Headphone");
152 snd_soc_dapm_ignore_suspend(&card->dapm, "Speaker");
153
154 return ret;
155}
156
157static const struct snd_soc_pcm_stream byt_rt5651_dai_params = {
158 .formats = SNDRV_PCM_FMTBIT_S24_LE,
159 .rate_min = 48000,
160 .rate_max = 48000,
161 .channels_min = 2,
162 .channels_max = 2,
163};
164
165static int byt_rt5651_codec_fixup(struct snd_soc_pcm_runtime *rtd,
166 struct snd_pcm_hw_params *params)
167{
168 struct snd_interval *rate = hw_param_interval(params,
169 SNDRV_PCM_HW_PARAM_RATE);
170 struct snd_interval *channels = hw_param_interval(params,
171 SNDRV_PCM_HW_PARAM_CHANNELS);
172 int ret;
173
174 /* The DSP will covert the FE rate to 48k, stereo, 24bits */
175 rate->min = rate->max = 48000;
176 channels->min = channels->max = 2;
177
178 /* set SSP2 to 24-bit */
179 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
180
181 /*
182 * Default mode for SSP configuration is TDM 4 slot, override config
183 * with explicit setting to I2S 2ch 24-bit. The word length is set with
184 * dai_set_tdm_slot() since there is no other API exposed
185 */
186 ret = snd_soc_dai_set_fmt(rtd->cpu_dai,
187 SND_SOC_DAIFMT_I2S |
188 SND_SOC_DAIFMT_NB_IF |
189 SND_SOC_DAIFMT_CBS_CFS
190 );
191
192 if (ret < 0) {
193 dev_err(rtd->dev, "can't set format to I2S, err %d\n", ret);
194 return ret;
195 }
196
197 ret = snd_soc_dai_set_tdm_slot(rtd->cpu_dai, 0x3, 0x3, 2, 24);
198 if (ret < 0) {
199 dev_err(rtd->dev, "can't set I2S config, err %d\n", ret);
200 return ret;
201 }
202
203 return 0;
204}
205
206static unsigned int rates_48000[] = {
207 48000,
208};
209
210static struct snd_pcm_hw_constraint_list constraints_48000 = {
211 .count = ARRAY_SIZE(rates_48000),
212 .list = rates_48000,
213};
214
215static int byt_rt5651_aif1_startup(struct snd_pcm_substream *substream)
216{
217 return snd_pcm_hw_constraint_list(substream->runtime, 0,
218 SNDRV_PCM_HW_PARAM_RATE,
219 &constraints_48000);
220}
221
222static struct snd_soc_ops byt_rt5651_aif1_ops = {
223 .startup = byt_rt5651_aif1_startup,
224};
225
226static struct snd_soc_ops byt_rt5651_be_ssp2_ops = {
227 .hw_params = byt_rt5651_aif1_hw_params,
228};
229
230static struct snd_soc_dai_link byt_rt5651_dais[] = {
231 [MERR_DPCM_AUDIO] = {
232 .name = "Audio Port",
233 .stream_name = "Audio",
234 .cpu_dai_name = "media-cpu-dai",
235 .codec_dai_name = "snd-soc-dummy-dai",
236 .codec_name = "snd-soc-dummy",
237 .platform_name = "sst-mfld-platform",
238 .ignore_suspend = 1,
239 .nonatomic = true,
240 .dynamic = 1,
241 .dpcm_playback = 1,
242 .dpcm_capture = 1,
243 .ops = &byt_rt5651_aif1_ops,
244 },
245 [MERR_DPCM_DEEP_BUFFER] = {
246 .name = "Deep-Buffer Audio Port",
247 .stream_name = "Deep-Buffer Audio",
248 .cpu_dai_name = "deepbuffer-cpu-dai",
249 .codec_dai_name = "snd-soc-dummy-dai",
250 .codec_name = "snd-soc-dummy",
251 .platform_name = "sst-mfld-platform",
252 .ignore_suspend = 1,
253 .nonatomic = true,
254 .dynamic = 1,
255 .dpcm_playback = 1,
256 .ops = &byt_rt5651_aif1_ops,
257 },
258 [MERR_DPCM_COMPR] = {
259 .name = "Compressed Port",
260 .stream_name = "Compress",
261 .cpu_dai_name = "compress-cpu-dai",
262 .codec_dai_name = "snd-soc-dummy-dai",
263 .codec_name = "snd-soc-dummy",
264 .platform_name = "sst-mfld-platform",
265 },
266 /* CODEC<->CODEC link */
267 /* back ends */
268 {
269 .name = "SSP2-Codec",
270 .be_id = 1,
271 .cpu_dai_name = "ssp2-port",
272 .platform_name = "sst-mfld-platform",
273 .no_pcm = 1,
274 .codec_dai_name = "rt5651-aif1",
275 .codec_name = "i2c-10EC5651:00",
276 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
277 | SND_SOC_DAIFMT_CBS_CFS,
278 .be_hw_params_fixup = byt_rt5651_codec_fixup,
279 .ignore_suspend = 1,
280 .nonatomic = true,
281 .dpcm_playback = 1,
282 .dpcm_capture = 1,
283 .init = byt_rt5651_init,
284 .ops = &byt_rt5651_be_ssp2_ops,
285 },
286};
287
288/* SoC card */
289static struct snd_soc_card byt_rt5651_card = {
290 .name = "bytcr-rt5651",
291 .owner = THIS_MODULE,
292 .dai_link = byt_rt5651_dais,
293 .num_links = ARRAY_SIZE(byt_rt5651_dais),
294 .dapm_widgets = byt_rt5651_widgets,
295 .num_dapm_widgets = ARRAY_SIZE(byt_rt5651_widgets),
296 .dapm_routes = byt_rt5651_audio_map,
297 .num_dapm_routes = ARRAY_SIZE(byt_rt5651_audio_map),
298 .fully_routed = true,
299};
300
301static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
302{
303 int ret_val = 0;
304
305 /* register the soc card */
306 byt_rt5651_card.dev = &pdev->dev;
307
308 ret_val = devm_snd_soc_register_card(&pdev->dev, &byt_rt5651_card);
309
310 if (ret_val) {
311 dev_err(&pdev->dev, "devm_snd_soc_register_card failed %d\n",
312 ret_val);
313 return ret_val;
314 }
315 platform_set_drvdata(pdev, &byt_rt5651_card);
316 return ret_val;
317}
318
319static struct platform_driver snd_byt_rt5651_mc_driver = {
320 .driver = {
321 .name = "bytcr_rt5651",
322 .pm = &snd_soc_pm_ops,
323 },
324 .probe = snd_byt_rt5651_mc_probe,
325};
326
327module_platform_driver(snd_byt_rt5651_mc_driver);
328
329MODULE_DESCRIPTION("ASoC Intel(R) Baytrail CR Machine driver for RT5651");
330MODULE_AUTHOR("Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>");
331MODULE_LICENSE("GPL v2");
332MODULE_ALIAS("platform:bytcr_rt5651");
diff --git a/sound/soc/intel/boards/cht_bsw_max98090_ti.c b/sound/soc/intel/boards/cht_bsw_max98090_ti.c
index 4e2fcf188dd1..90588d6e64fc 100644
--- a/sound/soc/intel/boards/cht_bsw_max98090_ti.c
+++ b/sound/soc/intel/boards/cht_bsw_max98090_ti.c
@@ -41,12 +41,9 @@ struct cht_mc_private {
41 41
42static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card) 42static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
43{ 43{
44 int i; 44 struct snd_soc_pcm_runtime *rtd;
45 45
46 for (i = 0; i < card->num_rtd; i++) { 46 list_for_each_entry(rtd, &card->rtd_list, list) {
47 struct snd_soc_pcm_runtime *rtd;
48
49 rtd = card->rtd + i;
50 if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI, 47 if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
51 strlen(CHT_CODEC_DAI))) 48 strlen(CHT_CODEC_DAI)))
52 return rtd->codec_dai; 49 return rtd->codec_dai;
@@ -235,6 +232,18 @@ static struct snd_soc_dai_link cht_dailink[] = {
235 .dpcm_capture = 1, 232 .dpcm_capture = 1,
236 .ops = &cht_aif1_ops, 233 .ops = &cht_aif1_ops,
237 }, 234 },
235 [MERR_DPCM_DEEP_BUFFER] = {
236 .name = "Deep-Buffer Audio Port",
237 .stream_name = "Deep-Buffer Audio",
238 .cpu_dai_name = "deepbuffer-cpu-dai",
239 .codec_dai_name = "snd-soc-dummy-dai",
240 .codec_name = "snd-soc-dummy",
241 .platform_name = "sst-mfld-platform",
242 .nonatomic = true,
243 .dynamic = 1,
244 .dpcm_playback = 1,
245 .ops = &cht_aif1_ops,
246 },
238 [MERR_DPCM_COMPR] = { 247 [MERR_DPCM_COMPR] = {
239 .name = "Compressed Port", 248 .name = "Compressed Port",
240 .stream_name = "Compress", 249 .stream_name = "Compress",
diff --git a/sound/soc/intel/boards/cht_bsw_rt5645.c b/sound/soc/intel/boards/cht_bsw_rt5645.c
index 38d65a3529c4..2d3afddb0a2e 100644
--- a/sound/soc/intel/boards/cht_bsw_rt5645.c
+++ b/sound/soc/intel/boards/cht_bsw_rt5645.c
@@ -47,12 +47,9 @@ struct cht_mc_private {
47 47
48static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card) 48static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
49{ 49{
50 int i; 50 struct snd_soc_pcm_runtime *rtd;
51
52 for (i = 0; i < card->num_rtd; i++) {
53 struct snd_soc_pcm_runtime *rtd;
54 51
55 rtd = card->rtd + i; 52 list_for_each_entry(rtd, &card->rtd_list, list) {
56 if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI, 53 if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
57 strlen(CHT_CODEC_DAI))) 54 strlen(CHT_CODEC_DAI)))
58 return rtd->codec_dai; 55 return rtd->codec_dai;
@@ -263,6 +260,18 @@ static struct snd_soc_dai_link cht_dailink[] = {
263 .dpcm_capture = 1, 260 .dpcm_capture = 1,
264 .ops = &cht_aif1_ops, 261 .ops = &cht_aif1_ops,
265 }, 262 },
263 [MERR_DPCM_DEEP_BUFFER] = {
264 .name = "Deep-Buffer Audio Port",
265 .stream_name = "Deep-Buffer Audio",
266 .cpu_dai_name = "deepbuffer-cpu-dai",
267 .codec_dai_name = "snd-soc-dummy-dai",
268 .codec_name = "snd-soc-dummy",
269 .platform_name = "sst-mfld-platform",
270 .nonatomic = true,
271 .dynamic = 1,
272 .dpcm_playback = 1,
273 .ops = &cht_aif1_ops,
274 },
266 [MERR_DPCM_COMPR] = { 275 [MERR_DPCM_COMPR] = {
267 .name = "Compressed Port", 276 .name = "Compressed Port",
268 .stream_name = "Compress", 277 .stream_name = "Compress",
diff --git a/sound/soc/intel/boards/cht_bsw_rt5672.c b/sound/soc/intel/boards/cht_bsw_rt5672.c
index 5621ccd92992..2e5347f8f96c 100644
--- a/sound/soc/intel/boards/cht_bsw_rt5672.c
+++ b/sound/soc/intel/boards/cht_bsw_rt5672.c
@@ -46,12 +46,9 @@ static struct snd_soc_jack_pin cht_bsw_headset_pins[] = {
46 46
47static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card) 47static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
48{ 48{
49 int i; 49 struct snd_soc_pcm_runtime *rtd;
50 50
51 for (i = 0; i < card->num_rtd; i++) { 51 list_for_each_entry(rtd, &card->rtd_list, list) {
52 struct snd_soc_pcm_runtime *rtd;
53
54 rtd = card->rtd + i;
55 if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI, 52 if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
56 strlen(CHT_CODEC_DAI))) 53 strlen(CHT_CODEC_DAI)))
57 return rtd->codec_dai; 54 return rtd->codec_dai;
@@ -251,6 +248,18 @@ static struct snd_soc_dai_link cht_dailink[] = {
251 .dpcm_capture = 1, 248 .dpcm_capture = 1,
252 .ops = &cht_aif1_ops, 249 .ops = &cht_aif1_ops,
253 }, 250 },
251 [MERR_DPCM_DEEP_BUFFER] = {
252 .name = "Deep-Buffer Audio Port",
253 .stream_name = "Deep-Buffer Audio",
254 .cpu_dai_name = "deepbuffer-cpu-dai",
255 .codec_dai_name = "snd-soc-dummy-dai",
256 .codec_name = "snd-soc-dummy",
257 .platform_name = "sst-mfld-platform",
258 .nonatomic = true,
259 .dynamic = 1,
260 .dpcm_playback = 1,
261 .ops = &cht_aif1_ops,
262 },
254 [MERR_DPCM_COMPR] = { 263 [MERR_DPCM_COMPR] = {
255 .name = "Compressed Port", 264 .name = "Compressed Port",
256 .stream_name = "Compress", 265 .stream_name = "Compress",
diff --git a/sound/soc/intel/boards/skl_nau88l25_max98357a.c b/sound/soc/intel/boards/skl_nau88l25_max98357a.c
new file mode 100644
index 000000000000..ab7da9c304b2
--- /dev/null
+++ b/sound/soc/intel/boards/skl_nau88l25_max98357a.c
@@ -0,0 +1,485 @@
1/*
2 * Intel Skylake I2S Machine Driver with MAXIM98357A
3 * and NAU88L25
4 *
5 * Copyright (C) 2015, Intel Corporation. All rights reserved.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License version
9 * 2 as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 */
16
17#include <linux/module.h>
18#include <linux/platform_device.h>
19#include <sound/core.h>
20#include <sound/jack.h>
21#include <sound/pcm.h>
22#include <sound/pcm_params.h>
23#include <sound/soc.h>
24#include "../../codecs/nau8825.h"
25
26#define SKL_NUVOTON_CODEC_DAI "nau8825-hifi"
27#define SKL_MAXIM_CODEC_DAI "HiFi"
28
29static struct snd_soc_jack skylake_headset;
30static struct snd_soc_card skylake_audio_card;
31
32static inline struct snd_soc_dai *skl_get_codec_dai(struct snd_soc_card *card)
33{
34 struct snd_soc_pcm_runtime *rtd;
35
36 list_for_each_entry(rtd, &card->rtd_list, list) {
37
38 if (!strncmp(rtd->codec_dai->name, SKL_NUVOTON_CODEC_DAI,
39 strlen(SKL_NUVOTON_CODEC_DAI)))
40 return rtd->codec_dai;
41 }
42
43 return NULL;
44}
45
46static int platform_clock_control(struct snd_soc_dapm_widget *w,
47 struct snd_kcontrol *k, int event)
48{
49 struct snd_soc_dapm_context *dapm = w->dapm;
50 struct snd_soc_card *card = dapm->card;
51 struct snd_soc_dai *codec_dai;
52 int ret;
53
54 codec_dai = skl_get_codec_dai(card);
55 if (!codec_dai) {
56 dev_err(card->dev, "Codec dai not found; Unable to set platform clock\n");
57 return -EIO;
58 }
59
60 if (SND_SOC_DAPM_EVENT_ON(event)) {
61 ret = snd_soc_dai_set_sysclk(codec_dai,
62 NAU8825_CLK_MCLK, 24000000, SND_SOC_CLOCK_IN);
63 if (ret < 0) {
64 dev_err(card->dev, "set sysclk err = %d\n", ret);
65 return -EIO;
66 }
67 } else {
68 ret = snd_soc_dai_set_sysclk(codec_dai,
69 NAU8825_CLK_INTERNAL, 0, SND_SOC_CLOCK_IN);
70 if (ret < 0) {
71 dev_err(card->dev, "set sysclk err = %d\n", ret);
72 return -EIO;
73 }
74 }
75
76 return ret;
77}
78
79static const struct snd_kcontrol_new skylake_controls[] = {
80 SOC_DAPM_PIN_SWITCH("Headphone Jack"),
81 SOC_DAPM_PIN_SWITCH("Headset Mic"),
82 SOC_DAPM_PIN_SWITCH("Spk"),
83};
84
85static const struct snd_soc_dapm_widget skylake_widgets[] = {
86 SND_SOC_DAPM_HP("Headphone Jack", NULL),
87 SND_SOC_DAPM_MIC("Headset Mic", NULL),
88 SND_SOC_DAPM_SPK("Spk", NULL),
89 SND_SOC_DAPM_MIC("SoC DMIC", NULL),
90 SND_SOC_DAPM_SINK("WoV Sink"),
91 SND_SOC_DAPM_SPK("DP", NULL),
92 SND_SOC_DAPM_SPK("HDMI", NULL),
93 SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
94 platform_clock_control, SND_SOC_DAPM_PRE_PMU |
95 SND_SOC_DAPM_POST_PMD),
96};
97
98static const struct snd_soc_dapm_route skylake_map[] = {
99 /* HP jack connectors - unknown if we have jack detection */
100 { "Headphone Jack", NULL, "HPOL" },
101 { "Headphone Jack", NULL, "HPOR" },
102
103 /* speaker */
104 { "Spk", NULL, "Speaker" },
105
106 /* other jacks */
107 { "MIC", NULL, "Headset Mic" },
108 { "DMic", NULL, "SoC DMIC" },
109
110 {"WoV Sink", NULL, "hwd_in sink"},
111 {"HDMI", NULL, "hif5 Output"},
112 {"DP", NULL, "hif6 Output"},
113
114 /* CODEC BE connections */
115 { "HiFi Playback", NULL, "ssp0 Tx" },
116 { "ssp0 Tx", NULL, "codec0_out" },
117
118 { "Playback", NULL, "ssp1 Tx" },
119 { "ssp1 Tx", NULL, "codec1_out" },
120
121 { "codec0_in", NULL, "ssp1 Rx" },
122 { "ssp1 Rx", NULL, "Capture" },
123
124 /* DMIC */
125 { "dmic01_hifi", NULL, "DMIC01 Rx" },
126 { "DMIC01 Rx", NULL, "DMIC AIF" },
127 { "hifi1", NULL, "iDisp Tx"},
128 { "iDisp Tx", NULL, "iDisp_out"},
129 { "Headphone Jack", NULL, "Platform Clock" },
130 { "Headset Mic", NULL, "Platform Clock" },
131};
132
133static int skylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
134 struct snd_pcm_hw_params *params)
135{
136 struct snd_interval *rate = hw_param_interval(params,
137 SNDRV_PCM_HW_PARAM_RATE);
138 struct snd_interval *channels = hw_param_interval(params,
139 SNDRV_PCM_HW_PARAM_CHANNELS);
140 struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
141
142 /* The ADSP will covert the FE rate to 48k, stereo */
143 rate->min = rate->max = 48000;
144 channels->min = channels->max = 2;
145
146 /* set SSP0 to 24 bit */
147 snd_mask_none(fmt);
148 snd_mask_set(fmt, SNDRV_PCM_FORMAT_S24_LE);
149
150 return 0;
151}
152
153static int skylake_nau8825_codec_init(struct snd_soc_pcm_runtime *rtd)
154{
155 int ret;
156 struct snd_soc_codec *codec = rtd->codec;
157
158 /*
159 * Headset buttons map to the google Reference headset.
160 * These can be configured by userspace.
161 */
162 ret = snd_soc_card_jack_new(&skylake_audio_card, "Headset Jack",
163 SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 |
164 SND_JACK_BTN_2 | SND_JACK_BTN_3, &skylake_headset,
165 NULL, 0);
166 if (ret) {
167 dev_err(rtd->dev, "Headset Jack creation failed %d\n", ret);
168 return ret;
169 }
170
171 nau8825_enable_jack_detect(codec, &skylake_headset);
172
173 snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC");
174 snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "WoV Sink");
175
176 return ret;
177}
178
179static int skylake_nau8825_fe_init(struct snd_soc_pcm_runtime *rtd)
180{
181 struct snd_soc_dapm_context *dapm;
182 struct snd_soc_component *component = rtd->cpu_dai->component;
183
184 dapm = snd_soc_component_get_dapm(component);
185 snd_soc_dapm_ignore_suspend(dapm, "Reference Capture");
186
187 return 0;
188}
189
190static unsigned int rates[] = {
191 48000,
192};
193
194static struct snd_pcm_hw_constraint_list constraints_rates = {
195 .count = ARRAY_SIZE(rates),
196 .list = rates,
197 .mask = 0,
198};
199
200static unsigned int channels[] = {
201 2,
202};
203
204static struct snd_pcm_hw_constraint_list constraints_channels = {
205 .count = ARRAY_SIZE(channels),
206 .list = channels,
207 .mask = 0,
208};
209
210static int skl_fe_startup(struct snd_pcm_substream *substream)
211{
212 struct snd_pcm_runtime *runtime = substream->runtime;
213
214 /*
215 * On this platform for PCM device we support,
216 * 48Khz
217 * stereo
218 * 16 bit audio
219 */
220
221 runtime->hw.channels_max = 2;
222 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
223 &constraints_channels);
224
225 runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
226 snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
227
228 snd_pcm_hw_constraint_list(runtime, 0,
229 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
230
231 return 0;
232}
233
234static const struct snd_soc_ops skylake_nau8825_fe_ops = {
235 .startup = skl_fe_startup,
236};
237
238static int skylake_nau8825_hw_params(struct snd_pcm_substream *substream,
239 struct snd_pcm_hw_params *params)
240{
241 struct snd_soc_pcm_runtime *rtd = substream->private_data;
242 struct snd_soc_dai *codec_dai = rtd->codec_dai;
243 int ret;
244
245 ret = snd_soc_dai_set_sysclk(codec_dai,
246 NAU8825_CLK_MCLK, 24000000, SND_SOC_CLOCK_IN);
247
248 if (ret < 0)
249 dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret);
250
251 return ret;
252}
253
254static struct snd_soc_ops skylake_nau8825_ops = {
255 .hw_params = skylake_nau8825_hw_params,
256};
257
258static int skylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
259 struct snd_pcm_hw_params *params)
260{
261 struct snd_interval *channels = hw_param_interval(params,
262 SNDRV_PCM_HW_PARAM_CHANNELS);
263
264 if (params_channels(params) == 2)
265 channels->min = channels->max = 2;
266 else
267 channels->min = channels->max = 4;
268
269 return 0;
270}
271
272static unsigned int channels_dmic[] = {
273 2, 4,
274};
275
276static struct snd_pcm_hw_constraint_list constraints_dmic_channels = {
277 .count = ARRAY_SIZE(channels_dmic),
278 .list = channels_dmic,
279 .mask = 0,
280};
281
282static int skylake_dmic_startup(struct snd_pcm_substream *substream)
283{
284 struct snd_pcm_runtime *runtime = substream->runtime;
285
286 runtime->hw.channels_max = 4;
287 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
288 &constraints_dmic_channels);
289
290 return snd_pcm_hw_constraint_list(substream->runtime, 0,
291 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
292}
293
294static struct snd_soc_ops skylake_dmic_ops = {
295 .startup = skylake_dmic_startup,
296};
297
298static unsigned int rates_16000[] = {
299 16000,
300};
301
302static struct snd_pcm_hw_constraint_list constraints_16000 = {
303 .count = ARRAY_SIZE(rates_16000),
304 .list = rates_16000,
305};
306
307static int skylake_refcap_startup(struct snd_pcm_substream *substream)
308{
309 return snd_pcm_hw_constraint_list(substream->runtime, 0,
310 SNDRV_PCM_HW_PARAM_RATE,
311 &constraints_16000);
312}
313
314static struct snd_soc_ops skylaye_refcap_ops = {
315 .startup = skylake_refcap_startup,
316};
317
318/* skylake digital audio interface glue - connects codec <--> CPU */
319static struct snd_soc_dai_link skylake_dais[] = {
320 /* Front End DAI links */
321 {
322 .name = "Skl Audio Port",
323 .stream_name = "Audio",
324 .cpu_dai_name = "System Pin",
325 .platform_name = "0000:00:1f.3",
326 .dynamic = 1,
327 .codec_name = "snd-soc-dummy",
328 .codec_dai_name = "snd-soc-dummy-dai",
329 .nonatomic = 1,
330 .init = skylake_nau8825_fe_init,
331 .trigger = {
332 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
333 .dpcm_playback = 1,
334 .ops = &skylake_nau8825_fe_ops,
335 },
336 {
337 .name = "Skl Audio Capture Port",
338 .stream_name = "Audio Record",
339 .cpu_dai_name = "System Pin",
340 .platform_name = "0000:00:1f.3",
341 .dynamic = 1,
342 .codec_name = "snd-soc-dummy",
343 .codec_dai_name = "snd-soc-dummy-dai",
344 .nonatomic = 1,
345 .trigger = {
346 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
347 .dpcm_capture = 1,
348 .ops = &skylake_nau8825_fe_ops,
349 },
350 {
351 .name = "Skl Audio Reference cap",
352 .stream_name = "Wake on Voice",
353 .cpu_dai_name = "Reference Pin",
354 .codec_name = "snd-soc-dummy",
355 .codec_dai_name = "snd-soc-dummy-dai",
356 .platform_name = "0000:00:1f.3",
357 .init = NULL,
358 .dpcm_capture = 1,
359 .ignore_suspend = 1,
360 .nonatomic = 1,
361 .dynamic = 1,
362 .ops = &skylaye_refcap_ops,
363 },
364 {
365 .name = "Skl Audio DMIC cap",
366 .stream_name = "dmiccap",
367 .cpu_dai_name = "DMIC Pin",
368 .codec_name = "snd-soc-dummy",
369 .codec_dai_name = "snd-soc-dummy-dai",
370 .platform_name = "0000:00:1f.3",
371 .init = NULL,
372 .dpcm_capture = 1,
373 .nonatomic = 1,
374 .dynamic = 1,
375 .ops = &skylake_dmic_ops,
376 },
377 {
378 .name = "Skl HDMI Port",
379 .stream_name = "Hdmi",
380 .cpu_dai_name = "HDMI Pin",
381 .codec_name = "snd-soc-dummy",
382 .codec_dai_name = "snd-soc-dummy-dai",
383 .platform_name = "0000:00:1f.3",
384 .dpcm_playback = 1,
385 .init = NULL,
386 .nonatomic = 1,
387 .dynamic = 1,
388 },
389
390 /* Back End DAI links */
391 {
392 /* SSP0 - Codec */
393 .name = "SSP0-Codec",
394 .be_id = 0,
395 .cpu_dai_name = "SSP0 Pin",
396 .platform_name = "0000:00:1f.3",
397 .no_pcm = 1,
398 .codec_name = "MX98357A:00",
399 .codec_dai_name = SKL_MAXIM_CODEC_DAI,
400 .dai_fmt = SND_SOC_DAIFMT_I2S |
401 SND_SOC_DAIFMT_NB_NF |
402 SND_SOC_DAIFMT_CBS_CFS,
403 .ignore_pmdown_time = 1,
404 .be_hw_params_fixup = skylake_ssp_fixup,
405 .dpcm_playback = 1,
406 },
407 {
408 /* SSP1 - Codec */
409 .name = "SSP1-Codec",
410 .be_id = 0,
411 .cpu_dai_name = "SSP1 Pin",
412 .platform_name = "0000:00:1f.3",
413 .no_pcm = 1,
414 .codec_name = "i2c-10508825:00",
415 .codec_dai_name = SKL_NUVOTON_CODEC_DAI,
416 .init = skylake_nau8825_codec_init,
417 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
418 SND_SOC_DAIFMT_CBS_CFS,
419 .ignore_pmdown_time = 1,
420 .be_hw_params_fixup = skylake_ssp_fixup,
421 .ops = &skylake_nau8825_ops,
422 .dpcm_playback = 1,
423 .dpcm_capture = 1,
424 },
425 {
426 .name = "dmic01",
427 .be_id = 1,
428 .cpu_dai_name = "DMIC01 Pin",
429 .codec_name = "dmic-codec",
430 .codec_dai_name = "dmic-hifi",
431 .platform_name = "0000:00:1f.3",
432 .be_hw_params_fixup = skylake_dmic_fixup,
433 .ignore_suspend = 1,
434 .dpcm_capture = 1,
435 .no_pcm = 1,
436 },
437 {
438 .name = "iDisp",
439 .be_id = 3,
440 .cpu_dai_name = "iDisp Pin",
441 .codec_name = "ehdaudio0D2",
442 .codec_dai_name = "intel-hdmi-hifi1",
443 .platform_name = "0000:00:1f.3",
444 .dpcm_playback = 1,
445 .no_pcm = 1,
446 },
447};
448
449/* skylake audio machine driver for SPT + NAU88L25 */
450static struct snd_soc_card skylake_audio_card = {
451 .name = "sklnau8825max",
452 .owner = THIS_MODULE,
453 .dai_link = skylake_dais,
454 .num_links = ARRAY_SIZE(skylake_dais),
455 .controls = skylake_controls,
456 .num_controls = ARRAY_SIZE(skylake_controls),
457 .dapm_widgets = skylake_widgets,
458 .num_dapm_widgets = ARRAY_SIZE(skylake_widgets),
459 .dapm_routes = skylake_map,
460 .num_dapm_routes = ARRAY_SIZE(skylake_map),
461 .fully_routed = true,
462};
463
464static int skylake_audio_probe(struct platform_device *pdev)
465{
466 skylake_audio_card.dev = &pdev->dev;
467
468 return devm_snd_soc_register_card(&pdev->dev, &skylake_audio_card);
469}
470
471static struct platform_driver skylake_audio = {
472 .probe = skylake_audio_probe,
473 .driver = {
474 .name = "skl_nau88l25_max98357a_i2s",
475 .pm = &snd_soc_pm_ops,
476 },
477};
478
479module_platform_driver(skylake_audio)
480
481/* Module information */
482MODULE_DESCRIPTION("Audio Machine driver-NAU88L25 & MAX98357A in I2S mode");
483MODULE_AUTHOR("Rohit Ainapure <rohit.m.ainapure@intel.com");
484MODULE_LICENSE("GPL v2");
485MODULE_ALIAS("platform:skl_nau88l25_max98357a_i2s");
diff --git a/sound/soc/intel/boards/skl_nau88l25_ssm4567.c b/sound/soc/intel/boards/skl_nau88l25_ssm4567.c
new file mode 100644
index 000000000000..c071812f31e5
--- /dev/null
+++ b/sound/soc/intel/boards/skl_nau88l25_ssm4567.c
@@ -0,0 +1,536 @@
1/*
2 * Intel Skylake I2S Machine Driver for NAU88L25+SSM4567
3 *
4 * Copyright (C) 2015, Intel Corporation. All rights reserved.
5 *
6 * Modified from:
7 * Intel Skylake I2S Machine Driver for NAU88L25 and SSM4567
8 *
9 * Copyright (C) 2015, Intel Corporation. All rights reserved.
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License version
13 * 2 as published by the Free Software Foundation.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 */
20
21#include <linux/module.h>
22#include <linux/platform_device.h>
23#include <sound/core.h>
24#include <sound/pcm.h>
25#include <sound/soc.h>
26#include <sound/jack.h>
27#include <sound/pcm_params.h>
28#include "../../codecs/nau8825.h"
29
30#define SKL_NUVOTON_CODEC_DAI "nau8825-hifi"
31#define SKL_SSM_CODEC_DAI "ssm4567-hifi"
32
33static struct snd_soc_jack skylake_headset;
34static struct snd_soc_card skylake_audio_card;
35
36static inline struct snd_soc_dai *skl_get_codec_dai(struct snd_soc_card *card)
37{
38 struct snd_soc_pcm_runtime *rtd;
39
40 list_for_each_entry(rtd, &card->rtd_list, list) {
41
42 if (!strncmp(rtd->codec_dai->name, SKL_NUVOTON_CODEC_DAI,
43 strlen(SKL_NUVOTON_CODEC_DAI)))
44 return rtd->codec_dai;
45 }
46
47 return NULL;
48}
49
50static const struct snd_kcontrol_new skylake_controls[] = {
51 SOC_DAPM_PIN_SWITCH("Headphone Jack"),
52 SOC_DAPM_PIN_SWITCH("Headset Mic"),
53 SOC_DAPM_PIN_SWITCH("Left Speaker"),
54 SOC_DAPM_PIN_SWITCH("Right Speaker"),
55};
56
57static int platform_clock_control(struct snd_soc_dapm_widget *w,
58 struct snd_kcontrol *k, int event)
59{
60 struct snd_soc_dapm_context *dapm = w->dapm;
61 struct snd_soc_card *card = dapm->card;
62 struct snd_soc_dai *codec_dai;
63 int ret;
64
65 codec_dai = skl_get_codec_dai(card);
66 if (!codec_dai) {
67 dev_err(card->dev, "Codec dai not found\n");
68 return -EIO;
69 }
70
71 if (SND_SOC_DAPM_EVENT_ON(event)) {
72 ret = snd_soc_dai_set_sysclk(codec_dai,
73 NAU8825_CLK_MCLK, 24000000, SND_SOC_CLOCK_IN);
74 if (ret < 0) {
75 dev_err(card->dev, "set sysclk err = %d\n", ret);
76 return -EIO;
77 }
78 } else {
79 ret = snd_soc_dai_set_sysclk(codec_dai,
80 NAU8825_CLK_INTERNAL, 0, SND_SOC_CLOCK_IN);
81 if (ret < 0) {
82 dev_err(card->dev, "set sysclk err = %d\n", ret);
83 return -EIO;
84 }
85 }
86 return ret;
87}
88
89static const struct snd_soc_dapm_widget skylake_widgets[] = {
90 SND_SOC_DAPM_HP("Headphone Jack", NULL),
91 SND_SOC_DAPM_MIC("Headset Mic", NULL),
92 SND_SOC_DAPM_SPK("Left Speaker", NULL),
93 SND_SOC_DAPM_SPK("Right Speaker", NULL),
94 SND_SOC_DAPM_MIC("SoC DMIC", NULL),
95 SND_SOC_DAPM_SINK("WoV Sink"),
96 SND_SOC_DAPM_SPK("DP", NULL),
97 SND_SOC_DAPM_SPK("HDMI", NULL),
98 SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
99 platform_clock_control, SND_SOC_DAPM_PRE_PMU |
100 SND_SOC_DAPM_POST_PMD),
101};
102
103static const struct snd_soc_dapm_route skylake_map[] = {
104 /* HP jack connectors - unknown if we have jack detection */
105 {"Headphone Jack", NULL, "HPOL"},
106 {"Headphone Jack", NULL, "HPOR"},
107
108 /* speaker */
109 {"Left Speaker", NULL, "Left OUT"},
110 {"Right Speaker", NULL, "Right OUT"},
111
112 /* other jacks */
113 {"MIC", NULL, "Headset Mic"},
114 {"DMic", NULL, "SoC DMIC"},
115
116 {"WoV Sink", NULL, "hwd_in sink"},
117
118 {"HDMI", NULL, "hif5 Output"},
119 {"DP", NULL, "hif6 Output"},
120 /* CODEC BE connections */
121 { "Left Playback", NULL, "ssp0 Tx"},
122 { "Right Playback", NULL, "ssp0 Tx"},
123 { "ssp0 Tx", NULL, "codec0_out"},
124
125 { "Playback", NULL, "ssp1 Tx"},
126 { "ssp1 Tx", NULL, "codec1_out"},
127
128 { "codec0_in", NULL, "ssp1 Rx" },
129 { "ssp1 Rx", NULL, "Capture" },
130
131 /* DMIC */
132 { "dmic01_hifi", NULL, "DMIC01 Rx" },
133 { "DMIC01 Rx", NULL, "DMIC AIF" },
134 { "hifi1", NULL, "iDisp Tx"},
135 { "iDisp Tx", NULL, "iDisp_out"},
136 { "Headphone Jack", NULL, "Platform Clock" },
137 { "Headset Mic", NULL, "Platform Clock" },
138};
139
140static struct snd_soc_codec_conf ssm4567_codec_conf[] = {
141 {
142 .dev_name = "i2c-INT343B:00",
143 .name_prefix = "Left",
144 },
145 {
146 .dev_name = "i2c-INT343B:01",
147 .name_prefix = "Right",
148 },
149};
150
151static struct snd_soc_dai_link_component ssm4567_codec_components[] = {
152 { /* Left */
153 .name = "i2c-INT343B:00",
154 .dai_name = SKL_SSM_CODEC_DAI,
155 },
156 { /* Right */
157 .name = "i2c-INT343B:01",
158 .dai_name = SKL_SSM_CODEC_DAI,
159 },
160};
161
162static int skylake_ssm4567_codec_init(struct snd_soc_pcm_runtime *rtd)
163{
164 int ret;
165
166 /* Slot 1 for left */
167 ret = snd_soc_dai_set_tdm_slot(rtd->codec_dais[0], 0x01, 0x01, 2, 48);
168 if (ret < 0)
169 return ret;
170
171 /* Slot 2 for right */
172 ret = snd_soc_dai_set_tdm_slot(rtd->codec_dais[1], 0x02, 0x02, 2, 48);
173 if (ret < 0)
174 return ret;
175
176 return ret;
177}
178
179static int skylake_nau8825_codec_init(struct snd_soc_pcm_runtime *rtd)
180{
181 int ret;
182 struct snd_soc_codec *codec = rtd->codec;
183
184 /*
185 * 4 buttons here map to the google Reference headset
186 * The use of these buttons can be decided by the user space.
187 */
188 ret = snd_soc_card_jack_new(&skylake_audio_card, "Headset Jack",
189 SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 |
190 SND_JACK_BTN_2 | SND_JACK_BTN_3, &skylake_headset,
191 NULL, 0);
192 if (ret) {
193 dev_err(rtd->dev, "Headset Jack creation failed %d\n", ret);
194 return ret;
195 }
196
197 nau8825_enable_jack_detect(codec, &skylake_headset);
198
199 snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC");
200 snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "WoV Sink");
201
202 return ret;
203}
204
205static int skylake_nau8825_fe_init(struct snd_soc_pcm_runtime *rtd)
206{
207 struct snd_soc_dapm_context *dapm;
208 struct snd_soc_component *component = rtd->cpu_dai->component;
209
210 dapm = snd_soc_component_get_dapm(component);
211 snd_soc_dapm_ignore_suspend(dapm, "Reference Capture");
212
213 return 0;
214}
215
216static unsigned int rates[] = {
217 48000,
218};
219
220static struct snd_pcm_hw_constraint_list constraints_rates = {
221 .count = ARRAY_SIZE(rates),
222 .list = rates,
223 .mask = 0,
224};
225
226static unsigned int channels[] = {
227 2,
228};
229
230static struct snd_pcm_hw_constraint_list constraints_channels = {
231 .count = ARRAY_SIZE(channels),
232 .list = channels,
233 .mask = 0,
234};
235
236static int skl_fe_startup(struct snd_pcm_substream *substream)
237{
238 struct snd_pcm_runtime *runtime = substream->runtime;
239
240 /*
241 * on this platform for PCM device we support,
242 * 48Khz
243 * stereo
244 * 16 bit audio
245 */
246
247 runtime->hw.channels_max = 2;
248 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
249 &constraints_channels);
250
251 runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
252 snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
253
254 snd_pcm_hw_constraint_list(runtime, 0,
255 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
256
257 return 0;
258}
259
260static const struct snd_soc_ops skylake_nau8825_fe_ops = {
261 .startup = skl_fe_startup,
262};
263
264static int skylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
265 struct snd_pcm_hw_params *params)
266{
267 struct snd_interval *rate = hw_param_interval(params,
268 SNDRV_PCM_HW_PARAM_RATE);
269 struct snd_interval *channels = hw_param_interval(params,
270 SNDRV_PCM_HW_PARAM_CHANNELS);
271 struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
272
273 /* The ADSP will covert the FE rate to 48k, stereo */
274 rate->min = rate->max = 48000;
275 channels->min = channels->max = 2;
276
277 /* set SSP0 to 24 bit */
278 snd_mask_none(fmt);
279 snd_mask_set(fmt, SNDRV_PCM_FORMAT_S24_LE);
280 return 0;
281}
282
283static int skylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
284 struct snd_pcm_hw_params *params)
285{
286 struct snd_interval *channels = hw_param_interval(params,
287 SNDRV_PCM_HW_PARAM_CHANNELS);
288 if (params_channels(params) == 2)
289 channels->min = channels->max = 2;
290 else
291 channels->min = channels->max = 4;
292
293 return 0;
294}
295
296static int skylake_nau8825_hw_params(struct snd_pcm_substream *substream,
297 struct snd_pcm_hw_params *params)
298{
299 struct snd_soc_pcm_runtime *rtd = substream->private_data;
300 struct snd_soc_dai *codec_dai = rtd->codec_dai;
301 int ret;
302
303 ret = snd_soc_dai_set_sysclk(codec_dai,
304 NAU8825_CLK_MCLK, 24000000, SND_SOC_CLOCK_IN);
305
306 if (ret < 0)
307 dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret);
308
309 return ret;
310}
311
312static struct snd_soc_ops skylake_nau8825_ops = {
313 .hw_params = skylake_nau8825_hw_params,
314};
315
316static unsigned int channels_dmic[] = {
317 2, 4,
318};
319
320static struct snd_pcm_hw_constraint_list constraints_dmic_channels = {
321 .count = ARRAY_SIZE(channels_dmic),
322 .list = channels_dmic,
323 .mask = 0,
324};
325
326static int skylake_dmic_startup(struct snd_pcm_substream *substream)
327{
328 struct snd_pcm_runtime *runtime = substream->runtime;
329
330 runtime->hw.channels_max = 4;
331 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
332 &constraints_dmic_channels);
333
334 return snd_pcm_hw_constraint_list(substream->runtime, 0,
335 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
336}
337
338static struct snd_soc_ops skylake_dmic_ops = {
339 .startup = skylake_dmic_startup,
340};
341
342static unsigned int rates_16000[] = {
343 16000,
344};
345
346static struct snd_pcm_hw_constraint_list constraints_16000 = {
347 .count = ARRAY_SIZE(rates_16000),
348 .list = rates_16000,
349};
350
351static int skylake_refcap_startup(struct snd_pcm_substream *substream)
352{
353 return snd_pcm_hw_constraint_list(substream->runtime, 0,
354 SNDRV_PCM_HW_PARAM_RATE,
355 &constraints_16000);
356}
357
358static struct snd_soc_ops skylaye_refcap_ops = {
359 .startup = skylake_refcap_startup,
360};
361
362/* skylake digital audio interface glue - connects codec <--> CPU */
363static struct snd_soc_dai_link skylake_dais[] = {
364 /* Front End DAI links */
365 {
366 .name = "Skl Audio Port",
367 .stream_name = "Audio",
368 .cpu_dai_name = "System Pin",
369 .platform_name = "0000:00:1f.3",
370 .dynamic = 1,
371 .codec_name = "snd-soc-dummy",
372 .codec_dai_name = "snd-soc-dummy-dai",
373 .nonatomic = 1,
374 .init = skylake_nau8825_fe_init,
375 .trigger = {
376 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
377 .dpcm_playback = 1,
378 .ops = &skylake_nau8825_fe_ops,
379 },
380 {
381 .name = "Skl Audio Capture Port",
382 .stream_name = "Audio Record",
383 .cpu_dai_name = "System Pin",
384 .platform_name = "0000:00:1f.3",
385 .dynamic = 1,
386 .codec_name = "snd-soc-dummy",
387 .codec_dai_name = "snd-soc-dummy-dai",
388 .nonatomic = 1,
389 .trigger = {
390 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
391 .dpcm_capture = 1,
392 .ops = &skylake_nau8825_fe_ops,
393 },
394 {
395 .name = "Skl Audio Reference cap",
396 .stream_name = "Wake on Voice",
397 .cpu_dai_name = "Reference Pin",
398 .codec_name = "snd-soc-dummy",
399 .codec_dai_name = "snd-soc-dummy-dai",
400 .platform_name = "0000:00:1f.3",
401 .init = NULL,
402 .dpcm_capture = 1,
403 .ignore_suspend = 1,
404 .nonatomic = 1,
405 .dynamic = 1,
406 .ops = &skylaye_refcap_ops,
407 },
408 {
409 .name = "Skl Audio DMIC cap",
410 .stream_name = "dmiccap",
411 .cpu_dai_name = "DMIC Pin",
412 .codec_name = "snd-soc-dummy",
413 .codec_dai_name = "snd-soc-dummy-dai",
414 .platform_name = "0000:00:1f.3",
415 .init = NULL,
416 .dpcm_capture = 1,
417 .nonatomic = 1,
418 .dynamic = 1,
419 .ops = &skylake_dmic_ops,
420 },
421 {
422 .name = "Skl HDMI Port",
423 .stream_name = "Hdmi",
424 .cpu_dai_name = "HDMI Pin",
425 .codec_name = "snd-soc-dummy",
426 .codec_dai_name = "snd-soc-dummy-dai",
427 .platform_name = "0000:00:1f.3",
428 .dpcm_playback = 1,
429 .init = NULL,
430 .nonatomic = 1,
431 .dynamic = 1,
432 },
433
434 /* Back End DAI links */
435 {
436 /* SSP0 - Codec */
437 .name = "SSP0-Codec",
438 .be_id = 0,
439 .cpu_dai_name = "SSP0 Pin",
440 .platform_name = "0000:00:1f.3",
441 .no_pcm = 1,
442 .codecs = ssm4567_codec_components,
443 .num_codecs = ARRAY_SIZE(ssm4567_codec_components),
444 .dai_fmt = SND_SOC_DAIFMT_DSP_A |
445 SND_SOC_DAIFMT_IB_NF |
446 SND_SOC_DAIFMT_CBS_CFS,
447 .init = skylake_ssm4567_codec_init,
448 .ignore_pmdown_time = 1,
449 .be_hw_params_fixup = skylake_ssp_fixup,
450 .dpcm_playback = 1,
451 },
452 {
453 /* SSP1 - Codec */
454 .name = "SSP1-Codec",
455 .be_id = 0,
456 .cpu_dai_name = "SSP1 Pin",
457 .platform_name = "0000:00:1f.3",
458 .no_pcm = 1,
459 .codec_name = "i2c-10508825:00",
460 .codec_dai_name = SKL_NUVOTON_CODEC_DAI,
461 .init = skylake_nau8825_codec_init,
462 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
463 SND_SOC_DAIFMT_CBS_CFS,
464 .ignore_pmdown_time = 1,
465 .be_hw_params_fixup = skylake_ssp_fixup,
466 .ops = &skylake_nau8825_ops,
467 .dpcm_playback = 1,
468 .dpcm_capture = 1,
469 },
470 {
471 .name = "dmic01",
472 .be_id = 1,
473 .cpu_dai_name = "DMIC01 Pin",
474 .codec_name = "dmic-codec",
475 .codec_dai_name = "dmic-hifi",
476 .platform_name = "0000:00:1f.3",
477 .ignore_suspend = 1,
478 .be_hw_params_fixup = skylake_dmic_fixup,
479 .dpcm_capture = 1,
480 .no_pcm = 1,
481 },
482 {
483 .name = "iDisp",
484 .be_id = 3,
485 .cpu_dai_name = "iDisp Pin",
486 .codec_name = "ehdaudio0D2",
487 .codec_dai_name = "intel-hdmi-hifi1",
488 .platform_name = "0000:00:1f.3",
489 .dpcm_playback = 1,
490 .no_pcm = 1,
491 },
492};
493
494/* skylake audio machine driver for SPT + NAU88L25 */
495static struct snd_soc_card skylake_audio_card = {
496 .name = "sklnau8825adi",
497 .owner = THIS_MODULE,
498 .dai_link = skylake_dais,
499 .num_links = ARRAY_SIZE(skylake_dais),
500 .controls = skylake_controls,
501 .num_controls = ARRAY_SIZE(skylake_controls),
502 .dapm_widgets = skylake_widgets,
503 .num_dapm_widgets = ARRAY_SIZE(skylake_widgets),
504 .dapm_routes = skylake_map,
505 .num_dapm_routes = ARRAY_SIZE(skylake_map),
506 .codec_conf = ssm4567_codec_conf,
507 .num_configs = ARRAY_SIZE(ssm4567_codec_conf),
508 .fully_routed = true,
509};
510
511static int skylake_audio_probe(struct platform_device *pdev)
512{
513 skylake_audio_card.dev = &pdev->dev;
514
515 return devm_snd_soc_register_card(&pdev->dev, &skylake_audio_card);
516}
517
518static struct platform_driver skylake_audio = {
519 .probe = skylake_audio_probe,
520 .driver = {
521 .name = "skl_nau88l25_ssm4567_i2s",
522 .pm = &snd_soc_pm_ops,
523 },
524};
525
526module_platform_driver(skylake_audio)
527
528/* Module information */
529MODULE_AUTHOR("Conrad Cooke <conrad.cooke@intel.com>");
530MODULE_AUTHOR("Harsha Priya <harshapriya.n@intel.com>");
531MODULE_AUTHOR("Naveen M <naveen.m@intel.com>");
532MODULE_AUTHOR("Sathya Prakash M R <sathya.prakash.m.r@intel.com>");
533MODULE_AUTHOR("Yong Zhi <yong.zhi@intel.com>");
534MODULE_DESCRIPTION("Intel Audio Machine driver for SKL with NAU88L25 and SSM4567 in I2S Mode");
535MODULE_LICENSE("GPL v2");
536MODULE_ALIAS("platform:skl_nau88l25_ssm4567_i2s");
diff --git a/sound/soc/intel/boards/skl_rt286.c b/sound/soc/intel/boards/skl_rt286.c
index a73a431bd8b7..7396ddb427d8 100644
--- a/sound/soc/intel/boards/skl_rt286.c
+++ b/sound/soc/intel/boards/skl_rt286.c
@@ -52,6 +52,7 @@ static const struct snd_soc_dapm_widget skylake_widgets[] = {
52 SND_SOC_DAPM_MIC("Mic Jack", NULL), 52 SND_SOC_DAPM_MIC("Mic Jack", NULL),
53 SND_SOC_DAPM_MIC("DMIC2", NULL), 53 SND_SOC_DAPM_MIC("DMIC2", NULL),
54 SND_SOC_DAPM_MIC("SoC DMIC", NULL), 54 SND_SOC_DAPM_MIC("SoC DMIC", NULL),
55 SND_SOC_DAPM_SINK("WoV Sink"),
55}; 56};
56 57
57static const struct snd_soc_dapm_route skylake_rt286_map[] = { 58static const struct snd_soc_dapm_route skylake_rt286_map[] = {
@@ -67,7 +68,9 @@ static const struct snd_soc_dapm_route skylake_rt286_map[] = {
67 68
68 /* digital mics */ 69 /* digital mics */
69 {"DMIC1 Pin", NULL, "DMIC2"}, 70 {"DMIC1 Pin", NULL, "DMIC2"},
70 {"DMIC AIF", NULL, "SoC DMIC"}, 71 {"DMic", NULL, "SoC DMIC"},
72
73 {"WoV Sink", NULL, "hwd_in sink"},
71 74
72 /* CODEC BE connections */ 75 /* CODEC BE connections */
73 { "AIF1 Playback", NULL, "ssp0 Tx"}, 76 { "AIF1 Playback", NULL, "ssp0 Tx"},
@@ -79,13 +82,24 @@ static const struct snd_soc_dapm_route skylake_rt286_map[] = {
79 { "ssp0 Rx", NULL, "AIF1 Capture" }, 82 { "ssp0 Rx", NULL, "AIF1 Capture" },
80 83
81 { "dmic01_hifi", NULL, "DMIC01 Rx" }, 84 { "dmic01_hifi", NULL, "DMIC01 Rx" },
82 { "DMIC01 Rx", NULL, "Capture" }, 85 { "DMIC01 Rx", NULL, "DMIC AIF" },
83 86
84 { "hif1", NULL, "iDisp Tx"}, 87 { "hif1", NULL, "iDisp Tx"},
85 { "iDisp Tx", NULL, "iDisp_out"}, 88 { "iDisp Tx", NULL, "iDisp_out"},
86 89
87}; 90};
88 91
92static int skylake_rt286_fe_init(struct snd_soc_pcm_runtime *rtd)
93{
94 struct snd_soc_dapm_context *dapm;
95 struct snd_soc_component *component = rtd->cpu_dai->component;
96
97 dapm = snd_soc_component_get_dapm(component);
98 snd_soc_dapm_ignore_suspend(dapm, "Reference Capture");
99
100 return 0;
101}
102
89static int skylake_rt286_codec_init(struct snd_soc_pcm_runtime *rtd) 103static int skylake_rt286_codec_init(struct snd_soc_pcm_runtime *rtd)
90{ 104{
91 struct snd_soc_codec *codec = rtd->codec; 105 struct snd_soc_codec *codec = rtd->codec;
@@ -101,9 +115,59 @@ static int skylake_rt286_codec_init(struct snd_soc_pcm_runtime *rtd)
101 115
102 rt286_mic_detect(codec, &skylake_headset); 116 rt286_mic_detect(codec, &skylake_headset);
103 117
118 snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC");
119 snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "WoV Sink");
120
104 return 0; 121 return 0;
105} 122}
106 123
124static unsigned int rates[] = {
125 48000,
126};
127
128static struct snd_pcm_hw_constraint_list constraints_rates = {
129 .count = ARRAY_SIZE(rates),
130 .list = rates,
131 .mask = 0,
132};
133
134static unsigned int channels[] = {
135 2,
136};
137
138static struct snd_pcm_hw_constraint_list constraints_channels = {
139 .count = ARRAY_SIZE(channels),
140 .list = channels,
141 .mask = 0,
142};
143
144static int skl_fe_startup(struct snd_pcm_substream *substream)
145{
146 struct snd_pcm_runtime *runtime = substream->runtime;
147
148 /*
149 * on this platform for PCM device we support,
150 * 48Khz
151 * stereo
152 * 16 bit audio
153 */
154
155 runtime->hw.channels_max = 2;
156 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
157 &constraints_channels);
158
159 runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
160 snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
161
162 snd_pcm_hw_constraint_list(runtime, 0,
163 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
164
165 return 0;
166}
167
168static const struct snd_soc_ops skylake_rt286_fe_ops = {
169 .startup = skl_fe_startup,
170};
107 171
108static int skylake_ssp0_fixup(struct snd_soc_pcm_runtime *rtd, 172static int skylake_ssp0_fixup(struct snd_soc_pcm_runtime *rtd,
109 struct snd_pcm_hw_params *params) 173 struct snd_pcm_hw_params *params)
@@ -112,12 +176,15 @@ static int skylake_ssp0_fixup(struct snd_soc_pcm_runtime *rtd,
112 SNDRV_PCM_HW_PARAM_RATE); 176 SNDRV_PCM_HW_PARAM_RATE);
113 struct snd_interval *channels = hw_param_interval(params, 177 struct snd_interval *channels = hw_param_interval(params,
114 SNDRV_PCM_HW_PARAM_CHANNELS); 178 SNDRV_PCM_HW_PARAM_CHANNELS);
179 struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
115 180
116 /* The output is 48KHz, stereo, 16bits */ 181 /* The output is 48KHz, stereo, 16bits */
117 rate->min = rate->max = 48000; 182 rate->min = rate->max = 48000;
118 channels->min = channels->max = 2; 183 channels->min = channels->max = 2;
119 params_set_format(params, SNDRV_PCM_FORMAT_S16_LE);
120 184
185 /* set SSP0 to 24 bit */
186 snd_mask_none(fmt);
187 snd_mask_set(fmt, SNDRV_PCM_FORMAT_S24_LE);
121 return 0; 188 return 0;
122} 189}
123 190
@@ -140,6 +207,42 @@ static struct snd_soc_ops skylake_rt286_ops = {
140 .hw_params = skylake_rt286_hw_params, 207 .hw_params = skylake_rt286_hw_params,
141}; 208};
142 209
210static int skylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
211 struct snd_pcm_hw_params *params)
212{
213 struct snd_interval *channels = hw_param_interval(params,
214 SNDRV_PCM_HW_PARAM_CHANNELS);
215 channels->min = channels->max = 4;
216
217 return 0;
218}
219
220static unsigned int channels_dmic[] = {
221 2, 4,
222};
223
224static struct snd_pcm_hw_constraint_list constraints_dmic_channels = {
225 .count = ARRAY_SIZE(channels_dmic),
226 .list = channels_dmic,
227 .mask = 0,
228};
229
230static int skylake_dmic_startup(struct snd_pcm_substream *substream)
231{
232 struct snd_pcm_runtime *runtime = substream->runtime;
233
234 runtime->hw.channels_max = 4;
235 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
236 &constraints_dmic_channels);
237
238 return snd_pcm_hw_constraint_list(substream->runtime, 0,
239 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
240}
241
242static struct snd_soc_ops skylake_dmic_ops = {
243 .startup = skylake_dmic_startup,
244};
245
143/* skylake digital audio interface glue - connects codec <--> CPU */ 246/* skylake digital audio interface glue - connects codec <--> CPU */
144static struct snd_soc_dai_link skylake_rt286_dais[] = { 247static struct snd_soc_dai_link skylake_rt286_dais[] = {
145 /* Front End DAI links */ 248 /* Front End DAI links */
@@ -152,11 +255,13 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
152 .dynamic = 1, 255 .dynamic = 1,
153 .codec_name = "snd-soc-dummy", 256 .codec_name = "snd-soc-dummy",
154 .codec_dai_name = "snd-soc-dummy-dai", 257 .codec_dai_name = "snd-soc-dummy-dai",
258 .init = skylake_rt286_fe_init,
155 .trigger = { 259 .trigger = {
156 SND_SOC_DPCM_TRIGGER_POST, 260 SND_SOC_DPCM_TRIGGER_POST,
157 SND_SOC_DPCM_TRIGGER_POST 261 SND_SOC_DPCM_TRIGGER_POST
158 }, 262 },
159 .dpcm_playback = 1, 263 .dpcm_playback = 1,
264 .ops = &skylake_rt286_fe_ops,
160 }, 265 },
161 { 266 {
162 .name = "Skl Audio Capture Port", 267 .name = "Skl Audio Capture Port",
@@ -172,6 +277,7 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
172 SND_SOC_DPCM_TRIGGER_POST 277 SND_SOC_DPCM_TRIGGER_POST
173 }, 278 },
174 .dpcm_capture = 1, 279 .dpcm_capture = 1,
280 .ops = &skylake_rt286_fe_ops,
175 }, 281 },
176 { 282 {
177 .name = "Skl Audio Reference cap", 283 .name = "Skl Audio Reference cap",
@@ -186,6 +292,19 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
186 .nonatomic = 1, 292 .nonatomic = 1,
187 .dynamic = 1, 293 .dynamic = 1,
188 }, 294 },
295 {
296 .name = "Skl Audio DMIC cap",
297 .stream_name = "dmiccap",
298 .cpu_dai_name = "DMIC Pin",
299 .codec_name = "snd-soc-dummy",
300 .codec_dai_name = "snd-soc-dummy-dai",
301 .platform_name = "0000:00:1f.3",
302 .init = NULL,
303 .dpcm_capture = 1,
304 .nonatomic = 1,
305 .dynamic = 1,
306 .ops = &skylake_dmic_ops,
307 },
189 308
190 /* Back End DAI links */ 309 /* Back End DAI links */
191 { 310 {
@@ -201,7 +320,6 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
201 .dai_fmt = SND_SOC_DAIFMT_I2S | 320 .dai_fmt = SND_SOC_DAIFMT_I2S |
202 SND_SOC_DAIFMT_NB_NF | 321 SND_SOC_DAIFMT_NB_NF |
203 SND_SOC_DAIFMT_CBS_CFS, 322 SND_SOC_DAIFMT_CBS_CFS,
204 .ignore_suspend = 1,
205 .ignore_pmdown_time = 1, 323 .ignore_pmdown_time = 1,
206 .be_hw_params_fixup = skylake_ssp0_fixup, 324 .be_hw_params_fixup = skylake_ssp0_fixup,
207 .ops = &skylake_rt286_ops, 325 .ops = &skylake_rt286_ops,
@@ -215,6 +333,7 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
215 .codec_name = "dmic-codec", 333 .codec_name = "dmic-codec",
216 .codec_dai_name = "dmic-hifi", 334 .codec_dai_name = "dmic-hifi",
217 .platform_name = "0000:00:1f.3", 335 .platform_name = "0000:00:1f.3",
336 .be_hw_params_fixup = skylake_dmic_fixup,
218 .ignore_suspend = 1, 337 .ignore_suspend = 1,
219 .dpcm_capture = 1, 338 .dpcm_capture = 1,
220 .no_pcm = 1, 339 .no_pcm = 1,
@@ -247,6 +366,7 @@ static struct platform_driver skylake_audio = {
247 .probe = skylake_audio_probe, 366 .probe = skylake_audio_probe,
248 .driver = { 367 .driver = {
249 .name = "skl_alc286s_i2s", 368 .name = "skl_alc286s_i2s",
369 .pm = &snd_soc_pm_ops,
250 }, 370 },
251}; 371};
252 372
diff --git a/sound/soc/intel/common/Makefile b/sound/soc/intel/common/Makefile
index d9105584c51f..668fdeee195e 100644
--- a/sound/soc/intel/common/Makefile
+++ b/sound/soc/intel/common/Makefile
@@ -1,11 +1,13 @@
1snd-soc-sst-dsp-objs := sst-dsp.o 1snd-soc-sst-dsp-objs := sst-dsp.o
2snd-soc-sst-acpi-objs := sst-acpi.o 2ifneq ($(CONFIG_SND_SST_IPC_ACPI),)
3snd-soc-sst-acpi-objs := sst-match-acpi.o
4else
5snd-soc-sst-acpi-objs := sst-acpi.o sst-match-acpi.o
6endif
7
3snd-soc-sst-ipc-objs := sst-ipc.o 8snd-soc-sst-ipc-objs := sst-ipc.o
4 9
5ifneq ($(CONFIG_DW_DMAC_CORE),) 10snd-soc-sst-dsp-$(CONFIG_DW_DMAC_CORE) += sst-firmware.o
6snd-soc-sst-dsp-objs += sst-firmware.o
7endif
8 11
9obj-$(CONFIG_SND_SOC_INTEL_SST) += snd-soc-sst-dsp.o snd-soc-sst-ipc.o 12obj-$(CONFIG_SND_SOC_INTEL_SST) += snd-soc-sst-dsp.o snd-soc-sst-ipc.o
10obj-$(CONFIG_SND_SOC_INTEL_SST_ACPI) += snd-soc-sst-acpi.o 13obj-$(CONFIG_SND_SOC_INTEL_SST_ACPI) += snd-soc-sst-acpi.o
11
diff --git a/sound/soc/intel/common/sst-acpi.c b/sound/soc/intel/common/sst-acpi.c
index 67b6d3d52f57..7a85c576dad3 100644
--- a/sound/soc/intel/common/sst-acpi.c
+++ b/sound/soc/intel/common/sst-acpi.c
@@ -21,21 +21,12 @@
21#include <linux/platform_device.h> 21#include <linux/platform_device.h>
22 22
23#include "sst-dsp.h" 23#include "sst-dsp.h"
24#include "sst-acpi.h"
24 25
25#define SST_LPT_DSP_DMA_ADDR_OFFSET 0x0F0000 26#define SST_LPT_DSP_DMA_ADDR_OFFSET 0x0F0000
26#define SST_WPT_DSP_DMA_ADDR_OFFSET 0x0FE000 27#define SST_WPT_DSP_DMA_ADDR_OFFSET 0x0FE000
27#define SST_LPT_DSP_DMA_SIZE (1024 - 1) 28#define SST_LPT_DSP_DMA_SIZE (1024 - 1)
28 29
29/* Descriptor for SST ASoC machine driver */
30struct sst_acpi_mach {
31 /* ACPI ID for the matching machine driver. Audio codec for instance */
32 const u8 id[ACPI_ID_LEN];
33 /* machine driver name */
34 const char *drv_name;
35 /* firmware file name */
36 const char *fw_filename;
37};
38
39/* Descriptor for setting up SST platform data */ 30/* Descriptor for setting up SST platform data */
40struct sst_acpi_desc { 31struct sst_acpi_desc {
41 const char *drv_name; 32 const char *drv_name;
@@ -88,28 +79,6 @@ static void sst_acpi_fw_cb(const struct firmware *fw, void *context)
88 return; 79 return;
89} 80}
90 81
91static acpi_status sst_acpi_mach_match(acpi_handle handle, u32 level,
92 void *context, void **ret)
93{
94 *(bool *)context = true;
95 return AE_OK;
96}
97
98static struct sst_acpi_mach *sst_acpi_find_machine(
99 struct sst_acpi_mach *machines)
100{
101 struct sst_acpi_mach *mach;
102 bool found = false;
103
104 for (mach = machines; mach->id[0]; mach++)
105 if (ACPI_SUCCESS(acpi_get_devices(mach->id,
106 sst_acpi_mach_match,
107 &found, NULL)) && found)
108 return mach;
109
110 return NULL;
111}
112
113static int sst_acpi_probe(struct platform_device *pdev) 82static int sst_acpi_probe(struct platform_device *pdev)
114{ 83{
115 const struct acpi_device_id *id; 84 const struct acpi_device_id *id;
@@ -211,7 +180,7 @@ static int sst_acpi_remove(struct platform_device *pdev)
211} 180}
212 181
213static struct sst_acpi_mach haswell_machines[] = { 182static struct sst_acpi_mach haswell_machines[] = {
214 { "INT33CA", "haswell-audio", "intel/IntcSST1.bin" }, 183 { "INT33CA", "haswell-audio", "intel/IntcSST1.bin", NULL, NULL, NULL },
215 {} 184 {}
216}; 185};
217 186
@@ -229,7 +198,7 @@ static struct sst_acpi_desc sst_acpi_haswell_desc = {
229}; 198};
230 199
231static struct sst_acpi_mach broadwell_machines[] = { 200static struct sst_acpi_mach broadwell_machines[] = {
232 { "INT343A", "broadwell-audio", "intel/IntcSST2.bin" }, 201 { "INT343A", "broadwell-audio", "intel/IntcSST2.bin", NULL, NULL, NULL },
233 {} 202 {}
234}; 203};
235 204
@@ -247,8 +216,8 @@ static struct sst_acpi_desc sst_acpi_broadwell_desc = {
247}; 216};
248 217
249static struct sst_acpi_mach baytrail_machines[] = { 218static struct sst_acpi_mach baytrail_machines[] = {
250 { "10EC5640", "byt-rt5640", "intel/fw_sst_0f28.bin-48kHz_i2s_master" }, 219 { "10EC5640", "byt-rt5640", "intel/fw_sst_0f28.bin-48kHz_i2s_master", NULL, NULL, NULL },
251 { "193C9890", "byt-max98090", "intel/fw_sst_0f28.bin-48kHz_i2s_master" }, 220 { "193C9890", "byt-max98090", "intel/fw_sst_0f28.bin-48kHz_i2s_master", NULL, NULL, NULL },
252 {} 221 {}
253}; 222};
254 223
diff --git a/sound/soc/intel/common/sst-acpi.h b/sound/soc/intel/common/sst-acpi.h
new file mode 100644
index 000000000000..3ee3b7ab5d03
--- /dev/null
+++ b/sound/soc/intel/common/sst-acpi.h
@@ -0,0 +1,33 @@
1/*
2 * Copyright (C) 2013-15, Intel Corporation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License version
6 * 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 */
14
15#include <linux/acpi.h>
16
17/* acpi match */
18struct sst_acpi_mach *sst_acpi_find_machine(struct sst_acpi_mach *machines);
19
20/* Descriptor for SST ASoC machine driver */
21struct sst_acpi_mach {
22 /* ACPI ID for the matching machine driver. Audio codec for instance */
23 const u8 id[ACPI_ID_LEN];
24 /* machine driver name */
25 const char *drv_name;
26 /* firmware file name */
27 const char *fw_filename;
28
29 /* board name */
30 const char *board;
31 void (*machine_quirk)(void);
32 void *pdata;
33};
diff --git a/sound/soc/intel/common/sst-dsp-priv.h b/sound/soc/intel/common/sst-dsp-priv.h
index 2151652d37b7..81aa1ed64201 100644
--- a/sound/soc/intel/common/sst-dsp-priv.h
+++ b/sound/soc/intel/common/sst-dsp-priv.h
@@ -243,7 +243,7 @@ struct sst_mem_block {
243 u32 size; /* block size */ 243 u32 size; /* block size */
244 u32 index; /* block index 0..N */ 244 u32 index; /* block index 0..N */
245 enum sst_mem_type type; /* block memory type IRAM/DRAM */ 245 enum sst_mem_type type; /* block memory type IRAM/DRAM */
246 struct sst_block_ops *ops; /* block operations, if any */ 246 const struct sst_block_ops *ops;/* block operations, if any */
247 247
248 /* block status */ 248 /* block status */
249 u32 bytes_used; /* bytes in use by modules */ 249 u32 bytes_used; /* bytes in use by modules */
@@ -308,6 +308,8 @@ struct sst_dsp {
308 308
309 /* SKL data */ 309 /* SKL data */
310 310
311 const char *fw_name;
312
311 /* To allocate CL dma buffers */ 313 /* To allocate CL dma buffers */
312 struct skl_dsp_loader_ops dsp_ops; 314 struct skl_dsp_loader_ops dsp_ops;
313 struct skl_dsp_fw_ops fw_ops; 315 struct skl_dsp_fw_ops fw_ops;
@@ -376,8 +378,8 @@ void sst_block_free_scratch(struct sst_dsp *dsp);
376 378
377/* Register the DSPs memory blocks - would be nice to read from ACPI */ 379/* Register the DSPs memory blocks - would be nice to read from ACPI */
378struct sst_mem_block *sst_mem_block_register(struct sst_dsp *dsp, u32 offset, 380struct sst_mem_block *sst_mem_block_register(struct sst_dsp *dsp, u32 offset,
379 u32 size, enum sst_mem_type type, struct sst_block_ops *ops, u32 index, 381 u32 size, enum sst_mem_type type, const struct sst_block_ops *ops,
380 void *private); 382 u32 index, void *private);
381void sst_mem_block_unregister_all(struct sst_dsp *dsp); 383void sst_mem_block_unregister_all(struct sst_dsp *dsp);
382 384
383/* Create/Free DMA resources */ 385/* Create/Free DMA resources */
diff --git a/sound/soc/intel/common/sst-dsp.c b/sound/soc/intel/common/sst-dsp.c
index c9452e02e0dd..b5bbdf4fe93a 100644
--- a/sound/soc/intel/common/sst-dsp.c
+++ b/sound/soc/intel/common/sst-dsp.c
@@ -420,7 +420,7 @@ void sst_dsp_inbox_read(struct sst_dsp *sst, void *message, size_t bytes)
420} 420}
421EXPORT_SYMBOL_GPL(sst_dsp_inbox_read); 421EXPORT_SYMBOL_GPL(sst_dsp_inbox_read);
422 422
423#if IS_ENABLED(CONFIG_DW_DMAC_CORE) 423#ifdef CONFIG_DW_DMAC_CORE
424struct sst_dsp *sst_dsp_new(struct device *dev, 424struct sst_dsp *sst_dsp_new(struct device *dev,
425 struct sst_dsp_device *sst_dev, struct sst_pdata *pdata) 425 struct sst_dsp_device *sst_dev, struct sst_pdata *pdata)
426{ 426{
diff --git a/sound/soc/intel/common/sst-dsp.h b/sound/soc/intel/common/sst-dsp.h
index 859f0de00339..0b84c719ec48 100644
--- a/sound/soc/intel/common/sst-dsp.h
+++ b/sound/soc/intel/common/sst-dsp.h
@@ -216,7 +216,7 @@ struct sst_pdata {
216 void *dsp; 216 void *dsp;
217}; 217};
218 218
219#if IS_ENABLED(CONFIG_DW_DMAC_CORE) 219#ifdef CONFIG_DW_DMAC_CORE
220/* Initialization */ 220/* Initialization */
221struct sst_dsp *sst_dsp_new(struct device *dev, 221struct sst_dsp *sst_dsp_new(struct device *dev,
222 struct sst_dsp_device *sst_dev, struct sst_pdata *pdata); 222 struct sst_dsp_device *sst_dev, struct sst_pdata *pdata);
diff --git a/sound/soc/intel/common/sst-firmware.c b/sound/soc/intel/common/sst-firmware.c
index 1636a1eeb002..ef4881e7753a 100644
--- a/sound/soc/intel/common/sst-firmware.c
+++ b/sound/soc/intel/common/sst-firmware.c
@@ -51,8 +51,22 @@ struct sst_dma {
51 51
52static inline void sst_memcpy32(volatile void __iomem *dest, void *src, u32 bytes) 52static inline void sst_memcpy32(volatile void __iomem *dest, void *src, u32 bytes)
53{ 53{
54 u32 tmp = 0;
55 int i, m, n;
56 const u8 *src_byte = src;
57
58 m = bytes / 4;
59 n = bytes % 4;
60
54 /* __iowrite32_copy use 32bit size values so divide by 4 */ 61 /* __iowrite32_copy use 32bit size values so divide by 4 */
55 __iowrite32_copy((void *)dest, src, bytes/4); 62 __iowrite32_copy((void *)dest, src, m);
63
64 if (n) {
65 for (i = 0; i < n; i++)
66 tmp |= (u32)*(src_byte + m * 4 + i) << (i * 8);
67 __iowrite32_copy((void *)(dest + m * 4), &tmp, 1);
68 }
69
56} 70}
57 71
58static void sst_dma_transfer_complete(void *arg) 72static void sst_dma_transfer_complete(void *arg)
@@ -1014,8 +1028,8 @@ EXPORT_SYMBOL_GPL(sst_module_runtime_restore);
1014 1028
1015/* register a DSP memory block for use with FW based modules */ 1029/* register a DSP memory block for use with FW based modules */
1016struct sst_mem_block *sst_mem_block_register(struct sst_dsp *dsp, u32 offset, 1030struct sst_mem_block *sst_mem_block_register(struct sst_dsp *dsp, u32 offset,
1017 u32 size, enum sst_mem_type type, struct sst_block_ops *ops, u32 index, 1031 u32 size, enum sst_mem_type type, const struct sst_block_ops *ops,
1018 void *private) 1032 u32 index, void *private)
1019{ 1033{
1020 struct sst_mem_block *block; 1034 struct sst_mem_block *block;
1021 1035
diff --git a/sound/soc/intel/common/sst-match-acpi.c b/sound/soc/intel/common/sst-match-acpi.c
new file mode 100644
index 000000000000..dd077e116d25
--- /dev/null
+++ b/sound/soc/intel/common/sst-match-acpi.c
@@ -0,0 +1,43 @@
1/*
2 * sst_match_apci.c - SST (LPE) match for ACPI enumeration.
3 *
4 * Copyright (c) 2013-15, Intel Corporation.
5 *
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms and conditions of the GNU General Public License,
9 * version 2, as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 */
16#include <linux/acpi.h>
17#include <linux/device.h>
18#include <linux/module.h>
19#include <linux/platform_device.h>
20
21#include "sst-acpi.h"
22
23static acpi_status sst_acpi_mach_match(acpi_handle handle, u32 level,
24 void *context, void **ret)
25{
26 *(bool *)context = true;
27 return AE_OK;
28}
29
30struct sst_acpi_mach *sst_acpi_find_machine(struct sst_acpi_mach *machines)
31{
32 struct sst_acpi_mach *mach;
33 bool found = false;
34
35 for (mach = machines; mach->id[0]; mach++)
36 if (ACPI_SUCCESS(acpi_get_devices(mach->id,
37 sst_acpi_mach_match,
38 &found, NULL)) && found)
39 return mach;
40
41 return NULL;
42}
43EXPORT_SYMBOL_GPL(sst_acpi_find_machine);
diff --git a/sound/soc/intel/haswell/sst-haswell-dsp.c b/sound/soc/intel/haswell/sst-haswell-dsp.c
index 7f94920c8a4d..b2bec36d074c 100644
--- a/sound/soc/intel/haswell/sst-haswell-dsp.c
+++ b/sound/soc/intel/haswell/sst-haswell-dsp.c
@@ -607,7 +607,7 @@ static int hsw_block_disable(struct sst_mem_block *block)
607 return 0; 607 return 0;
608} 608}
609 609
610static struct sst_block_ops sst_hsw_ops = { 610static const struct sst_block_ops sst_hsw_ops = {
611 .enable = hsw_block_enable, 611 .enable = hsw_block_enable,
612 .disable = hsw_block_disable, 612 .disable = hsw_block_disable,
613}; 613};
diff --git a/sound/soc/intel/haswell/sst-haswell-ipc.c b/sound/soc/intel/haswell/sst-haswell-ipc.c
index b27f25f70730..ac60f1301e21 100644
--- a/sound/soc/intel/haswell/sst-haswell-ipc.c
+++ b/sound/soc/intel/haswell/sst-haswell-ipc.c
@@ -778,7 +778,6 @@ static irqreturn_t hsw_irq_thread(int irq, void *context)
778 struct sst_hsw *hsw = sst_dsp_get_thread_context(sst); 778 struct sst_hsw *hsw = sst_dsp_get_thread_context(sst);
779 struct sst_generic_ipc *ipc = &hsw->ipc; 779 struct sst_generic_ipc *ipc = &hsw->ipc;
780 u32 ipcx, ipcd; 780 u32 ipcx, ipcd;
781 int handled;
782 unsigned long flags; 781 unsigned long flags;
783 782
784 spin_lock_irqsave(&sst->spinlock, flags); 783 spin_lock_irqsave(&sst->spinlock, flags);
@@ -790,34 +789,30 @@ static irqreturn_t hsw_irq_thread(int irq, void *context)
790 if (ipcx & SST_IPCX_DONE) { 789 if (ipcx & SST_IPCX_DONE) {
791 790
792 /* Handle Immediate reply from DSP Core */ 791 /* Handle Immediate reply from DSP Core */
793 handled = hsw_process_reply(hsw, ipcx); 792 hsw_process_reply(hsw, ipcx);
794 793
795 if (handled > 0) { 794 /* clear DONE bit - tell DSP we have completed */
796 /* clear DONE bit - tell DSP we have completed */ 795 sst_dsp_shim_update_bits_unlocked(sst, SST_IPCX,
797 sst_dsp_shim_update_bits_unlocked(sst, SST_IPCX, 796 SST_IPCX_DONE, 0);
798 SST_IPCX_DONE, 0);
799 797
800 /* unmask Done interrupt */ 798 /* unmask Done interrupt */
801 sst_dsp_shim_update_bits_unlocked(sst, SST_IMRX, 799 sst_dsp_shim_update_bits_unlocked(sst, SST_IMRX,
802 SST_IMRX_DONE, 0); 800 SST_IMRX_DONE, 0);
803 }
804 } 801 }
805 802
806 /* new message from DSP */ 803 /* new message from DSP */
807 if (ipcd & SST_IPCD_BUSY) { 804 if (ipcd & SST_IPCD_BUSY) {
808 805
809 /* Handle Notification and Delayed reply from DSP Core */ 806 /* Handle Notification and Delayed reply from DSP Core */
810 handled = hsw_process_notification(hsw); 807 hsw_process_notification(hsw);
811 808
812 /* clear BUSY bit and set DONE bit - accept new messages */ 809 /* clear BUSY bit and set DONE bit - accept new messages */
813 if (handled > 0) { 810 sst_dsp_shim_update_bits_unlocked(sst, SST_IPCD,
814 sst_dsp_shim_update_bits_unlocked(sst, SST_IPCD, 811 SST_IPCD_BUSY | SST_IPCD_DONE, SST_IPCD_DONE);
815 SST_IPCD_BUSY | SST_IPCD_DONE, SST_IPCD_DONE);
816 812
817 /* unmask busy interrupt */ 813 /* unmask busy interrupt */
818 sst_dsp_shim_update_bits_unlocked(sst, SST_IMRX, 814 sst_dsp_shim_update_bits_unlocked(sst, SST_IMRX,
819 SST_IMRX_BUSY, 0); 815 SST_IMRX_BUSY, 0);
820 }
821 } 816 }
822 817
823 spin_unlock_irqrestore(&sst->spinlock, flags); 818 spin_unlock_irqrestore(&sst->spinlock, flags);
diff --git a/sound/soc/intel/skylake/skl-messages.c b/sound/soc/intel/skylake/skl-messages.c
index 50a109503a3f..de6dac496a0d 100644
--- a/sound/soc/intel/skylake/skl-messages.c
+++ b/sound/soc/intel/skylake/skl-messages.c
@@ -96,7 +96,7 @@ int skl_init_dsp(struct skl *skl)
96 } 96 }
97 97
98 ret = skl_sst_dsp_init(bus->dev, mmio_base, irq, 98 ret = skl_sst_dsp_init(bus->dev, mmio_base, irq,
99 loader_ops, &skl->skl_sst); 99 skl->fw_name, loader_ops, &skl->skl_sst);
100 if (ret < 0) 100 if (ret < 0)
101 return ret; 101 return ret;
102 102
@@ -182,94 +182,6 @@ enum skl_bitdepth skl_get_bit_depth(int params)
182 } 182 }
183} 183}
184 184
185static u32 skl_create_channel_map(enum skl_ch_cfg ch_cfg)
186{
187 u32 config;
188
189 switch (ch_cfg) {
190 case SKL_CH_CFG_MONO:
191 config = (0xFFFFFFF0 | SKL_CHANNEL_LEFT);
192 break;
193
194 case SKL_CH_CFG_STEREO:
195 config = (0xFFFFFF00 | SKL_CHANNEL_LEFT
196 | (SKL_CHANNEL_RIGHT << 4));
197 break;
198
199 case SKL_CH_CFG_2_1:
200 config = (0xFFFFF000 | SKL_CHANNEL_LEFT
201 | (SKL_CHANNEL_RIGHT << 4)
202 | (SKL_CHANNEL_LFE << 8));
203 break;
204
205 case SKL_CH_CFG_3_0:
206 config = (0xFFFFF000 | SKL_CHANNEL_LEFT
207 | (SKL_CHANNEL_CENTER << 4)
208 | (SKL_CHANNEL_RIGHT << 8));
209 break;
210
211 case SKL_CH_CFG_3_1:
212 config = (0xFFFF0000 | SKL_CHANNEL_LEFT
213 | (SKL_CHANNEL_CENTER << 4)
214 | (SKL_CHANNEL_RIGHT << 8)
215 | (SKL_CHANNEL_LFE << 12));
216 break;
217
218 case SKL_CH_CFG_QUATRO:
219 config = (0xFFFF0000 | SKL_CHANNEL_LEFT
220 | (SKL_CHANNEL_RIGHT << 4)
221 | (SKL_CHANNEL_LEFT_SURROUND << 8)
222 | (SKL_CHANNEL_RIGHT_SURROUND << 12));
223 break;
224
225 case SKL_CH_CFG_4_0:
226 config = (0xFFFF0000 | SKL_CHANNEL_LEFT
227 | (SKL_CHANNEL_CENTER << 4)
228 | (SKL_CHANNEL_RIGHT << 8)
229 | (SKL_CHANNEL_CENTER_SURROUND << 12));
230 break;
231
232 case SKL_CH_CFG_5_0:
233 config = (0xFFF00000 | SKL_CHANNEL_LEFT
234 | (SKL_CHANNEL_CENTER << 4)
235 | (SKL_CHANNEL_RIGHT << 8)
236 | (SKL_CHANNEL_LEFT_SURROUND << 12)
237 | (SKL_CHANNEL_RIGHT_SURROUND << 16));
238 break;
239
240 case SKL_CH_CFG_5_1:
241 config = (0xFF000000 | SKL_CHANNEL_CENTER
242 | (SKL_CHANNEL_LEFT << 4)
243 | (SKL_CHANNEL_RIGHT << 8)
244 | (SKL_CHANNEL_LEFT_SURROUND << 12)
245 | (SKL_CHANNEL_RIGHT_SURROUND << 16)
246 | (SKL_CHANNEL_LFE << 20));
247 break;
248
249 case SKL_CH_CFG_DUAL_MONO:
250 config = (0xFFFFFF00 | SKL_CHANNEL_LEFT
251 | (SKL_CHANNEL_LEFT << 4));
252 break;
253
254 case SKL_CH_CFG_I2S_DUAL_STEREO_0:
255 config = (0xFFFFFF00 | SKL_CHANNEL_LEFT
256 | (SKL_CHANNEL_RIGHT << 4));
257 break;
258
259 case SKL_CH_CFG_I2S_DUAL_STEREO_1:
260 config = (0xFFFF00FF | (SKL_CHANNEL_LEFT << 8)
261 | (SKL_CHANNEL_RIGHT << 12));
262 break;
263
264 default:
265 config = 0xFFFFFFFF;
266 break;
267
268 }
269
270 return config;
271}
272
273/* 185/*
274 * Each module in DSP expects a base module configuration, which consists of 186 * Each module in DSP expects a base module configuration, which consists of
275 * PCM format information, which we calculate in driver and resource values 187 * PCM format information, which we calculate in driver and resource values
@@ -280,7 +192,7 @@ static void skl_set_base_module_format(struct skl_sst *ctx,
280 struct skl_module_cfg *mconfig, 192 struct skl_module_cfg *mconfig,
281 struct skl_base_cfg *base_cfg) 193 struct skl_base_cfg *base_cfg)
282{ 194{
283 struct skl_module_fmt *format = &mconfig->in_fmt; 195 struct skl_module_fmt *format = &mconfig->in_fmt[0];
284 196
285 base_cfg->audio_fmt.number_of_channels = (u8)format->channels; 197 base_cfg->audio_fmt.number_of_channels = (u8)format->channels;
286 198
@@ -293,14 +205,14 @@ static void skl_set_base_module_format(struct skl_sst *ctx,
293 format->bit_depth, format->valid_bit_depth, 205 format->bit_depth, format->valid_bit_depth,
294 format->ch_cfg); 206 format->ch_cfg);
295 207
296 base_cfg->audio_fmt.channel_map = skl_create_channel_map( 208 base_cfg->audio_fmt.channel_map = format->ch_map;
297 base_cfg->audio_fmt.ch_cfg);
298 209
299 base_cfg->audio_fmt.interleaving = SKL_INTERLEAVING_PER_CHANNEL; 210 base_cfg->audio_fmt.interleaving = format->interleaving_style;
300 211
301 base_cfg->cps = mconfig->mcps; 212 base_cfg->cps = mconfig->mcps;
302 base_cfg->ibs = mconfig->ibs; 213 base_cfg->ibs = mconfig->ibs;
303 base_cfg->obs = mconfig->obs; 214 base_cfg->obs = mconfig->obs;
215 base_cfg->is_pages = mconfig->mem_pages;
304} 216}
305 217
306/* 218/*
@@ -399,7 +311,7 @@ static void skl_setup_out_format(struct skl_sst *ctx,
399 struct skl_module_cfg *mconfig, 311 struct skl_module_cfg *mconfig,
400 struct skl_audio_data_format *out_fmt) 312 struct skl_audio_data_format *out_fmt)
401{ 313{
402 struct skl_module_fmt *format = &mconfig->out_fmt; 314 struct skl_module_fmt *format = &mconfig->out_fmt[0];
403 315
404 out_fmt->number_of_channels = (u8)format->channels; 316 out_fmt->number_of_channels = (u8)format->channels;
405 out_fmt->s_freq = format->s_freq; 317 out_fmt->s_freq = format->s_freq;
@@ -407,8 +319,9 @@ static void skl_setup_out_format(struct skl_sst *ctx,
407 out_fmt->valid_bit_depth = format->valid_bit_depth; 319 out_fmt->valid_bit_depth = format->valid_bit_depth;
408 out_fmt->ch_cfg = format->ch_cfg; 320 out_fmt->ch_cfg = format->ch_cfg;
409 321
410 out_fmt->channel_map = skl_create_channel_map(out_fmt->ch_cfg); 322 out_fmt->channel_map = format->ch_map;
411 out_fmt->interleaving = SKL_INTERLEAVING_PER_CHANNEL; 323 out_fmt->interleaving = format->interleaving_style;
324 out_fmt->sample_type = format->sample_type;
412 325
413 dev_dbg(ctx->dev, "copier out format chan=%d fre=%d bitdepth=%d\n", 326 dev_dbg(ctx->dev, "copier out format chan=%d fre=%d bitdepth=%d\n",
414 out_fmt->number_of_channels, format->s_freq, format->bit_depth); 327 out_fmt->number_of_channels, format->s_freq, format->bit_depth);
@@ -423,7 +336,7 @@ static void skl_set_src_format(struct skl_sst *ctx,
423 struct skl_module_cfg *mconfig, 336 struct skl_module_cfg *mconfig,
424 struct skl_src_module_cfg *src_mconfig) 337 struct skl_src_module_cfg *src_mconfig)
425{ 338{
426 struct skl_module_fmt *fmt = &mconfig->out_fmt; 339 struct skl_module_fmt *fmt = &mconfig->out_fmt[0];
427 340
428 skl_set_base_module_format(ctx, mconfig, 341 skl_set_base_module_format(ctx, mconfig,
429 (struct skl_base_cfg *)src_mconfig); 342 (struct skl_base_cfg *)src_mconfig);
@@ -440,7 +353,7 @@ static void skl_set_updown_mixer_format(struct skl_sst *ctx,
440 struct skl_module_cfg *mconfig, 353 struct skl_module_cfg *mconfig,
441 struct skl_up_down_mixer_cfg *mixer_mconfig) 354 struct skl_up_down_mixer_cfg *mixer_mconfig)
442{ 355{
443 struct skl_module_fmt *fmt = &mconfig->out_fmt; 356 struct skl_module_fmt *fmt = &mconfig->out_fmt[0];
444 int i = 0; 357 int i = 0;
445 358
446 skl_set_base_module_format(ctx, mconfig, 359 skl_set_base_module_format(ctx, mconfig,
@@ -475,6 +388,47 @@ static void skl_set_copier_format(struct skl_sst *ctx,
475 skl_setup_cpr_gateway_cfg(ctx, mconfig, cpr_mconfig); 388 skl_setup_cpr_gateway_cfg(ctx, mconfig, cpr_mconfig);
476} 389}
477 390
391/*
392 * Algo module are DSP pre processing modules. Algo module take base module
393 * configuration and params
394 */
395
396static void skl_set_algo_format(struct skl_sst *ctx,
397 struct skl_module_cfg *mconfig,
398 struct skl_algo_cfg *algo_mcfg)
399{
400 struct skl_base_cfg *base_cfg = (struct skl_base_cfg *)algo_mcfg;
401
402 skl_set_base_module_format(ctx, mconfig, base_cfg);
403
404 if (mconfig->formats_config.caps_size == 0)
405 return;
406
407 memcpy(algo_mcfg->params,
408 mconfig->formats_config.caps,
409 mconfig->formats_config.caps_size);
410
411}
412
413/*
414 * Mic select module allows selecting one or many input channels, thus
415 * acting as a demux.
416 *
417 * Mic select module take base module configuration and out-format
418 * configuration
419 */
420static void skl_set_base_outfmt_format(struct skl_sst *ctx,
421 struct skl_module_cfg *mconfig,
422 struct skl_base_outfmt_cfg *base_outfmt_mcfg)
423{
424 struct skl_audio_data_format *out_fmt = &base_outfmt_mcfg->out_fmt;
425 struct skl_base_cfg *base_cfg =
426 (struct skl_base_cfg *)base_outfmt_mcfg;
427
428 skl_set_base_module_format(ctx, mconfig, base_cfg);
429 skl_setup_out_format(ctx, mconfig, out_fmt);
430}
431
478static u16 skl_get_module_param_size(struct skl_sst *ctx, 432static u16 skl_get_module_param_size(struct skl_sst *ctx,
479 struct skl_module_cfg *mconfig) 433 struct skl_module_cfg *mconfig)
480{ 434{
@@ -492,6 +446,14 @@ static u16 skl_get_module_param_size(struct skl_sst *ctx,
492 case SKL_MODULE_TYPE_UPDWMIX: 446 case SKL_MODULE_TYPE_UPDWMIX:
493 return sizeof(struct skl_up_down_mixer_cfg); 447 return sizeof(struct skl_up_down_mixer_cfg);
494 448
449 case SKL_MODULE_TYPE_ALGO:
450 param_size = sizeof(struct skl_base_cfg);
451 param_size += mconfig->formats_config.caps_size;
452 return param_size;
453
454 case SKL_MODULE_TYPE_BASE_OUTFMT:
455 return sizeof(struct skl_base_outfmt_cfg);
456
495 default: 457 default:
496 /* 458 /*
497 * return only base cfg when no specific module type is 459 * return only base cfg when no specific module type is
@@ -538,6 +500,14 @@ static int skl_set_module_format(struct skl_sst *ctx,
538 skl_set_updown_mixer_format(ctx, module_config, *param_data); 500 skl_set_updown_mixer_format(ctx, module_config, *param_data);
539 break; 501 break;
540 502
503 case SKL_MODULE_TYPE_ALGO:
504 skl_set_algo_format(ctx, module_config, *param_data);
505 break;
506
507 case SKL_MODULE_TYPE_BASE_OUTFMT:
508 skl_set_base_outfmt_format(ctx, module_config, *param_data);
509 break;
510
541 default: 511 default:
542 skl_set_base_module_format(ctx, module_config, *param_data); 512 skl_set_base_module_format(ctx, module_config, *param_data);
543 break; 513 break;
@@ -571,10 +541,10 @@ static int skl_get_queue_index(struct skl_module_pin *mpin,
571 * In static, the pin_index is fixed based on module_id and instance id 541 * In static, the pin_index is fixed based on module_id and instance id
572 */ 542 */
573static int skl_alloc_queue(struct skl_module_pin *mpin, 543static int skl_alloc_queue(struct skl_module_pin *mpin,
574 struct skl_module_inst_id id, int max) 544 struct skl_module_cfg *tgt_cfg, int max)
575{ 545{
576 int i; 546 int i;
577 547 struct skl_module_inst_id id = tgt_cfg->id;
578 /* 548 /*
579 * if pin in dynamic, find first free pin 549 * if pin in dynamic, find first free pin
580 * otherwise find match module and instance id pin as topology will 550 * otherwise find match module and instance id pin as topology will
@@ -583,16 +553,23 @@ static int skl_alloc_queue(struct skl_module_pin *mpin,
583 */ 553 */
584 for (i = 0; i < max; i++) { 554 for (i = 0; i < max; i++) {
585 if (mpin[i].is_dynamic) { 555 if (mpin[i].is_dynamic) {
586 if (!mpin[i].in_use) { 556 if (!mpin[i].in_use &&
557 mpin[i].pin_state == SKL_PIN_UNBIND) {
558
587 mpin[i].in_use = true; 559 mpin[i].in_use = true;
588 mpin[i].id.module_id = id.module_id; 560 mpin[i].id.module_id = id.module_id;
589 mpin[i].id.instance_id = id.instance_id; 561 mpin[i].id.instance_id = id.instance_id;
562 mpin[i].tgt_mcfg = tgt_cfg;
590 return i; 563 return i;
591 } 564 }
592 } else { 565 } else {
593 if (mpin[i].id.module_id == id.module_id && 566 if (mpin[i].id.module_id == id.module_id &&
594 mpin[i].id.instance_id == id.instance_id) 567 mpin[i].id.instance_id == id.instance_id &&
568 mpin[i].pin_state == SKL_PIN_UNBIND) {
569
570 mpin[i].tgt_mcfg = tgt_cfg;
595 return i; 571 return i;
572 }
596 } 573 }
597 } 574 }
598 575
@@ -606,6 +583,28 @@ static void skl_free_queue(struct skl_module_pin *mpin, int q_index)
606 mpin[q_index].id.module_id = 0; 583 mpin[q_index].id.module_id = 0;
607 mpin[q_index].id.instance_id = 0; 584 mpin[q_index].id.instance_id = 0;
608 } 585 }
586 mpin[q_index].pin_state = SKL_PIN_UNBIND;
587 mpin[q_index].tgt_mcfg = NULL;
588}
589
590/* Module state will be set to unint, if all the out pin state is UNBIND */
591
592static void skl_clear_module_state(struct skl_module_pin *mpin, int max,
593 struct skl_module_cfg *mcfg)
594{
595 int i;
596 bool found = false;
597
598 for (i = 0; i < max; i++) {
599 if (mpin[i].pin_state == SKL_PIN_UNBIND)
600 continue;
601 found = true;
602 break;
603 }
604
605 if (!found)
606 mcfg->m_state = SKL_MODULE_UNINIT;
607 return;
609} 608}
610 609
611/* 610/*
@@ -615,7 +614,7 @@ static void skl_free_queue(struct skl_module_pin *mpin, int q_index)
615 * invoke the DSP by sending IPC INIT_INSTANCE using ipc helper 614 * invoke the DSP by sending IPC INIT_INSTANCE using ipc helper
616 */ 615 */
617int skl_init_module(struct skl_sst *ctx, 616int skl_init_module(struct skl_sst *ctx,
618 struct skl_module_cfg *mconfig, char *param) 617 struct skl_module_cfg *mconfig)
619{ 618{
620 u16 module_config_size = 0; 619 u16 module_config_size = 0;
621 void *param_data = NULL; 620 void *param_data = NULL;
@@ -682,37 +681,30 @@ int skl_unbind_modules(struct skl_sst *ctx,
682 struct skl_module_inst_id dst_id = dst_mcfg->id; 681 struct skl_module_inst_id dst_id = dst_mcfg->id;
683 int in_max = dst_mcfg->max_in_queue; 682 int in_max = dst_mcfg->max_in_queue;
684 int out_max = src_mcfg->max_out_queue; 683 int out_max = src_mcfg->max_out_queue;
685 int src_index, dst_index; 684 int src_index, dst_index, src_pin_state, dst_pin_state;
686 685
687 skl_dump_bind_info(ctx, src_mcfg, dst_mcfg); 686 skl_dump_bind_info(ctx, src_mcfg, dst_mcfg);
688 687
689 if (src_mcfg->m_state != SKL_MODULE_BIND_DONE)
690 return 0;
691
692 /*
693 * if intra module unbind, check if both modules are BIND,
694 * then send unbind
695 */
696 if ((src_mcfg->pipe->ppl_id != dst_mcfg->pipe->ppl_id) &&
697 dst_mcfg->m_state != SKL_MODULE_BIND_DONE)
698 return 0;
699 else if (src_mcfg->m_state < SKL_MODULE_INIT_DONE &&
700 dst_mcfg->m_state < SKL_MODULE_INIT_DONE)
701 return 0;
702
703 /* get src queue index */ 688 /* get src queue index */
704 src_index = skl_get_queue_index(src_mcfg->m_out_pin, dst_id, out_max); 689 src_index = skl_get_queue_index(src_mcfg->m_out_pin, dst_id, out_max);
705 if (src_index < 0) 690 if (src_index < 0)
706 return -EINVAL; 691 return -EINVAL;
707 692
708 msg.src_queue = src_mcfg->m_out_pin[src_index].pin_index; 693 msg.src_queue = src_index;
709 694
710 /* get dst queue index */ 695 /* get dst queue index */
711 dst_index = skl_get_queue_index(dst_mcfg->m_in_pin, src_id, in_max); 696 dst_index = skl_get_queue_index(dst_mcfg->m_in_pin, src_id, in_max);
712 if (dst_index < 0) 697 if (dst_index < 0)
713 return -EINVAL; 698 return -EINVAL;
714 699
715 msg.dst_queue = dst_mcfg->m_in_pin[dst_index].pin_index; 700 msg.dst_queue = dst_index;
701
702 src_pin_state = src_mcfg->m_out_pin[src_index].pin_state;
703 dst_pin_state = dst_mcfg->m_in_pin[dst_index].pin_state;
704
705 if (src_pin_state != SKL_PIN_BIND_DONE ||
706 dst_pin_state != SKL_PIN_BIND_DONE)
707 return 0;
716 708
717 msg.module_id = src_mcfg->id.module_id; 709 msg.module_id = src_mcfg->id.module_id;
718 msg.instance_id = src_mcfg->id.instance_id; 710 msg.instance_id = src_mcfg->id.instance_id;
@@ -722,10 +714,15 @@ int skl_unbind_modules(struct skl_sst *ctx,
722 714
723 ret = skl_ipc_bind_unbind(&ctx->ipc, &msg); 715 ret = skl_ipc_bind_unbind(&ctx->ipc, &msg);
724 if (!ret) { 716 if (!ret) {
725 src_mcfg->m_state = SKL_MODULE_UNINIT;
726 /* free queue only if unbind is success */ 717 /* free queue only if unbind is success */
727 skl_free_queue(src_mcfg->m_out_pin, src_index); 718 skl_free_queue(src_mcfg->m_out_pin, src_index);
728 skl_free_queue(dst_mcfg->m_in_pin, dst_index); 719 skl_free_queue(dst_mcfg->m_in_pin, dst_index);
720
721 /*
722 * check only if src module bind state, bind is
723 * always from src -> sink
724 */
725 skl_clear_module_state(src_mcfg->m_out_pin, out_max, src_mcfg);
729 } 726 }
730 727
731 return ret; 728 return ret;
@@ -744,8 +741,6 @@ int skl_bind_modules(struct skl_sst *ctx,
744{ 741{
745 int ret; 742 int ret;
746 struct skl_ipc_bind_unbind_msg msg; 743 struct skl_ipc_bind_unbind_msg msg;
747 struct skl_module_inst_id src_id = src_mcfg->id;
748 struct skl_module_inst_id dst_id = dst_mcfg->id;
749 int in_max = dst_mcfg->max_in_queue; 744 int in_max = dst_mcfg->max_in_queue;
750 int out_max = src_mcfg->max_out_queue; 745 int out_max = src_mcfg->max_out_queue;
751 int src_index, dst_index; 746 int src_index, dst_index;
@@ -756,18 +751,18 @@ int skl_bind_modules(struct skl_sst *ctx,
756 dst_mcfg->m_state < SKL_MODULE_INIT_DONE) 751 dst_mcfg->m_state < SKL_MODULE_INIT_DONE)
757 return 0; 752 return 0;
758 753
759 src_index = skl_alloc_queue(src_mcfg->m_out_pin, dst_id, out_max); 754 src_index = skl_alloc_queue(src_mcfg->m_out_pin, dst_mcfg, out_max);
760 if (src_index < 0) 755 if (src_index < 0)
761 return -EINVAL; 756 return -EINVAL;
762 757
763 msg.src_queue = src_mcfg->m_out_pin[src_index].pin_index; 758 msg.src_queue = src_index;
764 dst_index = skl_alloc_queue(dst_mcfg->m_in_pin, src_id, in_max); 759 dst_index = skl_alloc_queue(dst_mcfg->m_in_pin, src_mcfg, in_max);
765 if (dst_index < 0) { 760 if (dst_index < 0) {
766 skl_free_queue(src_mcfg->m_out_pin, src_index); 761 skl_free_queue(src_mcfg->m_out_pin, src_index);
767 return -EINVAL; 762 return -EINVAL;
768 } 763 }
769 764
770 msg.dst_queue = dst_mcfg->m_in_pin[dst_index].pin_index; 765 msg.dst_queue = dst_index;
771 766
772 dev_dbg(ctx->dev, "src queue = %d dst queue =%d\n", 767 dev_dbg(ctx->dev, "src queue = %d dst queue =%d\n",
773 msg.src_queue, msg.dst_queue); 768 msg.src_queue, msg.dst_queue);
@@ -782,6 +777,8 @@ int skl_bind_modules(struct skl_sst *ctx,
782 777
783 if (!ret) { 778 if (!ret) {
784 src_mcfg->m_state = SKL_MODULE_BIND_DONE; 779 src_mcfg->m_state = SKL_MODULE_BIND_DONE;
780 src_mcfg->m_out_pin[src_index].pin_state = SKL_PIN_BIND_DONE;
781 dst_mcfg->m_in_pin[dst_index].pin_state = SKL_PIN_BIND_DONE;
785 } else { 782 } else {
786 /* error case , if IPC fails, clear the queue index */ 783 /* error case , if IPC fails, clear the queue index */
787 skl_free_queue(src_mcfg->m_out_pin, src_index); 784 skl_free_queue(src_mcfg->m_out_pin, src_index);
@@ -852,6 +849,8 @@ int skl_delete_pipe(struct skl_sst *ctx, struct skl_pipe *pipe)
852 ret = skl_ipc_delete_pipeline(&ctx->ipc, pipe->ppl_id); 849 ret = skl_ipc_delete_pipeline(&ctx->ipc, pipe->ppl_id);
853 if (ret < 0) 850 if (ret < 0)
854 dev_err(ctx->dev, "Failed to delete pipeline\n"); 851 dev_err(ctx->dev, "Failed to delete pipeline\n");
852
853 pipe->state = SKL_PIPE_INVALID;
855 } 854 }
856 855
857 return ret; 856 return ret;
@@ -916,3 +915,30 @@ int skl_stop_pipe(struct skl_sst *ctx, struct skl_pipe *pipe)
916 915
917 return 0; 916 return 0;
918} 917}
918
919/* Algo parameter set helper function */
920int skl_set_module_params(struct skl_sst *ctx, u32 *params, int size,
921 u32 param_id, struct skl_module_cfg *mcfg)
922{
923 struct skl_ipc_large_config_msg msg;
924
925 msg.module_id = mcfg->id.module_id;
926 msg.instance_id = mcfg->id.instance_id;
927 msg.param_data_size = size;
928 msg.large_param_id = param_id;
929
930 return skl_ipc_set_large_config(&ctx->ipc, &msg, params);
931}
932
933int skl_get_module_params(struct skl_sst *ctx, u32 *params, int size,
934 u32 param_id, struct skl_module_cfg *mcfg)
935{
936 struct skl_ipc_large_config_msg msg;
937
938 msg.module_id = mcfg->id.module_id;
939 msg.instance_id = mcfg->id.instance_id;
940 msg.param_data_size = size;
941 msg.large_param_id = param_id;
942
943 return skl_ipc_get_large_config(&ctx->ipc, &msg, params);
944}
diff --git a/sound/soc/intel/skylake/skl-nhlt.c b/sound/soc/intel/skylake/skl-nhlt.c
index b0c7bd113aac..6e4b21cdb1bd 100644
--- a/sound/soc/intel/skylake/skl-nhlt.c
+++ b/sound/soc/intel/skylake/skl-nhlt.c
@@ -55,7 +55,7 @@ void skl_nhlt_free(void *addr)
55 55
56static struct nhlt_specific_cfg *skl_get_specific_cfg( 56static struct nhlt_specific_cfg *skl_get_specific_cfg(
57 struct device *dev, struct nhlt_fmt *fmt, 57 struct device *dev, struct nhlt_fmt *fmt,
58 u8 no_ch, u32 rate, u16 bps) 58 u8 no_ch, u32 rate, u16 bps, u8 linktype)
59{ 59{
60 struct nhlt_specific_cfg *sp_config; 60 struct nhlt_specific_cfg *sp_config;
61 struct wav_fmt *wfmt; 61 struct wav_fmt *wfmt;
@@ -68,11 +68,17 @@ static struct nhlt_specific_cfg *skl_get_specific_cfg(
68 wfmt = &fmt_config->fmt_ext.fmt; 68 wfmt = &fmt_config->fmt_ext.fmt;
69 dev_dbg(dev, "ch=%d fmt=%d s_rate=%d\n", wfmt->channels, 69 dev_dbg(dev, "ch=%d fmt=%d s_rate=%d\n", wfmt->channels,
70 wfmt->bits_per_sample, wfmt->samples_per_sec); 70 wfmt->bits_per_sample, wfmt->samples_per_sec);
71 if (wfmt->channels == no_ch && wfmt->samples_per_sec == rate && 71 if (wfmt->channels == no_ch && wfmt->bits_per_sample == bps) {
72 wfmt->bits_per_sample == bps) { 72 /*
73 * if link type is dmic ignore rate check as the blob is
74 * generic for all rates
75 */
73 sp_config = &fmt_config->config; 76 sp_config = &fmt_config->config;
77 if (linktype == NHLT_LINK_DMIC)
78 return sp_config;
74 79
75 return sp_config; 80 if (wfmt->samples_per_sec == rate)
81 return sp_config;
76 } 82 }
77 83
78 fmt_config = (struct nhlt_fmt_cfg *)(fmt_config->config.caps + 84 fmt_config = (struct nhlt_fmt_cfg *)(fmt_config->config.caps +
@@ -115,7 +121,7 @@ struct nhlt_specific_cfg
115 struct device *dev = bus->dev; 121 struct device *dev = bus->dev;
116 struct nhlt_specific_cfg *sp_config; 122 struct nhlt_specific_cfg *sp_config;
117 struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt; 123 struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt;
118 u16 bps = num_ch * s_fmt; 124 u16 bps = (s_fmt == 16) ? 16 : 32;
119 u8 j; 125 u8 j;
120 126
121 dump_config(dev, instance, link_type, s_fmt, num_ch, s_rate, dirn, bps); 127 dump_config(dev, instance, link_type, s_fmt, num_ch, s_rate, dirn, bps);
@@ -128,7 +134,8 @@ struct nhlt_specific_cfg
128 if (skl_check_ep_match(dev, epnt, instance, link_type, dirn)) { 134 if (skl_check_ep_match(dev, epnt, instance, link_type, dirn)) {
129 fmt = (struct nhlt_fmt *)(epnt->config.caps + 135 fmt = (struct nhlt_fmt *)(epnt->config.caps +
130 epnt->config.size); 136 epnt->config.size);
131 sp_config = skl_get_specific_cfg(dev, fmt, num_ch, s_rate, bps); 137 sp_config = skl_get_specific_cfg(dev, fmt, num_ch,
138 s_rate, bps, link_type);
132 if (sp_config) 139 if (sp_config)
133 return sp_config; 140 return sp_config;
134 } 141 }
diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c
index a2f94ce1679d..f3553258091a 100644
--- a/sound/soc/intel/skylake/skl-pcm.c
+++ b/sound/soc/intel/skylake/skl-pcm.c
@@ -25,9 +25,12 @@
25#include <sound/soc.h> 25#include <sound/soc.h>
26#include "skl.h" 26#include "skl.h"
27#include "skl-topology.h" 27#include "skl-topology.h"
28#include "skl-sst-dsp.h"
29#include "skl-sst-ipc.h"
28 30
29#define HDA_MONO 1 31#define HDA_MONO 1
30#define HDA_STEREO 2 32#define HDA_STEREO 2
33#define HDA_QUAD 4
31 34
32static struct snd_pcm_hardware azx_pcm_hw = { 35static struct snd_pcm_hardware azx_pcm_hw = {
33 .info = (SNDRV_PCM_INFO_MMAP | 36 .info = (SNDRV_PCM_INFO_MMAP |
@@ -35,16 +38,20 @@ static struct snd_pcm_hardware azx_pcm_hw = {
35 SNDRV_PCM_INFO_BLOCK_TRANSFER | 38 SNDRV_PCM_INFO_BLOCK_TRANSFER |
36 SNDRV_PCM_INFO_MMAP_VALID | 39 SNDRV_PCM_INFO_MMAP_VALID |
37 SNDRV_PCM_INFO_PAUSE | 40 SNDRV_PCM_INFO_PAUSE |
41 SNDRV_PCM_INFO_RESUME |
38 SNDRV_PCM_INFO_SYNC_START | 42 SNDRV_PCM_INFO_SYNC_START |
39 SNDRV_PCM_INFO_HAS_WALL_CLOCK | /* legacy */ 43 SNDRV_PCM_INFO_HAS_WALL_CLOCK | /* legacy */
40 SNDRV_PCM_INFO_HAS_LINK_ATIME | 44 SNDRV_PCM_INFO_HAS_LINK_ATIME |
41 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP), 45 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
42 .formats = SNDRV_PCM_FMTBIT_S16_LE, 46 .formats = SNDRV_PCM_FMTBIT_S16_LE |
43 .rates = SNDRV_PCM_RATE_48000, 47 SNDRV_PCM_FMTBIT_S32_LE |
44 .rate_min = 48000, 48 SNDRV_PCM_FMTBIT_S24_LE,
49 .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000 |
50 SNDRV_PCM_RATE_8000,
51 .rate_min = 8000,
45 .rate_max = 48000, 52 .rate_max = 48000,
46 .channels_min = 2, 53 .channels_min = 1,
47 .channels_max = 2, 54 .channels_max = HDA_QUAD,
48 .buffer_bytes_max = AZX_MAX_BUF_SIZE, 55 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
49 .period_bytes_min = 128, 56 .period_bytes_min = 128,
50 .period_bytes_max = AZX_MAX_BUF_SIZE / 2, 57 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
@@ -105,6 +112,31 @@ static enum hdac_ext_stream_type skl_get_host_stream_type(struct hdac_ext_bus *e
105 return HDAC_EXT_STREAM_TYPE_COUPLED; 112 return HDAC_EXT_STREAM_TYPE_COUPLED;
106} 113}
107 114
115/*
116 * check if the stream opened is marked as ignore_suspend by machine, if so
117 * then enable suspend_active refcount
118 *
119 * The count supend_active does not need lock as it is used in open/close
120 * and suspend context
121 */
122static void skl_set_suspend_active(struct snd_pcm_substream *substream,
123 struct snd_soc_dai *dai, bool enable)
124{
125 struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
126 struct snd_soc_dapm_widget *w;
127 struct skl *skl = ebus_to_skl(ebus);
128
129 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
130 w = dai->playback_widget;
131 else
132 w = dai->capture_widget;
133
134 if (w->ignore_suspend && enable)
135 skl->supend_active++;
136 else if (w->ignore_suspend && !enable)
137 skl->supend_active--;
138}
139
108static int skl_pcm_open(struct snd_pcm_substream *substream, 140static int skl_pcm_open(struct snd_pcm_substream *substream,
109 struct snd_soc_dai *dai) 141 struct snd_soc_dai *dai)
110{ 142{
@@ -112,12 +144,8 @@ static int skl_pcm_open(struct snd_pcm_substream *substream,
112 struct hdac_ext_stream *stream; 144 struct hdac_ext_stream *stream;
113 struct snd_pcm_runtime *runtime = substream->runtime; 145 struct snd_pcm_runtime *runtime = substream->runtime;
114 struct skl_dma_params *dma_params; 146 struct skl_dma_params *dma_params;
115 int ret;
116 147
117 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); 148 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
118 ret = pm_runtime_get_sync(dai->dev);
119 if (ret < 0)
120 return ret;
121 149
122 stream = snd_hdac_ext_stream_assign(ebus, substream, 150 stream = snd_hdac_ext_stream_assign(ebus, substream,
123 skl_get_host_stream_type(ebus)); 151 skl_get_host_stream_type(ebus));
@@ -146,6 +174,7 @@ static int skl_pcm_open(struct snd_pcm_substream *substream,
146 174
147 dev_dbg(dai->dev, "stream tag set in dma params=%d\n", 175 dev_dbg(dai->dev, "stream tag set in dma params=%d\n",
148 dma_params->stream_tag); 176 dma_params->stream_tag);
177 skl_set_suspend_active(substream, dai, true);
149 snd_pcm_set_sync(substream); 178 snd_pcm_set_sync(substream);
150 179
151 return 0; 180 return 0;
@@ -185,10 +214,6 @@ static int skl_pcm_prepare(struct snd_pcm_substream *substream,
185 int err; 214 int err;
186 215
187 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); 216 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
188 if (hdac_stream(stream)->prepared) {
189 dev_dbg(dai->dev, "already stream is prepared - returning\n");
190 return 0;
191 }
192 217
193 format_val = skl_get_format(substream, dai); 218 format_val = skl_get_format(substream, dai);
194 dev_dbg(dai->dev, "stream_tag=%d formatvalue=%d\n", 219 dev_dbg(dai->dev, "stream_tag=%d formatvalue=%d\n",
@@ -250,6 +275,7 @@ static void skl_pcm_close(struct snd_pcm_substream *substream,
250 struct hdac_ext_stream *stream = get_hdac_ext_stream(substream); 275 struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
251 struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev); 276 struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
252 struct skl_dma_params *dma_params = NULL; 277 struct skl_dma_params *dma_params = NULL;
278 struct skl *skl = ebus_to_skl(ebus);
253 279
254 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); 280 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
255 281
@@ -261,9 +287,18 @@ static void skl_pcm_close(struct snd_pcm_substream *substream,
261 * dma_params 287 * dma_params
262 */ 288 */
263 snd_soc_dai_set_dma_data(dai, substream, NULL); 289 snd_soc_dai_set_dma_data(dai, substream, NULL);
290 skl_set_suspend_active(substream, dai, false);
291
292 /*
293 * check if close is for "Reference Pin" and set back the
294 * CGCTL.MISCBDCGE if disabled by driver
295 */
296 if (!strncmp(dai->name, "Reference Pin", 13) &&
297 skl->skl_sst->miscbdcg_disabled) {
298 skl->skl_sst->enable_miscbdcge(dai->dev, true);
299 skl->skl_sst->miscbdcg_disabled = false;
300 }
264 301
265 pm_runtime_mark_last_busy(dai->dev);
266 pm_runtime_put_autosuspend(dai->dev);
267 kfree(dma_params); 302 kfree(dma_params);
268} 303}
269 304
@@ -291,7 +326,53 @@ static int skl_be_hw_params(struct snd_pcm_substream *substream,
291 p_params.ch = params_channels(params); 326 p_params.ch = params_channels(params);
292 p_params.s_freq = params_rate(params); 327 p_params.s_freq = params_rate(params);
293 p_params.stream = substream->stream; 328 p_params.stream = substream->stream;
294 skl_tplg_be_update_params(dai, &p_params); 329
330 return skl_tplg_be_update_params(dai, &p_params);
331}
332
333static int skl_decoupled_trigger(struct snd_pcm_substream *substream,
334 int cmd)
335{
336 struct hdac_ext_bus *ebus = get_bus_ctx(substream);
337 struct hdac_bus *bus = ebus_to_hbus(ebus);
338 struct hdac_ext_stream *stream;
339 int start;
340 unsigned long cookie;
341 struct hdac_stream *hstr;
342
343 stream = get_hdac_ext_stream(substream);
344 hstr = hdac_stream(stream);
345
346 if (!hstr->prepared)
347 return -EPIPE;
348
349 switch (cmd) {
350 case SNDRV_PCM_TRIGGER_START:
351 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
352 case SNDRV_PCM_TRIGGER_RESUME:
353 start = 1;
354 break;
355
356 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
357 case SNDRV_PCM_TRIGGER_SUSPEND:
358 case SNDRV_PCM_TRIGGER_STOP:
359 start = 0;
360 break;
361
362 default:
363 return -EINVAL;
364 }
365
366 spin_lock_irqsave(&bus->reg_lock, cookie);
367
368 if (start) {
369 snd_hdac_stream_start(hdac_stream(stream), true);
370 snd_hdac_stream_timecounter_init(hstr, 0);
371 } else {
372 snd_hdac_stream_stop(hdac_stream(stream));
373 }
374
375 spin_unlock_irqrestore(&bus->reg_lock, cookie);
295 376
296 return 0; 377 return 0;
297} 378}
@@ -302,23 +383,72 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
302 struct skl *skl = get_skl_ctx(dai->dev); 383 struct skl *skl = get_skl_ctx(dai->dev);
303 struct skl_sst *ctx = skl->skl_sst; 384 struct skl_sst *ctx = skl->skl_sst;
304 struct skl_module_cfg *mconfig; 385 struct skl_module_cfg *mconfig;
386 struct hdac_ext_bus *ebus = get_bus_ctx(substream);
387 struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
388 int ret;
305 389
306 mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream); 390 mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream);
307 if (!mconfig) 391 if (!mconfig)
308 return -EIO; 392 return -EIO;
309 393
310 switch (cmd) { 394 switch (cmd) {
311 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
312 case SNDRV_PCM_TRIGGER_RESUME: 395 case SNDRV_PCM_TRIGGER_RESUME:
396 skl_pcm_prepare(substream, dai);
397 /*
398 * enable DMA Resume enable bit for the stream, set the dpib
399 * & lpib position to resune before starting the DMA
400 */
401 snd_hdac_ext_stream_drsm_enable(ebus, true,
402 hdac_stream(stream)->index);
403 snd_hdac_ext_stream_set_dpibr(ebus, stream, stream->dpib);
404 snd_hdac_ext_stream_set_lpib(stream, stream->lpib);
405
406 case SNDRV_PCM_TRIGGER_START:
407 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
408 /*
409 * Start HOST DMA and Start FE Pipe.This is to make sure that
410 * there are no underrun/overrun in the case when the FE
411 * pipeline is started but there is a delay in starting the
412 * DMA channel on the host.
413 */
414 snd_hdac_ext_stream_decouple(ebus, stream, true);
415 ret = skl_decoupled_trigger(substream, cmd);
416 if (ret < 0)
417 return ret;
313 return skl_run_pipe(ctx, mconfig->pipe); 418 return skl_run_pipe(ctx, mconfig->pipe);
419 break;
314 420
315 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 421 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
316 case SNDRV_PCM_TRIGGER_SUSPEND: 422 case SNDRV_PCM_TRIGGER_SUSPEND:
317 return skl_stop_pipe(ctx, mconfig->pipe); 423 case SNDRV_PCM_TRIGGER_STOP:
424 /*
425 * Stop FE Pipe first and stop DMA. This is to make sure that
426 * there are no underrun/overrun in the case if there is a delay
427 * between the two operations.
428 */
429 ret = skl_stop_pipe(ctx, mconfig->pipe);
430 if (ret < 0)
431 return ret;
432
433 ret = skl_decoupled_trigger(substream, cmd);
434 if (cmd == SNDRV_PCM_TRIGGER_SUSPEND) {
435 /* save the dpib and lpib positions */
436 stream->dpib = readl(ebus->bus.remap_addr +
437 AZX_REG_VS_SDXDPIB_XBASE +
438 (AZX_REG_VS_SDXDPIB_XINTERVAL *
439 hdac_stream(stream)->index));
440
441 stream->lpib = snd_hdac_stream_get_pos_lpib(
442 hdac_stream(stream));
443 snd_hdac_ext_stream_decouple(ebus, stream, false);
444 }
445 break;
318 446
319 default: 447 default:
320 return 0; 448 return -EINVAL;
321 } 449 }
450
451 return 0;
322} 452}
323 453
324static int skl_link_hw_params(struct snd_pcm_substream *substream, 454static int skl_link_hw_params(struct snd_pcm_substream *substream,
@@ -352,9 +482,7 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
352 p_params.stream = substream->stream; 482 p_params.stream = substream->stream;
353 p_params.link_dma_id = hdac_stream(link_dev)->stream_tag - 1; 483 p_params.link_dma_id = hdac_stream(link_dev)->stream_tag - 1;
354 484
355 skl_tplg_be_update_params(dai, &p_params); 485 return skl_tplg_be_update_params(dai, &p_params);
356
357 return 0;
358} 486}
359 487
360static int skl_link_pcm_prepare(struct snd_pcm_substream *substream, 488static int skl_link_pcm_prepare(struct snd_pcm_substream *substream,
@@ -369,11 +497,6 @@ static int skl_link_pcm_prepare(struct snd_pcm_substream *substream,
369 struct snd_soc_dai *codec_dai = rtd->codec_dai; 497 struct snd_soc_dai *codec_dai = rtd->codec_dai;
370 struct hdac_ext_link *link; 498 struct hdac_ext_link *link;
371 499
372 if (link_dev->link_prepared) {
373 dev_dbg(dai->dev, "already stream is prepared - returning\n");
374 return 0;
375 }
376
377 dma_params = (struct skl_dma_params *) 500 dma_params = (struct skl_dma_params *)
378 snd_soc_dai_get_dma_data(codec_dai, substream); 501 snd_soc_dai_get_dma_data(codec_dai, substream);
379 if (dma_params) 502 if (dma_params)
@@ -381,14 +504,15 @@ static int skl_link_pcm_prepare(struct snd_pcm_substream *substream,
381 dev_dbg(dai->dev, "stream_tag=%d formatvalue=%d codec_dai_name=%s\n", 504 dev_dbg(dai->dev, "stream_tag=%d formatvalue=%d codec_dai_name=%s\n",
382 hdac_stream(link_dev)->stream_tag, format_val, codec_dai->name); 505 hdac_stream(link_dev)->stream_tag, format_val, codec_dai->name);
383 506
384 snd_hdac_ext_link_stream_reset(link_dev);
385
386 snd_hdac_ext_link_stream_setup(link_dev, format_val);
387
388 link = snd_hdac_ext_bus_get_link(ebus, rtd->codec->component.name); 507 link = snd_hdac_ext_bus_get_link(ebus, rtd->codec->component.name);
389 if (!link) 508 if (!link)
390 return -EINVAL; 509 return -EINVAL;
391 510
511 snd_hdac_ext_bus_link_power_up(link);
512 snd_hdac_ext_link_stream_reset(link_dev);
513
514 snd_hdac_ext_link_stream_setup(link_dev, format_val);
515
392 snd_hdac_ext_link_set_stream_id(link, hdac_stream(link_dev)->stream_tag); 516 snd_hdac_ext_link_set_stream_id(link, hdac_stream(link_dev)->stream_tag);
393 link_dev->link_prepared = 1; 517 link_dev->link_prepared = 1;
394 518
@@ -400,12 +524,16 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
400{ 524{
401 struct hdac_ext_stream *link_dev = 525 struct hdac_ext_stream *link_dev =
402 snd_soc_dai_get_dma_data(dai, substream); 526 snd_soc_dai_get_dma_data(dai, substream);
527 struct hdac_ext_bus *ebus = get_bus_ctx(substream);
528 struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
403 529
404 dev_dbg(dai->dev, "In %s cmd=%d\n", __func__, cmd); 530 dev_dbg(dai->dev, "In %s cmd=%d\n", __func__, cmd);
405 switch (cmd) { 531 switch (cmd) {
532 case SNDRV_PCM_TRIGGER_RESUME:
533 skl_link_pcm_prepare(substream, dai);
406 case SNDRV_PCM_TRIGGER_START: 534 case SNDRV_PCM_TRIGGER_START:
407 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 535 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
408 case SNDRV_PCM_TRIGGER_RESUME: 536 snd_hdac_ext_stream_decouple(ebus, stream, true);
409 snd_hdac_ext_link_stream_start(link_dev); 537 snd_hdac_ext_link_stream_start(link_dev);
410 break; 538 break;
411 539
@@ -413,6 +541,8 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
413 case SNDRV_PCM_TRIGGER_SUSPEND: 541 case SNDRV_PCM_TRIGGER_SUSPEND:
414 case SNDRV_PCM_TRIGGER_STOP: 542 case SNDRV_PCM_TRIGGER_STOP:
415 snd_hdac_ext_link_stream_clear(link_dev); 543 snd_hdac_ext_link_stream_clear(link_dev);
544 if (cmd == SNDRV_PCM_TRIGGER_SUSPEND)
545 snd_hdac_ext_stream_decouple(ebus, stream, false);
416 break; 546 break;
417 547
418 default: 548 default:
@@ -443,19 +573,6 @@ static int skl_link_hw_free(struct snd_pcm_substream *substream,
443 return 0; 573 return 0;
444} 574}
445 575
446static int skl_be_startup(struct snd_pcm_substream *substream,
447 struct snd_soc_dai *dai)
448{
449 return pm_runtime_get_sync(dai->dev);
450}
451
452static void skl_be_shutdown(struct snd_pcm_substream *substream,
453 struct snd_soc_dai *dai)
454{
455 pm_runtime_mark_last_busy(dai->dev);
456 pm_runtime_put_autosuspend(dai->dev);
457}
458
459static struct snd_soc_dai_ops skl_pcm_dai_ops = { 576static struct snd_soc_dai_ops skl_pcm_dai_ops = {
460 .startup = skl_pcm_open, 577 .startup = skl_pcm_open,
461 .shutdown = skl_pcm_close, 578 .shutdown = skl_pcm_close,
@@ -466,24 +583,18 @@ static struct snd_soc_dai_ops skl_pcm_dai_ops = {
466}; 583};
467 584
468static struct snd_soc_dai_ops skl_dmic_dai_ops = { 585static struct snd_soc_dai_ops skl_dmic_dai_ops = {
469 .startup = skl_be_startup,
470 .hw_params = skl_be_hw_params, 586 .hw_params = skl_be_hw_params,
471 .shutdown = skl_be_shutdown,
472}; 587};
473 588
474static struct snd_soc_dai_ops skl_be_ssp_dai_ops = { 589static struct snd_soc_dai_ops skl_be_ssp_dai_ops = {
475 .startup = skl_be_startup,
476 .hw_params = skl_be_hw_params, 590 .hw_params = skl_be_hw_params,
477 .shutdown = skl_be_shutdown,
478}; 591};
479 592
480static struct snd_soc_dai_ops skl_link_dai_ops = { 593static struct snd_soc_dai_ops skl_link_dai_ops = {
481 .startup = skl_be_startup,
482 .prepare = skl_link_pcm_prepare, 594 .prepare = skl_link_pcm_prepare,
483 .hw_params = skl_link_hw_params, 595 .hw_params = skl_link_hw_params,
484 .hw_free = skl_link_hw_free, 596 .hw_free = skl_link_hw_free,
485 .trigger = skl_link_pcm_trigger, 597 .trigger = skl_link_pcm_trigger,
486 .shutdown = skl_be_shutdown,
487}; 598};
488 599
489static struct snd_soc_dai_driver skl_platform_dai[] = { 600static struct snd_soc_dai_driver skl_platform_dai[] = {
@@ -511,7 +622,7 @@ static struct snd_soc_dai_driver skl_platform_dai[] = {
511 .capture = { 622 .capture = {
512 .stream_name = "Reference Capture", 623 .stream_name = "Reference Capture",
513 .channels_min = HDA_MONO, 624 .channels_min = HDA_MONO,
514 .channels_max = HDA_STEREO, 625 .channels_max = HDA_QUAD,
515 .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000, 626 .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000,
516 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, 627 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
517 }, 628 },
@@ -538,6 +649,18 @@ static struct snd_soc_dai_driver skl_platform_dai[] = {
538 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, 649 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
539 }, 650 },
540}, 651},
652{
653 .name = "DMIC Pin",
654 .ops = &skl_pcm_dai_ops,
655 .capture = {
656 .stream_name = "DMIC Capture",
657 .channels_min = HDA_MONO,
658 .channels_max = HDA_QUAD,
659 .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000,
660 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
661 },
662},
663
541/* BE CPU Dais */ 664/* BE CPU Dais */
542{ 665{
543 .name = "SSP0 Pin", 666 .name = "SSP0 Pin",
@@ -558,6 +681,24 @@ static struct snd_soc_dai_driver skl_platform_dai[] = {
558 }, 681 },
559}, 682},
560{ 683{
684 .name = "SSP1 Pin",
685 .ops = &skl_be_ssp_dai_ops,
686 .playback = {
687 .stream_name = "ssp1 Tx",
688 .channels_min = HDA_STEREO,
689 .channels_max = HDA_STEREO,
690 .rates = SNDRV_PCM_RATE_48000,
691 .formats = SNDRV_PCM_FMTBIT_S16_LE,
692 },
693 .capture = {
694 .stream_name = "ssp1 Rx",
695 .channels_min = HDA_STEREO,
696 .channels_max = HDA_STEREO,
697 .rates = SNDRV_PCM_RATE_48000,
698 .formats = SNDRV_PCM_FMTBIT_S16_LE,
699 },
700},
701{
561 .name = "iDisp Pin", 702 .name = "iDisp Pin",
562 .ops = &skl_link_dai_ops, 703 .ops = &skl_link_dai_ops,
563 .playback = { 704 .playback = {
@@ -573,8 +714,8 @@ static struct snd_soc_dai_driver skl_platform_dai[] = {
573 .ops = &skl_dmic_dai_ops, 714 .ops = &skl_dmic_dai_ops,
574 .capture = { 715 .capture = {
575 .stream_name = "DMIC01 Rx", 716 .stream_name = "DMIC01 Rx",
576 .channels_min = HDA_STEREO, 717 .channels_min = HDA_MONO,
577 .channels_max = HDA_STEREO, 718 .channels_max = HDA_QUAD,
578 .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000, 719 .rates = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_16000,
579 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, 720 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
580 }, 721 },
@@ -688,66 +829,15 @@ static int skl_coupled_trigger(struct snd_pcm_substream *substream,
688 return 0; 829 return 0;
689} 830}
690 831
691static int skl_decoupled_trigger(struct snd_pcm_substream *substream,
692 int cmd)
693{
694 struct hdac_ext_bus *ebus = get_bus_ctx(substream);
695 struct hdac_bus *bus = ebus_to_hbus(ebus);
696 struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
697 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
698 struct hdac_ext_stream *stream;
699 int start;
700 unsigned long cookie;
701 struct hdac_stream *hstr;
702
703 dev_dbg(bus->dev, "In %s cmd=%d streamname=%s\n", __func__, cmd, cpu_dai->name);
704
705 stream = get_hdac_ext_stream(substream);
706 hstr = hdac_stream(stream);
707
708 if (!hstr->prepared)
709 return -EPIPE;
710
711 switch (cmd) {
712 case SNDRV_PCM_TRIGGER_START:
713 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
714 case SNDRV_PCM_TRIGGER_RESUME:
715 start = 1;
716 break;
717
718 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
719 case SNDRV_PCM_TRIGGER_SUSPEND:
720 case SNDRV_PCM_TRIGGER_STOP:
721 start = 0;
722 break;
723
724 default:
725 return -EINVAL;
726 }
727
728 spin_lock_irqsave(&bus->reg_lock, cookie);
729
730 if (start)
731 snd_hdac_stream_start(hdac_stream(stream), true);
732 else
733 snd_hdac_stream_stop(hdac_stream(stream));
734
735 if (start)
736 snd_hdac_stream_timecounter_init(hstr, 0);
737
738 spin_unlock_irqrestore(&bus->reg_lock, cookie);
739
740 return 0;
741}
742static int skl_platform_pcm_trigger(struct snd_pcm_substream *substream, 832static int skl_platform_pcm_trigger(struct snd_pcm_substream *substream,
743 int cmd) 833 int cmd)
744{ 834{
745 struct hdac_ext_bus *ebus = get_bus_ctx(substream); 835 struct hdac_ext_bus *ebus = get_bus_ctx(substream);
746 836
747 if (ebus->ppcap) 837 if (!ebus->ppcap)
748 return skl_decoupled_trigger(substream, cmd);
749 else
750 return skl_coupled_trigger(substream, cmd); 838 return skl_coupled_trigger(substream, cmd);
839
840 return 0;
751} 841}
752 842
753/* calculate runtime delay from LPIB */ 843/* calculate runtime delay from LPIB */
@@ -789,7 +879,7 @@ static unsigned int skl_get_position(struct hdac_ext_stream *hstream,
789{ 879{
790 struct hdac_stream *hstr = hdac_stream(hstream); 880 struct hdac_stream *hstr = hdac_stream(hstream);
791 struct snd_pcm_substream *substream = hstr->substream; 881 struct snd_pcm_substream *substream = hstr->substream;
792 struct hdac_ext_bus *ebus = get_bus_ctx(substream); 882 struct hdac_ext_bus *ebus;
793 unsigned int pos; 883 unsigned int pos;
794 int delay; 884 int delay;
795 885
@@ -800,6 +890,7 @@ static unsigned int skl_get_position(struct hdac_ext_stream *hstream,
800 pos = 0; 890 pos = 0;
801 891
802 if (substream->runtime) { 892 if (substream->runtime) {
893 ebus = get_bus_ctx(substream);
803 delay = skl_get_delay_from_lpib(ebus, hstream, pos) 894 delay = skl_get_delay_from_lpib(ebus, hstream, pos)
804 + codec_delay; 895 + codec_delay;
805 substream->runtime->delay += delay; 896 substream->runtime->delay += delay;
@@ -941,7 +1032,6 @@ int skl_platform_register(struct device *dev)
941 struct skl *skl = ebus_to_skl(ebus); 1032 struct skl *skl = ebus_to_skl(ebus);
942 1033
943 INIT_LIST_HEAD(&skl->ppl_list); 1034 INIT_LIST_HEAD(&skl->ppl_list);
944 INIT_LIST_HEAD(&skl->dapm_path_list);
945 1035
946 ret = snd_soc_register_platform(dev, &skl_platform_drv); 1036 ret = snd_soc_register_platform(dev, &skl_platform_drv);
947 if (ret) { 1037 if (ret) {
diff --git a/sound/soc/intel/skylake/skl-sst-cldma.c b/sound/soc/intel/skylake/skl-sst-cldma.c
index 44748ba98da2..da2329d17f4d 100644
--- a/sound/soc/intel/skylake/skl-sst-cldma.c
+++ b/sound/soc/intel/skylake/skl-sst-cldma.c
@@ -18,6 +18,7 @@
18#include <linux/device.h> 18#include <linux/device.h>
19#include <linux/mm.h> 19#include <linux/mm.h>
20#include <linux/kthread.h> 20#include <linux/kthread.h>
21#include <linux/delay.h>
21#include "../common/sst-dsp.h" 22#include "../common/sst-dsp.h"
22#include "../common/sst-dsp-priv.h" 23#include "../common/sst-dsp-priv.h"
23 24
@@ -33,6 +34,53 @@ void skl_cldma_int_disable(struct sst_dsp *ctx)
33 SKL_ADSP_REG_ADSPIC, SKL_ADSPIC_CL_DMA, 0); 34 SKL_ADSP_REG_ADSPIC, SKL_ADSPIC_CL_DMA, 0);
34} 35}
35 36
37static void skl_cldma_stream_run(struct sst_dsp *ctx, bool enable)
38{
39 unsigned char val;
40 int timeout;
41
42 sst_dsp_shim_update_bits_unlocked(ctx,
43 SKL_ADSP_REG_CL_SD_CTL,
44 CL_SD_CTL_RUN_MASK, CL_SD_CTL_RUN(enable));
45
46 udelay(3);
47 timeout = 300;
48 do {
49 /* waiting for hardware to report that the stream Run bit set */
50 val = sst_dsp_shim_read(ctx, SKL_ADSP_REG_CL_SD_CTL) &
51 CL_SD_CTL_RUN_MASK;
52 if (enable && val)
53 break;
54 else if (!enable && !val)
55 break;
56 udelay(3);
57 } while (--timeout);
58
59 if (timeout == 0)
60 dev_err(ctx->dev, "Failed to set Run bit=%d enable=%d\n", val, enable);
61}
62
63static void skl_cldma_stream_clear(struct sst_dsp *ctx)
64{
65 /* make sure Run bit is cleared before setting stream register */
66 skl_cldma_stream_run(ctx, 0);
67
68 sst_dsp_shim_update_bits(ctx, SKL_ADSP_REG_CL_SD_CTL,
69 CL_SD_CTL_IOCE_MASK, CL_SD_CTL_IOCE(0));
70 sst_dsp_shim_update_bits(ctx, SKL_ADSP_REG_CL_SD_CTL,
71 CL_SD_CTL_FEIE_MASK, CL_SD_CTL_FEIE(0));
72 sst_dsp_shim_update_bits(ctx, SKL_ADSP_REG_CL_SD_CTL,
73 CL_SD_CTL_DEIE_MASK, CL_SD_CTL_DEIE(0));
74 sst_dsp_shim_update_bits(ctx, SKL_ADSP_REG_CL_SD_CTL,
75 CL_SD_CTL_STRM_MASK, CL_SD_CTL_STRM(0));
76
77 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_BDLPL, CL_SD_BDLPLBA(0));
78 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_BDLPU, 0);
79
80 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_CBL, 0);
81 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_LVI, 0);
82}
83
36/* Code loader helper APIs */ 84/* Code loader helper APIs */
37static void skl_cldma_setup_bdle(struct sst_dsp *ctx, 85static void skl_cldma_setup_bdle(struct sst_dsp *ctx,
38 struct snd_dma_buffer *dmab_data, 86 struct snd_dma_buffer *dmab_data,
@@ -68,6 +116,7 @@ static void skl_cldma_setup_controller(struct sst_dsp *ctx,
68 struct snd_dma_buffer *dmab_bdl, unsigned int max_size, 116 struct snd_dma_buffer *dmab_bdl, unsigned int max_size,
69 u32 count) 117 u32 count)
70{ 118{
119 skl_cldma_stream_clear(ctx);
71 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_BDLPL, 120 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_BDLPL,
72 CL_SD_BDLPLBA(dmab_bdl->addr)); 121 CL_SD_BDLPLBA(dmab_bdl->addr));
73 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_BDLPU, 122 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_BDLPU,
@@ -107,36 +156,13 @@ static void skl_cldma_cleanup_spb(struct sst_dsp *ctx)
107 sst_dsp_shim_write_unlocked(ctx, SKL_ADSP_REG_CL_SPBFIFO_SPIB, 0); 156 sst_dsp_shim_write_unlocked(ctx, SKL_ADSP_REG_CL_SPBFIFO_SPIB, 0);
108} 157}
109 158
110static void skl_cldma_trigger(struct sst_dsp *ctx, bool enable)
111{
112 if (enable)
113 sst_dsp_shim_update_bits_unlocked(ctx,
114 SKL_ADSP_REG_CL_SD_CTL,
115 CL_SD_CTL_RUN_MASK, CL_SD_CTL_RUN(1));
116 else
117 sst_dsp_shim_update_bits_unlocked(ctx,
118 SKL_ADSP_REG_CL_SD_CTL,
119 CL_SD_CTL_RUN_MASK, CL_SD_CTL_RUN(0));
120}
121
122static void skl_cldma_cleanup(struct sst_dsp *ctx) 159static void skl_cldma_cleanup(struct sst_dsp *ctx)
123{ 160{
124 skl_cldma_cleanup_spb(ctx); 161 skl_cldma_cleanup_spb(ctx);
162 skl_cldma_stream_clear(ctx);
125 163
126 sst_dsp_shim_update_bits(ctx, SKL_ADSP_REG_CL_SD_CTL, 164 ctx->dsp_ops.free_dma_buf(ctx->dev, &ctx->cl_dev.dmab_data);
127 CL_SD_CTL_IOCE_MASK, CL_SD_CTL_IOCE(0)); 165 ctx->dsp_ops.free_dma_buf(ctx->dev, &ctx->cl_dev.dmab_bdl);
128 sst_dsp_shim_update_bits(ctx, SKL_ADSP_REG_CL_SD_CTL,
129 CL_SD_CTL_FEIE_MASK, CL_SD_CTL_FEIE(0));
130 sst_dsp_shim_update_bits(ctx, SKL_ADSP_REG_CL_SD_CTL,
131 CL_SD_CTL_DEIE_MASK, CL_SD_CTL_DEIE(0));
132 sst_dsp_shim_update_bits(ctx, SKL_ADSP_REG_CL_SD_CTL,
133 CL_SD_CTL_STRM_MASK, CL_SD_CTL_STRM(0));
134
135 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_BDLPL, CL_SD_BDLPLBA(0));
136 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_BDLPU, 0);
137
138 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_CBL, 0);
139 sst_dsp_shim_write(ctx, SKL_ADSP_REG_CL_SD_LVI, 0);
140} 166}
141 167
142static int skl_cldma_wait_interruptible(struct sst_dsp *ctx) 168static int skl_cldma_wait_interruptible(struct sst_dsp *ctx)
@@ -164,7 +190,7 @@ cleanup:
164 190
165static void skl_cldma_stop(struct sst_dsp *ctx) 191static void skl_cldma_stop(struct sst_dsp *ctx)
166{ 192{
167 ctx->cl_dev.ops.cl_trigger(ctx, false); 193 skl_cldma_stream_run(ctx, false);
168} 194}
169 195
170static void skl_cldma_fill_buffer(struct sst_dsp *ctx, unsigned int size, 196static void skl_cldma_fill_buffer(struct sst_dsp *ctx, unsigned int size,
@@ -175,6 +201,21 @@ static void skl_cldma_fill_buffer(struct sst_dsp *ctx, unsigned int size,
175 ctx->cl_dev.dma_buffer_offset, trigger); 201 ctx->cl_dev.dma_buffer_offset, trigger);
176 dev_dbg(ctx->dev, "spib position: %d\n", ctx->cl_dev.curr_spib_pos); 202 dev_dbg(ctx->dev, "spib position: %d\n", ctx->cl_dev.curr_spib_pos);
177 203
204 /*
205 * Check if the size exceeds buffer boundary. If it exceeds
206 * max_buffer size, then copy till buffer size and then copy
207 * remaining buffer from the start of ring buffer.
208 */
209 if (ctx->cl_dev.dma_buffer_offset + size > ctx->cl_dev.bufsize) {
210 unsigned int size_b = ctx->cl_dev.bufsize -
211 ctx->cl_dev.dma_buffer_offset;
212 memcpy(ctx->cl_dev.dmab_data.area + ctx->cl_dev.dma_buffer_offset,
213 curr_pos, size_b);
214 size -= size_b;
215 curr_pos += size_b;
216 ctx->cl_dev.dma_buffer_offset = 0;
217 }
218
178 memcpy(ctx->cl_dev.dmab_data.area + ctx->cl_dev.dma_buffer_offset, 219 memcpy(ctx->cl_dev.dmab_data.area + ctx->cl_dev.dma_buffer_offset,
179 curr_pos, size); 220 curr_pos, size);
180 221
@@ -291,7 +332,7 @@ int skl_cldma_prepare(struct sst_dsp *ctx)
291 ctx->cl_dev.ops.cl_setup_controller = skl_cldma_setup_controller; 332 ctx->cl_dev.ops.cl_setup_controller = skl_cldma_setup_controller;
292 ctx->cl_dev.ops.cl_setup_spb = skl_cldma_setup_spb; 333 ctx->cl_dev.ops.cl_setup_spb = skl_cldma_setup_spb;
293 ctx->cl_dev.ops.cl_cleanup_spb = skl_cldma_cleanup_spb; 334 ctx->cl_dev.ops.cl_cleanup_spb = skl_cldma_cleanup_spb;
294 ctx->cl_dev.ops.cl_trigger = skl_cldma_trigger; 335 ctx->cl_dev.ops.cl_trigger = skl_cldma_stream_run;
295 ctx->cl_dev.ops.cl_cleanup_controller = skl_cldma_cleanup; 336 ctx->cl_dev.ops.cl_cleanup_controller = skl_cldma_cleanup;
296 ctx->cl_dev.ops.cl_copy_to_dmabuf = skl_cldma_copy_to_buf; 337 ctx->cl_dev.ops.cl_copy_to_dmabuf = skl_cldma_copy_to_buf;
297 ctx->cl_dev.ops.cl_stop_dma = skl_cldma_stop; 338 ctx->cl_dev.ops.cl_stop_dma = skl_cldma_stop;
diff --git a/sound/soc/intel/skylake/skl-sst-dsp.h b/sound/soc/intel/skylake/skl-sst-dsp.h
index 6bfcef449bdc..cbb40751c37e 100644
--- a/sound/soc/intel/skylake/skl-sst-dsp.h
+++ b/sound/soc/intel/skylake/skl-sst-dsp.h
@@ -58,9 +58,9 @@ struct sst_dsp_device;
58 58
59#define SKL_ADSP_MMIO_LEN 0x10000 59#define SKL_ADSP_MMIO_LEN 0x10000
60 60
61#define SKL_ADSP_W0_STAT_SZ 0x800 61#define SKL_ADSP_W0_STAT_SZ 0x1000
62 62
63#define SKL_ADSP_W0_UP_SZ 0x800 63#define SKL_ADSP_W0_UP_SZ 0x1000
64 64
65#define SKL_ADSP_W1_SZ 0x1000 65#define SKL_ADSP_W1_SZ 0x1000
66 66
@@ -114,6 +114,9 @@ struct skl_dsp_fw_ops {
114 int (*set_state_D0)(struct sst_dsp *ctx); 114 int (*set_state_D0)(struct sst_dsp *ctx);
115 int (*set_state_D3)(struct sst_dsp *ctx); 115 int (*set_state_D3)(struct sst_dsp *ctx);
116 unsigned int (*get_fw_errcode)(struct sst_dsp *ctx); 116 unsigned int (*get_fw_errcode)(struct sst_dsp *ctx);
117 int (*load_mod)(struct sst_dsp *ctx, u16 mod_id, char *mod_name);
118 int (*unload_mod)(struct sst_dsp *ctx, u16 mod_id);
119
117}; 120};
118 121
119struct skl_dsp_loader_ops { 122struct skl_dsp_loader_ops {
@@ -123,6 +126,17 @@ struct skl_dsp_loader_ops {
123 struct snd_dma_buffer *dmab); 126 struct snd_dma_buffer *dmab);
124}; 127};
125 128
129struct skl_load_module_info {
130 u16 mod_id;
131 const struct firmware *fw;
132};
133
134struct skl_module_table {
135 struct skl_load_module_info *mod_info;
136 unsigned int usage_cnt;
137 struct list_head list;
138};
139
126void skl_cldma_process_intr(struct sst_dsp *ctx); 140void skl_cldma_process_intr(struct sst_dsp *ctx);
127void skl_cldma_int_disable(struct sst_dsp *ctx); 141void skl_cldma_int_disable(struct sst_dsp *ctx);
128int skl_cldma_prepare(struct sst_dsp *ctx); 142int skl_cldma_prepare(struct sst_dsp *ctx);
@@ -139,7 +153,8 @@ void skl_dsp_free(struct sst_dsp *dsp);
139 153
140int skl_dsp_boot(struct sst_dsp *ctx); 154int skl_dsp_boot(struct sst_dsp *ctx);
141int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, 155int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
142 struct skl_dsp_loader_ops dsp_ops, struct skl_sst **dsp); 156 const char *fw_name, struct skl_dsp_loader_ops dsp_ops,
157 struct skl_sst **dsp);
143void skl_sst_dsp_cleanup(struct device *dev, struct skl_sst *ctx); 158void skl_sst_dsp_cleanup(struct device *dev, struct skl_sst *ctx);
144 159
145#endif /*__SKL_SST_DSP_H__*/ 160#endif /*__SKL_SST_DSP_H__*/
diff --git a/sound/soc/intel/skylake/skl-sst-ipc.c b/sound/soc/intel/skylake/skl-sst-ipc.c
index 3345ea0d4414..543460293b00 100644
--- a/sound/soc/intel/skylake/skl-sst-ipc.c
+++ b/sound/soc/intel/skylake/skl-sst-ipc.c
@@ -16,8 +16,10 @@
16 16
17#include "../common/sst-dsp.h" 17#include "../common/sst-dsp.h"
18#include "../common/sst-dsp-priv.h" 18#include "../common/sst-dsp-priv.h"
19#include "skl.h"
19#include "skl-sst-dsp.h" 20#include "skl-sst-dsp.h"
20#include "skl-sst-ipc.h" 21#include "skl-sst-ipc.h"
22#include "sound/hdaudio_ext.h"
21 23
22 24
23#define IPC_IXC_STATUS_BITS 24 25#define IPC_IXC_STATUS_BITS 24
@@ -130,6 +132,11 @@
130#define IPC_SRC_QUEUE_MASK 0x7 132#define IPC_SRC_QUEUE_MASK 0x7
131#define IPC_SRC_QUEUE(x) (((x) & IPC_SRC_QUEUE_MASK) \ 133#define IPC_SRC_QUEUE(x) (((x) & IPC_SRC_QUEUE_MASK) \
132 << IPC_SRC_QUEUE_SHIFT) 134 << IPC_SRC_QUEUE_SHIFT)
135/* Load Module count */
136#define IPC_LOAD_MODULE_SHIFT 0
137#define IPC_LOAD_MODULE_MASK 0xFF
138#define IPC_LOAD_MODULE_CNT(x) (((x) & IPC_LOAD_MODULE_MASK) \
139 << IPC_LOAD_MODULE_SHIFT)
133 140
134/* Save pipeline messgae extension register */ 141/* Save pipeline messgae extension register */
135#define IPC_DMA_ID_SHIFT 0 142#define IPC_DMA_ID_SHIFT 0
@@ -317,6 +324,19 @@ static int skl_ipc_process_notification(struct sst_generic_ipc *ipc,
317 wake_up(&skl->boot_wait); 324 wake_up(&skl->boot_wait);
318 break; 325 break;
319 326
327 case IPC_GLB_NOTIFY_PHRASE_DETECTED:
328 dev_dbg(ipc->dev, "***** Phrase Detected **********\n");
329
330 /*
331 * Per HW recomendation, After phrase detection,
332 * clear the CGCTL.MISCBDCGE.
333 *
334 * This will be set back on stream closure
335 */
336 skl->enable_miscbdcge(ipc->dev, false);
337 skl->miscbdcg_disabled = true;
338 break;
339
320 default: 340 default:
321 dev_err(ipc->dev, "ipc: Unhandled error msg=%x", 341 dev_err(ipc->dev, "ipc: Unhandled error msg=%x",
322 header.primary); 342 header.primary);
@@ -344,6 +364,8 @@ static void skl_ipc_process_reply(struct sst_generic_ipc *ipc,
344 switch (reply) { 364 switch (reply) {
345 case IPC_GLB_REPLY_SUCCESS: 365 case IPC_GLB_REPLY_SUCCESS:
346 dev_info(ipc->dev, "ipc FW reply %x: success\n", header.primary); 366 dev_info(ipc->dev, "ipc FW reply %x: success\n", header.primary);
367 /* copy the rx data from the mailbox */
368 sst_dsp_inbox_read(ipc->dsp, msg->rx_data, msg->rx_size);
347 break; 369 break;
348 370
349 case IPC_GLB_REPLY_OUT_OF_MEMORY: 371 case IPC_GLB_REPLY_OUT_OF_MEMORY:
@@ -650,7 +672,7 @@ int skl_ipc_set_dx(struct sst_generic_ipc *ipc, u8 instance_id,
650 dev_dbg(ipc->dev, "In %s primary =%x ext=%x\n", __func__, 672 dev_dbg(ipc->dev, "In %s primary =%x ext=%x\n", __func__,
651 header.primary, header.extension); 673 header.primary, header.extension);
652 ret = sst_ipc_tx_message_wait(ipc, *ipc_header, 674 ret = sst_ipc_tx_message_wait(ipc, *ipc_header,
653 dx, sizeof(dx), NULL, 0); 675 dx, sizeof(*dx), NULL, 0);
654 if (ret < 0) { 676 if (ret < 0) {
655 dev_err(ipc->dev, "ipc: set dx failed, err %d\n", ret); 677 dev_err(ipc->dev, "ipc: set dx failed, err %d\n", ret);
656 return ret; 678 return ret;
@@ -728,6 +750,54 @@ int skl_ipc_bind_unbind(struct sst_generic_ipc *ipc,
728} 750}
729EXPORT_SYMBOL_GPL(skl_ipc_bind_unbind); 751EXPORT_SYMBOL_GPL(skl_ipc_bind_unbind);
730 752
753/*
754 * In order to load a module we need to send IPC to initiate that. DMA will
755 * performed to load the module memory. The FW supports multiple module load
756 * at single shot, so we can send IPC with N modules represented by
757 * module_cnt
758 */
759int skl_ipc_load_modules(struct sst_generic_ipc *ipc,
760 u8 module_cnt, void *data)
761{
762 struct skl_ipc_header header = {0};
763 u64 *ipc_header = (u64 *)(&header);
764 int ret;
765
766 header.primary = IPC_MSG_TARGET(IPC_FW_GEN_MSG);
767 header.primary |= IPC_MSG_DIR(IPC_MSG_REQUEST);
768 header.primary |= IPC_GLB_TYPE(IPC_GLB_LOAD_MULTIPLE_MODS);
769 header.primary |= IPC_LOAD_MODULE_CNT(module_cnt);
770
771 ret = sst_ipc_tx_message_wait(ipc, *ipc_header, data,
772 (sizeof(u16) * module_cnt), NULL, 0);
773 if (ret < 0)
774 dev_err(ipc->dev, "ipc: load modules failed :%d\n", ret);
775
776 return ret;
777}
778EXPORT_SYMBOL_GPL(skl_ipc_load_modules);
779
780int skl_ipc_unload_modules(struct sst_generic_ipc *ipc, u8 module_cnt,
781 void *data)
782{
783 struct skl_ipc_header header = {0};
784 u64 *ipc_header = (u64 *)(&header);
785 int ret;
786
787 header.primary = IPC_MSG_TARGET(IPC_FW_GEN_MSG);
788 header.primary |= IPC_MSG_DIR(IPC_MSG_REQUEST);
789 header.primary |= IPC_GLB_TYPE(IPC_GLB_UNLOAD_MULTIPLE_MODS);
790 header.primary |= IPC_LOAD_MODULE_CNT(module_cnt);
791
792 ret = sst_ipc_tx_message_wait(ipc, *ipc_header, data,
793 (sizeof(u16) * module_cnt), NULL, 0);
794 if (ret < 0)
795 dev_err(ipc->dev, "ipc: unload modules failed :%d\n", ret);
796
797 return ret;
798}
799EXPORT_SYMBOL_GPL(skl_ipc_unload_modules);
800
731int skl_ipc_set_large_config(struct sst_generic_ipc *ipc, 801int skl_ipc_set_large_config(struct sst_generic_ipc *ipc,
732 struct skl_ipc_large_config_msg *msg, u32 *param) 802 struct skl_ipc_large_config_msg *msg, u32 *param)
733{ 803{
@@ -781,3 +851,54 @@ int skl_ipc_set_large_config(struct sst_generic_ipc *ipc,
781 return ret; 851 return ret;
782} 852}
783EXPORT_SYMBOL_GPL(skl_ipc_set_large_config); 853EXPORT_SYMBOL_GPL(skl_ipc_set_large_config);
854
855int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
856 struct skl_ipc_large_config_msg *msg, u32 *param)
857{
858 struct skl_ipc_header header = {0};
859 u64 *ipc_header = (u64 *)(&header);
860 int ret = 0;
861 size_t sz_remaining, rx_size, data_offset;
862
863 header.primary = IPC_MSG_TARGET(IPC_MOD_MSG);
864 header.primary |= IPC_MSG_DIR(IPC_MSG_REQUEST);
865 header.primary |= IPC_GLB_TYPE(IPC_MOD_LARGE_CONFIG_GET);
866 header.primary |= IPC_MOD_INSTANCE_ID(msg->instance_id);
867 header.primary |= IPC_MOD_ID(msg->module_id);
868
869 header.extension = IPC_DATA_OFFSET_SZ(msg->param_data_size);
870 header.extension |= IPC_LARGE_PARAM_ID(msg->large_param_id);
871 header.extension |= IPC_FINAL_BLOCK(1);
872 header.extension |= IPC_INITIAL_BLOCK(1);
873
874 sz_remaining = msg->param_data_size;
875 data_offset = 0;
876
877 while (sz_remaining != 0) {
878 rx_size = sz_remaining > SKL_ADSP_W1_SZ
879 ? SKL_ADSP_W1_SZ : sz_remaining;
880 if (rx_size == sz_remaining)
881 header.extension |= IPC_FINAL_BLOCK(1);
882
883 ret = sst_ipc_tx_message_wait(ipc, *ipc_header, NULL, 0,
884 ((char *)param) + data_offset,
885 msg->param_data_size);
886 if (ret < 0) {
887 dev_err(ipc->dev,
888 "ipc: get large config fail, err: %d\n", ret);
889 return ret;
890 }
891 sz_remaining -= rx_size;
892 data_offset = msg->param_data_size - sz_remaining;
893
894 /* clear the fields */
895 header.extension &= IPC_INITIAL_BLOCK_CLEAR;
896 header.extension &= IPC_DATA_OFFSET_SZ_CLEAR;
897 /* fill the fields */
898 header.extension |= IPC_INITIAL_BLOCK(1);
899 header.extension |= IPC_DATA_OFFSET_SZ(data_offset);
900 }
901
902 return ret;
903}
904EXPORT_SYMBOL_GPL(skl_ipc_get_large_config);
diff --git a/sound/soc/intel/skylake/skl-sst-ipc.h b/sound/soc/intel/skylake/skl-sst-ipc.h
index f1a154e45dc3..d59d1ba62a43 100644
--- a/sound/soc/intel/skylake/skl-sst-ipc.h
+++ b/sound/soc/intel/skylake/skl-sst-ipc.h
@@ -55,6 +55,11 @@ struct skl_sst {
55 55
56 /* IPC messaging */ 56 /* IPC messaging */
57 struct sst_generic_ipc ipc; 57 struct sst_generic_ipc ipc;
58
59 /* callback for miscbdge */
60 void (*enable_miscbdcge)(struct device *dev, bool enable);
61 /*Is CGCTL.MISCBDCGE disabled*/
62 bool miscbdcg_disabled;
58}; 63};
59 64
60struct skl_ipc_init_instance_msg { 65struct skl_ipc_init_instance_msg {
@@ -108,12 +113,21 @@ int skl_ipc_init_instance(struct sst_generic_ipc *sst_ipc,
108int skl_ipc_bind_unbind(struct sst_generic_ipc *sst_ipc, 113int skl_ipc_bind_unbind(struct sst_generic_ipc *sst_ipc,
109 struct skl_ipc_bind_unbind_msg *msg); 114 struct skl_ipc_bind_unbind_msg *msg);
110 115
116int skl_ipc_load_modules(struct sst_generic_ipc *ipc,
117 u8 module_cnt, void *data);
118
119int skl_ipc_unload_modules(struct sst_generic_ipc *ipc,
120 u8 module_cnt, void *data);
121
111int skl_ipc_set_dx(struct sst_generic_ipc *ipc, 122int skl_ipc_set_dx(struct sst_generic_ipc *ipc,
112 u8 instance_id, u16 module_id, struct skl_ipc_dxstate_info *dx); 123 u8 instance_id, u16 module_id, struct skl_ipc_dxstate_info *dx);
113 124
114int skl_ipc_set_large_config(struct sst_generic_ipc *ipc, 125int skl_ipc_set_large_config(struct sst_generic_ipc *ipc,
115 struct skl_ipc_large_config_msg *msg, u32 *param); 126 struct skl_ipc_large_config_msg *msg, u32 *param);
116 127
128int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
129 struct skl_ipc_large_config_msg *msg, u32 *param);
130
117void skl_ipc_int_enable(struct sst_dsp *dsp); 131void skl_ipc_int_enable(struct sst_dsp *dsp);
118void skl_ipc_op_int_enable(struct sst_dsp *ctx); 132void skl_ipc_op_int_enable(struct sst_dsp *ctx);
119void skl_ipc_op_int_disable(struct sst_dsp *ctx); 133void skl_ipc_op_int_disable(struct sst_dsp *ctx);
diff --git a/sound/soc/intel/skylake/skl-sst.c b/sound/soc/intel/skylake/skl-sst.c
index 3b83dc99f1d4..e26f4746afb7 100644
--- a/sound/soc/intel/skylake/skl-sst.c
+++ b/sound/soc/intel/skylake/skl-sst.c
@@ -19,6 +19,7 @@
19#include <linux/module.h> 19#include <linux/module.h>
20#include <linux/delay.h> 20#include <linux/delay.h>
21#include <linux/device.h> 21#include <linux/device.h>
22#include <linux/err.h>
22#include "../common/sst-dsp.h" 23#include "../common/sst-dsp.h"
23#include "../common/sst-dsp-priv.h" 24#include "../common/sst-dsp-priv.h"
24#include "../common/sst-ipc.h" 25#include "../common/sst-ipc.h"
@@ -37,6 +38,8 @@
37#define SKL_INSTANCE_ID 0 38#define SKL_INSTANCE_ID 0
38#define SKL_BASE_FW_MODULE_ID 0 39#define SKL_BASE_FW_MODULE_ID 0
39 40
41#define SKL_NUM_MODULES 1
42
40static bool skl_check_fw_status(struct sst_dsp *ctx, u32 status) 43static bool skl_check_fw_status(struct sst_dsp *ctx, u32 status)
41{ 44{
42 u32 cur_sts; 45 u32 cur_sts;
@@ -77,7 +80,7 @@ static int skl_load_base_firmware(struct sst_dsp *ctx)
77 init_waitqueue_head(&skl->boot_wait); 80 init_waitqueue_head(&skl->boot_wait);
78 81
79 if (ctx->fw == NULL) { 82 if (ctx->fw == NULL) {
80 ret = request_firmware(&ctx->fw, "dsp_fw_release.bin", ctx->dev); 83 ret = request_firmware(&ctx->fw, ctx->fw_name, ctx->dev);
81 if (ret < 0) { 84 if (ret < 0) {
82 dev_err(ctx->dev, "Request firmware failed %d\n", ret); 85 dev_err(ctx->dev, "Request firmware failed %d\n", ret);
83 skl_dsp_disable_core(ctx); 86 skl_dsp_disable_core(ctx);
@@ -115,27 +118,28 @@ static int skl_load_base_firmware(struct sst_dsp *ctx)
115 dev_err(ctx->dev, 118 dev_err(ctx->dev,
116 "Timeout waiting for ROM init done, reg:0x%x\n", reg); 119 "Timeout waiting for ROM init done, reg:0x%x\n", reg);
117 ret = -EIO; 120 ret = -EIO;
118 goto skl_load_base_firmware_failed; 121 goto transfer_firmware_failed;
119 } 122 }
120 123
121 ret = skl_transfer_firmware(ctx, ctx->fw->data, ctx->fw->size); 124 ret = skl_transfer_firmware(ctx, ctx->fw->data, ctx->fw->size);
122 if (ret < 0) { 125 if (ret < 0) {
123 dev_err(ctx->dev, "Transfer firmware failed%d\n", ret); 126 dev_err(ctx->dev, "Transfer firmware failed%d\n", ret);
124 goto skl_load_base_firmware_failed; 127 goto transfer_firmware_failed;
125 } else { 128 } else {
126 ret = wait_event_timeout(skl->boot_wait, skl->boot_complete, 129 ret = wait_event_timeout(skl->boot_wait, skl->boot_complete,
127 msecs_to_jiffies(SKL_IPC_BOOT_MSECS)); 130 msecs_to_jiffies(SKL_IPC_BOOT_MSECS));
128 if (ret == 0) { 131 if (ret == 0) {
129 dev_err(ctx->dev, "DSP boot failed, FW Ready timed-out\n"); 132 dev_err(ctx->dev, "DSP boot failed, FW Ready timed-out\n");
130 ret = -EIO; 133 ret = -EIO;
131 goto skl_load_base_firmware_failed; 134 goto transfer_firmware_failed;
132 } 135 }
133 136
134 dev_dbg(ctx->dev, "Download firmware successful%d\n", ret); 137 dev_dbg(ctx->dev, "Download firmware successful%d\n", ret);
135 skl_dsp_set_state_locked(ctx, SKL_DSP_RUNNING); 138 skl_dsp_set_state_locked(ctx, SKL_DSP_RUNNING);
136 } 139 }
137 return 0; 140 return 0;
138 141transfer_firmware_failed:
142 ctx->cl_dev.ops.cl_cleanup_controller(ctx);
139skl_load_base_firmware_failed: 143skl_load_base_firmware_failed:
140 skl_dsp_disable_core(ctx); 144 skl_dsp_disable_core(ctx);
141 release_firmware(ctx->fw); 145 release_firmware(ctx->fw);
@@ -175,10 +179,15 @@ static int skl_set_dsp_D3(struct sst_dsp *ctx)
175 dx.core_mask = SKL_DSP_CORE0_MASK; 179 dx.core_mask = SKL_DSP_CORE0_MASK;
176 dx.dx_mask = SKL_IPC_D3_MASK; 180 dx.dx_mask = SKL_IPC_D3_MASK;
177 ret = skl_ipc_set_dx(&skl->ipc, SKL_INSTANCE_ID, SKL_BASE_FW_MODULE_ID, &dx); 181 ret = skl_ipc_set_dx(&skl->ipc, SKL_INSTANCE_ID, SKL_BASE_FW_MODULE_ID, &dx);
178 if (ret < 0) { 182 if (ret < 0)
179 dev_err(ctx->dev, "Failed to set DSP to D3 state\n"); 183 dev_err(ctx->dev,
180 return ret; 184 "D3 request to FW failed, continuing reset: %d", ret);
181 } 185
186 /* disable Interrupt */
187 ctx->cl_dev.ops.cl_cleanup_controller(ctx);
188 skl_cldma_int_disable(ctx);
189 skl_ipc_op_int_disable(ctx);
190 skl_ipc_int_disable(ctx);
182 191
183 ret = skl_dsp_disable_core(ctx); 192 ret = skl_dsp_disable_core(ctx);
184 if (ret < 0) { 193 if (ret < 0) {
@@ -187,12 +196,6 @@ static int skl_set_dsp_D3(struct sst_dsp *ctx)
187 } 196 }
188 skl_dsp_set_state_locked(ctx, SKL_DSP_RESET); 197 skl_dsp_set_state_locked(ctx, SKL_DSP_RESET);
189 198
190 /* disable Interrupt */
191 ctx->cl_dev.ops.cl_cleanup_controller(ctx);
192 skl_cldma_int_disable(ctx);
193 skl_ipc_op_int_disable(ctx);
194 skl_ipc_int_disable(ctx);
195
196 return ret; 199 return ret;
197} 200}
198 201
@@ -201,11 +204,182 @@ static unsigned int skl_get_errorcode(struct sst_dsp *ctx)
201 return sst_dsp_shim_read(ctx, SKL_ADSP_ERROR_CODE); 204 return sst_dsp_shim_read(ctx, SKL_ADSP_ERROR_CODE);
202} 205}
203 206
207/*
208 * since get/set_module are called from DAPM context,
209 * we don't need lock for usage count
210 */
211static int skl_get_module(struct sst_dsp *ctx, u16 mod_id)
212{
213 struct skl_module_table *module;
214
215 list_for_each_entry(module, &ctx->module_list, list) {
216 if (module->mod_info->mod_id == mod_id)
217 return ++module->usage_cnt;
218 }
219
220 return -EINVAL;
221}
222
223static int skl_put_module(struct sst_dsp *ctx, u16 mod_id)
224{
225 struct skl_module_table *module;
226
227 list_for_each_entry(module, &ctx->module_list, list) {
228 if (module->mod_info->mod_id == mod_id)
229 return --module->usage_cnt;
230 }
231
232 return -EINVAL;
233}
234
235static struct skl_module_table *skl_fill_module_table(struct sst_dsp *ctx,
236 char *mod_name, int mod_id)
237{
238 const struct firmware *fw;
239 struct skl_module_table *skl_module;
240 unsigned int size;
241 int ret;
242
243 ret = request_firmware(&fw, mod_name, ctx->dev);
244 if (ret < 0) {
245 dev_err(ctx->dev, "Request Module %s failed :%d\n",
246 mod_name, ret);
247 return NULL;
248 }
249
250 skl_module = devm_kzalloc(ctx->dev, sizeof(*skl_module), GFP_KERNEL);
251 if (skl_module == NULL) {
252 release_firmware(fw);
253 return NULL;
254 }
255
256 size = sizeof(*skl_module->mod_info);
257 skl_module->mod_info = devm_kzalloc(ctx->dev, size, GFP_KERNEL);
258 if (skl_module->mod_info == NULL) {
259 release_firmware(fw);
260 return NULL;
261 }
262
263 skl_module->mod_info->mod_id = mod_id;
264 skl_module->mod_info->fw = fw;
265 list_add(&skl_module->list, &ctx->module_list);
266
267 return skl_module;
268}
269
270/* get a module from it's unique ID */
271static struct skl_module_table *skl_module_get_from_id(
272 struct sst_dsp *ctx, u16 mod_id)
273{
274 struct skl_module_table *module;
275
276 if (list_empty(&ctx->module_list)) {
277 dev_err(ctx->dev, "Module list is empty\n");
278 return NULL;
279 }
280
281 list_for_each_entry(module, &ctx->module_list, list) {
282 if (module->mod_info->mod_id == mod_id)
283 return module;
284 }
285
286 return NULL;
287}
288
289static int skl_transfer_module(struct sst_dsp *ctx,
290 struct skl_load_module_info *module)
291{
292 int ret;
293 struct skl_sst *skl = ctx->thread_context;
294
295 ret = ctx->cl_dev.ops.cl_copy_to_dmabuf(ctx, module->fw->data,
296 module->fw->size);
297 if (ret < 0)
298 return ret;
299
300 ret = skl_ipc_load_modules(&skl->ipc, SKL_NUM_MODULES,
301 (void *)&module->mod_id);
302 if (ret < 0)
303 dev_err(ctx->dev, "Failed to Load module: %d\n", ret);
304
305 ctx->cl_dev.ops.cl_stop_dma(ctx);
306
307 return ret;
308}
309
310static int skl_load_module(struct sst_dsp *ctx, u16 mod_id, char *guid)
311{
312 struct skl_module_table *module_entry = NULL;
313 int ret = 0;
314 char mod_name[64]; /* guid str = 32 chars + 4 hyphens */
315
316 snprintf(mod_name, sizeof(mod_name), "%s%s%s",
317 "intel/dsp_fw_", guid, ".bin");
318
319 module_entry = skl_module_get_from_id(ctx, mod_id);
320 if (module_entry == NULL) {
321 module_entry = skl_fill_module_table(ctx, mod_name, mod_id);
322 if (module_entry == NULL) {
323 dev_err(ctx->dev, "Failed to Load module\n");
324 return -EINVAL;
325 }
326 }
327
328 if (!module_entry->usage_cnt) {
329 ret = skl_transfer_module(ctx, module_entry->mod_info);
330 if (ret < 0) {
331 dev_err(ctx->dev, "Failed to Load module\n");
332 return ret;
333 }
334 }
335
336 ret = skl_get_module(ctx, mod_id);
337
338 return ret;
339}
340
341static int skl_unload_module(struct sst_dsp *ctx, u16 mod_id)
342{
343 int usage_cnt;
344 struct skl_sst *skl = ctx->thread_context;
345 int ret = 0;
346
347 usage_cnt = skl_put_module(ctx, mod_id);
348 if (usage_cnt < 0) {
349 dev_err(ctx->dev, "Module bad usage cnt!:%d\n", usage_cnt);
350 return -EIO;
351 }
352 ret = skl_ipc_unload_modules(&skl->ipc,
353 SKL_NUM_MODULES, &mod_id);
354 if (ret < 0) {
355 dev_err(ctx->dev, "Failed to UnLoad module\n");
356 skl_get_module(ctx, mod_id);
357 return ret;
358 }
359
360 return ret;
361}
362
363static void skl_clear_module_table(struct sst_dsp *ctx)
364{
365 struct skl_module_table *module, *tmp;
366
367 if (list_empty(&ctx->module_list))
368 return;
369
370 list_for_each_entry_safe(module, tmp, &ctx->module_list, list) {
371 list_del(&module->list);
372 release_firmware(module->mod_info->fw);
373 }
374}
375
204static struct skl_dsp_fw_ops skl_fw_ops = { 376static struct skl_dsp_fw_ops skl_fw_ops = {
205 .set_state_D0 = skl_set_dsp_D0, 377 .set_state_D0 = skl_set_dsp_D0,
206 .set_state_D3 = skl_set_dsp_D3, 378 .set_state_D3 = skl_set_dsp_D3,
207 .load_fw = skl_load_base_firmware, 379 .load_fw = skl_load_base_firmware,
208 .get_fw_errcode = skl_get_errorcode, 380 .get_fw_errcode = skl_get_errorcode,
381 .load_mod = skl_load_module,
382 .unload_mod = skl_unload_module,
209}; 383};
210 384
211static struct sst_ops skl_ops = { 385static struct sst_ops skl_ops = {
@@ -223,7 +397,7 @@ static struct sst_dsp_device skl_dev = {
223}; 397};
224 398
225int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq, 399int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
226 struct skl_dsp_loader_ops dsp_ops, struct skl_sst **dsp) 400 const char *fw_name, struct skl_dsp_loader_ops dsp_ops, struct skl_sst **dsp)
227{ 401{
228 struct skl_sst *skl; 402 struct skl_sst *skl;
229 struct sst_dsp *sst; 403 struct sst_dsp *sst;
@@ -244,11 +418,13 @@ int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
244 418
245 sst = skl->dsp; 419 sst = skl->dsp;
246 420
421 sst->fw_name = fw_name;
247 sst->addr.lpe = mmio_base; 422 sst->addr.lpe = mmio_base;
248 sst->addr.shim = mmio_base; 423 sst->addr.shim = mmio_base;
249 sst_dsp_mailbox_init(sst, (SKL_ADSP_SRAM0_BASE + SKL_ADSP_W0_STAT_SZ), 424 sst_dsp_mailbox_init(sst, (SKL_ADSP_SRAM0_BASE + SKL_ADSP_W0_STAT_SZ),
250 SKL_ADSP_W0_UP_SZ, SKL_ADSP_SRAM1_BASE, SKL_ADSP_W1_SZ); 425 SKL_ADSP_W0_UP_SZ, SKL_ADSP_SRAM1_BASE, SKL_ADSP_W1_SZ);
251 426
427 INIT_LIST_HEAD(&sst->module_list);
252 sst->dsp_ops = dsp_ops; 428 sst->dsp_ops = dsp_ops;
253 sst->fw_ops = skl_fw_ops; 429 sst->fw_ops = skl_fw_ops;
254 430
@@ -259,23 +435,24 @@ int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
259 ret = sst->fw_ops.load_fw(sst); 435 ret = sst->fw_ops.load_fw(sst);
260 if (ret < 0) { 436 if (ret < 0) {
261 dev_err(dev, "Load base fw failed : %d", ret); 437 dev_err(dev, "Load base fw failed : %d", ret);
262 return ret; 438 goto cleanup;
263 } 439 }
264 440
265 if (dsp) 441 if (dsp)
266 *dsp = skl; 442 *dsp = skl;
267 443
268 return 0; 444 return ret;
269 445
270 skl_ipc_free(&skl->ipc); 446cleanup:
447 skl_sst_dsp_cleanup(dev, skl);
271 return ret; 448 return ret;
272} 449}
273EXPORT_SYMBOL_GPL(skl_sst_dsp_init); 450EXPORT_SYMBOL_GPL(skl_sst_dsp_init);
274 451
275void skl_sst_dsp_cleanup(struct device *dev, struct skl_sst *ctx) 452void skl_sst_dsp_cleanup(struct device *dev, struct skl_sst *ctx)
276{ 453{
454 skl_clear_module_table(ctx->dsp);
277 skl_ipc_free(&ctx->ipc); 455 skl_ipc_free(&ctx->ipc);
278 ctx->dsp->cl_dev.ops.cl_cleanup_controller(ctx->dsp);
279 ctx->dsp->ops->free(ctx->dsp); 456 ctx->dsp->ops->free(ctx->dsp);
280} 457}
281EXPORT_SYMBOL_GPL(skl_sst_dsp_cleanup); 458EXPORT_SYMBOL_GPL(skl_sst_dsp_cleanup);
diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
index ad4d0f82603e..4624556f486d 100644
--- a/sound/soc/intel/skylake/skl-topology.c
+++ b/sound/soc/intel/skylake/skl-topology.c
@@ -26,6 +26,8 @@
26#include "skl-topology.h" 26#include "skl-topology.h"
27#include "skl.h" 27#include "skl.h"
28#include "skl-tplg-interface.h" 28#include "skl-tplg-interface.h"
29#include "../common/sst-dsp.h"
30#include "../common/sst-dsp-priv.h"
29 31
30#define SKL_CH_FIXUP_MASK (1 << 0) 32#define SKL_CH_FIXUP_MASK (1 << 0)
31#define SKL_RATE_FIXUP_MASK (1 << 1) 33#define SKL_RATE_FIXUP_MASK (1 << 1)
@@ -129,17 +131,15 @@ static void skl_dump_mconfig(struct skl_sst *ctx,
129{ 131{
130 dev_dbg(ctx->dev, "Dumping config\n"); 132 dev_dbg(ctx->dev, "Dumping config\n");
131 dev_dbg(ctx->dev, "Input Format:\n"); 133 dev_dbg(ctx->dev, "Input Format:\n");
132 dev_dbg(ctx->dev, "channels = %d\n", mcfg->in_fmt.channels); 134 dev_dbg(ctx->dev, "channels = %d\n", mcfg->in_fmt[0].channels);
133 dev_dbg(ctx->dev, "s_freq = %d\n", mcfg->in_fmt.s_freq); 135 dev_dbg(ctx->dev, "s_freq = %d\n", mcfg->in_fmt[0].s_freq);
134 dev_dbg(ctx->dev, "ch_cfg = %d\n", mcfg->in_fmt.ch_cfg); 136 dev_dbg(ctx->dev, "ch_cfg = %d\n", mcfg->in_fmt[0].ch_cfg);
135 dev_dbg(ctx->dev, "valid bit depth = %d\n", 137 dev_dbg(ctx->dev, "valid bit depth = %d\n", mcfg->in_fmt[0].valid_bit_depth);
136 mcfg->in_fmt.valid_bit_depth);
137 dev_dbg(ctx->dev, "Output Format:\n"); 138 dev_dbg(ctx->dev, "Output Format:\n");
138 dev_dbg(ctx->dev, "channels = %d\n", mcfg->out_fmt.channels); 139 dev_dbg(ctx->dev, "channels = %d\n", mcfg->out_fmt[0].channels);
139 dev_dbg(ctx->dev, "s_freq = %d\n", mcfg->out_fmt.s_freq); 140 dev_dbg(ctx->dev, "s_freq = %d\n", mcfg->out_fmt[0].s_freq);
140 dev_dbg(ctx->dev, "valid bit depth = %d\n", 141 dev_dbg(ctx->dev, "valid bit depth = %d\n", mcfg->out_fmt[0].valid_bit_depth);
141 mcfg->out_fmt.valid_bit_depth); 142 dev_dbg(ctx->dev, "ch_cfg = %d\n", mcfg->out_fmt[0].ch_cfg);
142 dev_dbg(ctx->dev, "ch_cfg = %d\n", mcfg->out_fmt.ch_cfg);
143} 143}
144 144
145static void skl_tplg_update_params(struct skl_module_fmt *fmt, 145static void skl_tplg_update_params(struct skl_module_fmt *fmt,
@@ -149,8 +149,24 @@ static void skl_tplg_update_params(struct skl_module_fmt *fmt,
149 fmt->s_freq = params->s_freq; 149 fmt->s_freq = params->s_freq;
150 if (fixup & SKL_CH_FIXUP_MASK) 150 if (fixup & SKL_CH_FIXUP_MASK)
151 fmt->channels = params->ch; 151 fmt->channels = params->ch;
152 if (fixup & SKL_FMT_FIXUP_MASK) 152 if (fixup & SKL_FMT_FIXUP_MASK) {
153 fmt->valid_bit_depth = params->s_fmt; 153 fmt->valid_bit_depth = skl_get_bit_depth(params->s_fmt);
154
155 /*
156 * 16 bit is 16 bit container whereas 24 bit is in 32 bit
157 * container so update bit depth accordingly
158 */
159 switch (fmt->valid_bit_depth) {
160 case SKL_DEPTH_16BIT:
161 fmt->bit_depth = fmt->valid_bit_depth;
162 break;
163
164 default:
165 fmt->bit_depth = SKL_DEPTH_32BIT;
166 break;
167 }
168 }
169
154} 170}
155 171
156/* 172/*
@@ -171,8 +187,9 @@ static void skl_tplg_update_params_fixup(struct skl_module_cfg *m_cfg,
171 int in_fixup, out_fixup; 187 int in_fixup, out_fixup;
172 struct skl_module_fmt *in_fmt, *out_fmt; 188 struct skl_module_fmt *in_fmt, *out_fmt;
173 189
174 in_fmt = &m_cfg->in_fmt; 190 /* Fixups will be applied to pin 0 only */
175 out_fmt = &m_cfg->out_fmt; 191 in_fmt = &m_cfg->in_fmt[0];
192 out_fmt = &m_cfg->out_fmt[0];
176 193
177 if (params->stream == SNDRV_PCM_STREAM_PLAYBACK) { 194 if (params->stream == SNDRV_PCM_STREAM_PLAYBACK) {
178 if (is_fe) { 195 if (is_fe) {
@@ -209,18 +226,25 @@ static void skl_tplg_update_buffer_size(struct skl_sst *ctx,
209 struct skl_module_cfg *mcfg) 226 struct skl_module_cfg *mcfg)
210{ 227{
211 int multiplier = 1; 228 int multiplier = 1;
229 struct skl_module_fmt *in_fmt, *out_fmt;
230
231
232 /* Since fixups is applied to pin 0 only, ibs, obs needs
233 * change for pin 0 only
234 */
235 in_fmt = &mcfg->in_fmt[0];
236 out_fmt = &mcfg->out_fmt[0];
212 237
213 if (mcfg->m_type == SKL_MODULE_TYPE_SRCINT) 238 if (mcfg->m_type == SKL_MODULE_TYPE_SRCINT)
214 multiplier = 5; 239 multiplier = 5;
215 240 mcfg->ibs = (in_fmt->s_freq / 1000) *
216 mcfg->ibs = (mcfg->in_fmt.s_freq / 1000) * 241 (mcfg->in_fmt->channels) *
217 (mcfg->in_fmt.channels) * 242 (mcfg->in_fmt->bit_depth >> 3) *
218 (mcfg->in_fmt.bit_depth >> 3) *
219 multiplier; 243 multiplier;
220 244
221 mcfg->obs = (mcfg->out_fmt.s_freq / 1000) * 245 mcfg->obs = (mcfg->out_fmt->s_freq / 1000) *
222 (mcfg->out_fmt.channels) * 246 (mcfg->out_fmt->channels) *
223 (mcfg->out_fmt.bit_depth >> 3) * 247 (mcfg->out_fmt->bit_depth >> 3) *
224 multiplier; 248 multiplier;
225} 249}
226 250
@@ -292,6 +316,83 @@ static int skl_tplg_alloc_pipe_widget(struct device *dev,
292} 316}
293 317
294/* 318/*
319 * some modules can have multiple params set from user control and
320 * need to be set after module is initialized. If set_param flag is
321 * set module params will be done after module is initialised.
322 */
323static int skl_tplg_set_module_params(struct snd_soc_dapm_widget *w,
324 struct skl_sst *ctx)
325{
326 int i, ret;
327 struct skl_module_cfg *mconfig = w->priv;
328 const struct snd_kcontrol_new *k;
329 struct soc_bytes_ext *sb;
330 struct skl_algo_data *bc;
331 struct skl_specific_cfg *sp_cfg;
332
333 if (mconfig->formats_config.caps_size > 0 &&
334 mconfig->formats_config.set_params == SKL_PARAM_SET) {
335 sp_cfg = &mconfig->formats_config;
336 ret = skl_set_module_params(ctx, sp_cfg->caps,
337 sp_cfg->caps_size,
338 sp_cfg->param_id, mconfig);
339 if (ret < 0)
340 return ret;
341 }
342
343 for (i = 0; i < w->num_kcontrols; i++) {
344 k = &w->kcontrol_news[i];
345 if (k->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
346 sb = (void *) k->private_value;
347 bc = (struct skl_algo_data *)sb->dobj.private;
348
349 if (bc->set_params == SKL_PARAM_SET) {
350 ret = skl_set_module_params(ctx,
351 (u32 *)bc->params, bc->max,
352 bc->param_id, mconfig);
353 if (ret < 0)
354 return ret;
355 }
356 }
357 }
358
359 return 0;
360}
361
362/*
363 * some module param can set from user control and this is required as
364 * when module is initailzed. if module param is required in init it is
365 * identifed by set_param flag. if set_param flag is not set, then this
366 * parameter needs to set as part of module init.
367 */
368static int skl_tplg_set_module_init_data(struct snd_soc_dapm_widget *w)
369{
370 const struct snd_kcontrol_new *k;
371 struct soc_bytes_ext *sb;
372 struct skl_algo_data *bc;
373 struct skl_module_cfg *mconfig = w->priv;
374 int i;
375
376 for (i = 0; i < w->num_kcontrols; i++) {
377 k = &w->kcontrol_news[i];
378 if (k->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
379 sb = (struct soc_bytes_ext *)k->private_value;
380 bc = (struct skl_algo_data *)sb->dobj.private;
381
382 if (bc->set_params != SKL_PARAM_INIT)
383 continue;
384
385 mconfig->formats_config.caps = (u32 *)&bc->params;
386 mconfig->formats_config.caps_size = bc->max;
387
388 break;
389 }
390 }
391
392 return 0;
393}
394
395/*
295 * Inside a pipe instance, we can have various modules. These modules need 396 * Inside a pipe instance, we can have various modules. These modules need
296 * to instantiated in DSP by invoking INIT_MODULE IPC, which is achieved by 397 * to instantiated in DSP by invoking INIT_MODULE IPC, which is achieved by
297 * skl_init_module() routine, so invoke that for all modules in a pipeline 398 * skl_init_module() routine, so invoke that for all modules in a pipeline
@@ -313,12 +414,25 @@ skl_tplg_init_pipe_modules(struct skl *skl, struct skl_pipe *pipe)
313 if (!skl_tplg_alloc_pipe_mcps(skl, mconfig)) 414 if (!skl_tplg_alloc_pipe_mcps(skl, mconfig))
314 return -ENOMEM; 415 return -ENOMEM;
315 416
417 if (mconfig->is_loadable && ctx->dsp->fw_ops.load_mod) {
418 ret = ctx->dsp->fw_ops.load_mod(ctx->dsp,
419 mconfig->id.module_id, mconfig->guid);
420 if (ret < 0)
421 return ret;
422 }
423
316 /* 424 /*
317 * apply fix/conversion to module params based on 425 * apply fix/conversion to module params based on
318 * FE/BE params 426 * FE/BE params
319 */ 427 */
320 skl_tplg_update_module_params(w, ctx); 428 skl_tplg_update_module_params(w, ctx);
321 ret = skl_init_module(ctx, mconfig, NULL); 429
430 skl_tplg_set_module_init_data(w);
431 ret = skl_init_module(ctx, mconfig);
432 if (ret < 0)
433 return ret;
434
435 ret = skl_tplg_set_module_params(w, ctx);
322 if (ret < 0) 436 if (ret < 0)
323 return ret; 437 return ret;
324 } 438 }
@@ -326,6 +440,24 @@ skl_tplg_init_pipe_modules(struct skl *skl, struct skl_pipe *pipe)
326 return 0; 440 return 0;
327} 441}
328 442
443static int skl_tplg_unload_pipe_modules(struct skl_sst *ctx,
444 struct skl_pipe *pipe)
445{
446 struct skl_pipe_module *w_module = NULL;
447 struct skl_module_cfg *mconfig = NULL;
448
449 list_for_each_entry(w_module, &pipe->w_list, node) {
450 mconfig = w_module->w->priv;
451
452 if (mconfig->is_loadable && ctx->dsp->fw_ops.unload_mod)
453 return ctx->dsp->fw_ops.unload_mod(ctx->dsp,
454 mconfig->id.module_id);
455 }
456
457 /* no modules to unload in this path, so return */
458 return 0;
459}
460
329/* 461/*
330 * Mixer module represents a pipeline. So in the Pre-PMU event of mixer we 462 * Mixer module represents a pipeline. So in the Pre-PMU event of mixer we
331 * need create the pipeline. So we do following: 463 * need create the pipeline. So we do following:
@@ -397,41 +529,24 @@ static int skl_tplg_mixer_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
397 return 0; 529 return 0;
398} 530}
399 531
400/* 532static int skl_tplg_bind_sinks(struct snd_soc_dapm_widget *w,
401 * A PGA represents a module in a pipeline. So in the Pre-PMU event of PGA 533 struct skl *skl,
402 * we need to do following: 534 struct skl_module_cfg *src_mconfig)
403 * - Bind to sink pipeline
404 * Since the sink pipes can be running and we don't get mixer event on
405 * connect for already running mixer, we need to find the sink pipes
406 * here and bind to them. This way dynamic connect works.
407 * - Start sink pipeline, if not running
408 * - Then run current pipe
409 */
410static int skl_tplg_pga_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
411 struct skl *skl)
412{ 535{
413 struct snd_soc_dapm_path *p; 536 struct snd_soc_dapm_path *p;
414 struct skl_dapm_path_list *path_list; 537 struct snd_soc_dapm_widget *sink = NULL, *next_sink = NULL;
415 struct snd_soc_dapm_widget *source, *sink; 538 struct skl_module_cfg *sink_mconfig;
416 struct skl_module_cfg *src_mconfig, *sink_mconfig;
417 struct skl_sst *ctx = skl->skl_sst; 539 struct skl_sst *ctx = skl->skl_sst;
418 int ret = 0; 540 int ret;
419
420 source = w;
421 src_mconfig = source->priv;
422 541
423 /* 542 snd_soc_dapm_widget_for_each_sink_path(w, p) {
424 * find which sink it is connected to, bind with the sink,
425 * if sink is not started, start sink pipe first, then start
426 * this pipe
427 */
428 snd_soc_dapm_widget_for_each_source_path(w, p) {
429 if (!p->connect) 543 if (!p->connect)
430 continue; 544 continue;
431 545
432 dev_dbg(ctx->dev, "%s: src widget=%s\n", __func__, w->name); 546 dev_dbg(ctx->dev, "%s: src widget=%s\n", __func__, w->name);
433 dev_dbg(ctx->dev, "%s: sink widget=%s\n", __func__, p->sink->name); 547 dev_dbg(ctx->dev, "%s: sink widget=%s\n", __func__, p->sink->name);
434 548
549 next_sink = p->sink;
435 /* 550 /*
436 * here we will check widgets in sink pipelines, so that 551 * here we will check widgets in sink pipelines, so that
437 * can be any widgets type and we are only interested if 552 * can be any widgets type and we are only interested if
@@ -441,7 +556,6 @@ static int skl_tplg_pga_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
441 is_skl_dsp_widget_type(p->sink)) { 556 is_skl_dsp_widget_type(p->sink)) {
442 557
443 sink = p->sink; 558 sink = p->sink;
444 src_mconfig = source->priv;
445 sink_mconfig = sink->priv; 559 sink_mconfig = sink->priv;
446 560
447 /* Bind source to sink, mixin is always source */ 561 /* Bind source to sink, mixin is always source */
@@ -451,32 +565,89 @@ static int skl_tplg_pga_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
451 565
452 /* Start sinks pipe first */ 566 /* Start sinks pipe first */
453 if (sink_mconfig->pipe->state != SKL_PIPE_STARTED) { 567 if (sink_mconfig->pipe->state != SKL_PIPE_STARTED) {
454 ret = skl_run_pipe(ctx, sink_mconfig->pipe); 568 if (sink_mconfig->pipe->conn_type !=
569 SKL_PIPE_CONN_TYPE_FE)
570 ret = skl_run_pipe(ctx,
571 sink_mconfig->pipe);
455 if (ret) 572 if (ret)
456 return ret; 573 return ret;
457 } 574 }
458
459 path_list = kzalloc(
460 sizeof(struct skl_dapm_path_list),
461 GFP_KERNEL);
462 if (path_list == NULL)
463 return -ENOMEM;
464
465 /* Add connected path to one global list */
466 path_list->dapm_path = p;
467 list_add_tail(&path_list->node, &skl->dapm_path_list);
468 break;
469 } 575 }
470 } 576 }
471 577
472 /* Start source pipe last after starting all sinks */ 578 if (!sink)
473 ret = skl_run_pipe(ctx, src_mconfig->pipe); 579 return skl_tplg_bind_sinks(next_sink, skl, src_mconfig);
580
581 return 0;
582}
583
584/*
585 * A PGA represents a module in a pipeline. So in the Pre-PMU event of PGA
586 * we need to do following:
587 * - Bind to sink pipeline
588 * Since the sink pipes can be running and we don't get mixer event on
589 * connect for already running mixer, we need to find the sink pipes
590 * here and bind to them. This way dynamic connect works.
591 * - Start sink pipeline, if not running
592 * - Then run current pipe
593 */
594static int skl_tplg_pga_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
595 struct skl *skl)
596{
597 struct skl_module_cfg *src_mconfig;
598 struct skl_sst *ctx = skl->skl_sst;
599 int ret = 0;
600
601 src_mconfig = w->priv;
602
603 /*
604 * find which sink it is connected to, bind with the sink,
605 * if sink is not started, start sink pipe first, then start
606 * this pipe
607 */
608 ret = skl_tplg_bind_sinks(w, skl, src_mconfig);
474 if (ret) 609 if (ret)
475 return ret; 610 return ret;
476 611
612 /* Start source pipe last after starting all sinks */
613 if (src_mconfig->pipe->conn_type != SKL_PIPE_CONN_TYPE_FE)
614 return skl_run_pipe(ctx, src_mconfig->pipe);
615
477 return 0; 616 return 0;
478} 617}
479 618
619static struct snd_soc_dapm_widget *skl_get_src_dsp_widget(
620 struct snd_soc_dapm_widget *w, struct skl *skl)
621{
622 struct snd_soc_dapm_path *p;
623 struct snd_soc_dapm_widget *src_w = NULL;
624 struct skl_sst *ctx = skl->skl_sst;
625
626 snd_soc_dapm_widget_for_each_source_path(w, p) {
627 src_w = p->source;
628 if (!p->connect)
629 continue;
630
631 dev_dbg(ctx->dev, "sink widget=%s\n", w->name);
632 dev_dbg(ctx->dev, "src widget=%s\n", p->source->name);
633
634 /*
635 * here we will check widgets in sink pipelines, so that can
636 * be any widgets type and we are only interested if they are
637 * ones used for SKL so check that first
638 */
639 if ((p->source->priv != NULL) &&
640 is_skl_dsp_widget_type(p->source)) {
641 return p->source;
642 }
643 }
644
645 if (src_w != NULL)
646 return skl_get_src_dsp_widget(src_w, skl);
647
648 return NULL;
649}
650
480/* 651/*
481 * in the Post-PMU event of mixer we need to do following: 652 * in the Post-PMU event of mixer we need to do following:
482 * - Check if this pipe is running 653 * - Check if this pipe is running
@@ -490,7 +661,6 @@ static int skl_tplg_mixer_dapm_post_pmu_event(struct snd_soc_dapm_widget *w,
490 struct skl *skl) 661 struct skl *skl)
491{ 662{
492 int ret = 0; 663 int ret = 0;
493 struct snd_soc_dapm_path *p;
494 struct snd_soc_dapm_widget *source, *sink; 664 struct snd_soc_dapm_widget *source, *sink;
495 struct skl_module_cfg *src_mconfig, *sink_mconfig; 665 struct skl_module_cfg *src_mconfig, *sink_mconfig;
496 struct skl_sst *ctx = skl->skl_sst; 666 struct skl_sst *ctx = skl->skl_sst;
@@ -504,32 +674,18 @@ static int skl_tplg_mixer_dapm_post_pmu_event(struct snd_soc_dapm_widget *w,
504 * one more sink before this sink got connected, Since source is 674 * one more sink before this sink got connected, Since source is
505 * started, bind this sink to source and start this pipe. 675 * started, bind this sink to source and start this pipe.
506 */ 676 */
507 snd_soc_dapm_widget_for_each_sink_path(w, p) { 677 source = skl_get_src_dsp_widget(w, skl);
508 if (!p->connect) 678 if (source != NULL) {
509 continue; 679 src_mconfig = source->priv;
510 680 sink_mconfig = sink->priv;
511 dev_dbg(ctx->dev, "sink widget=%s\n", w->name); 681 src_pipe_started = 1;
512 dev_dbg(ctx->dev, "src widget=%s\n", p->source->name);
513 682
514 /* 683 /*
515 * here we will check widgets in sink pipelines, so that 684 * check pipe state, then no need to bind or start the
516 * can be any widgets type and we are only interested if 685 * pipe
517 * they are ones used for SKL so check that first
518 */ 686 */
519 if ((p->source->priv != NULL) && 687 if (src_mconfig->pipe->state != SKL_PIPE_STARTED)
520 is_skl_dsp_widget_type(p->source)) { 688 src_pipe_started = 0;
521 source = p->source;
522 src_mconfig = source->priv;
523 sink_mconfig = sink->priv;
524 src_pipe_started = 1;
525
526 /*
527 * check pipe state, then no need to bind or start
528 * the pipe
529 */
530 if (src_mconfig->pipe->state != SKL_PIPE_STARTED)
531 src_pipe_started = 0;
532 }
533 } 689 }
534 690
535 if (src_pipe_started) { 691 if (src_pipe_started) {
@@ -537,7 +693,8 @@ static int skl_tplg_mixer_dapm_post_pmu_event(struct snd_soc_dapm_widget *w,
537 if (ret) 693 if (ret)
538 return ret; 694 return ret;
539 695
540 ret = skl_run_pipe(ctx, sink_mconfig->pipe); 696 if (sink_mconfig->pipe->conn_type != SKL_PIPE_CONN_TYPE_FE)
697 ret = skl_run_pipe(ctx, sink_mconfig->pipe);
541 } 698 }
542 699
543 return ret; 700 return ret;
@@ -552,52 +709,35 @@ static int skl_tplg_mixer_dapm_post_pmu_event(struct snd_soc_dapm_widget *w,
552static int skl_tplg_mixer_dapm_pre_pmd_event(struct snd_soc_dapm_widget *w, 709static int skl_tplg_mixer_dapm_pre_pmd_event(struct snd_soc_dapm_widget *w,
553 struct skl *skl) 710 struct skl *skl)
554{ 711{
555 struct snd_soc_dapm_widget *source, *sink;
556 struct skl_module_cfg *src_mconfig, *sink_mconfig; 712 struct skl_module_cfg *src_mconfig, *sink_mconfig;
557 int ret = 0, path_found = 0; 713 int ret = 0, i;
558 struct skl_dapm_path_list *path_list, *tmp_list;
559 struct skl_sst *ctx = skl->skl_sst; 714 struct skl_sst *ctx = skl->skl_sst;
560 715
561 sink = w; 716 sink_mconfig = w->priv;
562 sink_mconfig = sink->priv;
563 717
564 /* Stop the pipe */ 718 /* Stop the pipe */
565 ret = skl_stop_pipe(ctx, sink_mconfig->pipe); 719 ret = skl_stop_pipe(ctx, sink_mconfig->pipe);
566 if (ret) 720 if (ret)
567 return ret; 721 return ret;
568 722
569 /* 723 for (i = 0; i < sink_mconfig->max_in_queue; i++) {
570 * This list, dapm_path_list handling here does not need any locks 724 if (sink_mconfig->m_in_pin[i].pin_state == SKL_PIN_BIND_DONE) {
571 * as we are under dapm lock while handling widget events. 725 src_mconfig = sink_mconfig->m_in_pin[i].tgt_mcfg;
572 * List can be manipulated safely only under dapm widgets handler 726 if (!src_mconfig)
573 * routines 727 continue;
574 */ 728 /*
575 list_for_each_entry_safe(path_list, tmp_list, 729 * If path_found == 1, that means pmd for source
576 &skl->dapm_path_list, node) { 730 * pipe has not occurred, source is connected to
577 if (path_list->dapm_path->sink == sink) { 731 * some other sink. so its responsibility of sink
578 dev_dbg(ctx->dev, "Path found = %s\n", 732 * to unbind itself from source.
579 path_list->dapm_path->name); 733 */
580 source = path_list->dapm_path->source; 734 ret = skl_stop_pipe(ctx, src_mconfig->pipe);
581 src_mconfig = source->priv; 735 if (ret < 0)
582 path_found = 1; 736 return ret;
583
584 list_del(&path_list->node);
585 kfree(path_list);
586 break;
587 }
588 }
589
590 /*
591 * If path_found == 1, that means pmd for source pipe has
592 * not occurred, source is connected to some other sink.
593 * so its responsibility of sink to unbind itself from source.
594 */
595 if (path_found) {
596 ret = skl_stop_pipe(ctx, src_mconfig->pipe);
597 if (ret < 0)
598 return ret;
599 737
600 ret = skl_unbind_modules(ctx, src_mconfig, sink_mconfig); 738 ret = skl_unbind_modules(ctx,
739 src_mconfig, sink_mconfig);
740 }
601 } 741 }
602 742
603 return ret; 743 return ret;
@@ -622,10 +762,12 @@ static int skl_tplg_mixer_dapm_post_pmd_event(struct snd_soc_dapm_widget *w,
622 int ret = 0; 762 int ret = 0;
623 763
624 skl_tplg_free_pipe_mcps(skl, mconfig); 764 skl_tplg_free_pipe_mcps(skl, mconfig);
765 skl_tplg_free_pipe_mem(skl, mconfig);
625 766
626 list_for_each_entry(w_module, &s_pipe->w_list, node) { 767 list_for_each_entry(w_module, &s_pipe->w_list, node) {
627 dst_module = w_module->w->priv; 768 dst_module = w_module->w->priv;
628 769
770 skl_tplg_free_pipe_mcps(skl, dst_module);
629 if (src_module == NULL) { 771 if (src_module == NULL) {
630 src_module = dst_module; 772 src_module = dst_module;
631 continue; 773 continue;
@@ -639,9 +781,8 @@ static int skl_tplg_mixer_dapm_post_pmd_event(struct snd_soc_dapm_widget *w,
639 } 781 }
640 782
641 ret = skl_delete_pipe(ctx, mconfig->pipe); 783 ret = skl_delete_pipe(ctx, mconfig->pipe);
642 skl_tplg_free_pipe_mem(skl, mconfig);
643 784
644 return ret; 785 return skl_tplg_unload_pipe_modules(ctx, s_pipe);
645} 786}
646 787
647/* 788/*
@@ -653,47 +794,34 @@ static int skl_tplg_mixer_dapm_post_pmd_event(struct snd_soc_dapm_widget *w,
653static int skl_tplg_pga_dapm_post_pmd_event(struct snd_soc_dapm_widget *w, 794static int skl_tplg_pga_dapm_post_pmd_event(struct snd_soc_dapm_widget *w,
654 struct skl *skl) 795 struct skl *skl)
655{ 796{
656 struct snd_soc_dapm_widget *source, *sink;
657 struct skl_module_cfg *src_mconfig, *sink_mconfig; 797 struct skl_module_cfg *src_mconfig, *sink_mconfig;
658 int ret = 0, path_found = 0; 798 int ret = 0, i;
659 struct skl_dapm_path_list *path_list, *tmp_path_list;
660 struct skl_sst *ctx = skl->skl_sst; 799 struct skl_sst *ctx = skl->skl_sst;
661 800
662 source = w; 801 src_mconfig = w->priv;
663 src_mconfig = source->priv;
664 802
665 skl_tplg_free_pipe_mcps(skl, src_mconfig);
666 /* Stop the pipe since this is a mixin module */ 803 /* Stop the pipe since this is a mixin module */
667 ret = skl_stop_pipe(ctx, src_mconfig->pipe); 804 ret = skl_stop_pipe(ctx, src_mconfig->pipe);
668 if (ret) 805 if (ret)
669 return ret; 806 return ret;
670 807
671 list_for_each_entry_safe(path_list, tmp_path_list, &skl->dapm_path_list, node) { 808 for (i = 0; i < src_mconfig->max_out_queue; i++) {
672 if (path_list->dapm_path->source == source) { 809 if (src_mconfig->m_out_pin[i].pin_state == SKL_PIN_BIND_DONE) {
673 dev_dbg(ctx->dev, "Path found = %s\n", 810 sink_mconfig = src_mconfig->m_out_pin[i].tgt_mcfg;
674 path_list->dapm_path->name); 811 if (!sink_mconfig)
675 sink = path_list->dapm_path->sink; 812 continue;
676 sink_mconfig = sink->priv; 813 /*
677 path_found = 1; 814 * This is a connecter and if path is found that means
678 815 * unbind between source and sink has not happened yet
679 list_del(&path_list->node); 816 */
680 kfree(path_list); 817 ret = skl_stop_pipe(ctx, sink_mconfig->pipe);
681 break; 818 if (ret < 0)
819 return ret;
820 ret = skl_unbind_modules(ctx, src_mconfig,
821 sink_mconfig);
682 } 822 }
683 } 823 }
684 824
685 /*
686 * This is a connector and if path is found that means
687 * unbind between source and sink has not happened yet
688 */
689 if (path_found) {
690 ret = skl_stop_pipe(ctx, src_mconfig->pipe);
691 if (ret < 0)
692 return ret;
693
694 ret = skl_unbind_modules(ctx, src_mconfig, sink_mconfig);
695 }
696
697 return ret; 825 return ret;
698} 826}
699 827
@@ -774,6 +902,67 @@ static int skl_tplg_pga_event(struct snd_soc_dapm_widget *w,
774 return 0; 902 return 0;
775} 903}
776 904
905static int skl_tplg_tlv_control_get(struct snd_kcontrol *kcontrol,
906 unsigned int __user *data, unsigned int size)
907{
908 struct soc_bytes_ext *sb =
909 (struct soc_bytes_ext *)kcontrol->private_value;
910 struct skl_algo_data *bc = (struct skl_algo_data *)sb->dobj.private;
911 struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kcontrol);
912 struct skl_module_cfg *mconfig = w->priv;
913 struct skl *skl = get_skl_ctx(w->dapm->dev);
914
915 if (w->power)
916 skl_get_module_params(skl->skl_sst, (u32 *)bc->params,
917 bc->max, bc->param_id, mconfig);
918
919 if (bc->params) {
920 if (copy_to_user(data, &bc->param_id, sizeof(u32)))
921 return -EFAULT;
922 if (copy_to_user(data + 1, &size, sizeof(u32)))
923 return -EFAULT;
924 if (copy_to_user(data + 2, bc->params, size))
925 return -EFAULT;
926 }
927
928 return 0;
929}
930
931#define SKL_PARAM_VENDOR_ID 0xff
932
933static int skl_tplg_tlv_control_set(struct snd_kcontrol *kcontrol,
934 const unsigned int __user *data, unsigned int size)
935{
936 struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kcontrol);
937 struct skl_module_cfg *mconfig = w->priv;
938 struct soc_bytes_ext *sb =
939 (struct soc_bytes_ext *)kcontrol->private_value;
940 struct skl_algo_data *ac = (struct skl_algo_data *)sb->dobj.private;
941 struct skl *skl = get_skl_ctx(w->dapm->dev);
942
943 if (ac->params) {
944 /*
945 * if the param_is is of type Vendor, firmware expects actual
946 * parameter id and size from the control.
947 */
948 if (ac->param_id == SKL_PARAM_VENDOR_ID) {
949 if (copy_from_user(ac->params, data, size))
950 return -EFAULT;
951 } else {
952 if (copy_from_user(ac->params,
953 data + 2 * sizeof(u32), size))
954 return -EFAULT;
955 }
956
957 if (w->power)
958 return skl_set_module_params(skl->skl_sst,
959 (u32 *)ac->params, ac->max,
960 ac->param_id, mconfig);
961 }
962
963 return 0;
964}
965
777/* 966/*
778 * The FE params are passed by hw_params of the DAI. 967 * The FE params are passed by hw_params of the DAI.
779 * On hw_params, the params are stored in Gateway module of the FE and we 968 * On hw_params, the params are stored in Gateway module of the FE and we
@@ -790,9 +979,9 @@ int skl_tplg_update_pipe_params(struct device *dev,
790 memcpy(pipe->p_params, params, sizeof(*params)); 979 memcpy(pipe->p_params, params, sizeof(*params));
791 980
792 if (params->stream == SNDRV_PCM_STREAM_PLAYBACK) 981 if (params->stream == SNDRV_PCM_STREAM_PLAYBACK)
793 format = &mconfig->in_fmt; 982 format = &mconfig->in_fmt[0];
794 else 983 else
795 format = &mconfig->out_fmt; 984 format = &mconfig->out_fmt[0];
796 985
797 /* set the hw_params */ 986 /* set the hw_params */
798 format->s_freq = params->s_freq; 987 format->s_freq = params->s_freq;
@@ -809,6 +998,7 @@ int skl_tplg_update_pipe_params(struct device *dev,
809 break; 998 break;
810 999
811 case SKL_DEPTH_24BIT: 1000 case SKL_DEPTH_24BIT:
1001 case SKL_DEPTH_32BIT:
812 format->bit_depth = SKL_DEPTH_32BIT; 1002 format->bit_depth = SKL_DEPTH_32BIT;
813 break; 1003 break;
814 1004
@@ -846,7 +1036,7 @@ skl_tplg_fe_get_cpr_module(struct snd_soc_dai *dai, int stream)
846 w = dai->playback_widget; 1036 w = dai->playback_widget;
847 snd_soc_dapm_widget_for_each_sink_path(w, p) { 1037 snd_soc_dapm_widget_for_each_sink_path(w, p) {
848 if (p->connect && p->sink->power && 1038 if (p->connect && p->sink->power &&
849 is_skl_dsp_widget_type(p->sink)) 1039 !is_skl_dsp_widget_type(p->sink))
850 continue; 1040 continue;
851 1041
852 if (p->sink->priv) { 1042 if (p->sink->priv) {
@@ -859,7 +1049,7 @@ skl_tplg_fe_get_cpr_module(struct snd_soc_dai *dai, int stream)
859 w = dai->capture_widget; 1049 w = dai->capture_widget;
860 snd_soc_dapm_widget_for_each_source_path(w, p) { 1050 snd_soc_dapm_widget_for_each_source_path(w, p) {
861 if (p->connect && p->source->power && 1051 if (p->connect && p->source->power &&
862 is_skl_dsp_widget_type(p->source)) 1052 !is_skl_dsp_widget_type(p->source))
863 continue; 1053 continue;
864 1054
865 if (p->source->priv) { 1055 if (p->source->priv) {
@@ -920,6 +1110,9 @@ static int skl_tplg_be_fill_pipe_params(struct snd_soc_dai *dai,
920 1110
921 memcpy(pipe->p_params, params, sizeof(*params)); 1111 memcpy(pipe->p_params, params, sizeof(*params));
922 1112
1113 if (link_type == NHLT_LINK_HDA)
1114 return 0;
1115
923 /* update the blob based on virtual bus_id*/ 1116 /* update the blob based on virtual bus_id*/
924 cfg = skl_get_ep_blob(skl, mconfig->vbus_id, link_type, 1117 cfg = skl_get_ep_blob(skl, mconfig->vbus_id, link_type,
925 params->s_fmt, params->ch, 1118 params->s_fmt, params->ch,
@@ -950,18 +1143,13 @@ static int skl_tplg_be_set_src_pipe_params(struct snd_soc_dai *dai,
950 if (p->connect && is_skl_dsp_widget_type(p->source) && 1143 if (p->connect && is_skl_dsp_widget_type(p->source) &&
951 p->source->priv) { 1144 p->source->priv) {
952 1145
953 if (!p->source->power) { 1146 ret = skl_tplg_be_fill_pipe_params(dai,
954 ret = skl_tplg_be_fill_pipe_params( 1147 p->source->priv, params);
955 dai, p->source->priv, 1148 if (ret < 0)
956 params); 1149 return ret;
957 if (ret < 0)
958 return ret;
959 } else {
960 return -EBUSY;
961 }
962 } else { 1150 } else {
963 ret = skl_tplg_be_set_src_pipe_params( 1151 ret = skl_tplg_be_set_src_pipe_params(dai,
964 dai, p->source, params); 1152 p->source, params);
965 if (ret < 0) 1153 if (ret < 0)
966 return ret; 1154 return ret;
967 } 1155 }
@@ -980,15 +1168,10 @@ static int skl_tplg_be_set_sink_pipe_params(struct snd_soc_dai *dai,
980 if (p->connect && is_skl_dsp_widget_type(p->sink) && 1168 if (p->connect && is_skl_dsp_widget_type(p->sink) &&
981 p->sink->priv) { 1169 p->sink->priv) {
982 1170
983 if (!p->sink->power) { 1171 ret = skl_tplg_be_fill_pipe_params(dai,
984 ret = skl_tplg_be_fill_pipe_params( 1172 p->sink->priv, params);
985 dai, p->sink->priv, params); 1173 if (ret < 0)
986 if (ret < 0) 1174 return ret;
987 return ret;
988 } else {
989 return -EBUSY;
990 }
991
992 } else { 1175 } else {
993 ret = skl_tplg_be_set_sink_pipe_params( 1176 ret = skl_tplg_be_set_sink_pipe_params(
994 dai, p->sink, params); 1177 dai, p->sink, params);
@@ -1030,6 +1213,11 @@ static const struct snd_soc_tplg_widget_events skl_tplg_widget_ops[] = {
1030 {SKL_PGA_EVENT, skl_tplg_pga_event}, 1213 {SKL_PGA_EVENT, skl_tplg_pga_event},
1031}; 1214};
1032 1215
1216static const struct snd_soc_tplg_bytes_ext_ops skl_tlv_ops[] = {
1217 {SKL_CONTROL_TYPE_BYTE_TLV, skl_tplg_tlv_control_get,
1218 skl_tplg_tlv_control_set},
1219};
1220
1033/* 1221/*
1034 * The topology binary passes the pin info for a module so initialize the pin 1222 * The topology binary passes the pin info for a module so initialize the pin
1035 * info passed into module instance 1223 * info passed into module instance
@@ -1045,6 +1233,7 @@ static void skl_fill_module_pin_info(struct skl_dfw_module_pin *dfw_pin,
1045 m_pin[i].id.instance_id = dfw_pin[i].instance_id; 1233 m_pin[i].id.instance_id = dfw_pin[i].instance_id;
1046 m_pin[i].in_use = false; 1234 m_pin[i].in_use = false;
1047 m_pin[i].is_dynamic = is_dynamic; 1235 m_pin[i].is_dynamic = is_dynamic;
1236 m_pin[i].pin_state = SKL_PIN_UNBIND;
1048 } 1237 }
1049} 1238}
1050 1239
@@ -1092,6 +1281,24 @@ static struct skl_pipe *skl_tplg_add_pipe(struct device *dev,
1092 return ppl->pipe; 1281 return ppl->pipe;
1093} 1282}
1094 1283
1284static void skl_tplg_fill_fmt(struct skl_module_fmt *dst_fmt,
1285 struct skl_dfw_module_fmt *src_fmt,
1286 int pins)
1287{
1288 int i;
1289
1290 for (i = 0; i < pins; i++) {
1291 dst_fmt[i].channels = src_fmt[i].channels;
1292 dst_fmt[i].s_freq = src_fmt[i].freq;
1293 dst_fmt[i].bit_depth = src_fmt[i].bit_depth;
1294 dst_fmt[i].valid_bit_depth = src_fmt[i].valid_bit_depth;
1295 dst_fmt[i].ch_cfg = src_fmt[i].ch_cfg;
1296 dst_fmt[i].ch_map = src_fmt[i].ch_map;
1297 dst_fmt[i].interleaving_style = src_fmt[i].interleaving_style;
1298 dst_fmt[i].sample_type = src_fmt[i].sample_type;
1299 }
1300}
1301
1095/* 1302/*
1096 * Topology core widget load callback 1303 * Topology core widget load callback
1097 * 1304 *
@@ -1130,22 +1337,16 @@ static int skl_tplg_widget_load(struct snd_soc_component *cmpnt,
1130 mconfig->max_in_queue = dfw_config->max_in_queue; 1337 mconfig->max_in_queue = dfw_config->max_in_queue;
1131 mconfig->max_out_queue = dfw_config->max_out_queue; 1338 mconfig->max_out_queue = dfw_config->max_out_queue;
1132 mconfig->is_loadable = dfw_config->is_loadable; 1339 mconfig->is_loadable = dfw_config->is_loadable;
1133 mconfig->in_fmt.channels = dfw_config->in_fmt.channels; 1340 skl_tplg_fill_fmt(mconfig->in_fmt, dfw_config->in_fmt,
1134 mconfig->in_fmt.s_freq = dfw_config->in_fmt.freq; 1341 MODULE_MAX_IN_PINS);
1135 mconfig->in_fmt.bit_depth = dfw_config->in_fmt.bit_depth; 1342 skl_tplg_fill_fmt(mconfig->out_fmt, dfw_config->out_fmt,
1136 mconfig->in_fmt.valid_bit_depth = 1343 MODULE_MAX_OUT_PINS);
1137 dfw_config->in_fmt.valid_bit_depth; 1344
1138 mconfig->in_fmt.ch_cfg = dfw_config->in_fmt.ch_cfg;
1139 mconfig->out_fmt.channels = dfw_config->out_fmt.channels;
1140 mconfig->out_fmt.s_freq = dfw_config->out_fmt.freq;
1141 mconfig->out_fmt.bit_depth = dfw_config->out_fmt.bit_depth;
1142 mconfig->out_fmt.valid_bit_depth =
1143 dfw_config->out_fmt.valid_bit_depth;
1144 mconfig->out_fmt.ch_cfg = dfw_config->out_fmt.ch_cfg;
1145 mconfig->params_fixup = dfw_config->params_fixup; 1345 mconfig->params_fixup = dfw_config->params_fixup;
1146 mconfig->converter = dfw_config->converter; 1346 mconfig->converter = dfw_config->converter;
1147 mconfig->m_type = dfw_config->module_type; 1347 mconfig->m_type = dfw_config->module_type;
1148 mconfig->vbus_id = dfw_config->vbus_id; 1348 mconfig->vbus_id = dfw_config->vbus_id;
1349 mconfig->mem_pages = dfw_config->mem_pages;
1149 1350
1150 pipe = skl_tplg_add_pipe(bus->dev, skl, &dfw_config->pipe); 1351 pipe = skl_tplg_add_pipe(bus->dev, skl, &dfw_config->pipe);
1151 if (pipe) 1352 if (pipe)
@@ -1156,10 +1357,13 @@ static int skl_tplg_widget_load(struct snd_soc_component *cmpnt,
1156 mconfig->time_slot = dfw_config->time_slot; 1357 mconfig->time_slot = dfw_config->time_slot;
1157 mconfig->formats_config.caps_size = dfw_config->caps.caps_size; 1358 mconfig->formats_config.caps_size = dfw_config->caps.caps_size;
1158 1359
1159 mconfig->m_in_pin = devm_kzalloc(bus->dev, 1360 if (dfw_config->is_loadable)
1160 (mconfig->max_in_queue) * 1361 memcpy(mconfig->guid, dfw_config->uuid,
1161 sizeof(*mconfig->m_in_pin), 1362 ARRAY_SIZE(dfw_config->uuid));
1162 GFP_KERNEL); 1363
1364 mconfig->m_in_pin = devm_kzalloc(bus->dev, (mconfig->max_in_queue) *
1365 sizeof(*mconfig->m_in_pin),
1366 GFP_KERNEL);
1163 if (!mconfig->m_in_pin) 1367 if (!mconfig->m_in_pin)
1164 return -ENOMEM; 1368 return -ENOMEM;
1165 1369
@@ -1188,7 +1392,9 @@ static int skl_tplg_widget_load(struct snd_soc_component *cmpnt,
1188 return -ENOMEM; 1392 return -ENOMEM;
1189 1393
1190 memcpy(mconfig->formats_config.caps, dfw_config->caps.caps, 1394 memcpy(mconfig->formats_config.caps, dfw_config->caps.caps,
1191 dfw_config->caps.caps_size); 1395 dfw_config->caps.caps_size);
1396 mconfig->formats_config.param_id = dfw_config->caps.param_id;
1397 mconfig->formats_config.set_params = dfw_config->caps.set_params;
1192 1398
1193bind_event: 1399bind_event:
1194 if (tplg_w->event_type == 0) { 1400 if (tplg_w->event_type == 0) {
@@ -1209,8 +1415,70 @@ bind_event:
1209 return 0; 1415 return 0;
1210} 1416}
1211 1417
1418static int skl_init_algo_data(struct device *dev, struct soc_bytes_ext *be,
1419 struct snd_soc_tplg_bytes_control *bc)
1420{
1421 struct skl_algo_data *ac;
1422 struct skl_dfw_algo_data *dfw_ac =
1423 (struct skl_dfw_algo_data *)bc->priv.data;
1424
1425 ac = devm_kzalloc(dev, sizeof(*ac), GFP_KERNEL);
1426 if (!ac)
1427 return -ENOMEM;
1428
1429 /* Fill private data */
1430 ac->max = dfw_ac->max;
1431 ac->param_id = dfw_ac->param_id;
1432 ac->set_params = dfw_ac->set_params;
1433
1434 if (ac->max) {
1435 ac->params = (char *) devm_kzalloc(dev, ac->max, GFP_KERNEL);
1436 if (!ac->params)
1437 return -ENOMEM;
1438
1439 if (dfw_ac->params)
1440 memcpy(ac->params, dfw_ac->params, ac->max);
1441 }
1442
1443 be->dobj.private = ac;
1444 return 0;
1445}
1446
1447static int skl_tplg_control_load(struct snd_soc_component *cmpnt,
1448 struct snd_kcontrol_new *kctl,
1449 struct snd_soc_tplg_ctl_hdr *hdr)
1450{
1451 struct soc_bytes_ext *sb;
1452 struct snd_soc_tplg_bytes_control *tplg_bc;
1453 struct hdac_ext_bus *ebus = snd_soc_component_get_drvdata(cmpnt);
1454 struct hdac_bus *bus = ebus_to_hbus(ebus);
1455
1456 switch (hdr->ops.info) {
1457 case SND_SOC_TPLG_CTL_BYTES:
1458 tplg_bc = container_of(hdr,
1459 struct snd_soc_tplg_bytes_control, hdr);
1460 if (kctl->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
1461 sb = (struct soc_bytes_ext *)kctl->private_value;
1462 if (tplg_bc->priv.size)
1463 return skl_init_algo_data(
1464 bus->dev, sb, tplg_bc);
1465 }
1466 break;
1467
1468 default:
1469 dev_warn(bus->dev, "Control load not supported %d:%d:%d\n",
1470 hdr->ops.get, hdr->ops.put, hdr->ops.info);
1471 break;
1472 }
1473
1474 return 0;
1475}
1476
1212static struct snd_soc_tplg_ops skl_tplg_ops = { 1477static struct snd_soc_tplg_ops skl_tplg_ops = {
1213 .widget_load = skl_tplg_widget_load, 1478 .widget_load = skl_tplg_widget_load,
1479 .control_load = skl_tplg_control_load,
1480 .bytes_ext_ops = skl_tlv_ops,
1481 .bytes_ext_ops_count = ARRAY_SIZE(skl_tlv_ops),
1214}; 1482};
1215 1483
1216/* This will be read from topology manifest, currently defined here */ 1484/* This will be read from topology manifest, currently defined here */
diff --git a/sound/soc/intel/skylake/skl-topology.h b/sound/soc/intel/skylake/skl-topology.h
index 76053a8de41c..9aa2a2b6598a 100644
--- a/sound/soc/intel/skylake/skl-topology.h
+++ b/sound/soc/intel/skylake/skl-topology.h
@@ -36,6 +36,9 @@
36/* Maximum number of coefficients up down mixer module */ 36/* Maximum number of coefficients up down mixer module */
37#define UP_DOWN_MIXER_MAX_COEFF 6 37#define UP_DOWN_MIXER_MAX_COEFF 6
38 38
39#define MODULE_MAX_IN_PINS 8
40#define MODULE_MAX_OUT_PINS 8
41
39enum skl_channel_index { 42enum skl_channel_index {
40 SKL_CHANNEL_LEFT = 0, 43 SKL_CHANNEL_LEFT = 0,
41 SKL_CHANNEL_RIGHT = 1, 44 SKL_CHANNEL_RIGHT = 1,
@@ -55,12 +58,6 @@ enum skl_bitdepth {
55 SKL_DEPTH_INVALID 58 SKL_DEPTH_INVALID
56}; 59};
57 60
58enum skl_interleaving {
59 /* [s1_ch1...s1_chN,...,sM_ch1...sM_chN] */
60 SKL_INTERLEAVING_PER_CHANNEL = 0,
61 /* [s1_ch1...sM_ch1,...,s1_chN...sM_chN] */
62 SKL_INTERLEAVING_PER_SAMPLE = 1,
63};
64 61
65enum skl_s_freq { 62enum skl_s_freq {
66 SKL_FS_8000 = 8000, 63 SKL_FS_8000 = 8000,
@@ -143,6 +140,16 @@ struct skl_up_down_mixer_cfg {
143 s32 coeff[UP_DOWN_MIXER_MAX_COEFF]; 140 s32 coeff[UP_DOWN_MIXER_MAX_COEFF];
144} __packed; 141} __packed;
145 142
143struct skl_algo_cfg {
144 struct skl_base_cfg base_cfg;
145 char params[0];
146} __packed;
147
148struct skl_base_outfmt_cfg {
149 struct skl_base_cfg base_cfg;
150 struct skl_audio_data_format out_fmt;
151} __packed;
152
146enum skl_dma_type { 153enum skl_dma_type {
147 SKL_DMA_HDA_HOST_OUTPUT_CLASS = 0, 154 SKL_DMA_HDA_HOST_OUTPUT_CLASS = 0,
148 SKL_DMA_HDA_HOST_INPUT_CLASS = 1, 155 SKL_DMA_HDA_HOST_INPUT_CLASS = 1,
@@ -178,21 +185,34 @@ struct skl_module_fmt {
178 u32 bit_depth; 185 u32 bit_depth;
179 u32 valid_bit_depth; 186 u32 valid_bit_depth;
180 u32 ch_cfg; 187 u32 ch_cfg;
188 u32 interleaving_style;
189 u32 sample_type;
190 u32 ch_map;
181}; 191};
182 192
193struct skl_module_cfg;
194
183struct skl_module_inst_id { 195struct skl_module_inst_id {
184 u32 module_id; 196 u32 module_id;
185 u32 instance_id; 197 u32 instance_id;
186}; 198};
187 199
200enum skl_module_pin_state {
201 SKL_PIN_UNBIND = 0,
202 SKL_PIN_BIND_DONE = 1,
203};
204
188struct skl_module_pin { 205struct skl_module_pin {
189 struct skl_module_inst_id id; 206 struct skl_module_inst_id id;
190 u8 pin_index;
191 bool is_dynamic; 207 bool is_dynamic;
192 bool in_use; 208 bool in_use;
209 enum skl_module_pin_state pin_state;
210 struct skl_module_cfg *tgt_mcfg;
193}; 211};
194 212
195struct skl_specific_cfg { 213struct skl_specific_cfg {
214 u32 set_params;
215 u32 param_id;
196 u32 caps_size; 216 u32 caps_size;
197 u32 *caps; 217 u32 *caps;
198}; 218};
@@ -238,9 +258,13 @@ enum skl_module_state {
238}; 258};
239 259
240struct skl_module_cfg { 260struct skl_module_cfg {
261 char guid[SKL_UUID_STR_SZ];
241 struct skl_module_inst_id id; 262 struct skl_module_inst_id id;
242 struct skl_module_fmt in_fmt; 263 u8 domain;
243 struct skl_module_fmt out_fmt; 264 bool homogenous_inputs;
265 bool homogenous_outputs;
266 struct skl_module_fmt in_fmt[MODULE_MAX_IN_PINS];
267 struct skl_module_fmt out_fmt[MODULE_MAX_OUT_PINS];
244 u8 max_in_queue; 268 u8 max_in_queue;
245 u8 max_out_queue; 269 u8 max_out_queue;
246 u8 in_queue_mask; 270 u8 in_queue_mask;
@@ -258,6 +282,7 @@ struct skl_module_cfg {
258 u32 params_fixup; 282 u32 params_fixup;
259 u32 converter; 283 u32 converter;
260 u32 vbus_id; 284 u32 vbus_id;
285 u32 mem_pages;
261 struct skl_module_pin *m_in_pin; 286 struct skl_module_pin *m_in_pin;
262 struct skl_module_pin *m_out_pin; 287 struct skl_module_pin *m_out_pin;
263 enum skl_module_type m_type; 288 enum skl_module_type m_type;
@@ -267,13 +292,15 @@ struct skl_module_cfg {
267 struct skl_specific_cfg formats_config; 292 struct skl_specific_cfg formats_config;
268}; 293};
269 294
270struct skl_pipeline { 295struct skl_algo_data {
271 struct skl_pipe *pipe; 296 u32 param_id;
272 struct list_head node; 297 u32 set_params;
298 u32 max;
299 char *params;
273}; 300};
274 301
275struct skl_dapm_path_list { 302struct skl_pipeline {
276 struct snd_soc_dapm_path *dapm_path; 303 struct skl_pipe *pipe;
277 struct list_head node; 304 struct list_head node;
278}; 305};
279 306
@@ -305,8 +332,7 @@ int skl_delete_pipe(struct skl_sst *ctx, struct skl_pipe *pipe);
305 332
306int skl_stop_pipe(struct skl_sst *ctx, struct skl_pipe *pipe); 333int skl_stop_pipe(struct skl_sst *ctx, struct skl_pipe *pipe);
307 334
308int skl_init_module(struct skl_sst *ctx, struct skl_module_cfg *module_config, 335int skl_init_module(struct skl_sst *ctx, struct skl_module_cfg *module_config);
309 char *param);
310 336
311int skl_bind_modules(struct skl_sst *ctx, struct skl_module_cfg 337int skl_bind_modules(struct skl_sst *ctx, struct skl_module_cfg
312 *src_module, struct skl_module_cfg *dst_module); 338 *src_module, struct skl_module_cfg *dst_module);
@@ -314,5 +340,10 @@ int skl_bind_modules(struct skl_sst *ctx, struct skl_module_cfg
314int skl_unbind_modules(struct skl_sst *ctx, struct skl_module_cfg 340int skl_unbind_modules(struct skl_sst *ctx, struct skl_module_cfg
315 *src_module, struct skl_module_cfg *dst_module); 341 *src_module, struct skl_module_cfg *dst_module);
316 342
343int skl_set_module_params(struct skl_sst *ctx, u32 *params, int size,
344 u32 param_id, struct skl_module_cfg *mcfg);
345int skl_get_module_params(struct skl_sst *ctx, u32 *params, int size,
346 u32 param_id, struct skl_module_cfg *mcfg);
347
317enum skl_bitdepth skl_get_bit_depth(int params); 348enum skl_bitdepth skl_get_bit_depth(int params);
318#endif 349#endif
diff --git a/sound/soc/intel/skylake/skl-tplg-interface.h b/sound/soc/intel/skylake/skl-tplg-interface.h
index 2bc396d54cbe..c9ae010b3cc8 100644
--- a/sound/soc/intel/skylake/skl-tplg-interface.h
+++ b/sound/soc/intel/skylake/skl-tplg-interface.h
@@ -23,15 +23,13 @@
23 * Default types range from 0~12. type can range from 0 to 0xff 23 * Default types range from 0~12. type can range from 0 to 0xff
24 * SST types start at higher to avoid any overlapping in future 24 * SST types start at higher to avoid any overlapping in future
25 */ 25 */
26#define SOC_CONTROL_TYPE_HDA_SST_ALGO_PARAMS 0x100 26#define SKL_CONTROL_TYPE_BYTE_TLV 0x100
27#define SOC_CONTROL_TYPE_HDA_SST_MUX 0x101
28#define SOC_CONTROL_TYPE_HDA_SST_MIX 0x101
29#define SOC_CONTROL_TYPE_HDA_SST_BYTE 0x103
30 27
31#define HDA_SST_CFG_MAX 900 /* size of copier cfg*/ 28#define HDA_SST_CFG_MAX 900 /* size of copier cfg*/
32#define MAX_IN_QUEUE 8 29#define MAX_IN_QUEUE 8
33#define MAX_OUT_QUEUE 8 30#define MAX_OUT_QUEUE 8
34 31
32#define SKL_UUID_STR_SZ 40
35/* Event types goes here */ 33/* Event types goes here */
36/* Reserve event type 0 for no event handlers */ 34/* Reserve event type 0 for no event handlers */
37enum skl_event_types { 35enum skl_event_types {
@@ -72,6 +70,7 @@ enum skl_ch_cfg {
72 SKL_CH_CFG_DUAL_MONO = 9, 70 SKL_CH_CFG_DUAL_MONO = 9,
73 SKL_CH_CFG_I2S_DUAL_STEREO_0 = 10, 71 SKL_CH_CFG_I2S_DUAL_STEREO_0 = 10,
74 SKL_CH_CFG_I2S_DUAL_STEREO_1 = 11, 72 SKL_CH_CFG_I2S_DUAL_STEREO_1 = 11,
73 SKL_CH_CFG_4_CHANNEL = 12,
75 SKL_CH_CFG_INVALID 74 SKL_CH_CFG_INVALID
76}; 75};
77 76
@@ -79,7 +78,9 @@ enum skl_module_type {
79 SKL_MODULE_TYPE_MIXER = 0, 78 SKL_MODULE_TYPE_MIXER = 0,
80 SKL_MODULE_TYPE_COPIER, 79 SKL_MODULE_TYPE_COPIER,
81 SKL_MODULE_TYPE_UPDWMIX, 80 SKL_MODULE_TYPE_UPDWMIX,
82 SKL_MODULE_TYPE_SRCINT 81 SKL_MODULE_TYPE_SRCINT,
82 SKL_MODULE_TYPE_ALGO,
83 SKL_MODULE_TYPE_BASE_OUTFMT
83}; 84};
84 85
85enum skl_core_affinity { 86enum skl_core_affinity {
@@ -110,6 +111,42 @@ enum skl_dev_type {
110 SKL_DEVICE_NONE 111 SKL_DEVICE_NONE
111}; 112};
112 113
114/**
115 * enum skl_interleaving - interleaving style
116 *
117 * @SKL_INTERLEAVING_PER_CHANNEL: [s1_ch1...s1_chN,...,sM_ch1...sM_chN]
118 * @SKL_INTERLEAVING_PER_SAMPLE: [s1_ch1...sM_ch1,...,s1_chN...sM_chN]
119 */
120enum skl_interleaving {
121 SKL_INTERLEAVING_PER_CHANNEL = 0,
122 SKL_INTERLEAVING_PER_SAMPLE = 1,
123};
124
125enum skl_sample_type {
126 SKL_SAMPLE_TYPE_INT_MSB = 0,
127 SKL_SAMPLE_TYPE_INT_LSB = 1,
128 SKL_SAMPLE_TYPE_INT_SIGNED = 2,
129 SKL_SAMPLE_TYPE_INT_UNSIGNED = 3,
130 SKL_SAMPLE_TYPE_FLOAT = 4
131};
132
133enum module_pin_type {
134 /* All pins of the module takes same PCM inputs or outputs
135 * e.g. mixout
136 */
137 SKL_PIN_TYPE_HOMOGENEOUS,
138 /* All pins of the module takes different PCM inputs or outputs
139 * e.g mux
140 */
141 SKL_PIN_TYPE_HETEROGENEOUS,
142};
143
144enum skl_module_param_type {
145 SKL_PARAM_DEFAULT = 0,
146 SKL_PARAM_INIT,
147 SKL_PARAM_SET
148};
149
113struct skl_dfw_module_pin { 150struct skl_dfw_module_pin {
114 u16 module_id; 151 u16 module_id;
115 u16 instance_id; 152 u16 instance_id;
@@ -121,9 +158,15 @@ struct skl_dfw_module_fmt {
121 u32 bit_depth; 158 u32 bit_depth;
122 u32 valid_bit_depth; 159 u32 valid_bit_depth;
123 u32 ch_cfg; 160 u32 ch_cfg;
161 u32 interleaving_style;
162 u32 sample_type;
163 u32 ch_map;
124} __packed; 164} __packed;
125 165
126struct skl_dfw_module_caps { 166struct skl_dfw_module_caps {
167 u32 set_params:2;
168 u32 rsvd:30;
169 u32 param_id;
127 u32 caps_size; 170 u32 caps_size;
128 u32 caps[HDA_SST_CFG_MAX]; 171 u32 caps[HDA_SST_CFG_MAX];
129}; 172};
@@ -131,41 +174,57 @@ struct skl_dfw_module_caps {
131struct skl_dfw_pipe { 174struct skl_dfw_pipe {
132 u8 pipe_id; 175 u8 pipe_id;
133 u8 pipe_priority; 176 u8 pipe_priority;
134 u16 conn_type; 177 u16 conn_type:4;
135 u32 memory_pages; 178 u16 rsvd:4;
179 u16 memory_pages:8;
136} __packed; 180} __packed;
137 181
138struct skl_dfw_module { 182struct skl_dfw_module {
183 char uuid[SKL_UUID_STR_SZ];
184
139 u16 module_id; 185 u16 module_id;
140 u16 instance_id; 186 u16 instance_id;
141 u32 max_mcps; 187 u32 max_mcps;
142 u8 core_id; 188 u32 mem_pages;
143 u8 max_in_queue;
144 u8 max_out_queue;
145 u8 is_loadable;
146 u8 conn_type;
147 u8 dev_type;
148 u8 hw_conn_type;
149 u8 time_slot;
150 u32 obs; 189 u32 obs;
151 u32 ibs; 190 u32 ibs;
152 u32 params_fixup;
153 u32 converter;
154 u32 module_type;
155 u32 vbus_id; 191 u32 vbus_id;
156 u8 is_dynamic_in_pin; 192
157 u8 is_dynamic_out_pin; 193 u32 max_in_queue:8;
194 u32 max_out_queue:8;
195 u32 time_slot:8;
196 u32 core_id:4;
197 u32 rsvd1:4;
198
199 u32 module_type:8;
200 u32 conn_type:4;
201 u32 dev_type:4;
202 u32 hw_conn_type:4;
203 u32 rsvd2:12;
204
205 u32 params_fixup:8;
206 u32 converter:8;
207 u32 input_pin_type:1;
208 u32 output_pin_type:1;
209 u32 is_dynamic_in_pin:1;
210 u32 is_dynamic_out_pin:1;
211 u32 is_loadable:1;
212 u32 rsvd3:11;
213
158 struct skl_dfw_pipe pipe; 214 struct skl_dfw_pipe pipe;
159 struct skl_dfw_module_fmt in_fmt; 215 struct skl_dfw_module_fmt in_fmt[MAX_IN_QUEUE];
160 struct skl_dfw_module_fmt out_fmt; 216 struct skl_dfw_module_fmt out_fmt[MAX_OUT_QUEUE];
161 struct skl_dfw_module_pin in_pin[MAX_IN_QUEUE]; 217 struct skl_dfw_module_pin in_pin[MAX_IN_QUEUE];
162 struct skl_dfw_module_pin out_pin[MAX_OUT_QUEUE]; 218 struct skl_dfw_module_pin out_pin[MAX_OUT_QUEUE];
163 struct skl_dfw_module_caps caps; 219 struct skl_dfw_module_caps caps;
164} __packed; 220} __packed;
165 221
166struct skl_dfw_algo_data { 222struct skl_dfw_algo_data {
223 u32 set_params:2;
224 u32 rsvd:30;
225 u32 param_id;
167 u32 max; 226 u32 max;
168 char *params; 227 char params[0];
169} __packed; 228} __packed;
170 229
171#endif 230#endif
diff --git a/sound/soc/intel/skylake/skl.c b/sound/soc/intel/skylake/skl.c
index caa69c4598a6..443a15de94b5 100644
--- a/sound/soc/intel/skylake/skl.c
+++ b/sound/soc/intel/skylake/skl.c
@@ -27,7 +27,10 @@
27#include <linux/platform_device.h> 27#include <linux/platform_device.h>
28#include <linux/firmware.h> 28#include <linux/firmware.h>
29#include <sound/pcm.h> 29#include <sound/pcm.h>
30#include "../common/sst-acpi.h"
30#include "skl.h" 31#include "skl.h"
32#include "skl-sst-dsp.h"
33#include "skl-sst-ipc.h"
31 34
32/* 35/*
33 * initialize the PCI registers 36 * initialize the PCI registers
@@ -58,6 +61,49 @@ static void skl_init_pci(struct skl *skl)
58 skl_update_pci_byte(skl->pci, AZX_PCIREG_TCSEL, 0x07, 0); 61 skl_update_pci_byte(skl->pci, AZX_PCIREG_TCSEL, 0x07, 0);
59} 62}
60 63
64static void update_pci_dword(struct pci_dev *pci,
65 unsigned int reg, u32 mask, u32 val)
66{
67 u32 data = 0;
68
69 pci_read_config_dword(pci, reg, &data);
70 data &= ~mask;
71 data |= (val & mask);
72 pci_write_config_dword(pci, reg, data);
73}
74
75/*
76 * skl_enable_miscbdcge - enable/dsiable CGCTL.MISCBDCGE bits
77 *
78 * @dev: device pointer
79 * @enable: enable/disable flag
80 */
81static void skl_enable_miscbdcge(struct device *dev, bool enable)
82{
83 struct pci_dev *pci = to_pci_dev(dev);
84 u32 val;
85
86 val = enable ? AZX_CGCTL_MISCBDCGE_MASK : 0;
87
88 update_pci_dword(pci, AZX_PCIREG_CGCTL, AZX_CGCTL_MISCBDCGE_MASK, val);
89}
90
91/*
92 * While performing reset, controller may not come back properly causing
93 * issues, so recommendation is to set CGCTL.MISCBDCGE to 0 then do reset
94 * (init chip) and then again set CGCTL.MISCBDCGE to 1
95 */
96static int skl_init_chip(struct hdac_bus *bus, bool full_reset)
97{
98 int ret;
99
100 skl_enable_miscbdcge(bus->dev, false);
101 ret = snd_hdac_bus_init_chip(bus, full_reset);
102 skl_enable_miscbdcge(bus->dev, true);
103
104 return ret;
105}
106
61/* called from IRQ */ 107/* called from IRQ */
62static void skl_stream_update(struct hdac_bus *bus, struct hdac_stream *hstr) 108static void skl_stream_update(struct hdac_bus *bus, struct hdac_stream *hstr)
63{ 109{
@@ -130,6 +176,39 @@ static int skl_acquire_irq(struct hdac_ext_bus *ebus, int do_disconnect)
130 return 0; 176 return 0;
131} 177}
132 178
179#ifdef CONFIG_PM
180static int _skl_suspend(struct hdac_ext_bus *ebus)
181{
182 struct skl *skl = ebus_to_skl(ebus);
183 struct hdac_bus *bus = ebus_to_hbus(ebus);
184 int ret;
185
186 snd_hdac_ext_bus_link_power_down_all(ebus);
187
188 ret = skl_suspend_dsp(skl);
189 if (ret < 0)
190 return ret;
191
192 snd_hdac_bus_stop_chip(bus);
193 skl_enable_miscbdcge(bus->dev, false);
194 snd_hdac_bus_enter_link_reset(bus);
195 skl_enable_miscbdcge(bus->dev, true);
196
197 return 0;
198}
199
200static int _skl_resume(struct hdac_ext_bus *ebus)
201{
202 struct skl *skl = ebus_to_skl(ebus);
203 struct hdac_bus *bus = ebus_to_hbus(ebus);
204
205 skl_init_pci(skl);
206 skl_init_chip(bus, true);
207
208 return skl_resume_dsp(skl);
209}
210#endif
211
133#ifdef CONFIG_PM_SLEEP 212#ifdef CONFIG_PM_SLEEP
134/* 213/*
135 * power management 214 * power management
@@ -138,26 +217,46 @@ static int skl_suspend(struct device *dev)
138{ 217{
139 struct pci_dev *pci = to_pci_dev(dev); 218 struct pci_dev *pci = to_pci_dev(dev);
140 struct hdac_ext_bus *ebus = pci_get_drvdata(pci); 219 struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
220 struct skl *skl = ebus_to_skl(ebus);
141 struct hdac_bus *bus = ebus_to_hbus(ebus); 221 struct hdac_bus *bus = ebus_to_hbus(ebus);
142 222
143 snd_hdac_bus_stop_chip(bus); 223 /*
144 snd_hdac_bus_enter_link_reset(bus); 224 * Do not suspend if streams which are marked ignore suspend are
145 225 * running, we need to save the state for these and continue
146 return 0; 226 */
227 if (skl->supend_active) {
228 snd_hdac_ext_bus_link_power_down_all(ebus);
229 enable_irq_wake(bus->irq);
230 pci_save_state(pci);
231 pci_disable_device(pci);
232 return 0;
233 } else {
234 return _skl_suspend(ebus);
235 }
147} 236}
148 237
149static int skl_resume(struct device *dev) 238static int skl_resume(struct device *dev)
150{ 239{
151 struct pci_dev *pci = to_pci_dev(dev); 240 struct pci_dev *pci = to_pci_dev(dev);
152 struct hdac_ext_bus *ebus = pci_get_drvdata(pci); 241 struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
242 struct skl *skl = ebus_to_skl(ebus);
153 struct hdac_bus *bus = ebus_to_hbus(ebus); 243 struct hdac_bus *bus = ebus_to_hbus(ebus);
154 struct skl *hda = ebus_to_skl(ebus); 244 int ret;
155
156 skl_init_pci(hda);
157 245
158 snd_hdac_bus_init_chip(bus, 1); 246 /*
247 * resume only when we are not in suspend active, otherwise need to
248 * restore the device
249 */
250 if (skl->supend_active) {
251 pci_restore_state(pci);
252 ret = pci_enable_device(pci);
253 snd_hdac_ext_bus_link_power_up_all(ebus);
254 disable_irq_wake(bus->irq);
255 } else {
256 ret = _skl_resume(ebus);
257 }
159 258
160 return 0; 259 return ret;
161} 260}
162#endif /* CONFIG_PM_SLEEP */ 261#endif /* CONFIG_PM_SLEEP */
163 262
@@ -167,24 +266,10 @@ static int skl_runtime_suspend(struct device *dev)
167 struct pci_dev *pci = to_pci_dev(dev); 266 struct pci_dev *pci = to_pci_dev(dev);
168 struct hdac_ext_bus *ebus = pci_get_drvdata(pci); 267 struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
169 struct hdac_bus *bus = ebus_to_hbus(ebus); 268 struct hdac_bus *bus = ebus_to_hbus(ebus);
170 struct skl *skl = ebus_to_skl(ebus);
171 int ret;
172 269
173 dev_dbg(bus->dev, "in %s\n", __func__); 270 dev_dbg(bus->dev, "in %s\n", __func__);
174 271
175 /* enable controller wake up event */ 272 return _skl_suspend(ebus);
176 snd_hdac_chip_updatew(bus, WAKEEN, 0, STATESTS_INT_MASK);
177
178 snd_hdac_ext_bus_link_power_down_all(ebus);
179
180 ret = skl_suspend_dsp(skl);
181 if (ret < 0)
182 return ret;
183
184 snd_hdac_bus_stop_chip(bus);
185 snd_hdac_bus_enter_link_reset(bus);
186
187 return 0;
188} 273}
189 274
190static int skl_runtime_resume(struct device *dev) 275static int skl_runtime_resume(struct device *dev)
@@ -192,20 +277,10 @@ static int skl_runtime_resume(struct device *dev)
192 struct pci_dev *pci = to_pci_dev(dev); 277 struct pci_dev *pci = to_pci_dev(dev);
193 struct hdac_ext_bus *ebus = pci_get_drvdata(pci); 278 struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
194 struct hdac_bus *bus = ebus_to_hbus(ebus); 279 struct hdac_bus *bus = ebus_to_hbus(ebus);
195 struct skl *skl = ebus_to_skl(ebus);
196 int status;
197 280
198 dev_dbg(bus->dev, "in %s\n", __func__); 281 dev_dbg(bus->dev, "in %s\n", __func__);
199 282
200 /* Read STATESTS before controller reset */ 283 return _skl_resume(ebus);
201 status = snd_hdac_chip_readw(bus, STATESTS);
202
203 skl_init_pci(skl);
204 snd_hdac_bus_init_chip(bus, true);
205 /* disable controller Wake Up event */
206 snd_hdac_chip_updatew(bus, WAKEEN, STATESTS_INT_MASK, 0);
207
208 return skl_resume_dsp(skl);
209} 284}
210#endif /* CONFIG_PM */ 285#endif /* CONFIG_PM */
211 286
@@ -242,6 +317,43 @@ static int skl_free(struct hdac_ext_bus *ebus)
242 return 0; 317 return 0;
243} 318}
244 319
320static int skl_machine_device_register(struct skl *skl, void *driver_data)
321{
322 struct hdac_bus *bus = ebus_to_hbus(&skl->ebus);
323 struct platform_device *pdev;
324 struct sst_acpi_mach *mach = driver_data;
325 int ret;
326
327 mach = sst_acpi_find_machine(mach);
328 if (mach == NULL) {
329 dev_err(bus->dev, "No matching machine driver found\n");
330 return -ENODEV;
331 }
332 skl->fw_name = mach->fw_filename;
333
334 pdev = platform_device_alloc(mach->drv_name, -1);
335 if (pdev == NULL) {
336 dev_err(bus->dev, "platform device alloc failed\n");
337 return -EIO;
338 }
339
340 ret = platform_device_add(pdev);
341 if (ret) {
342 dev_err(bus->dev, "failed to add machine device\n");
343 platform_device_put(pdev);
344 return -EIO;
345 }
346 skl->i2s_dev = pdev;
347
348 return 0;
349}
350
351static void skl_machine_device_unregister(struct skl *skl)
352{
353 if (skl->i2s_dev)
354 platform_device_unregister(skl->i2s_dev);
355}
356
245static int skl_dmic_device_register(struct skl *skl) 357static int skl_dmic_device_register(struct skl *skl)
246{ 358{
247 struct hdac_bus *bus = ebus_to_hbus(&skl->ebus); 359 struct hdac_bus *bus = ebus_to_hbus(&skl->ebus);
@@ -321,7 +433,7 @@ static int skl_codec_create(struct hdac_ext_bus *ebus)
321 * back to the sanity state. 433 * back to the sanity state.
322 */ 434 */
323 snd_hdac_bus_stop_chip(bus); 435 snd_hdac_bus_stop_chip(bus);
324 snd_hdac_bus_init_chip(bus, true); 436 skl_init_chip(bus, true);
325 } 437 }
326 } 438 }
327 } 439 }
@@ -431,12 +543,11 @@ static int skl_first_init(struct hdac_ext_bus *ebus)
431 /* initialize chip */ 543 /* initialize chip */
432 skl_init_pci(skl); 544 skl_init_pci(skl);
433 545
434 snd_hdac_bus_init_chip(bus, true); 546 skl_init_chip(bus, true);
435 547
436 /* codec detection */ 548 /* codec detection */
437 if (!bus->codec_mask) { 549 if (!bus->codec_mask) {
438 dev_err(bus->dev, "no codecs found!\n"); 550 dev_info(bus->dev, "no hda codecs found!\n");
439 return -ENODEV;
440 } 551 }
441 552
442 return 0; 553 return 0;
@@ -471,11 +582,18 @@ static int skl_probe(struct pci_dev *pci,
471 582
472 /* check if dsp is there */ 583 /* check if dsp is there */
473 if (ebus->ppcap) { 584 if (ebus->ppcap) {
585 err = skl_machine_device_register(skl,
586 (void *)pci_id->driver_data);
587 if (err < 0)
588 goto out_free;
589
474 err = skl_init_dsp(skl); 590 err = skl_init_dsp(skl);
475 if (err < 0) { 591 if (err < 0) {
476 dev_dbg(bus->dev, "error failed to register dsp\n"); 592 dev_dbg(bus->dev, "error failed to register dsp\n");
477 goto out_free; 593 goto out_mach_free;
478 } 594 }
595 skl->skl_sst->enable_miscbdcge = skl_enable_miscbdcge;
596
479 } 597 }
480 if (ebus->mlcap) 598 if (ebus->mlcap)
481 snd_hdac_ext_bus_get_ml_capabilities(ebus); 599 snd_hdac_ext_bus_get_ml_capabilities(ebus);
@@ -509,6 +627,8 @@ out_dmic_free:
509 skl_dmic_device_unregister(skl); 627 skl_dmic_device_unregister(skl);
510out_dsp_free: 628out_dsp_free:
511 skl_free_dsp(skl); 629 skl_free_dsp(skl);
630out_mach_free:
631 skl_machine_device_unregister(skl);
512out_free: 632out_free:
513 skl->init_failed = 1; 633 skl->init_failed = 1;
514 skl_free(ebus); 634 skl_free(ebus);
@@ -529,15 +649,26 @@ static void skl_remove(struct pci_dev *pci)
529 pci_dev_put(pci); 649 pci_dev_put(pci);
530 skl_platform_unregister(&pci->dev); 650 skl_platform_unregister(&pci->dev);
531 skl_free_dsp(skl); 651 skl_free_dsp(skl);
652 skl_machine_device_unregister(skl);
532 skl_dmic_device_unregister(skl); 653 skl_dmic_device_unregister(skl);
533 skl_free(ebus); 654 skl_free(ebus);
534 dev_set_drvdata(&pci->dev, NULL); 655 dev_set_drvdata(&pci->dev, NULL);
535} 656}
536 657
658static struct sst_acpi_mach sst_skl_devdata[] = {
659 { "INT343A", "skl_alc286s_i2s", "intel/dsp_fw_release.bin", NULL, NULL, NULL },
660 { "INT343B", "skl_nau88l25_ssm4567_i2s", "intel/dsp_fw_release.bin",
661 NULL, NULL, NULL },
662 { "MX98357A", "skl_nau88l25_max98357a_i2s", "intel/dsp_fw_release.bin",
663 NULL, NULL, NULL },
664 {}
665};
666
537/* PCI IDs */ 667/* PCI IDs */
538static const struct pci_device_id skl_ids[] = { 668static const struct pci_device_id skl_ids[] = {
539 /* Sunrise Point-LP */ 669 /* Sunrise Point-LP */
540 { PCI_DEVICE(0x8086, 0x9d70), 0}, 670 { PCI_DEVICE(0x8086, 0x9d70),
671 .driver_data = (unsigned long)&sst_skl_devdata},
541 { 0, } 672 { 0, }
542}; 673};
543MODULE_DEVICE_TABLE(pci, skl_ids); 674MODULE_DEVICE_TABLE(pci, skl_ids);
diff --git a/sound/soc/intel/skylake/skl.h b/sound/soc/intel/skylake/skl.h
index a0709e344d44..4d18293b5537 100644
--- a/sound/soc/intel/skylake/skl.h
+++ b/sound/soc/intel/skylake/skl.h
@@ -48,6 +48,9 @@
48#define AZX_REG_VS_SDXEFIFOS_XBASE 0x1094 48#define AZX_REG_VS_SDXEFIFOS_XBASE 0x1094
49#define AZX_REG_VS_SDXEFIFOS_XINTERVAL 0x20 49#define AZX_REG_VS_SDXEFIFOS_XINTERVAL 0x20
50 50
51#define AZX_PCIREG_CGCTL 0x48
52#define AZX_CGCTL_MISCBDCGE_MASK (1 << 6)
53
51struct skl_dsp_resource { 54struct skl_dsp_resource {
52 u32 max_mcps; 55 u32 max_mcps;
53 u32 max_mem; 56 u32 max_mem;
@@ -61,15 +64,18 @@ struct skl {
61 64
62 unsigned int init_failed:1; /* delayed init failed */ 65 unsigned int init_failed:1; /* delayed init failed */
63 struct platform_device *dmic_dev; 66 struct platform_device *dmic_dev;
67 struct platform_device *i2s_dev;
64 68
65 void *nhlt; /* nhlt ptr */ 69 void *nhlt; /* nhlt ptr */
66 struct skl_sst *skl_sst; /* sst skl ctx */ 70 struct skl_sst *skl_sst; /* sst skl ctx */
67 71
68 struct skl_dsp_resource resource; 72 struct skl_dsp_resource resource;
69 struct list_head ppl_list; 73 struct list_head ppl_list;
70 struct list_head dapm_path_list;
71 74
75 const char *fw_name;
72 const struct firmware *tplg; 76 const struct firmware *tplg;
77
78 int supend_active;
73}; 79};
74 80
75#define skl_to_ebus(s) (&(s)->ebus) 81#define skl_to_ebus(s) (&(s)->ebus)
diff --git a/sound/soc/mediatek/mtk-afe-common.h b/sound/soc/mediatek/mtk-afe-common.h
index cc4393cb1130..9b1af1a70874 100644
--- a/sound/soc/mediatek/mtk-afe-common.h
+++ b/sound/soc/mediatek/mtk-afe-common.h
@@ -92,7 +92,6 @@ struct mtk_afe_memif_data {
92struct mtk_afe_memif { 92struct mtk_afe_memif {
93 unsigned int phys_buf_addr; 93 unsigned int phys_buf_addr;
94 int buffer_size; 94 int buffer_size;
95 unsigned int hw_ptr; /* Previous IRQ's HW ptr */
96 struct snd_pcm_substream *substream; 95 struct snd_pcm_substream *substream;
97 const struct mtk_afe_memif_data *data; 96 const struct mtk_afe_memif_data *data;
98 const struct mtk_afe_irq_data *irqdata; 97 const struct mtk_afe_irq_data *irqdata;
diff --git a/sound/soc/mediatek/mtk-afe-pcm.c b/sound/soc/mediatek/mtk-afe-pcm.c
index f5baf3c38863..08af9f5dc4ab 100644
--- a/sound/soc/mediatek/mtk-afe-pcm.c
+++ b/sound/soc/mediatek/mtk-afe-pcm.c
@@ -175,8 +175,17 @@ static snd_pcm_uframes_t mtk_afe_pcm_pointer
175 struct snd_soc_pcm_runtime *rtd = substream->private_data; 175 struct snd_soc_pcm_runtime *rtd = substream->private_data;
176 struct mtk_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); 176 struct mtk_afe *afe = snd_soc_platform_get_drvdata(rtd->platform);
177 struct mtk_afe_memif *memif = &afe->memif[rtd->cpu_dai->id]; 177 struct mtk_afe_memif *memif = &afe->memif[rtd->cpu_dai->id];
178 unsigned int hw_ptr;
179 int ret;
180
181 ret = regmap_read(afe->regmap, memif->data->reg_ofs_cur, &hw_ptr);
182 if (ret || hw_ptr == 0) {
183 dev_err(afe->dev, "%s hw_ptr err\n", __func__);
184 hw_ptr = memif->phys_buf_addr;
185 }
178 186
179 return bytes_to_frames(substream->runtime, memif->hw_ptr); 187 return bytes_to_frames(substream->runtime,
188 hw_ptr - memif->phys_buf_addr);
180} 189}
181 190
182static const struct snd_pcm_ops mtk_afe_pcm_ops = { 191static const struct snd_pcm_ops mtk_afe_pcm_ops = {
@@ -299,8 +308,6 @@ static int mtk_afe_dais_enable_clks(struct mtk_afe *afe,
299 dev_err(afe->dev, "Failed to enable m_ck\n"); 308 dev_err(afe->dev, "Failed to enable m_ck\n");
300 return ret; 309 return ret;
301 } 310 }
302 regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,
303 AUD_TCON0_PDN_22M | AUD_TCON0_PDN_24M, 0);
304 } 311 }
305 312
306 if (b_ck) { 313 if (b_ck) {
@@ -340,12 +347,8 @@ static int mtk_afe_dais_set_clks(struct mtk_afe *afe,
340static void mtk_afe_dais_disable_clks(struct mtk_afe *afe, 347static void mtk_afe_dais_disable_clks(struct mtk_afe *afe,
341 struct clk *m_ck, struct clk *b_ck) 348 struct clk *m_ck, struct clk *b_ck)
342{ 349{
343 if (m_ck) { 350 if (m_ck)
344 regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,
345 AUD_TCON0_PDN_22M | AUD_TCON0_PDN_24M,
346 AUD_TCON0_PDN_22M | AUD_TCON0_PDN_24M);
347 clk_disable_unprepare(m_ck); 351 clk_disable_unprepare(m_ck);
348 }
349 if (b_ck) 352 if (b_ck)
350 clk_disable_unprepare(b_ck); 353 clk_disable_unprepare(b_ck);
351} 354}
@@ -360,6 +363,8 @@ static int mtk_afe_i2s_startup(struct snd_pcm_substream *substream,
360 return 0; 363 return 0;
361 364
362 mtk_afe_dais_enable_clks(afe, afe->clocks[MTK_CLK_I2S1_M], NULL); 365 mtk_afe_dais_enable_clks(afe, afe->clocks[MTK_CLK_I2S1_M], NULL);
366 regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,
367 AUD_TCON0_PDN_22M | AUD_TCON0_PDN_24M, 0);
363 return 0; 368 return 0;
364} 369}
365 370
@@ -373,10 +378,10 @@ static void mtk_afe_i2s_shutdown(struct snd_pcm_substream *substream,
373 return; 378 return;
374 379
375 mtk_afe_set_i2s_enable(afe, false); 380 mtk_afe_set_i2s_enable(afe, false);
381 regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,
382 AUD_TCON0_PDN_22M | AUD_TCON0_PDN_24M,
383 AUD_TCON0_PDN_22M | AUD_TCON0_PDN_24M);
376 mtk_afe_dais_disable_clks(afe, afe->clocks[MTK_CLK_I2S1_M], NULL); 384 mtk_afe_dais_disable_clks(afe, afe->clocks[MTK_CLK_I2S1_M], NULL);
377
378 /* disable AFE */
379 regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0);
380} 385}
381 386
382static int mtk_afe_i2s_prepare(struct snd_pcm_substream *substream, 387static int mtk_afe_i2s_prepare(struct snd_pcm_substream *substream,
@@ -425,9 +430,6 @@ static void mtk_afe_hdmi_shutdown(struct snd_pcm_substream *substream,
425 430
426 mtk_afe_dais_disable_clks(afe, afe->clocks[MTK_CLK_I2S3_M], 431 mtk_afe_dais_disable_clks(afe, afe->clocks[MTK_CLK_I2S3_M],
427 afe->clocks[MTK_CLK_I2S3_B]); 432 afe->clocks[MTK_CLK_I2S3_B]);
428
429 /* disable AFE */
430 regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0);
431} 433}
432 434
433static int mtk_afe_hdmi_prepare(struct snd_pcm_substream *substream, 435static int mtk_afe_hdmi_prepare(struct snd_pcm_substream *substream,
@@ -603,7 +605,6 @@ static int mtk_afe_dais_hw_params(struct snd_pcm_substream *substream,
603 605
604 memif->phys_buf_addr = substream->runtime->dma_addr; 606 memif->phys_buf_addr = substream->runtime->dma_addr;
605 memif->buffer_size = substream->runtime->dma_bytes; 607 memif->buffer_size = substream->runtime->dma_bytes;
606 memif->hw_ptr = 0;
607 608
608 /* start */ 609 /* start */
609 regmap_write(afe->regmap, 610 regmap_write(afe->regmap,
@@ -672,17 +673,6 @@ static int mtk_afe_dais_hw_free(struct snd_pcm_substream *substream,
672 return snd_pcm_lib_free_pages(substream); 673 return snd_pcm_lib_free_pages(substream);
673} 674}
674 675
675static int mtk_afe_dais_prepare(struct snd_pcm_substream *substream,
676 struct snd_soc_dai *dai)
677{
678 struct snd_soc_pcm_runtime *rtd = substream->private_data;
679 struct mtk_afe *afe = snd_soc_platform_get_drvdata(rtd->platform);
680
681 /* enable AFE */
682 regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x1);
683 return 0;
684}
685
686static int mtk_afe_dais_trigger(struct snd_pcm_substream *substream, int cmd, 676static int mtk_afe_dais_trigger(struct snd_pcm_substream *substream, int cmd,
687 struct snd_soc_dai *dai) 677 struct snd_soc_dai *dai)
688{ 678{
@@ -738,7 +728,6 @@ static int mtk_afe_dais_trigger(struct snd_pcm_substream *substream, int cmd,
738 /* and clear pending IRQ */ 728 /* and clear pending IRQ */
739 regmap_write(afe->regmap, AFE_IRQ_CLR, 729 regmap_write(afe->regmap, AFE_IRQ_CLR,
740 1 << memif->data->irq_clr_shift); 730 1 << memif->data->irq_clr_shift);
741 memif->hw_ptr = 0;
742 return 0; 731 return 0;
743 default: 732 default:
744 return -EINVAL; 733 return -EINVAL;
@@ -751,7 +740,6 @@ static const struct snd_soc_dai_ops mtk_afe_dai_ops = {
751 .shutdown = mtk_afe_dais_shutdown, 740 .shutdown = mtk_afe_dais_shutdown,
752 .hw_params = mtk_afe_dais_hw_params, 741 .hw_params = mtk_afe_dais_hw_params,
753 .hw_free = mtk_afe_dais_hw_free, 742 .hw_free = mtk_afe_dais_hw_free,
754 .prepare = mtk_afe_dais_prepare,
755 .trigger = mtk_afe_dais_trigger, 743 .trigger = mtk_afe_dais_trigger,
756}; 744};
757 745
@@ -1082,7 +1070,7 @@ static const struct regmap_config mtk_afe_regmap_config = {
1082static irqreturn_t mtk_afe_irq_handler(int irq, void *dev_id) 1070static irqreturn_t mtk_afe_irq_handler(int irq, void *dev_id)
1083{ 1071{
1084 struct mtk_afe *afe = dev_id; 1072 struct mtk_afe *afe = dev_id;
1085 unsigned int reg_value, hw_ptr; 1073 unsigned int reg_value;
1086 int i, ret; 1074 int i, ret;
1087 1075
1088 ret = regmap_read(afe->regmap, AFE_IRQ_STATUS, &reg_value); 1076 ret = regmap_read(afe->regmap, AFE_IRQ_STATUS, &reg_value);
@@ -1098,13 +1086,6 @@ static irqreturn_t mtk_afe_irq_handler(int irq, void *dev_id)
1098 if (!(reg_value & (1 << memif->data->irq_clr_shift))) 1086 if (!(reg_value & (1 << memif->data->irq_clr_shift)))
1099 continue; 1087 continue;
1100 1088
1101 ret = regmap_read(afe->regmap, memif->data->reg_ofs_cur,
1102 &hw_ptr);
1103 if (ret || hw_ptr == 0) {
1104 dev_err(afe->dev, "%s hw_ptr err\n", __func__);
1105 hw_ptr = memif->phys_buf_addr;
1106 }
1107 memif->hw_ptr = hw_ptr - memif->phys_buf_addr;
1108 snd_pcm_period_elapsed(memif->substream); 1089 snd_pcm_period_elapsed(memif->substream);
1109 } 1090 }
1110 1091
@@ -1119,6 +1100,9 @@ static int mtk_afe_runtime_suspend(struct device *dev)
1119{ 1100{
1120 struct mtk_afe *afe = dev_get_drvdata(dev); 1101 struct mtk_afe *afe = dev_get_drvdata(dev);
1121 1102
1103 /* disable AFE */
1104 regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0);
1105
1122 /* disable AFE clk */ 1106 /* disable AFE clk */
1123 regmap_update_bits(afe->regmap, AUDIO_TOP_CON0, 1107 regmap_update_bits(afe->regmap, AUDIO_TOP_CON0,
1124 AUD_TCON0_PDN_AFE, AUD_TCON0_PDN_AFE); 1108 AUD_TCON0_PDN_AFE, AUD_TCON0_PDN_AFE);
@@ -1165,6 +1149,9 @@ static int mtk_afe_runtime_resume(struct device *dev)
1165 1149
1166 /* unmask all IRQs */ 1150 /* unmask all IRQs */
1167 regmap_update_bits(afe->regmap, AFE_IRQ_MCU_EN, 0xff, 0xff); 1151 regmap_update_bits(afe->regmap, AFE_IRQ_MCU_EN, 0xff, 0xff);
1152
1153 /* enable AFE */
1154 regmap_update_bits(afe->regmap, AFE_DAC_CON0, 0x1, 0x1);
1168 return 0; 1155 return 0;
1169 1156
1170err_bck0: 1157err_bck0:
diff --git a/sound/soc/omap/omap-hdmi-audio.c b/sound/soc/omap/omap-hdmi-audio.c
index 584b2372339e..f83cc2bc0fc4 100644
--- a/sound/soc/omap/omap-hdmi-audio.c
+++ b/sound/soc/omap/omap-hdmi-audio.c
@@ -368,6 +368,8 @@ static int omap_hdmi_audio_probe(struct platform_device *pdev)
368 card->owner = THIS_MODULE; 368 card->owner = THIS_MODULE;
369 card->dai_link = 369 card->dai_link =
370 devm_kzalloc(dev, sizeof(*(card->dai_link)), GFP_KERNEL); 370 devm_kzalloc(dev, sizeof(*(card->dai_link)), GFP_KERNEL);
371 if (!card->dai_link)
372 return -ENOMEM;
371 card->dai_link->name = card->name; 373 card->dai_link->name = card->name;
372 card->dai_link->stream_name = card->name; 374 card->dai_link->stream_name = card->name;
373 card->dai_link->cpu_dai_name = dev_name(ad->dssdev); 375 card->dai_link->cpu_dai_name = dev_name(ad->dssdev);
diff --git a/sound/soc/pxa/brownstone.c b/sound/soc/pxa/brownstone.c
index 6147e86e9b0f..416ea646c3b1 100644
--- a/sound/soc/pxa/brownstone.c
+++ b/sound/soc/pxa/brownstone.c
@@ -63,8 +63,7 @@ static int brownstone_wm8994_hw_params(struct snd_pcm_substream *substream,
63 sysclk = params_rate(params) * 512; 63 sysclk = params_rate(params) * 512;
64 sspa_mclk = params_rate(params) * 64; 64 sspa_mclk = params_rate(params) * 64;
65 } 65 }
66 sspa_div = freq_out; 66 sspa_div = freq_out / sspa_mclk;
67 do_div(sspa_div, sspa_mclk);
68 67
69 snd_soc_dai_set_sysclk(cpu_dai, MMP_SSPA_CLK_AUDIO, freq_out, 0); 68 snd_soc_dai_set_sysclk(cpu_dai, MMP_SSPA_CLK_AUDIO, freq_out, 0);
70 snd_soc_dai_set_pll(cpu_dai, MMP_SYSCLK, 0, freq_out, sysclk); 69 snd_soc_dai_set_pll(cpu_dai, MMP_SYSCLK, 0, freq_out, sysclk);
diff --git a/sound/soc/pxa/mioa701_wm9713.c b/sound/soc/pxa/mioa701_wm9713.c
index 29bc60e85e92..5c8f9db50a47 100644
--- a/sound/soc/pxa/mioa701_wm9713.c
+++ b/sound/soc/pxa/mioa701_wm9713.c
@@ -81,8 +81,12 @@ static int rear_amp_power(struct snd_soc_codec *codec, int power)
81static int rear_amp_event(struct snd_soc_dapm_widget *widget, 81static int rear_amp_event(struct snd_soc_dapm_widget *widget,
82 struct snd_kcontrol *kctl, int event) 82 struct snd_kcontrol *kctl, int event)
83{ 83{
84 struct snd_soc_codec *codec = widget->dapm->card->rtd[0].codec; 84 struct snd_soc_card *card = widget->dapm->card;
85 struct snd_soc_pcm_runtime *rtd;
86 struct snd_soc_codec *codec;
85 87
88 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
89 codec = rtd->codec;
86 return rear_amp_power(codec, SND_SOC_DAPM_EVENT_ON(event)); 90 return rear_amp_power(codec, SND_SOC_DAPM_EVENT_ON(event));
87} 91}
88 92
diff --git a/sound/soc/qcom/lpass-cpu.c b/sound/soc/qcom/lpass-cpu.c
index e5101e0d2d37..00b6c9d039cf 100644
--- a/sound/soc/qcom/lpass-cpu.c
+++ b/sound/soc/qcom/lpass-cpu.c
@@ -355,6 +355,7 @@ static struct regmap_config lpass_cpu_regmap_config = {
355 .readable_reg = lpass_cpu_regmap_readable, 355 .readable_reg = lpass_cpu_regmap_readable,
356 .volatile_reg = lpass_cpu_regmap_volatile, 356 .volatile_reg = lpass_cpu_regmap_volatile,
357 .cache_type = REGCACHE_FLAT, 357 .cache_type = REGCACHE_FLAT,
358 .val_format_endian = REGMAP_ENDIAN_LITTLE,
358}; 359};
359 360
360int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev) 361int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index 58ee64594f07..6561c4cc2edd 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -34,13 +34,7 @@ struct rk_i2s_dev {
34 34
35 struct regmap *regmap; 35 struct regmap *regmap;
36 36
37/* 37 bool is_master_mode;
38 * Used to indicate the tx/rx status.
39 * I2S controller hopes to start the tx and rx together,
40 * also to stop them when they are both try to stop.
41*/
42 bool tx_start;
43 bool rx_start;
44}; 38};
45 39
46static int i2s_runtime_suspend(struct device *dev) 40static int i2s_runtime_suspend(struct device *dev)
@@ -81,37 +75,29 @@ static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on)
81 I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE); 75 I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE);
82 76
83 regmap_update_bits(i2s->regmap, I2S_XFER, 77 regmap_update_bits(i2s->regmap, I2S_XFER,
84 I2S_XFER_TXS_START | I2S_XFER_RXS_START, 78 I2S_XFER_TXS_START,
85 I2S_XFER_TXS_START | I2S_XFER_RXS_START); 79 I2S_XFER_TXS_START);
86
87 i2s->tx_start = true;
88 } else { 80 } else {
89 i2s->tx_start = false;
90
91 regmap_update_bits(i2s->regmap, I2S_DMACR, 81 regmap_update_bits(i2s->regmap, I2S_DMACR,
92 I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE); 82 I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE);
93 83
94 if (!i2s->rx_start) { 84 regmap_update_bits(i2s->regmap, I2S_XFER,
95 regmap_update_bits(i2s->regmap, I2S_XFER, 85 I2S_XFER_TXS_START,
96 I2S_XFER_TXS_START | 86 I2S_XFER_TXS_STOP);
97 I2S_XFER_RXS_START,
98 I2S_XFER_TXS_STOP |
99 I2S_XFER_RXS_STOP);
100 87
101 regmap_update_bits(i2s->regmap, I2S_CLR, 88 regmap_update_bits(i2s->regmap, I2S_CLR,
102 I2S_CLR_TXC | I2S_CLR_RXC, 89 I2S_CLR_TXC,
103 I2S_CLR_TXC | I2S_CLR_RXC); 90 I2S_CLR_TXC);
104 91
105 regmap_read(i2s->regmap, I2S_CLR, &val); 92 regmap_read(i2s->regmap, I2S_CLR, &val);
106 93
107 /* Should wait for clear operation to finish */ 94 /* Should wait for clear operation to finish */
108 while (val) { 95 while (val & I2S_CLR_TXC) {
109 regmap_read(i2s->regmap, I2S_CLR, &val); 96 regmap_read(i2s->regmap, I2S_CLR, &val);
110 retry--; 97 retry--;
111 if (!retry) { 98 if (!retry) {
112 dev_warn(i2s->dev, "fail to clear\n"); 99 dev_warn(i2s->dev, "fail to clear\n");
113 break; 100 break;
114 }
115 } 101 }
116 } 102 }
117 } 103 }
@@ -127,37 +113,29 @@ static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on)
127 I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE); 113 I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE);
128 114
129 regmap_update_bits(i2s->regmap, I2S_XFER, 115 regmap_update_bits(i2s->regmap, I2S_XFER,
130 I2S_XFER_TXS_START | I2S_XFER_RXS_START, 116 I2S_XFER_RXS_START,
131 I2S_XFER_TXS_START | I2S_XFER_RXS_START); 117 I2S_XFER_RXS_START);
132
133 i2s->rx_start = true;
134 } else { 118 } else {
135 i2s->rx_start = false;
136
137 regmap_update_bits(i2s->regmap, I2S_DMACR, 119 regmap_update_bits(i2s->regmap, I2S_DMACR,
138 I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE); 120 I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE);
139 121
140 if (!i2s->tx_start) { 122 regmap_update_bits(i2s->regmap, I2S_XFER,
141 regmap_update_bits(i2s->regmap, I2S_XFER, 123 I2S_XFER_RXS_START,
142 I2S_XFER_TXS_START | 124 I2S_XFER_RXS_STOP);
143 I2S_XFER_RXS_START,
144 I2S_XFER_TXS_STOP |
145 I2S_XFER_RXS_STOP);
146 125
147 regmap_update_bits(i2s->regmap, I2S_CLR, 126 regmap_update_bits(i2s->regmap, I2S_CLR,
148 I2S_CLR_TXC | I2S_CLR_RXC, 127 I2S_CLR_RXC,
149 I2S_CLR_TXC | I2S_CLR_RXC); 128 I2S_CLR_RXC);
150 129
151 regmap_read(i2s->regmap, I2S_CLR, &val); 130 regmap_read(i2s->regmap, I2S_CLR, &val);
152 131
153 /* Should wait for clear operation to finish */ 132 /* Should wait for clear operation to finish */
154 while (val) { 133 while (val & I2S_CLR_RXC) {
155 regmap_read(i2s->regmap, I2S_CLR, &val); 134 regmap_read(i2s->regmap, I2S_CLR, &val);
156 retry--; 135 retry--;
157 if (!retry) { 136 if (!retry) {
158 dev_warn(i2s->dev, "fail to clear\n"); 137 dev_warn(i2s->dev, "fail to clear\n");
159 break; 138 break;
160 }
161 } 139 }
162 } 140 }
163 } 141 }
@@ -174,9 +152,11 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
174 case SND_SOC_DAIFMT_CBS_CFS: 152 case SND_SOC_DAIFMT_CBS_CFS:
175 /* Set source clock in Master mode */ 153 /* Set source clock in Master mode */
176 val = I2S_CKR_MSS_MASTER; 154 val = I2S_CKR_MSS_MASTER;
155 i2s->is_master_mode = true;
177 break; 156 break;
178 case SND_SOC_DAIFMT_CBM_CFM: 157 case SND_SOC_DAIFMT_CBM_CFM:
179 val = I2S_CKR_MSS_SLAVE; 158 val = I2S_CKR_MSS_SLAVE;
159 i2s->is_master_mode = false;
180 break; 160 break;
181 default: 161 default:
182 return -EINVAL; 162 return -EINVAL;
@@ -228,6 +208,26 @@ static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream,
228 struct rk_i2s_dev *i2s = to_info(dai); 208 struct rk_i2s_dev *i2s = to_info(dai);
229 struct snd_soc_pcm_runtime *rtd = substream->private_data; 209 struct snd_soc_pcm_runtime *rtd = substream->private_data;
230 unsigned int val = 0; 210 unsigned int val = 0;
211 unsigned int mclk_rate, bclk_rate, div_bclk, div_lrck;
212
213 if (i2s->is_master_mode) {
214 mclk_rate = clk_get_rate(i2s->mclk);
215 bclk_rate = 2 * 32 * params_rate(params);
216 if (bclk_rate && mclk_rate % bclk_rate)
217 return -EINVAL;
218
219 div_bclk = mclk_rate / bclk_rate;
220 div_lrck = bclk_rate / params_rate(params);
221 regmap_update_bits(i2s->regmap, I2S_CKR,
222 I2S_CKR_MDIV_MASK,
223 I2S_CKR_MDIV(div_bclk));
224
225 regmap_update_bits(i2s->regmap, I2S_CKR,
226 I2S_CKR_TSD_MASK |
227 I2S_CKR_RSD_MASK,
228 I2S_CKR_TSD(div_lrck) |
229 I2S_CKR_RSD(div_lrck));
230 }
231 231
232 switch (params_format(params)) { 232 switch (params_format(params)) {
233 case SNDRV_PCM_FORMAT_S8: 233 case SNDRV_PCM_FORMAT_S8:
@@ -242,6 +242,9 @@ static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream,
242 case SNDRV_PCM_FORMAT_S24_LE: 242 case SNDRV_PCM_FORMAT_S24_LE:
243 val |= I2S_TXCR_VDW(24); 243 val |= I2S_TXCR_VDW(24);
244 break; 244 break;
245 case SNDRV_PCM_FORMAT_S32_LE:
246 val |= I2S_TXCR_VDW(32);
247 break;
245 default: 248 default:
246 return -EINVAL; 249 return -EINVAL;
247 } 250 }
@@ -360,7 +363,8 @@ static struct snd_soc_dai_driver rockchip_i2s_dai = {
360 .formats = (SNDRV_PCM_FMTBIT_S8 | 363 .formats = (SNDRV_PCM_FMTBIT_S8 |
361 SNDRV_PCM_FMTBIT_S16_LE | 364 SNDRV_PCM_FMTBIT_S16_LE |
362 SNDRV_PCM_FMTBIT_S20_3LE | 365 SNDRV_PCM_FMTBIT_S20_3LE |
363 SNDRV_PCM_FMTBIT_S24_LE), 366 SNDRV_PCM_FMTBIT_S24_LE |
367 SNDRV_PCM_FMTBIT_S32_LE),
364 }, 368 },
365 .capture = { 369 .capture = {
366 .stream_name = "Capture", 370 .stream_name = "Capture",
@@ -370,7 +374,8 @@ static struct snd_soc_dai_driver rockchip_i2s_dai = {
370 .formats = (SNDRV_PCM_FMTBIT_S8 | 374 .formats = (SNDRV_PCM_FMTBIT_S8 |
371 SNDRV_PCM_FMTBIT_S16_LE | 375 SNDRV_PCM_FMTBIT_S16_LE |
372 SNDRV_PCM_FMTBIT_S20_3LE | 376 SNDRV_PCM_FMTBIT_S20_3LE |
373 SNDRV_PCM_FMTBIT_S24_LE), 377 SNDRV_PCM_FMTBIT_S24_LE |
378 SNDRV_PCM_FMTBIT_S32_LE),
374 }, 379 },
375 .ops = &rockchip_i2s_dai_ops, 380 .ops = &rockchip_i2s_dai_ops,
376 .symmetric_rates = 1, 381 .symmetric_rates = 1,
@@ -451,6 +456,7 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
451{ 456{
452 struct device_node *node = pdev->dev.of_node; 457 struct device_node *node = pdev->dev.of_node;
453 struct rk_i2s_dev *i2s; 458 struct rk_i2s_dev *i2s;
459 struct snd_soc_dai_driver *soc_dai;
454 struct resource *res; 460 struct resource *res;
455 void __iomem *regs; 461 void __iomem *regs;
456 int ret; 462 int ret;
@@ -511,17 +517,26 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
511 goto err_pm_disable; 517 goto err_pm_disable;
512 } 518 }
513 519
514 /* refine capture channels */ 520 soc_dai = devm_kzalloc(&pdev->dev,
521 sizeof(*soc_dai), GFP_KERNEL);
522 if (!soc_dai)
523 return -ENOMEM;
524
525 memcpy(soc_dai, &rockchip_i2s_dai, sizeof(*soc_dai));
526 if (!of_property_read_u32(node, "rockchip,playback-channels", &val)) {
527 if (val >= 2 && val <= 8)
528 soc_dai->playback.channels_max = val;
529 }
530
515 if (!of_property_read_u32(node, "rockchip,capture-channels", &val)) { 531 if (!of_property_read_u32(node, "rockchip,capture-channels", &val)) {
516 if (val >= 2 && val <= 8) 532 if (val >= 2 && val <= 8)
517 rockchip_i2s_dai.capture.channels_max = val; 533 soc_dai->capture.channels_max = val;
518 else
519 rockchip_i2s_dai.capture.channels_max = 2;
520 } 534 }
521 535
522 ret = devm_snd_soc_register_component(&pdev->dev, 536 ret = devm_snd_soc_register_component(&pdev->dev,
523 &rockchip_i2s_component, 537 &rockchip_i2s_component,
524 &rockchip_i2s_dai, 1); 538 soc_dai, 1);
539
525 if (ret) { 540 if (ret) {
526 dev_err(&pdev->dev, "Could not register DAI\n"); 541 dev_err(&pdev->dev, "Could not register DAI\n");
527 goto err_suspend; 542 goto err_suspend;
diff --git a/sound/soc/rockchip/rockchip_max98090.c b/sound/soc/rockchip/rockchip_max98090.c
index 26567b10393a..543610282cdb 100644
--- a/sound/soc/rockchip/rockchip_max98090.c
+++ b/sound/soc/rockchip/rockchip_max98090.c
@@ -80,11 +80,17 @@ static int rk_aif1_hw_params(struct snd_pcm_substream *substream,
80 switch (params_rate(params)) { 80 switch (params_rate(params)) {
81 case 8000: 81 case 8000:
82 case 16000: 82 case 16000:
83 case 24000:
84 case 32000:
83 case 48000: 85 case 48000:
86 case 64000:
84 case 96000: 87 case 96000:
85 mclk = 12288000; 88 mclk = 12288000;
86 break; 89 break;
90 case 11025:
91 case 22050:
87 case 44100: 92 case 44100:
93 case 88200:
88 mclk = 11289600; 94 mclk = 11289600;
89 break; 95 break;
90 default: 96 default:
diff --git a/sound/soc/rockchip/rockchip_rt5645.c b/sound/soc/rockchip/rockchip_rt5645.c
index 68c62e4c2316..440a8026346a 100644
--- a/sound/soc/rockchip/rockchip_rt5645.c
+++ b/sound/soc/rockchip/rockchip_rt5645.c
@@ -79,11 +79,17 @@ static int rk_aif1_hw_params(struct snd_pcm_substream *substream,
79 switch (params_rate(params)) { 79 switch (params_rate(params)) {
80 case 8000: 80 case 8000:
81 case 16000: 81 case 16000:
82 case 24000:
83 case 32000:
82 case 48000: 84 case 48000:
85 case 64000:
83 case 96000: 86 case 96000:
84 mclk = 12288000; 87 mclk = 12288000;
85 break; 88 break;
89 case 11025:
90 case 22050:
86 case 44100: 91 case 44100:
92 case 88200:
87 mclk = 11289600; 93 mclk = 11289600;
88 break; 94 break;
89 default: 95 default:
diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig
index 3744c9ed5370..78baa26e938b 100644
--- a/sound/soc/samsung/Kconfig
+++ b/sound/soc/samsung/Kconfig
@@ -1,8 +1,6 @@
1config SND_SOC_SAMSUNG 1config SND_SOC_SAMSUNG
2 tristate "ASoC support for Samsung" 2 tristate "ASoC support for Samsung"
3 depends on (PLAT_SAMSUNG || ARCH_EXYNOS) 3 depends on (PLAT_SAMSUNG || ARCH_EXYNOS)
4 depends on S3C64XX_PL080 || !ARCH_S3C64XX
5 depends on S3C24XX_DMAC || !ARCH_S3C24XX
6 select SND_SOC_GENERIC_DMAENGINE_PCM 4 select SND_SOC_GENERIC_DMAENGINE_PCM
7 help 5 help
8 Say Y or M if you want to add support for codecs attached to 6 Say Y or M if you want to add support for codecs attached to
diff --git a/sound/soc/samsung/ac97.c b/sound/soc/samsung/ac97.c
index e4145509d63c..4a7a503fe13c 100644
--- a/sound/soc/samsung/ac97.c
+++ b/sound/soc/samsung/ac97.c
@@ -324,7 +324,7 @@ static const struct snd_soc_component_driver s3c_ac97_component = {
324 324
325static int s3c_ac97_probe(struct platform_device *pdev) 325static int s3c_ac97_probe(struct platform_device *pdev)
326{ 326{
327 struct resource *mem_res, *dmatx_res, *dmarx_res, *dmamic_res, *irq_res; 327 struct resource *mem_res, *irq_res;
328 struct s3c_audio_pdata *ac97_pdata; 328 struct s3c_audio_pdata *ac97_pdata;
329 int ret; 329 int ret;
330 330
@@ -335,24 +335,6 @@ static int s3c_ac97_probe(struct platform_device *pdev)
335 } 335 }
336 336
337 /* Check for availability of necessary resource */ 337 /* Check for availability of necessary resource */
338 dmatx_res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
339 if (!dmatx_res) {
340 dev_err(&pdev->dev, "Unable to get AC97-TX dma resource\n");
341 return -ENXIO;
342 }
343
344 dmarx_res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
345 if (!dmarx_res) {
346 dev_err(&pdev->dev, "Unable to get AC97-RX dma resource\n");
347 return -ENXIO;
348 }
349
350 dmamic_res = platform_get_resource(pdev, IORESOURCE_DMA, 2);
351 if (!dmamic_res) {
352 dev_err(&pdev->dev, "Unable to get AC97-MIC dma resource\n");
353 return -ENXIO;
354 }
355
356 irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 338 irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
357 if (!irq_res) { 339 if (!irq_res) {
358 dev_err(&pdev->dev, "AC97 IRQ not provided!\n"); 340 dev_err(&pdev->dev, "AC97 IRQ not provided!\n");
@@ -364,11 +346,11 @@ static int s3c_ac97_probe(struct platform_device *pdev)
364 if (IS_ERR(s3c_ac97.regs)) 346 if (IS_ERR(s3c_ac97.regs))
365 return PTR_ERR(s3c_ac97.regs); 347 return PTR_ERR(s3c_ac97.regs);
366 348
367 s3c_ac97_pcm_out.channel = dmatx_res->start; 349 s3c_ac97_pcm_out.slave = ac97_pdata->dma_playback;
368 s3c_ac97_pcm_out.dma_addr = mem_res->start + S3C_AC97_PCM_DATA; 350 s3c_ac97_pcm_out.dma_addr = mem_res->start + S3C_AC97_PCM_DATA;
369 s3c_ac97_pcm_in.channel = dmarx_res->start; 351 s3c_ac97_pcm_in.slave = ac97_pdata->dma_capture;
370 s3c_ac97_pcm_in.dma_addr = mem_res->start + S3C_AC97_PCM_DATA; 352 s3c_ac97_pcm_in.dma_addr = mem_res->start + S3C_AC97_PCM_DATA;
371 s3c_ac97_mic_in.channel = dmamic_res->start; 353 s3c_ac97_mic_in.slave = ac97_pdata->dma_capture_mic;
372 s3c_ac97_mic_in.dma_addr = mem_res->start + S3C_AC97_MIC_DATA; 354 s3c_ac97_mic_in.dma_addr = mem_res->start + S3C_AC97_MIC_DATA;
373 355
374 init_completion(&s3c_ac97.done); 356 init_completion(&s3c_ac97.done);
@@ -406,7 +388,8 @@ static int s3c_ac97_probe(struct platform_device *pdev)
406 if (ret) 388 if (ret)
407 goto err5; 389 goto err5;
408 390
409 ret = samsung_asoc_dma_platform_register(&pdev->dev); 391 ret = samsung_asoc_dma_platform_register(&pdev->dev,
392 ac97_pdata->dma_filter);
410 if (ret) { 393 if (ret) {
411 dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret); 394 dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret);
412 goto err5; 395 goto err5;
diff --git a/sound/soc/samsung/bells.c b/sound/soc/samsung/bells.c
index e5f05e62fa3c..3dd246fa0059 100644
--- a/sound/soc/samsung/bells.c
+++ b/sound/soc/samsung/bells.c
@@ -58,11 +58,16 @@ static int bells_set_bias_level(struct snd_soc_card *card,
58 struct snd_soc_dapm_context *dapm, 58 struct snd_soc_dapm_context *dapm,
59 enum snd_soc_bias_level level) 59 enum snd_soc_bias_level level)
60{ 60{
61 struct snd_soc_dai *codec_dai = card->rtd[DAI_DSP_CODEC].codec_dai; 61 struct snd_soc_pcm_runtime *rtd;
62 struct snd_soc_codec *codec = codec_dai->codec; 62 struct snd_soc_dai *codec_dai;
63 struct snd_soc_codec *codec;
63 struct bells_drvdata *bells = card->drvdata; 64 struct bells_drvdata *bells = card->drvdata;
64 int ret; 65 int ret;
65 66
67 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_DSP_CODEC].name);
68 codec_dai = rtd->codec_dai;
69 codec = codec_dai->codec;
70
66 if (dapm->dev != codec_dai->dev) 71 if (dapm->dev != codec_dai->dev)
67 return 0; 72 return 0;
68 73
@@ -99,11 +104,16 @@ static int bells_set_bias_level_post(struct snd_soc_card *card,
99 struct snd_soc_dapm_context *dapm, 104 struct snd_soc_dapm_context *dapm,
100 enum snd_soc_bias_level level) 105 enum snd_soc_bias_level level)
101{ 106{
102 struct snd_soc_dai *codec_dai = card->rtd[DAI_DSP_CODEC].codec_dai; 107 struct snd_soc_pcm_runtime *rtd;
103 struct snd_soc_codec *codec = codec_dai->codec; 108 struct snd_soc_dai *codec_dai;
109 struct snd_soc_codec *codec;
104 struct bells_drvdata *bells = card->drvdata; 110 struct bells_drvdata *bells = card->drvdata;
105 int ret; 111 int ret;
106 112
113 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_DSP_CODEC].name);
114 codec_dai = rtd->codec_dai;
115 codec = codec_dai->codec;
116
107 if (dapm->dev != codec_dai->dev) 117 if (dapm->dev != codec_dai->dev)
108 return 0; 118 return 0;
109 119
@@ -137,14 +147,22 @@ static int bells_set_bias_level_post(struct snd_soc_card *card,
137static int bells_late_probe(struct snd_soc_card *card) 147static int bells_late_probe(struct snd_soc_card *card)
138{ 148{
139 struct bells_drvdata *bells = card->drvdata; 149 struct bells_drvdata *bells = card->drvdata;
140 struct snd_soc_codec *wm0010 = card->rtd[DAI_AP_DSP].codec; 150 struct snd_soc_pcm_runtime *rtd;
141 struct snd_soc_codec *codec = card->rtd[DAI_DSP_CODEC].codec; 151 struct snd_soc_codec *wm0010;
142 struct snd_soc_dai *aif1_dai = card->rtd[DAI_DSP_CODEC].codec_dai; 152 struct snd_soc_codec *codec;
153 struct snd_soc_dai *aif1_dai;
143 struct snd_soc_dai *aif2_dai; 154 struct snd_soc_dai *aif2_dai;
144 struct snd_soc_dai *aif3_dai; 155 struct snd_soc_dai *aif3_dai;
145 struct snd_soc_dai *wm9081_dai; 156 struct snd_soc_dai *wm9081_dai;
146 int ret; 157 int ret;
147 158
159 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_AP_DSP].name);
160 wm0010 = rtd->codec;
161
162 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_DSP_CODEC].name);
163 codec = rtd->codec;
164 aif1_dai = rtd->codec_dai;
165
148 ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK, 166 ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK,
149 ARIZONA_CLK_SRC_FLL1, 167 ARIZONA_CLK_SRC_FLL1,
150 bells->sysclk_rate, 168 bells->sysclk_rate,
@@ -181,7 +199,8 @@ static int bells_late_probe(struct snd_soc_card *card)
181 return ret; 199 return ret;
182 } 200 }
183 201
184 aif2_dai = card->rtd[DAI_CODEC_CP].cpu_dai; 202 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_CODEC_CP].name);
203 aif2_dai = rtd->cpu_dai;
185 204
186 ret = snd_soc_dai_set_sysclk(aif2_dai, ARIZONA_CLK_ASYNCCLK, 0, 0); 205 ret = snd_soc_dai_set_sysclk(aif2_dai, ARIZONA_CLK_ASYNCCLK, 0, 0);
187 if (ret != 0) { 206 if (ret != 0) {
@@ -192,8 +211,9 @@ static int bells_late_probe(struct snd_soc_card *card)
192 if (card->num_rtd == DAI_CODEC_SUB) 211 if (card->num_rtd == DAI_CODEC_SUB)
193 return 0; 212 return 0;
194 213
195 aif3_dai = card->rtd[DAI_CODEC_SUB].cpu_dai; 214 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_CODEC_SUB].name);
196 wm9081_dai = card->rtd[DAI_CODEC_SUB].codec_dai; 215 aif3_dai = rtd->cpu_dai;
216 wm9081_dai = rtd->codec_dai;
197 217
198 ret = snd_soc_dai_set_sysclk(aif3_dai, ARIZONA_CLK_SYSCLK, 0, 0); 218 ret = snd_soc_dai_set_sysclk(aif3_dai, ARIZONA_CLK_SYSCLK, 0, 0);
199 if (ret != 0) { 219 if (ret != 0) {
diff --git a/sound/soc/samsung/dma.h b/sound/soc/samsung/dma.h
index 0e85dcfec023..a7616cc9b39e 100644
--- a/sound/soc/samsung/dma.h
+++ b/sound/soc/samsung/dma.h
@@ -13,9 +13,10 @@
13#define _S3C_AUDIO_H 13#define _S3C_AUDIO_H
14 14
15#include <sound/dmaengine_pcm.h> 15#include <sound/dmaengine_pcm.h>
16#include <linux/dmaengine.h>
16 17
17struct s3c_dma_params { 18struct s3c_dma_params {
18 int channel; /* Channel ID */ 19 void *slave; /* Channel ID */
19 dma_addr_t dma_addr; 20 dma_addr_t dma_addr;
20 int dma_size; /* Size of the DMA transfer */ 21 int dma_size; /* Size of the DMA transfer */
21 char *ch_name; 22 char *ch_name;
@@ -25,6 +26,7 @@ struct s3c_dma_params {
25void samsung_asoc_init_dma_data(struct snd_soc_dai *dai, 26void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
26 struct s3c_dma_params *playback, 27 struct s3c_dma_params *playback,
27 struct s3c_dma_params *capture); 28 struct s3c_dma_params *capture);
28int samsung_asoc_dma_platform_register(struct device *dev); 29int samsung_asoc_dma_platform_register(struct device *dev,
30 dma_filter_fn fn);
29 31
30#endif 32#endif
diff --git a/sound/soc/samsung/dmaengine.c b/sound/soc/samsung/dmaengine.c
index 506f5bf6d082..063125937311 100644
--- a/sound/soc/samsung/dmaengine.c
+++ b/sound/soc/samsung/dmaengine.c
@@ -28,17 +28,8 @@
28 28
29#include "dma.h" 29#include "dma.h"
30 30
31#ifdef CONFIG_ARCH_S3C64XX 31static struct snd_dmaengine_pcm_config samsung_dmaengine_pcm_config = {
32#define filter_fn pl08x_filter_id
33#elif defined(CONFIG_ARCH_S3C24XX)
34#define filter_fn s3c24xx_dma_filter
35#else
36#define filter_fn NULL
37#endif
38
39static const struct snd_dmaengine_pcm_config samsung_dmaengine_pcm_config = {
40 .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, 32 .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
41 .compat_filter_fn = filter_fn,
42}; 33};
43 34
44void samsung_asoc_init_dma_data(struct snd_soc_dai *dai, 35void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
@@ -50,14 +41,14 @@ void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
50 41
51 if (playback) { 42 if (playback) {
52 playback_data = &playback->dma_data; 43 playback_data = &playback->dma_data;
53 playback_data->filter_data = (void *)playback->channel; 44 playback_data->filter_data = playback->slave;
54 playback_data->chan_name = playback->ch_name; 45 playback_data->chan_name = playback->ch_name;
55 playback_data->addr = playback->dma_addr; 46 playback_data->addr = playback->dma_addr;
56 playback_data->addr_width = playback->dma_size; 47 playback_data->addr_width = playback->dma_size;
57 } 48 }
58 if (capture) { 49 if (capture) {
59 capture_data = &capture->dma_data; 50 capture_data = &capture->dma_data;
60 capture_data->filter_data = (void *)capture->channel; 51 capture_data->filter_data = capture->slave;
61 capture_data->chan_name = capture->ch_name; 52 capture_data->chan_name = capture->ch_name;
62 capture_data->addr = capture->dma_addr; 53 capture_data->addr = capture->dma_addr;
63 capture_data->addr_width = capture->dma_size; 54 capture_data->addr_width = capture->dma_size;
@@ -67,8 +58,11 @@ void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
67} 58}
68EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data); 59EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data);
69 60
70int samsung_asoc_dma_platform_register(struct device *dev) 61int samsung_asoc_dma_platform_register(struct device *dev,
62 dma_filter_fn filter)
71{ 63{
64 samsung_dmaengine_pcm_config.compat_filter_fn = filter;
65
72 return devm_snd_dmaengine_pcm_register(dev, 66 return devm_snd_dmaengine_pcm_register(dev,
73 &samsung_dmaengine_pcm_config, 67 &samsung_dmaengine_pcm_config,
74 SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME | 68 SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME |
diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c
index ea4ab374a223..84d9e77c0fbe 100644
--- a/sound/soc/samsung/i2s.c
+++ b/sound/soc/samsung/i2s.c
@@ -89,6 +89,7 @@ struct i2s_dai {
89 struct s3c_dma_params dma_playback; 89 struct s3c_dma_params dma_playback;
90 struct s3c_dma_params dma_capture; 90 struct s3c_dma_params dma_capture;
91 struct s3c_dma_params idma_playback; 91 struct s3c_dma_params idma_playback;
92 dma_filter_fn filter;
92 u32 quirks; 93 u32 quirks;
93 u32 suspend_i2smod; 94 u32 suspend_i2smod;
94 u32 suspend_i2scon; 95 u32 suspend_i2scon;
@@ -1244,7 +1245,8 @@ static int samsung_i2s_probe(struct platform_device *pdev)
1244 if (ret != 0) 1245 if (ret != 0)
1245 return ret; 1246 return ret;
1246 1247
1247 return samsung_asoc_dma_platform_register(&pdev->dev); 1248 return samsung_asoc_dma_platform_register(&pdev->dev,
1249 sec_dai->filter);
1248 } 1250 }
1249 1251
1250 pri_dai = i2s_alloc_dai(pdev, false); 1252 pri_dai = i2s_alloc_dai(pdev, false);
@@ -1257,27 +1259,15 @@ static int samsung_i2s_probe(struct platform_device *pdev)
1257 pri_dai->lock = &pri_dai->spinlock; 1259 pri_dai->lock = &pri_dai->spinlock;
1258 1260
1259 if (!np) { 1261 if (!np) {
1260 res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
1261 if (!res) {
1262 dev_err(&pdev->dev,
1263 "Unable to get I2S-TX dma resource\n");
1264 return -ENXIO;
1265 }
1266 pri_dai->dma_playback.channel = res->start;
1267
1268 res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
1269 if (!res) {
1270 dev_err(&pdev->dev,
1271 "Unable to get I2S-RX dma resource\n");
1272 return -ENXIO;
1273 }
1274 pri_dai->dma_capture.channel = res->start;
1275
1276 if (i2s_pdata == NULL) { 1262 if (i2s_pdata == NULL) {
1277 dev_err(&pdev->dev, "Can't work without s3c_audio_pdata\n"); 1263 dev_err(&pdev->dev, "Can't work without s3c_audio_pdata\n");
1278 return -EINVAL; 1264 return -EINVAL;
1279 } 1265 }
1280 1266
1267 pri_dai->dma_playback.slave = i2s_pdata->dma_playback;
1268 pri_dai->dma_capture.slave = i2s_pdata->dma_capture;
1269 pri_dai->filter = i2s_pdata->dma_filter;
1270
1281 if (&i2s_pdata->type) 1271 if (&i2s_pdata->type)
1282 i2s_cfg = &i2s_pdata->type.i2s; 1272 i2s_cfg = &i2s_pdata->type.i2s;
1283 1273
@@ -1339,9 +1329,8 @@ static int samsung_i2s_probe(struct platform_device *pdev)
1339 sec_dai->dma_playback.ch_name = "tx-sec"; 1329 sec_dai->dma_playback.ch_name = "tx-sec";
1340 1330
1341 if (!np) { 1331 if (!np) {
1342 res = platform_get_resource(pdev, IORESOURCE_DMA, 2); 1332 sec_dai->dma_playback.slave = i2s_pdata->dma_play_sec;
1343 if (res) 1333 sec_dai->filter = i2s_pdata->dma_filter;
1344 sec_dai->dma_playback.channel = res->start;
1345 } 1334 }
1346 1335
1347 sec_dai->dma_playback.dma_size = 4; 1336 sec_dai->dma_playback.dma_size = 4;
@@ -1364,7 +1353,7 @@ static int samsung_i2s_probe(struct platform_device *pdev)
1364 1353
1365 pm_runtime_enable(&pdev->dev); 1354 pm_runtime_enable(&pdev->dev);
1366 1355
1367 ret = samsung_asoc_dma_platform_register(&pdev->dev); 1356 ret = samsung_asoc_dma_platform_register(&pdev->dev, pri_dai->filter);
1368 if (ret != 0) 1357 if (ret != 0)
1369 return ret; 1358 return ret;
1370 1359
diff --git a/sound/soc/samsung/littlemill.c b/sound/soc/samsung/littlemill.c
index 31a820eb0ac3..7cb204e649ca 100644
--- a/sound/soc/samsung/littlemill.c
+++ b/sound/soc/samsung/littlemill.c
@@ -23,9 +23,13 @@ static int littlemill_set_bias_level(struct snd_soc_card *card,
23 struct snd_soc_dapm_context *dapm, 23 struct snd_soc_dapm_context *dapm,
24 enum snd_soc_bias_level level) 24 enum snd_soc_bias_level level)
25{ 25{
26 struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai; 26 struct snd_soc_pcm_runtime *rtd;
27 struct snd_soc_dai *aif1_dai;
27 int ret; 28 int ret;
28 29
30 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
31 aif1_dai = rtd->codec_dai;
32
29 if (dapm->dev != aif1_dai->dev) 33 if (dapm->dev != aif1_dai->dev)
30 return 0; 34 return 0;
31 35
@@ -66,9 +70,13 @@ static int littlemill_set_bias_level_post(struct snd_soc_card *card,
66 struct snd_soc_dapm_context *dapm, 70 struct snd_soc_dapm_context *dapm,
67 enum snd_soc_bias_level level) 71 enum snd_soc_bias_level level)
68{ 72{
69 struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai; 73 struct snd_soc_pcm_runtime *rtd;
74 struct snd_soc_dai *aif1_dai;
70 int ret; 75 int ret;
71 76
77 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
78 aif1_dai = rtd->codec_dai;
79
72 if (dapm->dev != aif1_dai->dev) 80 if (dapm->dev != aif1_dai->dev)
73 return 0; 81 return 0;
74 82
@@ -168,9 +176,13 @@ static int bbclk_ev(struct snd_soc_dapm_widget *w,
168 struct snd_kcontrol *kcontrol, int event) 176 struct snd_kcontrol *kcontrol, int event)
169{ 177{
170 struct snd_soc_card *card = w->dapm->card; 178 struct snd_soc_card *card = w->dapm->card;
171 struct snd_soc_dai *aif2_dai = card->rtd[1].cpu_dai; 179 struct snd_soc_pcm_runtime *rtd;
180 struct snd_soc_dai *aif2_dai;
172 int ret; 181 int ret;
173 182
183 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
184 aif2_dai = rtd->cpu_dai;
185
174 switch (event) { 186 switch (event) {
175 case SND_SOC_DAPM_PRE_PMU: 187 case SND_SOC_DAPM_PRE_PMU:
176 ret = snd_soc_dai_set_pll(aif2_dai, WM8994_FLL2, 188 ret = snd_soc_dai_set_pll(aif2_dai, WM8994_FLL2,
@@ -245,11 +257,19 @@ static struct snd_soc_jack littlemill_headset;
245 257
246static int littlemill_late_probe(struct snd_soc_card *card) 258static int littlemill_late_probe(struct snd_soc_card *card)
247{ 259{
248 struct snd_soc_codec *codec = card->rtd[0].codec; 260 struct snd_soc_pcm_runtime *rtd;
249 struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai; 261 struct snd_soc_codec *codec;
250 struct snd_soc_dai *aif2_dai = card->rtd[1].cpu_dai; 262 struct snd_soc_dai *aif1_dai;
263 struct snd_soc_dai *aif2_dai;
251 int ret; 264 int ret;
252 265
266 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
267 codec = rtd->codec;
268 aif1_dai = rtd->codec_dai;
269
270 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
271 aif2_dai = rtd->cpu_dai;
272
253 ret = snd_soc_dai_set_sysclk(aif1_dai, WM8994_SYSCLK_MCLK2, 273 ret = snd_soc_dai_set_sysclk(aif1_dai, WM8994_SYSCLK_MCLK2,
254 32768, SND_SOC_CLOCK_IN); 274 32768, SND_SOC_CLOCK_IN);
255 if (ret < 0) 275 if (ret < 0)
diff --git a/sound/soc/samsung/odroidx2_max98090.c b/sound/soc/samsung/odroidx2_max98090.c
index 596f1180a369..04217279fe25 100644
--- a/sound/soc/samsung/odroidx2_max98090.c
+++ b/sound/soc/samsung/odroidx2_max98090.c
@@ -25,10 +25,15 @@ static struct snd_soc_dai_link odroidx2_dai[];
25 25
26static int odroidx2_late_probe(struct snd_soc_card *card) 26static int odroidx2_late_probe(struct snd_soc_card *card)
27{ 27{
28 struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; 28 struct snd_soc_pcm_runtime *rtd;
29 struct snd_soc_dai *cpu_dai = card->rtd[0].cpu_dai; 29 struct snd_soc_dai *codec_dai;
30 struct snd_soc_dai *cpu_dai;
30 int ret; 31 int ret;
31 32
33 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
34 codec_dai = rtd->codec_dai;
35 cpu_dai = rtd->cpu_dai;
36
32 ret = snd_soc_dai_set_sysclk(codec_dai, 0, MAX98090_MCLK, 37 ret = snd_soc_dai_set_sysclk(codec_dai, 0, MAX98090_MCLK,
33 SND_SOC_CLOCK_IN); 38 SND_SOC_CLOCK_IN);
34 39
diff --git a/sound/soc/samsung/pcm.c b/sound/soc/samsung/pcm.c
index b320a9d3fbf8..498f563a4c9c 100644
--- a/sound/soc/samsung/pcm.c
+++ b/sound/soc/samsung/pcm.c
@@ -486,8 +486,9 @@ static const struct snd_soc_component_driver s3c_pcm_component = {
486static int s3c_pcm_dev_probe(struct platform_device *pdev) 486static int s3c_pcm_dev_probe(struct platform_device *pdev)
487{ 487{
488 struct s3c_pcm_info *pcm; 488 struct s3c_pcm_info *pcm;
489 struct resource *mem_res, *dmatx_res, *dmarx_res; 489 struct resource *mem_res;
490 struct s3c_audio_pdata *pcm_pdata; 490 struct s3c_audio_pdata *pcm_pdata;
491 dma_filter_fn filter;
491 int ret; 492 int ret;
492 493
493 /* Check for valid device index */ 494 /* Check for valid device index */
@@ -499,18 +500,6 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev)
499 pcm_pdata = pdev->dev.platform_data; 500 pcm_pdata = pdev->dev.platform_data;
500 501
501 /* Check for availability of necessary resource */ 502 /* Check for availability of necessary resource */
502 dmatx_res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
503 if (!dmatx_res) {
504 dev_err(&pdev->dev, "Unable to get PCM-TX dma resource\n");
505 return -ENXIO;
506 }
507
508 dmarx_res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
509 if (!dmarx_res) {
510 dev_err(&pdev->dev, "Unable to get PCM-RX dma resource\n");
511 return -ENXIO;
512 }
513
514 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 503 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
515 if (!mem_res) { 504 if (!mem_res) {
516 dev_err(&pdev->dev, "Unable to get register resource\n"); 505 dev_err(&pdev->dev, "Unable to get register resource\n");
@@ -568,8 +557,12 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev)
568 s3c_pcm_stereo_out[pdev->id].dma_addr = mem_res->start 557 s3c_pcm_stereo_out[pdev->id].dma_addr = mem_res->start
569 + S3C_PCM_TXFIFO; 558 + S3C_PCM_TXFIFO;
570 559
571 s3c_pcm_stereo_in[pdev->id].channel = dmarx_res->start; 560 filter = NULL;
572 s3c_pcm_stereo_out[pdev->id].channel = dmatx_res->start; 561 if (pcm_pdata) {
562 s3c_pcm_stereo_in[pdev->id].slave = pcm_pdata->dma_capture;
563 s3c_pcm_stereo_out[pdev->id].slave = pcm_pdata->dma_playback;
564 filter = pcm_pdata->dma_filter;
565 }
573 566
574 pcm->dma_capture = &s3c_pcm_stereo_in[pdev->id]; 567 pcm->dma_capture = &s3c_pcm_stereo_in[pdev->id];
575 pcm->dma_playback = &s3c_pcm_stereo_out[pdev->id]; 568 pcm->dma_playback = &s3c_pcm_stereo_out[pdev->id];
@@ -583,7 +576,7 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev)
583 goto err5; 576 goto err5;
584 } 577 }
585 578
586 ret = samsung_asoc_dma_platform_register(&pdev->dev); 579 ret = samsung_asoc_dma_platform_register(&pdev->dev, filter);
587 if (ret) { 580 if (ret) {
588 dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret); 581 dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret);
589 goto err5; 582 goto err5;
diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c
index 2b766d212ce0..204029d12f5b 100644
--- a/sound/soc/samsung/s3c2412-i2s.c
+++ b/sound/soc/samsung/s3c2412-i2s.c
@@ -25,7 +25,6 @@
25#include <sound/soc.h> 25#include <sound/soc.h>
26#include <sound/pcm_params.h> 26#include <sound/pcm_params.h>
27 27
28#include <mach/dma.h>
29#include <mach/gpio-samsung.h> 28#include <mach/gpio-samsung.h>
30#include <plat/gpio-cfg.h> 29#include <plat/gpio-cfg.h>
31 30
@@ -33,14 +32,14 @@
33#include "regs-i2s-v2.h" 32#include "regs-i2s-v2.h"
34#include "s3c2412-i2s.h" 33#include "s3c2412-i2s.h"
35 34
35#include <linux/platform_data/asoc-s3c.h>
36
36static struct s3c_dma_params s3c2412_i2s_pcm_stereo_out = { 37static struct s3c_dma_params s3c2412_i2s_pcm_stereo_out = {
37 .channel = DMACH_I2S_OUT,
38 .ch_name = "tx", 38 .ch_name = "tx",
39 .dma_size = 4, 39 .dma_size = 4,
40}; 40};
41 41
42static struct s3c_dma_params s3c2412_i2s_pcm_stereo_in = { 42static struct s3c_dma_params s3c2412_i2s_pcm_stereo_in = {
43 .channel = DMACH_I2S_IN,
44 .ch_name = "rx", 43 .ch_name = "rx",
45 .dma_size = 4, 44 .dma_size = 4,
46}; 45};
@@ -152,6 +151,12 @@ static int s3c2412_iis_dev_probe(struct platform_device *pdev)
152{ 151{
153 int ret = 0; 152 int ret = 0;
154 struct resource *res; 153 struct resource *res;
154 struct s3c_audio_pdata *pdata = dev_get_platdata(&pdev->dev);
155
156 if (!pdata) {
157 dev_err(&pdev->dev, "missing platform data");
158 return -ENXIO;
159 }
155 160
156 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 161 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
157 s3c2412_i2s.regs = devm_ioremap_resource(&pdev->dev, res); 162 s3c2412_i2s.regs = devm_ioremap_resource(&pdev->dev, res);
@@ -159,7 +164,9 @@ static int s3c2412_iis_dev_probe(struct platform_device *pdev)
159 return PTR_ERR(s3c2412_i2s.regs); 164 return PTR_ERR(s3c2412_i2s.regs);
160 165
161 s3c2412_i2s_pcm_stereo_out.dma_addr = res->start + S3C2412_IISTXD; 166 s3c2412_i2s_pcm_stereo_out.dma_addr = res->start + S3C2412_IISTXD;
167 s3c2412_i2s_pcm_stereo_out.slave = pdata->dma_playback;
162 s3c2412_i2s_pcm_stereo_in.dma_addr = res->start + S3C2412_IISRXD; 168 s3c2412_i2s_pcm_stereo_in.dma_addr = res->start + S3C2412_IISRXD;
169 s3c2412_i2s_pcm_stereo_in.slave = pdata->dma_capture;
163 170
164 ret = s3c_i2sv2_register_component(&pdev->dev, -1, 171 ret = s3c_i2sv2_register_component(&pdev->dev, -1,
165 &s3c2412_i2s_component, 172 &s3c2412_i2s_component,
@@ -169,7 +176,8 @@ static int s3c2412_iis_dev_probe(struct platform_device *pdev)
169 return ret; 176 return ret;
170 } 177 }
171 178
172 ret = samsung_asoc_dma_platform_register(&pdev->dev); 179 ret = samsung_asoc_dma_platform_register(&pdev->dev,
180 pdata->dma_filter);
173 if (ret) 181 if (ret)
174 pr_err("failed to register the DMA: %d\n", ret); 182 pr_err("failed to register the DMA: %d\n", ret);
175 183
diff --git a/sound/soc/samsung/s3c24xx-i2s.c b/sound/soc/samsung/s3c24xx-i2s.c
index 5bf723689692..b3a475d73ba7 100644
--- a/sound/soc/samsung/s3c24xx-i2s.c
+++ b/sound/soc/samsung/s3c24xx-i2s.c
@@ -23,7 +23,6 @@
23#include <sound/soc.h> 23#include <sound/soc.h>
24#include <sound/pcm_params.h> 24#include <sound/pcm_params.h>
25 25
26#include <mach/dma.h>
27#include <mach/gpio-samsung.h> 26#include <mach/gpio-samsung.h>
28#include <plat/gpio-cfg.h> 27#include <plat/gpio-cfg.h>
29#include "regs-iis.h" 28#include "regs-iis.h"
@@ -31,14 +30,14 @@
31#include "dma.h" 30#include "dma.h"
32#include "s3c24xx-i2s.h" 31#include "s3c24xx-i2s.h"
33 32
33#include <linux/platform_data/asoc-s3c.h>
34
34static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_out = { 35static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_out = {
35 .channel = DMACH_I2S_OUT,
36 .ch_name = "tx", 36 .ch_name = "tx",
37 .dma_size = 2, 37 .dma_size = 2,
38}; 38};
39 39
40static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_in = { 40static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_in = {
41 .channel = DMACH_I2S_IN,
42 .ch_name = "rx", 41 .ch_name = "rx",
43 .dma_size = 2, 42 .dma_size = 2,
44}; 43};
@@ -454,6 +453,12 @@ static int s3c24xx_iis_dev_probe(struct platform_device *pdev)
454{ 453{
455 int ret = 0; 454 int ret = 0;
456 struct resource *res; 455 struct resource *res;
456 struct s3c_audio_pdata *pdata = dev_get_platdata(&pdev->dev);
457
458 if (!pdata) {
459 dev_err(&pdev->dev, "missing platform data");
460 return -ENXIO;
461 }
457 462
458 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 463 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
459 if (!res) { 464 if (!res) {
@@ -465,7 +470,9 @@ static int s3c24xx_iis_dev_probe(struct platform_device *pdev)
465 return PTR_ERR(s3c24xx_i2s.regs); 470 return PTR_ERR(s3c24xx_i2s.regs);
466 471
467 s3c24xx_i2s_pcm_stereo_out.dma_addr = res->start + S3C2410_IISFIFO; 472 s3c24xx_i2s_pcm_stereo_out.dma_addr = res->start + S3C2410_IISFIFO;
473 s3c24xx_i2s_pcm_stereo_out.slave = pdata->dma_playback;
468 s3c24xx_i2s_pcm_stereo_in.dma_addr = res->start + S3C2410_IISFIFO; 474 s3c24xx_i2s_pcm_stereo_in.dma_addr = res->start + S3C2410_IISFIFO;
475 s3c24xx_i2s_pcm_stereo_in.slave = pdata->dma_capture;
469 476
470 ret = devm_snd_soc_register_component(&pdev->dev, 477 ret = devm_snd_soc_register_component(&pdev->dev,
471 &s3c24xx_i2s_component, &s3c24xx_i2s_dai, 1); 478 &s3c24xx_i2s_component, &s3c24xx_i2s_dai, 1);
@@ -474,7 +481,8 @@ static int s3c24xx_iis_dev_probe(struct platform_device *pdev)
474 return ret; 481 return ret;
475 } 482 }
476 483
477 ret = samsung_asoc_dma_platform_register(&pdev->dev); 484 ret = samsung_asoc_dma_platform_register(&pdev->dev,
485 pdata->dma_filter);
478 if (ret) 486 if (ret)
479 pr_err("failed to register the dma: %d\n", ret); 487 pr_err("failed to register the dma: %d\n", ret);
480 488
diff --git a/sound/soc/samsung/snow.c b/sound/soc/samsung/snow.c
index 07ce2cfa4845..d8ac907bbb0d 100644
--- a/sound/soc/samsung/snow.c
+++ b/sound/soc/samsung/snow.c
@@ -35,10 +35,15 @@ static struct snd_soc_dai_link snow_dai[] = {
35 35
36static int snow_late_probe(struct snd_soc_card *card) 36static int snow_late_probe(struct snd_soc_card *card)
37{ 37{
38 struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; 38 struct snd_soc_pcm_runtime *rtd;
39 struct snd_soc_dai *cpu_dai = card->rtd[0].cpu_dai; 39 struct snd_soc_dai *codec_dai;
40 struct snd_soc_dai *cpu_dai;
40 int ret; 41 int ret;
41 42
43 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
44 codec_dai = rtd->codec_dai;
45 cpu_dai = rtd->cpu_dai;
46
42 /* Set the MCLK rate for the codec */ 47 /* Set the MCLK rate for the codec */
43 ret = snd_soc_dai_set_sysclk(codec_dai, 0, 48 ret = snd_soc_dai_set_sysclk(codec_dai, 0,
44 FIN_PLL_RATE, SND_SOC_CLOCK_IN); 49 FIN_PLL_RATE, SND_SOC_CLOCK_IN);
diff --git a/sound/soc/samsung/spdif.c b/sound/soc/samsung/spdif.c
index 36dbc0e96004..4687f521197c 100644
--- a/sound/soc/samsung/spdif.c
+++ b/sound/soc/samsung/spdif.c
@@ -359,20 +359,15 @@ static const struct snd_soc_component_driver samsung_spdif_component = {
359static int spdif_probe(struct platform_device *pdev) 359static int spdif_probe(struct platform_device *pdev)
360{ 360{
361 struct s3c_audio_pdata *spdif_pdata; 361 struct s3c_audio_pdata *spdif_pdata;
362 struct resource *mem_res, *dma_res; 362 struct resource *mem_res;
363 struct samsung_spdif_info *spdif; 363 struct samsung_spdif_info *spdif;
364 dma_filter_fn filter;
364 int ret; 365 int ret;
365 366
366 spdif_pdata = pdev->dev.platform_data; 367 spdif_pdata = pdev->dev.platform_data;
367 368
368 dev_dbg(&pdev->dev, "Entered %s\n", __func__); 369 dev_dbg(&pdev->dev, "Entered %s\n", __func__);
369 370
370 dma_res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
371 if (!dma_res) {
372 dev_err(&pdev->dev, "Unable to get dma resource.\n");
373 return -ENXIO;
374 }
375
376 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 371 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
377 if (!mem_res) { 372 if (!mem_res) {
378 dev_err(&pdev->dev, "Unable to get register resource.\n"); 373 dev_err(&pdev->dev, "Unable to get register resource.\n");
@@ -432,11 +427,15 @@ static int spdif_probe(struct platform_device *pdev)
432 427
433 spdif_stereo_out.dma_size = 2; 428 spdif_stereo_out.dma_size = 2;
434 spdif_stereo_out.dma_addr = mem_res->start + DATA_OUTBUF; 429 spdif_stereo_out.dma_addr = mem_res->start + DATA_OUTBUF;
435 spdif_stereo_out.channel = dma_res->start; 430 filter = NULL;
431 if (spdif_pdata) {
432 spdif_stereo_out.slave = spdif_pdata->dma_playback;
433 filter = spdif_pdata->dma_filter;
434 }
436 435
437 spdif->dma_playback = &spdif_stereo_out; 436 spdif->dma_playback = &spdif_stereo_out;
438 437
439 ret = samsung_asoc_dma_platform_register(&pdev->dev); 438 ret = samsung_asoc_dma_platform_register(&pdev->dev, filter);
440 if (ret) { 439 if (ret) {
441 dev_err(&pdev->dev, "failed to register DMA: %d\n", ret); 440 dev_err(&pdev->dev, "failed to register DMA: %d\n", ret);
442 goto err4; 441 goto err4;
diff --git a/sound/soc/samsung/speyside.c b/sound/soc/samsung/speyside.c
index d1ae21c5e253..083ef5e21b17 100644
--- a/sound/soc/samsung/speyside.c
+++ b/sound/soc/samsung/speyside.c
@@ -25,9 +25,13 @@ static int speyside_set_bias_level(struct snd_soc_card *card,
25 struct snd_soc_dapm_context *dapm, 25 struct snd_soc_dapm_context *dapm,
26 enum snd_soc_bias_level level) 26 enum snd_soc_bias_level level)
27{ 27{
28 struct snd_soc_dai *codec_dai = card->rtd[1].codec_dai; 28 struct snd_soc_pcm_runtime *rtd;
29 struct snd_soc_dai *codec_dai;
29 int ret; 30 int ret;
30 31
32 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
33 codec_dai = rtd->codec_dai;
34
31 if (dapm->dev != codec_dai->dev) 35 if (dapm->dev != codec_dai->dev)
32 return 0; 36 return 0;
33 37
@@ -57,9 +61,13 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card,
57 struct snd_soc_dapm_context *dapm, 61 struct snd_soc_dapm_context *dapm,
58 enum snd_soc_bias_level level) 62 enum snd_soc_bias_level level)
59{ 63{
60 struct snd_soc_dai *codec_dai = card->rtd[1].codec_dai; 64 struct snd_soc_pcm_runtime *rtd;
65 struct snd_soc_dai *codec_dai;
61 int ret; 66 int ret;
62 67
68 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
69 codec_dai = rtd->codec_dai;
70
63 if (dapm->dev != codec_dai->dev) 71 if (dapm->dev != codec_dai->dev)
64 return 0; 72 return 0;
65 73
diff --git a/sound/soc/samsung/tobermory.c b/sound/soc/samsung/tobermory.c
index 85ccfb7188cb..3310eda7cf53 100644
--- a/sound/soc/samsung/tobermory.c
+++ b/sound/soc/samsung/tobermory.c
@@ -23,9 +23,13 @@ static int tobermory_set_bias_level(struct snd_soc_card *card,
23 struct snd_soc_dapm_context *dapm, 23 struct snd_soc_dapm_context *dapm,
24 enum snd_soc_bias_level level) 24 enum snd_soc_bias_level level)
25{ 25{
26 struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; 26 struct snd_soc_pcm_runtime *rtd;
27 struct snd_soc_dai *codec_dai;
27 int ret; 28 int ret;
28 29
30 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
31 codec_dai = rtd->codec_dai;
32
29 if (dapm->dev != codec_dai->dev) 33 if (dapm->dev != codec_dai->dev)
30 return 0; 34 return 0;
31 35
@@ -62,9 +66,13 @@ static int tobermory_set_bias_level_post(struct snd_soc_card *card,
62 struct snd_soc_dapm_context *dapm, 66 struct snd_soc_dapm_context *dapm,
63 enum snd_soc_bias_level level) 67 enum snd_soc_bias_level level)
64{ 68{
65 struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; 69 struct snd_soc_pcm_runtime *rtd;
70 struct snd_soc_dai *codec_dai;
66 int ret; 71 int ret;
67 72
73 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
74 codec_dai = rtd->codec_dai;
75
68 if (dapm->dev != codec_dai->dev) 76 if (dapm->dev != codec_dai->dev)
69 return 0; 77 return 0;
70 78
@@ -170,10 +178,15 @@ static struct snd_soc_jack_pin tobermory_headset_pins[] = {
170 178
171static int tobermory_late_probe(struct snd_soc_card *card) 179static int tobermory_late_probe(struct snd_soc_card *card)
172{ 180{
173 struct snd_soc_codec *codec = card->rtd[0].codec; 181 struct snd_soc_pcm_runtime *rtd;
174 struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; 182 struct snd_soc_codec *codec;
183 struct snd_soc_dai *codec_dai;
175 int ret; 184 int ret;
176 185
186 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
187 codec = rtd->codec;
188 codec_dai = rtd->codec_dai;
189
177 ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK, 190 ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK,
178 32768, SND_SOC_CLOCK_IN); 191 32768, SND_SOC_CLOCK_IN);
179 if (ret < 0) 192 if (ret < 0)
diff --git a/sound/soc/sh/Kconfig b/sound/soc/sh/Kconfig
index 206d1edab07c..c9902a6d6fa0 100644
--- a/sound/soc/sh/Kconfig
+++ b/sound/soc/sh/Kconfig
@@ -36,7 +36,6 @@ config SND_SOC_SH4_SIU
36 36
37config SND_SOC_RCAR 37config SND_SOC_RCAR
38 tristate "R-Car series SRU/SCU/SSIU/SSI support" 38 tristate "R-Car series SRU/SCU/SSIU/SSI support"
39 depends on DMA_OF
40 depends on COMMON_CLK 39 depends on COMMON_CLK
41 select SND_SIMPLE_CARD 40 select SND_SIMPLE_CARD
42 select REGMAP_MMIO 41 select REGMAP_MMIO
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c
index 0215c78cbddf..ead520182e26 100644
--- a/sound/soc/sh/fsi.c
+++ b/sound/soc/sh/fsi.c
@@ -1362,15 +1362,18 @@ static int fsi_dma_push_start_stop(struct fsi_priv *fsi, struct fsi_stream *io,
1362 1362
1363static int fsi_dma_probe(struct fsi_priv *fsi, struct fsi_stream *io, struct device *dev) 1363static int fsi_dma_probe(struct fsi_priv *fsi, struct fsi_stream *io, struct device *dev)
1364{ 1364{
1365 dma_cap_mask_t mask;
1366 int is_play = fsi_stream_is_play(fsi, io); 1365 int is_play = fsi_stream_is_play(fsi, io);
1367 1366
1367#ifdef CONFIG_SUPERH
1368 dma_cap_mask_t mask;
1368 dma_cap_zero(mask); 1369 dma_cap_zero(mask);
1369 dma_cap_set(DMA_SLAVE, mask); 1370 dma_cap_set(DMA_SLAVE, mask);
1370 1371
1371 io->chan = dma_request_slave_channel_compat(mask, 1372 io->chan = dma_request_channel(mask, shdma_chan_filter,
1372 shdma_chan_filter, (void *)io->dma_id, 1373 (void *)io->dma_id);
1373 dev, is_play ? "tx" : "rx"); 1374#else
1375 io->chan = dma_request_slave_channel(dev, is_play ? "tx" : "rx");
1376#endif
1374 if (io->chan) { 1377 if (io->chan) {
1375 struct dma_slave_config cfg = {}; 1378 struct dma_slave_config cfg = {};
1376 int ret; 1379 int ret;
diff --git a/sound/soc/sh/rcar/Makefile b/sound/soc/sh/rcar/Makefile
index 8b258501aa35..a89ddf758695 100644
--- a/sound/soc/sh/rcar/Makefile
+++ b/sound/soc/sh/rcar/Makefile
@@ -1,4 +1,4 @@
1snd-soc-rcar-objs := core.o gen.o dma.o adg.o ssi.o src.o ctu.o mix.o dvc.o 1snd-soc-rcar-objs := core.o gen.o dma.o adg.o ssi.o ssiu.o src.o ctu.o mix.o dvc.o cmd.o
2obj-$(CONFIG_SND_SOC_RCAR) += snd-soc-rcar.o 2obj-$(CONFIG_SND_SOC_RCAR) += snd-soc-rcar.o
3 3
4snd-soc-rsrc-card-objs := rsrc-card.o 4snd-soc-rsrc-card-objs := rsrc-card.o
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index 2a5b3a293cd2..6d3ef366d536 100644
--- a/sound/soc/sh/rcar/adg.c
+++ b/sound/soc/sh/rcar/adg.c
@@ -68,8 +68,8 @@ static u32 rsnd_adg_calculate_rbgx(unsigned long div)
68 68
69static u32 rsnd_adg_ssi_ws_timing_gen2(struct rsnd_dai_stream *io) 69static u32 rsnd_adg_ssi_ws_timing_gen2(struct rsnd_dai_stream *io)
70{ 70{
71 struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io); 71 struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
72 int id = rsnd_mod_id(mod); 72 int id = rsnd_mod_id(ssi_mod);
73 int ws = id; 73 int ws = id;
74 74
75 if (rsnd_ssi_is_pin_sharing(io)) { 75 if (rsnd_ssi_is_pin_sharing(io)) {
@@ -90,13 +90,13 @@ static u32 rsnd_adg_ssi_ws_timing_gen2(struct rsnd_dai_stream *io)
90 return (0x6 + ws) << 8; 90 return (0x6 + ws) << 8;
91} 91}
92 92
93int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod, 93int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *cmd_mod,
94 struct rsnd_dai_stream *io) 94 struct rsnd_dai_stream *io)
95{ 95{
96 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 96 struct rsnd_priv *priv = rsnd_mod_to_priv(cmd_mod);
97 struct rsnd_adg *adg = rsnd_priv_to_adg(priv); 97 struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
98 struct rsnd_mod *adg_mod = rsnd_mod_get(adg); 98 struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
99 int id = rsnd_mod_id(mod); 99 int id = rsnd_mod_id(cmd_mod);
100 int shift = (id % 2) ? 16 : 0; 100 int shift = (id % 2) ? 16 : 0;
101 u32 mask, val; 101 u32 mask, val;
102 102
@@ -242,68 +242,6 @@ int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *src_mod,
242 return rsnd_adg_set_src_timsel_gen2(src_mod, io, val); 242 return rsnd_adg_set_src_timsel_gen2(src_mod, io, val);
243} 243}
244 244
245int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv,
246 struct rsnd_mod *mod,
247 unsigned int src_rate,
248 unsigned int dst_rate)
249{
250 struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
251 struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
252 struct device *dev = rsnd_priv_to_dev(priv);
253 int idx, sel, div, shift;
254 u32 mask, val;
255 int id = rsnd_mod_id(mod);
256 unsigned int sel_rate [] = {
257 clk_get_rate(adg->clk[CLKA]), /* 000: CLKA */
258 clk_get_rate(adg->clk[CLKB]), /* 001: CLKB */
259 clk_get_rate(adg->clk[CLKC]), /* 010: CLKC */
260 0, /* 011: MLBCLK (not used) */
261 adg->rbga_rate_for_441khz, /* 100: RBGA */
262 adg->rbgb_rate_for_48khz, /* 101: RBGB */
263 };
264
265 /* find div (= 1/128, 1/256, 1/512, 1/1024, 1/2048 */
266 for (sel = 0; sel < ARRAY_SIZE(sel_rate); sel++) {
267 for (div = 128, idx = 0;
268 div <= 2048;
269 div *= 2, idx++) {
270 if (src_rate == sel_rate[sel] / div) {
271 val = (idx << 4) | sel;
272 goto find_rate;
273 }
274 }
275 }
276 dev_err(dev, "can't find convert src clk\n");
277 return -EINVAL;
278
279find_rate:
280 shift = (id % 4) * 8;
281 mask = 0xFF << shift;
282 val = val << shift;
283
284 dev_dbg(dev, "adg convert src clk = %02x\n", val);
285
286 switch (id / 4) {
287 case 0:
288 rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL3, mask, val);
289 break;
290 case 1:
291 rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL4, mask, val);
292 break;
293 case 2:
294 rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL5, mask, val);
295 break;
296 }
297
298 /*
299 * Gen1 doesn't need dst_rate settings,
300 * since it uses SSI WS pin.
301 * see also rsnd_src_set_route_if_gen1()
302 */
303
304 return 0;
305}
306
307static void rsnd_adg_set_ssi_clk(struct rsnd_mod *ssi_mod, u32 val) 245static void rsnd_adg_set_ssi_clk(struct rsnd_mod *ssi_mod, u32 val)
308{ 246{
309 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod); 247 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
@@ -337,20 +275,16 @@ static void rsnd_adg_set_ssi_clk(struct rsnd_mod *ssi_mod, u32 val)
337 } 275 }
338} 276}
339 277
340int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod) 278int rsnd_adg_ssi_clk_stop(struct rsnd_mod *ssi_mod)
341{ 279{
342 /* 280 rsnd_adg_set_ssi_clk(ssi_mod, 0);
343 * "mod" = "ssi" here.
344 * we can get "ssi id" from mod
345 */
346 rsnd_adg_set_ssi_clk(mod, 0);
347 281
348 return 0; 282 return 0;
349} 283}
350 284
351int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate) 285int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *ssi_mod, unsigned int rate)
352{ 286{
353 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 287 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
354 struct rsnd_adg *adg = rsnd_priv_to_adg(priv); 288 struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
355 struct device *dev = rsnd_priv_to_dev(priv); 289 struct device *dev = rsnd_priv_to_dev(priv);
356 struct clk *clk; 290 struct clk *clk;
@@ -394,14 +328,10 @@ int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate)
394 328
395found_clock: 329found_clock:
396 330
397 /* 331 rsnd_adg_set_ssi_clk(ssi_mod, data);
398 * This "mod" = "ssi" here.
399 * we can get "ssi id" from mod
400 */
401 rsnd_adg_set_ssi_clk(mod, data);
402 332
403 dev_dbg(dev, "ADG: %s[%d] selects 0x%x for %d\n", 333 dev_dbg(dev, "ADG: %s[%d] selects 0x%x for %d\n",
404 rsnd_mod_name(mod), rsnd_mod_id(mod), 334 rsnd_mod_name(ssi_mod), rsnd_mod_id(ssi_mod),
405 data, rate); 335 data, rate);
406 336
407 return 0; 337 return 0;
@@ -418,15 +348,20 @@ static void rsnd_adg_get_clkin(struct rsnd_priv *priv,
418 [CLKC] = "clk_c", 348 [CLKC] = "clk_c",
419 [CLKI] = "clk_i", 349 [CLKI] = "clk_i",
420 }; 350 };
421 int i; 351 int i, ret;
422 352
423 for (i = 0; i < CLKMAX; i++) { 353 for (i = 0; i < CLKMAX; i++) {
424 clk = devm_clk_get(dev, clk_name[i]); 354 clk = devm_clk_get(dev, clk_name[i]);
425 adg->clk[i] = IS_ERR(clk) ? NULL : clk; 355 adg->clk[i] = IS_ERR(clk) ? NULL : clk;
426 } 356 }
427 357
428 for_each_rsnd_clk(clk, adg, i) 358 for_each_rsnd_clk(clk, adg, i) {
359 ret = clk_prepare_enable(clk);
360 if (ret < 0)
361 dev_warn(dev, "can't use clk %d\n", i);
362
429 dev_dbg(dev, "clk %d : %p : %ld\n", i, clk, clk_get_rate(clk)); 363 dev_dbg(dev, "clk %d : %p : %ld\n", i, clk, clk_get_rate(clk));
364 }
430} 365}
431 366
432static void rsnd_adg_get_clkout(struct rsnd_priv *priv, 367static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
@@ -437,7 +372,7 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
437 struct device *dev = rsnd_priv_to_dev(priv); 372 struct device *dev = rsnd_priv_to_dev(priv);
438 struct device_node *np = dev->of_node; 373 struct device_node *np = dev->of_node;
439 u32 ckr, rbgx, rbga, rbgb; 374 u32 ckr, rbgx, rbga, rbgb;
440 u32 rate, req_rate, div; 375 u32 rate, req_rate = 0, div;
441 uint32_t count = 0; 376 uint32_t count = 0;
442 unsigned long req_48kHz_rate, req_441kHz_rate; 377 unsigned long req_48kHz_rate, req_441kHz_rate;
443 int i; 378 int i;
@@ -572,9 +507,7 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
572 ckr, rbga, rbgb); 507 ckr, rbga, rbgb);
573} 508}
574 509
575int rsnd_adg_probe(struct platform_device *pdev, 510int rsnd_adg_probe(struct rsnd_priv *priv)
576 const struct rsnd_of_data *of_data,
577 struct rsnd_priv *priv)
578{ 511{
579 struct rsnd_adg *adg; 512 struct rsnd_adg *adg;
580 struct device *dev = rsnd_priv_to_dev(priv); 513 struct device *dev = rsnd_priv_to_dev(priv);
@@ -600,3 +533,14 @@ int rsnd_adg_probe(struct platform_device *pdev,
600 533
601 return 0; 534 return 0;
602} 535}
536
537void rsnd_adg_remove(struct rsnd_priv *priv)
538{
539 struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
540 struct clk *clk;
541 int i;
542
543 for_each_rsnd_clk(clk, adg, i) {
544 clk_disable_unprepare(clk);
545 }
546}
diff --git a/sound/soc/sh/rcar/cmd.c b/sound/soc/sh/rcar/cmd.c
new file mode 100644
index 000000000000..cd1f064e63c4
--- /dev/null
+++ b/sound/soc/sh/rcar/cmd.c
@@ -0,0 +1,171 @@
1/*
2 * Renesas R-Car CMD support
3 *
4 * Copyright (C) 2015 Renesas Solutions Corp.
5 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#include "rsnd.h"
12
13struct rsnd_cmd {
14 struct rsnd_mod mod;
15};
16
17#define CMD_NAME "cmd"
18
19#define rsnd_cmd_nr(priv) ((priv)->cmd_nr)
20#define for_each_rsnd_cmd(pos, priv, i) \
21 for ((i) = 0; \
22 ((i) < rsnd_cmd_nr(priv)) && \
23 ((pos) = (struct rsnd_cmd *)(priv)->cmd + i); \
24 i++)
25
26static int rsnd_cmd_init(struct rsnd_mod *mod,
27 struct rsnd_dai_stream *io,
28 struct rsnd_priv *priv)
29{
30 struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
31 struct rsnd_mod *mix = rsnd_io_to_mod_mix(io);
32 struct rsnd_mod *src = rsnd_io_to_mod_src(io);
33 struct device *dev = rsnd_priv_to_dev(priv);
34 u32 data;
35
36 if (!mix && !dvc)
37 return 0;
38
39 if (mix) {
40 struct rsnd_dai *rdai;
41 int i;
42 u32 path[] = {
43 [0] = 0,
44 [1] = 1 << 0,
45 [2] = 0,
46 [3] = 0,
47 [4] = 0,
48 [5] = 1 << 8
49 };
50
51 /*
52 * it is assuming that integrater is well understanding about
53 * data path. Here doesn't check impossible connection,
54 * like src2 + src5
55 */
56 data = 0;
57 for_each_rsnd_dai(rdai, priv, i) {
58 io = &rdai->playback;
59 if (mix == rsnd_io_to_mod_mix(io))
60 data |= path[rsnd_mod_id(src)];
61
62 io = &rdai->capture;
63 if (mix == rsnd_io_to_mod_mix(io))
64 data |= path[rsnd_mod_id(src)];
65 }
66
67 } else {
68 u32 path[] = {
69 [0] = 0x30000,
70 [1] = 0x30001,
71 [2] = 0x40000,
72 [3] = 0x10000,
73 [4] = 0x20000,
74 [5] = 0x40100
75 };
76
77 data = path[rsnd_mod_id(src)];
78 }
79
80 dev_dbg(dev, "ctu/mix path = 0x%08x", data);
81
82 rsnd_mod_write(mod, CMD_ROUTE_SLCT, data);
83 rsnd_mod_write(mod, CMD_BUSIF_DALIGN, rsnd_get_dalign(mod, io));
84
85 rsnd_adg_set_cmd_timsel_gen2(mod, io);
86
87 return 0;
88}
89
90static int rsnd_cmd_start(struct rsnd_mod *mod,
91 struct rsnd_dai_stream *io,
92 struct rsnd_priv *priv)
93{
94 rsnd_mod_write(mod, CMD_CTRL, 0x10);
95
96 return 0;
97}
98
99static int rsnd_cmd_stop(struct rsnd_mod *mod,
100 struct rsnd_dai_stream *io,
101 struct rsnd_priv *priv)
102{
103 rsnd_mod_write(mod, CMD_CTRL, 0);
104
105 return 0;
106}
107
108static struct rsnd_mod_ops rsnd_cmd_ops = {
109 .name = CMD_NAME,
110 .init = rsnd_cmd_init,
111 .start = rsnd_cmd_start,
112 .stop = rsnd_cmd_stop,
113};
114
115int rsnd_cmd_attach(struct rsnd_dai_stream *io, int id)
116{
117 struct rsnd_priv *priv = rsnd_io_to_priv(io);
118 struct rsnd_mod *mod = rsnd_cmd_mod_get(priv, id);
119
120 return rsnd_dai_connect(mod, io, mod->type);
121}
122
123struct rsnd_mod *rsnd_cmd_mod_get(struct rsnd_priv *priv, int id)
124{
125 if (WARN_ON(id < 0 || id >= rsnd_cmd_nr(priv)))
126 id = 0;
127
128 return rsnd_mod_get((struct rsnd_cmd *)(priv->cmd) + id);
129}
130
131int rsnd_cmd_probe(struct rsnd_priv *priv)
132{
133 struct device *dev = rsnd_priv_to_dev(priv);
134 struct rsnd_cmd *cmd;
135 int i, nr, ret;
136
137 /* This driver doesn't support Gen1 at this point */
138 if (rsnd_is_gen1(priv))
139 return 0;
140
141 /* same number as DVC */
142 nr = priv->dvc_nr;
143 if (!nr)
144 return 0;
145
146 cmd = devm_kzalloc(dev, sizeof(*cmd) * nr, GFP_KERNEL);
147 if (!cmd)
148 return -ENOMEM;
149
150 priv->cmd_nr = nr;
151 priv->cmd = cmd;
152
153 for_each_rsnd_cmd(cmd, priv, i) {
154 ret = rsnd_mod_init(priv, rsnd_mod_get(cmd),
155 &rsnd_cmd_ops, NULL, RSND_MOD_CMD, i);
156 if (ret)
157 return ret;
158 }
159
160 return 0;
161}
162
163void rsnd_cmd_remove(struct rsnd_priv *priv)
164{
165 struct rsnd_cmd *cmd;
166 int i;
167
168 for_each_rsnd_cmd(cmd, priv, i) {
169 rsnd_mod_quit(rsnd_mod_get(cmd));
170 }
171}
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index deed48ef28b8..02b4b085b8d7 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -99,34 +99,17 @@
99#define RSND_RATES SNDRV_PCM_RATE_8000_96000 99#define RSND_RATES SNDRV_PCM_RATE_8000_96000
100#define RSND_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE) 100#define RSND_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
101 101
102static const struct rsnd_of_data rsnd_of_data_gen1 = {
103 .flags = RSND_GEN1,
104};
105
106static const struct rsnd_of_data rsnd_of_data_gen2 = {
107 .flags = RSND_GEN2,
108};
109
110static const struct of_device_id rsnd_of_match[] = { 102static const struct of_device_id rsnd_of_match[] = {
111 { .compatible = "renesas,rcar_sound-gen1", .data = &rsnd_of_data_gen1 }, 103 { .compatible = "renesas,rcar_sound-gen1", .data = (void *)RSND_GEN1 },
112 { .compatible = "renesas,rcar_sound-gen2", .data = &rsnd_of_data_gen2 }, 104 { .compatible = "renesas,rcar_sound-gen2", .data = (void *)RSND_GEN2 },
113 { .compatible = "renesas,rcar_sound-gen3", .data = &rsnd_of_data_gen2 }, /* gen2 compatible */ 105 { .compatible = "renesas,rcar_sound-gen3", .data = (void *)RSND_GEN2 }, /* gen2 compatible */
114 {}, 106 {},
115}; 107};
116MODULE_DEVICE_TABLE(of, rsnd_of_match); 108MODULE_DEVICE_TABLE(of, rsnd_of_match);
117 109
118/* 110/*
119 * rsnd_platform functions 111 * rsnd_mod functions
120 */ 112 */
121#define rsnd_platform_call(priv, dai, func, param...) \
122 (!(priv->info->func) ? 0 : \
123 priv->info->func(param))
124
125#define rsnd_is_enable_path(io, name) \
126 ((io)->info ? (io)->info->name : NULL)
127#define rsnd_info_id(priv, io, name) \
128 ((io)->info->name - priv->info->name##_info)
129
130void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type) 113void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type)
131{ 114{
132 if (mod->type != type) { 115 if (mod->type != type) {
@@ -138,9 +121,6 @@ void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type)
138 } 121 }
139} 122}
140 123
141/*
142 * rsnd_mod functions
143 */
144char *rsnd_mod_name(struct rsnd_mod *mod) 124char *rsnd_mod_name(struct rsnd_mod *mod)
145{ 125{
146 if (!mod || !mod->ops) 126 if (!mod || !mod->ops)
@@ -192,19 +172,16 @@ void rsnd_mod_interrupt(struct rsnd_mod *mod,
192 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 172 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
193 struct rsnd_dai_stream *io; 173 struct rsnd_dai_stream *io;
194 struct rsnd_dai *rdai; 174 struct rsnd_dai *rdai;
195 int i, j; 175 int i;
196
197 for_each_rsnd_dai(rdai, priv, j) {
198 176
199 for (i = 0; i < RSND_MOD_MAX; i++) { 177 for_each_rsnd_dai(rdai, priv, i) {
200 io = &rdai->playback; 178 io = &rdai->playback;
201 if (mod == io->mod[i]) 179 if (mod == io->mod[mod->type])
202 callback(mod, io); 180 callback(mod, io);
203 181
204 io = &rdai->capture; 182 io = &rdai->capture;
205 if (mod == io->mod[i]) 183 if (mod == io->mod[mod->type])
206 callback(mod, io); 184 callback(mod, io);
207 }
208 } 185 }
209} 186}
210 187
@@ -214,6 +191,43 @@ int rsnd_io_is_working(struct rsnd_dai_stream *io)
214 return !!io->substream; 191 return !!io->substream;
215} 192}
216 193
194void rsnd_set_slot(struct rsnd_dai *rdai,
195 int slots, int num)
196{
197 rdai->slots = slots;
198 rdai->slots_num = num;
199}
200
201int rsnd_get_slot(struct rsnd_dai_stream *io)
202{
203 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
204
205 return rdai->slots;
206}
207
208int rsnd_get_slot_num(struct rsnd_dai_stream *io)
209{
210 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
211
212 return rdai->slots_num;
213}
214
215int rsnd_get_slot_width(struct rsnd_dai_stream *io)
216{
217 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
218 int chan = runtime->channels;
219
220 /* Multi channel Mode */
221 if (rsnd_ssi_multi_slaves(io))
222 chan /= rsnd_get_slot_num(io);
223
224 /* TDM Extend Mode needs 8ch */
225 if (chan == 6)
226 chan = 8;
227
228 return chan;
229}
230
217/* 231/*
218 * ADINR function 232 * ADINR function
219 */ 233 */
@@ -222,21 +236,17 @@ u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
222 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 236 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
223 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); 237 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
224 struct device *dev = rsnd_priv_to_dev(priv); 238 struct device *dev = rsnd_priv_to_dev(priv);
225 u32 adinr = runtime->channels;
226 239
227 switch (runtime->sample_bits) { 240 switch (runtime->sample_bits) {
228 case 16: 241 case 16:
229 adinr |= (8 << 16); 242 return 8 << 16;
230 break;
231 case 32: 243 case 32:
232 adinr |= (0 << 16); 244 return 0 << 16;
233 break;
234 default:
235 dev_warn(dev, "not supported sample bits\n");
236 return 0;
237 } 245 }
238 246
239 return adinr; 247 dev_warn(dev, "not supported sample bits\n");
248
249 return 0;
240} 250}
241 251
242u32 rsnd_get_adinr_chan(struct rsnd_mod *mod, struct rsnd_dai_stream *io) 252u32 rsnd_get_adinr_chan(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
@@ -267,13 +277,22 @@ u32 rsnd_get_adinr_chan(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
267 */ 277 */
268u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io) 278u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
269{ 279{
270 struct rsnd_mod *src = rsnd_io_to_mod_src(io);
271 struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io); 280 struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
272 struct rsnd_mod *target = src ? src : ssi; 281 struct rsnd_mod *target;
273 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); 282 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
274 u32 val = 0x76543210; 283 u32 val = 0x76543210;
275 u32 mask = ~0; 284 u32 mask = ~0;
276 285
286 if (rsnd_io_is_play(io)) {
287 struct rsnd_mod *src = rsnd_io_to_mod_src(io);
288
289 target = src ? src : ssi;
290 } else {
291 struct rsnd_mod *cmd = rsnd_io_to_mod_cmd(io);
292
293 target = cmd ? cmd : ssi;
294 }
295
277 mask <<= runtime->channels * 4; 296 mask <<= runtime->channels * 4;
278 val = val & mask; 297 val = val & mask;
279 298
@@ -300,20 +319,22 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
300/* 319/*
301 * rsnd_dai functions 320 * rsnd_dai functions
302 */ 321 */
303#define rsnd_mod_call(mod, io, func, param...) \ 322#define rsnd_mod_call(idx, io, func, param...) \
304({ \ 323({ \
305 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); \ 324 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); \
325 struct rsnd_mod *mod = (io)->mod[idx]; \
306 struct device *dev = rsnd_priv_to_dev(priv); \ 326 struct device *dev = rsnd_priv_to_dev(priv); \
327 u32 *status = (io)->mod_status + idx; \
307 u32 mask = 0xF << __rsnd_mod_shift_##func; \ 328 u32 mask = 0xF << __rsnd_mod_shift_##func; \
308 u8 val = (mod->status >> __rsnd_mod_shift_##func) & 0xF; \ 329 u8 val = (*status >> __rsnd_mod_shift_##func) & 0xF; \
309 u8 add = ((val + __rsnd_mod_add_##func) & 0xF); \ 330 u8 add = ((val + __rsnd_mod_add_##func) & 0xF); \
310 int ret = 0; \ 331 int ret = 0; \
311 int call = (val == __rsnd_mod_call_##func) && (mod)->ops->func; \ 332 int call = (val == __rsnd_mod_call_##func) && (mod)->ops->func; \
312 mod->status = (mod->status & ~mask) + \ 333 *status = (*status & ~mask) + \
313 (add << __rsnd_mod_shift_##func); \ 334 (add << __rsnd_mod_shift_##func); \
314 dev_dbg(dev, "%s[%d]\t0x%08x %s\n", \ 335 dev_dbg(dev, "%s[%d]\t0x%08x %s\n", \
315 rsnd_mod_name(mod), rsnd_mod_id(mod), \ 336 rsnd_mod_name(mod), rsnd_mod_id(mod), \
316 mod->status, call ? #func : ""); \ 337 *status, call ? #func : ""); \
317 if (call) \ 338 if (call) \
318 ret = (mod)->ops->func(mod, io, param); \ 339 ret = (mod)->ops->func(mod, io, param); \
319 ret; \ 340 ret; \
@@ -327,13 +348,14 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
327 mod = (io)->mod[i]; \ 348 mod = (io)->mod[i]; \
328 if (!mod) \ 349 if (!mod) \
329 continue; \ 350 continue; \
330 ret |= rsnd_mod_call(mod, io, fn, param); \ 351 ret |= rsnd_mod_call(i, io, fn, param); \
331 } \ 352 } \
332 ret; \ 353 ret; \
333}) 354})
334 355
335static int rsnd_dai_connect(struct rsnd_mod *mod, 356int rsnd_dai_connect(struct rsnd_mod *mod,
336 struct rsnd_dai_stream *io) 357 struct rsnd_dai_stream *io,
358 enum rsnd_mod_type type)
337{ 359{
338 struct rsnd_priv *priv; 360 struct rsnd_priv *priv;
339 struct device *dev; 361 struct device *dev;
@@ -341,10 +363,13 @@ static int rsnd_dai_connect(struct rsnd_mod *mod,
341 if (!mod) 363 if (!mod)
342 return -EIO; 364 return -EIO;
343 365
366 if (io->mod[type])
367 return -EINVAL;
368
344 priv = rsnd_mod_to_priv(mod); 369 priv = rsnd_mod_to_priv(mod);
345 dev = rsnd_priv_to_dev(priv); 370 dev = rsnd_priv_to_dev(priv);
346 371
347 io->mod[mod->type] = mod; 372 io->mod[type] = mod;
348 373
349 dev_dbg(dev, "%s[%d] is connected to io (%s)\n", 374 dev_dbg(dev, "%s[%d] is connected to io (%s)\n",
350 rsnd_mod_name(mod), rsnd_mod_id(mod), 375 rsnd_mod_name(mod), rsnd_mod_id(mod),
@@ -354,9 +379,10 @@ static int rsnd_dai_connect(struct rsnd_mod *mod,
354} 379}
355 380
356static void rsnd_dai_disconnect(struct rsnd_mod *mod, 381static void rsnd_dai_disconnect(struct rsnd_mod *mod,
357 struct rsnd_dai_stream *io) 382 struct rsnd_dai_stream *io,
383 enum rsnd_mod_type type)
358{ 384{
359 io->mod[mod->type] = NULL; 385 io->mod[type] = NULL;
360} 386}
361 387
362struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id) 388struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id)
@@ -469,7 +495,6 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
469 struct rsnd_priv *priv = rsnd_dai_to_priv(dai); 495 struct rsnd_priv *priv = rsnd_dai_to_priv(dai);
470 struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai); 496 struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
471 struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream); 497 struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
472 int ssi_id = rsnd_mod_id(rsnd_io_to_mod_ssi(io));
473 int ret; 498 int ret;
474 unsigned long flags; 499 unsigned long flags;
475 500
@@ -479,10 +504,6 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
479 case SNDRV_PCM_TRIGGER_START: 504 case SNDRV_PCM_TRIGGER_START:
480 rsnd_dai_stream_init(io, substream); 505 rsnd_dai_stream_init(io, substream);
481 506
482 ret = rsnd_platform_call(priv, dai, start, ssi_id);
483 if (ret < 0)
484 goto dai_trigger_end;
485
486 ret = rsnd_dai_call(init, io, priv); 507 ret = rsnd_dai_call(init, io, priv);
487 if (ret < 0) 508 if (ret < 0)
488 goto dai_trigger_end; 509 goto dai_trigger_end;
@@ -496,8 +517,6 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
496 517
497 ret |= rsnd_dai_call(quit, io, priv); 518 ret |= rsnd_dai_call(quit, io, priv);
498 519
499 ret |= rsnd_platform_call(priv, dai, stop, ssi_id);
500
501 rsnd_dai_stream_quit(io); 520 rsnd_dai_stream_quit(io);
502 break; 521 break;
503 default: 522 default:
@@ -567,332 +586,157 @@ static int rsnd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
567 return 0; 586 return 0;
568} 587}
569 588
570static const struct snd_soc_dai_ops rsnd_soc_dai_ops = { 589static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
571 .trigger = rsnd_soc_dai_trigger, 590 u32 tx_mask, u32 rx_mask,
572 .set_fmt = rsnd_soc_dai_set_fmt, 591 int slots, int slot_width)
573};
574
575#define rsnd_path_add(priv, io, type) \
576({ \
577 struct rsnd_mod *mod; \
578 int ret = 0; \
579 int id = -1; \
580 \
581 if (rsnd_is_enable_path(io, type)) { \
582 id = rsnd_info_id(priv, io, type); \
583 if (id >= 0) { \
584 mod = rsnd_##type##_mod_get(priv, id); \
585 ret = rsnd_dai_connect(mod, io); \
586 } \
587 } \
588 ret; \
589})
590
591#define rsnd_path_remove(priv, io, type) \
592{ \
593 struct rsnd_mod *mod; \
594 int id = -1; \
595 \
596 if (rsnd_is_enable_path(io, type)) { \
597 id = rsnd_info_id(priv, io, type); \
598 if (id >= 0) { \
599 mod = rsnd_##type##_mod_get(priv, id); \
600 rsnd_dai_disconnect(mod, io); \
601 } \
602 } \
603}
604
605void rsnd_path_parse(struct rsnd_priv *priv,
606 struct rsnd_dai_stream *io)
607{ 592{
608 struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io); 593 struct rsnd_priv *priv = rsnd_dai_to_priv(dai);
609 struct rsnd_mod *mix = rsnd_io_to_mod_mix(io); 594 struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
610 struct rsnd_mod *src = rsnd_io_to_mod_src(io);
611 struct rsnd_mod *cmd;
612 struct device *dev = rsnd_priv_to_dev(priv); 595 struct device *dev = rsnd_priv_to_dev(priv);
613 u32 data;
614 596
615 /* Gen1 is not supported */ 597 switch (slots) {
616 if (rsnd_is_gen1(priv)) 598 case 6:
617 return; 599 /* TDM Extend Mode */
618 600 rsnd_set_slot(rdai, slots, 1);
619 if (!mix && !dvc) 601 break;
620 return; 602 default:
621 603 dev_err(dev, "unsupported TDM slots (%d)\n", slots);
622 if (mix) { 604 return -EINVAL;
623 struct rsnd_dai *rdai;
624 int i;
625 u32 path[] = {
626 [0] = 0,
627 [1] = 1 << 0,
628 [2] = 0,
629 [3] = 0,
630 [4] = 0,
631 [5] = 1 << 8
632 };
633
634 /*
635 * it is assuming that integrater is well understanding about
636 * data path. Here doesn't check impossible connection,
637 * like src2 + src5
638 */
639 data = 0;
640 for_each_rsnd_dai(rdai, priv, i) {
641 io = &rdai->playback;
642 if (mix == rsnd_io_to_mod_mix(io))
643 data |= path[rsnd_mod_id(src)];
644
645 io = &rdai->capture;
646 if (mix == rsnd_io_to_mod_mix(io))
647 data |= path[rsnd_mod_id(src)];
648 }
649
650 /*
651 * We can't use ctu = rsnd_io_ctu() here.
652 * Since, ID of dvc/mix are 0 or 1 (= same as CMD number)
653 * but ctu IDs are 0 - 7 (= CTU00 - CTU13)
654 */
655 cmd = mix;
656 } else {
657 u32 path[] = {
658 [0] = 0x30000,
659 [1] = 0x30001,
660 [2] = 0x40000,
661 [3] = 0x10000,
662 [4] = 0x20000,
663 [5] = 0x40100
664 };
665
666 data = path[rsnd_mod_id(src)];
667
668 cmd = dvc;
669 } 605 }
670 606
671 dev_dbg(dev, "ctu/mix path = 0x%08x", data); 607 return 0;
672
673 rsnd_mod_write(cmd, CMD_ROUTE_SLCT, data);
674
675 rsnd_mod_write(cmd, CMD_CTRL, 0x10);
676} 608}
677 609
678static int rsnd_path_init(struct rsnd_priv *priv, 610static const struct snd_soc_dai_ops rsnd_soc_dai_ops = {
679 struct rsnd_dai *rdai, 611 .trigger = rsnd_soc_dai_trigger,
680 struct rsnd_dai_stream *io) 612 .set_fmt = rsnd_soc_dai_set_fmt,
681{ 613 .set_tdm_slot = rsnd_soc_set_dai_tdm_slot,
682 int ret; 614};
683
684 /*
685 * Gen1 is created by SRU/SSI, and this SRU is base module of
686 * Gen2's SCU/SSIU/SSI. (Gen2 SCU/SSIU came from SRU)
687 *
688 * Easy image is..
689 * Gen1 SRU = Gen2 SCU + SSIU + etc
690 *
691 * Gen2 SCU path is very flexible, but, Gen1 SRU (SCU parts) is
692 * using fixed path.
693 */
694
695 /* SSI */
696 ret = rsnd_path_add(priv, io, ssi);
697 if (ret < 0)
698 return ret;
699
700 /* SRC */
701 ret = rsnd_path_add(priv, io, src);
702 if (ret < 0)
703 return ret;
704 615
705 /* CTU */ 616void rsnd_parse_connect_common(struct rsnd_dai *rdai,
706 ret = rsnd_path_add(priv, io, ctu); 617 struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id),
707 if (ret < 0) 618 struct device_node *node,
708 return ret; 619 struct device_node *playback,
620 struct device_node *capture)
621{
622 struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
623 struct device_node *np;
624 struct rsnd_mod *mod;
625 int i;
709 626
710 /* MIX */ 627 if (!node)
711 ret = rsnd_path_add(priv, io, mix); 628 return;
712 if (ret < 0)
713 return ret;
714 629
715 /* DVC */ 630 i = 0;
716 ret = rsnd_path_add(priv, io, dvc); 631 for_each_child_of_node(node, np) {
717 if (ret < 0) 632 mod = mod_get(priv, i);
718 return ret; 633 if (np == playback)
634 rsnd_dai_connect(mod, &rdai->playback, mod->type);
635 if (np == capture)
636 rsnd_dai_connect(mod, &rdai->capture, mod->type);
637 i++;
638 }
719 639
720 return ret; 640 of_node_put(node);
721} 641}
722 642
723static void rsnd_of_parse_dai(struct platform_device *pdev, 643static int rsnd_dai_probe(struct rsnd_priv *priv)
724 const struct rsnd_of_data *of_data,
725 struct rsnd_priv *priv)
726{ 644{
727 struct device_node *dai_node, *dai_np; 645 struct device_node *dai_node;
728 struct device_node *ssi_node, *ssi_np; 646 struct device_node *dai_np;
729 struct device_node *src_node, *src_np;
730 struct device_node *ctu_node, *ctu_np;
731 struct device_node *mix_node, *mix_np;
732 struct device_node *dvc_node, *dvc_np;
733 struct device_node *playback, *capture; 647 struct device_node *playback, *capture;
734 struct rsnd_dai_platform_info *dai_info; 648 struct rsnd_dai_stream *io_playback;
735 struct rcar_snd_info *info = rsnd_priv_to_info(priv); 649 struct rsnd_dai_stream *io_capture;
736 struct device *dev = &pdev->dev; 650 struct snd_soc_dai_driver *rdrv, *drv;
737 int nr, i; 651 struct rsnd_dai *rdai;
738 int dai_i, ssi_i, src_i, ctu_i, mix_i, dvc_i; 652 struct device *dev = rsnd_priv_to_dev(priv);
739 653 int nr, dai_i, io_i;
740 if (!of_data) 654 int ret;
741 return;
742
743 dai_node = of_get_child_by_name(dev->of_node, "rcar_sound,dai");
744 if (!dai_node)
745 return;
746 655
656 dai_node = rsnd_dai_of_node(priv);
747 nr = of_get_child_count(dai_node); 657 nr = of_get_child_count(dai_node);
748 if (!nr) 658 if (!nr) {
749 return; 659 ret = -EINVAL;
660 goto rsnd_dai_probe_done;
661 }
750 662
751 dai_info = devm_kzalloc(dev, 663 rdrv = devm_kzalloc(dev, sizeof(*rdrv) * nr, GFP_KERNEL);
752 sizeof(struct rsnd_dai_platform_info) * nr, 664 rdai = devm_kzalloc(dev, sizeof(*rdai) * nr, GFP_KERNEL);
753 GFP_KERNEL); 665 if (!rdrv || !rdai) {
754 if (!dai_info) { 666 ret = -ENOMEM;
755 dev_err(dev, "dai info allocation error\n"); 667 goto rsnd_dai_probe_done;
756 return;
757 } 668 }
758 669
759 info->dai_info_nr = nr; 670 priv->rdai_nr = nr;
760 info->dai_info = dai_info; 671 priv->daidrv = rdrv;
761 672 priv->rdai = rdai;
762 ssi_node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");
763 src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src");
764 ctu_node = of_get_child_by_name(dev->of_node, "rcar_sound,ctu");
765 mix_node = of_get_child_by_name(dev->of_node, "rcar_sound,mix");
766 dvc_node = of_get_child_by_name(dev->of_node, "rcar_sound,dvc");
767
768#define mod_parse(name) \
769if (name##_node) { \
770 struct rsnd_##name##_platform_info *name##_info; \
771 \
772 name##_i = 0; \
773 for_each_child_of_node(name##_node, name##_np) { \
774 name##_info = info->name##_info + name##_i; \
775 \
776 if (name##_np == playback) \
777 dai_info->playback.name = name##_info; \
778 if (name##_np == capture) \
779 dai_info->capture.name = name##_info; \
780 \
781 name##_i++; \
782 } \
783}
784 673
785 /* 674 /*
786 * parse all dai 675 * parse all dai
787 */ 676 */
788 dai_i = 0; 677 dai_i = 0;
789 for_each_child_of_node(dai_node, dai_np) { 678 for_each_child_of_node(dai_node, dai_np) {
790 dai_info = info->dai_info + dai_i; 679 rdai = rsnd_rdai_get(priv, dai_i);
791 680 drv = rdrv + dai_i;
792 for (i = 0;; i++) { 681 io_playback = &rdai->playback;
793 682 io_capture = &rdai->capture;
794 playback = of_parse_phandle(dai_np, "playback", i); 683
795 capture = of_parse_phandle(dai_np, "capture", i); 684 snprintf(rdai->name, RSND_DAI_NAME_SIZE, "rsnd-dai.%d", dai_i);
685
686 rdai->priv = priv;
687 drv->name = rdai->name;
688 drv->ops = &rsnd_soc_dai_ops;
689
690 snprintf(rdai->playback.name, RSND_DAI_NAME_SIZE,
691 "DAI%d Playback", dai_i);
692 drv->playback.rates = RSND_RATES;
693 drv->playback.formats = RSND_FMTS;
694 drv->playback.channels_min = 2;
695 drv->playback.channels_max = 6;
696 drv->playback.stream_name = rdai->playback.name;
697
698 snprintf(rdai->capture.name, RSND_DAI_NAME_SIZE,
699 "DAI%d Capture", dai_i);
700 drv->capture.rates = RSND_RATES;
701 drv->capture.formats = RSND_FMTS;
702 drv->capture.channels_min = 2;
703 drv->capture.channels_max = 6;
704 drv->capture.stream_name = rdai->capture.name;
705
706 rdai->playback.rdai = rdai;
707 rdai->capture.rdai = rdai;
708 rsnd_set_slot(rdai, 2, 1); /* default */
709
710 for (io_i = 0;; io_i++) {
711 playback = of_parse_phandle(dai_np, "playback", io_i);
712 capture = of_parse_phandle(dai_np, "capture", io_i);
796 713
797 if (!playback && !capture) 714 if (!playback && !capture)
798 break; 715 break;
799 716
800 mod_parse(ssi); 717 rsnd_parse_connect_ssi(rdai, playback, capture);
801 mod_parse(src); 718 rsnd_parse_connect_src(rdai, playback, capture);
802 mod_parse(ctu); 719 rsnd_parse_connect_ctu(rdai, playback, capture);
803 mod_parse(mix); 720 rsnd_parse_connect_mix(rdai, playback, capture);
804 mod_parse(dvc); 721 rsnd_parse_connect_dvc(rdai, playback, capture);
805 722
806 of_node_put(playback); 723 of_node_put(playback);
807 of_node_put(capture); 724 of_node_put(capture);
808 } 725 }
809 726
810 dai_i++; 727 dai_i++;
811 }
812}
813
814static int rsnd_dai_probe(struct platform_device *pdev,
815 const struct rsnd_of_data *of_data,
816 struct rsnd_priv *priv)
817{
818 struct snd_soc_dai_driver *drv;
819 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
820 struct rsnd_dai *rdai;
821 struct rsnd_ssi_platform_info *pmod, *cmod;
822 struct device *dev = rsnd_priv_to_dev(priv);
823 int dai_nr;
824 int i;
825
826 rsnd_of_parse_dai(pdev, of_data, priv);
827 728
828 dai_nr = info->dai_info_nr; 729 dev_dbg(dev, "%s (%s/%s)\n", rdai->name,
829 if (!dai_nr) { 730 rsnd_io_to_mod_ssi(io_playback) ? "play" : " -- ",
830 dev_err(dev, "no dai\n"); 731 rsnd_io_to_mod_ssi(io_capture) ? "capture" : " -- ");
831 return -EIO;
832 } 732 }
833 733
834 drv = devm_kzalloc(dev, sizeof(*drv) * dai_nr, GFP_KERNEL); 734 ret = 0;
835 rdai = devm_kzalloc(dev, sizeof(*rdai) * dai_nr, GFP_KERNEL);
836 if (!drv || !rdai) {
837 dev_err(dev, "dai allocate failed\n");
838 return -ENOMEM;
839 }
840
841 priv->rdai_nr = dai_nr;
842 priv->daidrv = drv;
843 priv->rdai = rdai;
844 735
845 for (i = 0; i < dai_nr; i++) { 736rsnd_dai_probe_done:
737 of_node_put(dai_node);
846 738
847 pmod = info->dai_info[i].playback.ssi; 739 return ret;
848 cmod = info->dai_info[i].capture.ssi;
849
850 /*
851 * init rsnd_dai
852 */
853 snprintf(rdai[i].name, RSND_DAI_NAME_SIZE, "rsnd-dai.%d", i);
854 rdai[i].priv = priv;
855
856 /*
857 * init snd_soc_dai_driver
858 */
859 drv[i].name = rdai[i].name;
860 drv[i].ops = &rsnd_soc_dai_ops;
861 if (pmod) {
862 snprintf(rdai[i].playback.name, RSND_DAI_NAME_SIZE,
863 "DAI%d Playback", i);
864
865 drv[i].playback.rates = RSND_RATES;
866 drv[i].playback.formats = RSND_FMTS;
867 drv[i].playback.channels_min = 2;
868 drv[i].playback.channels_max = 2;
869 drv[i].playback.stream_name = rdai[i].playback.name;
870
871 rdai[i].playback.info = &info->dai_info[i].playback;
872 rdai[i].playback.rdai = rdai + i;
873 rsnd_path_init(priv, &rdai[i], &rdai[i].playback);
874 }
875 if (cmod) {
876 snprintf(rdai[i].capture.name, RSND_DAI_NAME_SIZE,
877 "DAI%d Capture", i);
878
879 drv[i].capture.rates = RSND_RATES;
880 drv[i].capture.formats = RSND_FMTS;
881 drv[i].capture.channels_min = 2;
882 drv[i].capture.channels_max = 2;
883 drv[i].capture.stream_name = rdai[i].capture.name;
884
885 rdai[i].capture.info = &info->dai_info[i].capture;
886 rdai[i].capture.rdai = rdai + i;
887 rsnd_path_init(priv, &rdai[i], &rdai[i].capture);
888 }
889
890 dev_dbg(dev, "%s (%s/%s)\n", rdai[i].name,
891 pmod ? "play" : " -- ",
892 cmod ? "capture" : " -- ");
893 }
894
895 return 0;
896} 740}
897 741
898/* 742/*
@@ -1033,14 +877,13 @@ static int __rsnd_kctrl_new(struct rsnd_mod *mod,
1033 void (*update)(struct rsnd_dai_stream *io, 877 void (*update)(struct rsnd_dai_stream *io,
1034 struct rsnd_mod *mod)) 878 struct rsnd_mod *mod))
1035{ 879{
1036 struct snd_soc_card *soc_card = rtd->card;
1037 struct snd_card *card = rtd->card->snd_card; 880 struct snd_card *card = rtd->card->snd_card;
1038 struct snd_kcontrol *kctrl; 881 struct snd_kcontrol *kctrl;
1039 struct snd_kcontrol_new knew = { 882 struct snd_kcontrol_new knew = {
1040 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 883 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1041 .name = name, 884 .name = name,
1042 .info = rsnd_kctrl_info, 885 .info = rsnd_kctrl_info,
1043 .index = rtd - soc_card->rtd, 886 .index = rtd->num,
1044 .get = rsnd_kctrl_get, 887 .get = rsnd_kctrl_get,
1045 .put = rsnd_kctrl_put, 888 .put = rsnd_kctrl_put,
1046 .private_value = (unsigned long)cfg, 889 .private_value = (unsigned long)cfg,
@@ -1077,10 +920,14 @@ int rsnd_kctrl_new_m(struct rsnd_mod *mod,
1077 void (*update)(struct rsnd_dai_stream *io, 920 void (*update)(struct rsnd_dai_stream *io,
1078 struct rsnd_mod *mod), 921 struct rsnd_mod *mod),
1079 struct rsnd_kctrl_cfg_m *_cfg, 922 struct rsnd_kctrl_cfg_m *_cfg,
923 int ch_size,
1080 u32 max) 924 u32 max)
1081{ 925{
926 if (ch_size > RSND_DVC_CHANNELS)
927 return -EINVAL;
928
1082 _cfg->cfg.max = max; 929 _cfg->cfg.max = max;
1083 _cfg->cfg.size = RSND_DVC_CHANNELS; 930 _cfg->cfg.size = ch_size;
1084 _cfg->cfg.val = _cfg->val; 931 _cfg->cfg.val = _cfg->val;
1085 return __rsnd_kctrl_new(mod, io, rtd, name, &_cfg->cfg, update); 932 return __rsnd_kctrl_new(mod, io, rtd, name, &_cfg->cfg, update);
1086} 933}
@@ -1161,6 +1008,9 @@ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
1161 1008
1162 ret = rsnd_dai_call(probe, io, priv); 1009 ret = rsnd_dai_call(probe, io, priv);
1163 if (ret == -EAGAIN) { 1010 if (ret == -EAGAIN) {
1011 struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
1012 int i;
1013
1164 /* 1014 /*
1165 * Fallback to PIO mode 1015 * Fallback to PIO mode
1166 */ 1016 */
@@ -1175,10 +1025,12 @@ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
1175 rsnd_dai_call(remove, io, priv); 1025 rsnd_dai_call(remove, io, priv);
1176 1026
1177 /* 1027 /*
1178 * remove SRC/DVC from DAI, 1028 * remove all mod from io
1029 * and, re connect ssi
1179 */ 1030 */
1180 rsnd_path_remove(priv, io, src); 1031 for (i = 0; i < RSND_MOD_MAX; i++)
1181 rsnd_path_remove(priv, io, dvc); 1032 rsnd_dai_disconnect((io)->mod[i], io, i);
1033 rsnd_dai_connect(ssi_mod, io, RSND_MOD_SSI);
1182 1034
1183 /* 1035 /*
1184 * fallback 1036 * fallback
@@ -1200,33 +1052,25 @@ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
1200 */ 1052 */
1201static int rsnd_probe(struct platform_device *pdev) 1053static int rsnd_probe(struct platform_device *pdev)
1202{ 1054{
1203 struct rcar_snd_info *info;
1204 struct rsnd_priv *priv; 1055 struct rsnd_priv *priv;
1205 struct device *dev = &pdev->dev; 1056 struct device *dev = &pdev->dev;
1206 struct rsnd_dai *rdai; 1057 struct rsnd_dai *rdai;
1207 const struct of_device_id *of_id = of_match_device(rsnd_of_match, dev); 1058 const struct of_device_id *of_id = of_match_device(rsnd_of_match, dev);
1208 const struct rsnd_of_data *of_data; 1059 int (*probe_func[])(struct rsnd_priv *priv) = {
1209 int (*probe_func[])(struct platform_device *pdev,
1210 const struct rsnd_of_data *of_data,
1211 struct rsnd_priv *priv) = {
1212 rsnd_gen_probe, 1060 rsnd_gen_probe,
1213 rsnd_dma_probe, 1061 rsnd_dma_probe,
1214 rsnd_ssi_probe, 1062 rsnd_ssi_probe,
1063 rsnd_ssiu_probe,
1215 rsnd_src_probe, 1064 rsnd_src_probe,
1216 rsnd_ctu_probe, 1065 rsnd_ctu_probe,
1217 rsnd_mix_probe, 1066 rsnd_mix_probe,
1218 rsnd_dvc_probe, 1067 rsnd_dvc_probe,
1068 rsnd_cmd_probe,
1219 rsnd_adg_probe, 1069 rsnd_adg_probe,
1220 rsnd_dai_probe, 1070 rsnd_dai_probe,
1221 }; 1071 };
1222 int ret, i; 1072 int ret, i;
1223 1073
1224 info = devm_kzalloc(&pdev->dev, sizeof(struct rcar_snd_info),
1225 GFP_KERNEL);
1226 if (!info)
1227 return -ENOMEM;
1228 of_data = of_id->data;
1229
1230 /* 1074 /*
1231 * init priv data 1075 * init priv data
1232 */ 1076 */
@@ -1237,14 +1081,14 @@ static int rsnd_probe(struct platform_device *pdev)
1237 } 1081 }
1238 1082
1239 priv->pdev = pdev; 1083 priv->pdev = pdev;
1240 priv->info = info; 1084 priv->flags = (unsigned long)of_id->data;
1241 spin_lock_init(&priv->lock); 1085 spin_lock_init(&priv->lock);
1242 1086
1243 /* 1087 /*
1244 * init each module 1088 * init each module
1245 */ 1089 */
1246 for (i = 0; i < ARRAY_SIZE(probe_func); i++) { 1090 for (i = 0; i < ARRAY_SIZE(probe_func); i++) {
1247 ret = probe_func[i](pdev, of_data, priv); 1091 ret = probe_func[i](priv);
1248 if (ret) 1092 if (ret)
1249 return ret; 1093 return ret;
1250 } 1094 }
@@ -1297,13 +1141,15 @@ static int rsnd_remove(struct platform_device *pdev)
1297{ 1141{
1298 struct rsnd_priv *priv = dev_get_drvdata(&pdev->dev); 1142 struct rsnd_priv *priv = dev_get_drvdata(&pdev->dev);
1299 struct rsnd_dai *rdai; 1143 struct rsnd_dai *rdai;
1300 void (*remove_func[])(struct platform_device *pdev, 1144 void (*remove_func[])(struct rsnd_priv *priv) = {
1301 struct rsnd_priv *priv) = {
1302 rsnd_ssi_remove, 1145 rsnd_ssi_remove,
1146 rsnd_ssiu_remove,
1303 rsnd_src_remove, 1147 rsnd_src_remove,
1304 rsnd_ctu_remove, 1148 rsnd_ctu_remove,
1305 rsnd_mix_remove, 1149 rsnd_mix_remove,
1306 rsnd_dvc_remove, 1150 rsnd_dvc_remove,
1151 rsnd_cmd_remove,
1152 rsnd_adg_remove,
1307 }; 1153 };
1308 int ret = 0, i; 1154 int ret = 0, i;
1309 1155
@@ -1315,7 +1161,7 @@ static int rsnd_remove(struct platform_device *pdev)
1315 } 1161 }
1316 1162
1317 for (i = 0; i < ARRAY_SIZE(remove_func); i++) 1163 for (i = 0; i < ARRAY_SIZE(remove_func); i++)
1318 remove_func[i](pdev, priv); 1164 remove_func[i](priv);
1319 1165
1320 snd_soc_unregister_component(&pdev->dev); 1166 snd_soc_unregister_component(&pdev->dev);
1321 snd_soc_unregister_platform(&pdev->dev); 1167 snd_soc_unregister_platform(&pdev->dev);
diff --git a/sound/soc/sh/rcar/ctu.c b/sound/soc/sh/rcar/ctu.c
index 3cb214ab848b..d53a225d19e9 100644
--- a/sound/soc/sh/rcar/ctu.c
+++ b/sound/soc/sh/rcar/ctu.c
@@ -13,7 +13,6 @@
13#define CTU_NAME "ctu" 13#define CTU_NAME "ctu"
14 14
15struct rsnd_ctu { 15struct rsnd_ctu {
16 struct rsnd_ctu_platform_info *info; /* rcar_snd.h */
17 struct rsnd_mod mod; 16 struct rsnd_mod mod;
18}; 17};
19 18
@@ -24,6 +23,7 @@ struct rsnd_ctu {
24 ((pos) = (struct rsnd_ctu *)(priv)->ctu + i); \ 23 ((pos) = (struct rsnd_ctu *)(priv)->ctu + i); \
25 i++) 24 i++)
26 25
26#define rsnd_ctu_get(priv, id) ((struct rsnd_ctu *)(priv->ctu) + id)
27#define rsnd_ctu_initialize_lock(mod) __rsnd_ctu_initialize_lock(mod, 1) 27#define rsnd_ctu_initialize_lock(mod) __rsnd_ctu_initialize_lock(mod, 1)
28#define rsnd_ctu_initialize_unlock(mod) __rsnd_ctu_initialize_lock(mod, 0) 28#define rsnd_ctu_initialize_unlock(mod) __rsnd_ctu_initialize_lock(mod, 0)
29static void __rsnd_ctu_initialize_lock(struct rsnd_mod *mod, u32 enable) 29static void __rsnd_ctu_initialize_lock(struct rsnd_mod *mod, u32 enable)
@@ -31,6 +31,13 @@ static void __rsnd_ctu_initialize_lock(struct rsnd_mod *mod, u32 enable)
31 rsnd_mod_write(mod, CTU_CTUIR, enable); 31 rsnd_mod_write(mod, CTU_CTUIR, enable);
32} 32}
33 33
34static int rsnd_ctu_probe_(struct rsnd_mod *mod,
35 struct rsnd_dai_stream *io,
36 struct rsnd_priv *priv)
37{
38 return rsnd_cmd_attach(io, rsnd_mod_id(mod) / 4);
39}
40
34static int rsnd_ctu_init(struct rsnd_mod *mod, 41static int rsnd_ctu_init(struct rsnd_mod *mod,
35 struct rsnd_dai_stream *io, 42 struct rsnd_dai_stream *io,
36 struct rsnd_priv *priv) 43 struct rsnd_priv *priv)
@@ -57,6 +64,7 @@ static int rsnd_ctu_quit(struct rsnd_mod *mod,
57 64
58static struct rsnd_mod_ops rsnd_ctu_ops = { 65static struct rsnd_mod_ops rsnd_ctu_ops = {
59 .name = CTU_NAME, 66 .name = CTU_NAME,
67 .probe = rsnd_ctu_probe_,
60 .init = rsnd_ctu_init, 68 .init = rsnd_ctu_init,
61 .quit = rsnd_ctu_quit, 69 .quit = rsnd_ctu_quit,
62}; 70};
@@ -66,51 +74,13 @@ struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id)
66 if (WARN_ON(id < 0 || id >= rsnd_ctu_nr(priv))) 74 if (WARN_ON(id < 0 || id >= rsnd_ctu_nr(priv)))
67 id = 0; 75 id = 0;
68 76
69 return rsnd_mod_get((struct rsnd_ctu *)(priv->ctu) + id); 77 return rsnd_mod_get(rsnd_ctu_get(priv, id));
70} 78}
71 79
72static void rsnd_of_parse_ctu(struct platform_device *pdev, 80int rsnd_ctu_probe(struct rsnd_priv *priv)
73 const struct rsnd_of_data *of_data,
74 struct rsnd_priv *priv)
75{ 81{
76 struct device_node *node; 82 struct device_node *node;
77 struct rsnd_ctu_platform_info *ctu_info; 83 struct device_node *np;
78 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
79 struct device *dev = &pdev->dev;
80 int nr;
81
82 if (!of_data)
83 return;
84
85 node = of_get_child_by_name(dev->of_node, "rcar_sound,ctu");
86 if (!node)
87 return;
88
89 nr = of_get_child_count(node);
90 if (!nr)
91 goto rsnd_of_parse_ctu_end;
92
93 ctu_info = devm_kzalloc(dev,
94 sizeof(struct rsnd_ctu_platform_info) * nr,
95 GFP_KERNEL);
96 if (!ctu_info) {
97 dev_err(dev, "ctu info allocation error\n");
98 goto rsnd_of_parse_ctu_end;
99 }
100
101 info->ctu_info = ctu_info;
102 info->ctu_info_nr = nr;
103
104rsnd_of_parse_ctu_end:
105 of_node_put(node);
106
107}
108
109int rsnd_ctu_probe(struct platform_device *pdev,
110 const struct rsnd_of_data *of_data,
111 struct rsnd_priv *priv)
112{
113 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
114 struct device *dev = rsnd_priv_to_dev(priv); 84 struct device *dev = rsnd_priv_to_dev(priv);
115 struct rsnd_ctu *ctu; 85 struct rsnd_ctu *ctu;
116 struct clk *clk; 86 struct clk *clk;
@@ -121,20 +91,30 @@ int rsnd_ctu_probe(struct platform_device *pdev,
121 if (rsnd_is_gen1(priv)) 91 if (rsnd_is_gen1(priv))
122 return 0; 92 return 0;
123 93
124 rsnd_of_parse_ctu(pdev, of_data, priv); 94 node = rsnd_ctu_of_node(priv);
95 if (!node)
96 return 0; /* not used is not error */
125 97
126 nr = info->ctu_info_nr; 98 nr = of_get_child_count(node);
127 if (!nr) 99 if (!nr) {
128 return 0; 100 ret = -EINVAL;
101 goto rsnd_ctu_probe_done;
102 }
129 103
130 ctu = devm_kzalloc(dev, sizeof(*ctu) * nr, GFP_KERNEL); 104 ctu = devm_kzalloc(dev, sizeof(*ctu) * nr, GFP_KERNEL);
131 if (!ctu) 105 if (!ctu) {
132 return -ENOMEM; 106 ret = -ENOMEM;
107 goto rsnd_ctu_probe_done;
108 }
133 109
134 priv->ctu_nr = nr; 110 priv->ctu_nr = nr;
135 priv->ctu = ctu; 111 priv->ctu = ctu;
136 112
137 for_each_rsnd_ctu(ctu, priv, i) { 113 i = 0;
114 ret = 0;
115 for_each_child_of_node(node, np) {
116 ctu = rsnd_ctu_get(priv, i);
117
138 /* 118 /*
139 * CTU00, CTU01, CTU02, CTU03 => CTU0 119 * CTU00, CTU01, CTU02, CTU03 => CTU0
140 * CTU10, CTU11, CTU12, CTU13 => CTU1 120 * CTU10, CTU11, CTU12, CTU13 => CTU1
@@ -143,22 +123,27 @@ int rsnd_ctu_probe(struct platform_device *pdev,
143 CTU_NAME, i / 4); 123 CTU_NAME, i / 4);
144 124
145 clk = devm_clk_get(dev, name); 125 clk = devm_clk_get(dev, name);
146 if (IS_ERR(clk)) 126 if (IS_ERR(clk)) {
147 return PTR_ERR(clk); 127 ret = PTR_ERR(clk);
148 128 goto rsnd_ctu_probe_done;
149 ctu->info = &info->ctu_info[i]; 129 }
150 130
151 ret = rsnd_mod_init(priv, rsnd_mod_get(ctu), &rsnd_ctu_ops, 131 ret = rsnd_mod_init(priv, rsnd_mod_get(ctu), &rsnd_ctu_ops,
152 clk, RSND_MOD_CTU, i); 132 clk, RSND_MOD_CTU, i);
153 if (ret) 133 if (ret)
154 return ret; 134 goto rsnd_ctu_probe_done;
135
136 i++;
155 } 137 }
156 138
157 return 0; 139
140rsnd_ctu_probe_done:
141 of_node_put(node);
142
143 return ret;
158} 144}
159 145
160void rsnd_ctu_remove(struct platform_device *pdev, 146void rsnd_ctu_remove(struct rsnd_priv *priv)
161 struct rsnd_priv *priv)
162{ 147{
163 struct rsnd_ctu *ctu; 148 struct rsnd_ctu *ctu;
164 int i; 149 int i;
diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c
index 5d084d040961..418e6fdd06a3 100644
--- a/sound/soc/sh/rcar/dma.c
+++ b/sound/soc/sh/rcar/dma.c
@@ -22,21 +22,36 @@
22/* PDMACHCR */ 22/* PDMACHCR */
23#define PDMACHCR_DE (1 << 0) 23#define PDMACHCR_DE (1 << 0)
24 24
25
26struct rsnd_dmaen {
27 struct dma_chan *chan;
28};
29
30struct rsnd_dmapp {
31 int dmapp_id;
32 u32 chcr;
33};
34
35struct rsnd_dma {
36 struct rsnd_mod mod;
37 dma_addr_t src_addr;
38 dma_addr_t dst_addr;
39 union {
40 struct rsnd_dmaen en;
41 struct rsnd_dmapp pp;
42 } dma;
43};
44
25struct rsnd_dma_ctrl { 45struct rsnd_dma_ctrl {
26 void __iomem *base; 46 void __iomem *base;
47 int dmaen_num;
27 int dmapp_num; 48 int dmapp_num;
28}; 49};
29 50
30struct rsnd_dma_ops {
31 char *name;
32 void (*start)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
33 void (*stop)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
34 int (*init)(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id,
35 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to);
36 void (*quit)(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
37};
38
39#define rsnd_priv_to_dmac(p) ((struct rsnd_dma_ctrl *)(p)->dma) 51#define rsnd_priv_to_dmac(p) ((struct rsnd_dma_ctrl *)(p)->dma)
52#define rsnd_mod_to_dma(_mod) container_of((_mod), struct rsnd_dma, mod)
53#define rsnd_dma_to_dmaen(dma) (&(dma)->dma.en)
54#define rsnd_dma_to_dmapp(dma) (&(dma)->dma.pp)
40 55
41/* 56/*
42 * Audio DMAC 57 * Audio DMAC
@@ -77,18 +92,24 @@ static void rsnd_dmaen_complete(void *data)
77 rsnd_mod_interrupt(mod, __rsnd_dmaen_complete); 92 rsnd_mod_interrupt(mod, __rsnd_dmaen_complete);
78} 93}
79 94
80static void rsnd_dmaen_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma) 95static int rsnd_dmaen_stop(struct rsnd_mod *mod,
96 struct rsnd_dai_stream *io,
97 struct rsnd_priv *priv)
81{ 98{
99 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
82 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); 100 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
83 101
84 dmaengine_terminate_all(dmaen->chan); 102 dmaengine_terminate_all(dmaen->chan);
103
104 return 0;
85} 105}
86 106
87static void rsnd_dmaen_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma) 107static int rsnd_dmaen_start(struct rsnd_mod *mod,
108 struct rsnd_dai_stream *io,
109 struct rsnd_priv *priv)
88{ 110{
111 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
89 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); 112 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
90 struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
91 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
92 struct snd_pcm_substream *substream = io->substream; 113 struct snd_pcm_substream *substream = io->substream;
93 struct device *dev = rsnd_priv_to_dev(priv); 114 struct device *dev = rsnd_priv_to_dev(priv);
94 struct dma_async_tx_descriptor *desc; 115 struct dma_async_tx_descriptor *desc;
@@ -103,18 +124,20 @@ static void rsnd_dmaen_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
103 124
104 if (!desc) { 125 if (!desc) {
105 dev_err(dev, "dmaengine_prep_slave_sg() fail\n"); 126 dev_err(dev, "dmaengine_prep_slave_sg() fail\n");
106 return; 127 return -EIO;
107 } 128 }
108 129
109 desc->callback = rsnd_dmaen_complete; 130 desc->callback = rsnd_dmaen_complete;
110 desc->callback_param = mod; 131 desc->callback_param = rsnd_mod_get(dma);
111 132
112 if (dmaengine_submit(desc) < 0) { 133 if (dmaengine_submit(desc) < 0) {
113 dev_err(dev, "dmaengine_submit() fail\n"); 134 dev_err(dev, "dmaengine_submit() fail\n");
114 return; 135 return -EIO;
115 } 136 }
116 137
117 dma_async_issue_pending(dmaen->chan); 138 dma_async_issue_pending(dmaen->chan);
139
140 return 0;
118} 141}
119 142
120struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, 143struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node,
@@ -152,12 +175,29 @@ static struct dma_chan *rsnd_dmaen_request_channel(struct rsnd_dai_stream *io,
152 return rsnd_mod_dma_req(io, mod_to); 175 return rsnd_mod_dma_req(io, mod_to);
153} 176}
154 177
155static int rsnd_dmaen_init(struct rsnd_dai_stream *io, 178static int rsnd_dmaen_remove(struct rsnd_mod *mod,
179 struct rsnd_dai_stream *io,
180 struct rsnd_priv *priv)
181{
182 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
183 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
184
185 if (dmaen->chan)
186 dma_release_channel(dmaen->chan);
187
188 dmaen->chan = NULL;
189
190 return 0;
191}
192
193static int rsnd_dmaen_attach(struct rsnd_dai_stream *io,
156 struct rsnd_dma *dma, int id, 194 struct rsnd_dma *dma, int id,
157 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to) 195 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
158{ 196{
197 struct rsnd_mod *mod = rsnd_mod_get(dma);
159 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); 198 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
160 struct rsnd_priv *priv = rsnd_io_to_priv(io); 199 struct rsnd_priv *priv = rsnd_io_to_priv(io);
200 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
161 struct device *dev = rsnd_priv_to_dev(priv); 201 struct device *dev = rsnd_priv_to_dev(priv);
162 struct dma_slave_config cfg = {}; 202 struct dma_slave_config cfg = {};
163 int is_play = rsnd_io_is_play(io); 203 int is_play = rsnd_io_is_play(io);
@@ -191,18 +231,20 @@ static int rsnd_dmaen_init(struct rsnd_dai_stream *io,
191 cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 231 cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
192 cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 232 cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
193 233
194 dev_dbg(dev, "%s %pad -> %pad\n", 234 dev_dbg(dev, "%s[%d] %pad -> %pad\n",
195 dma->ops->name, 235 rsnd_mod_name(mod), rsnd_mod_id(mod),
196 &cfg.src_addr, &cfg.dst_addr); 236 &cfg.src_addr, &cfg.dst_addr);
197 237
198 ret = dmaengine_slave_config(dmaen->chan, &cfg); 238 ret = dmaengine_slave_config(dmaen->chan, &cfg);
199 if (ret < 0) 239 if (ret < 0)
200 goto rsnd_dma_init_err; 240 goto rsnd_dma_attach_err;
241
242 dmac->dmaen_num++;
201 243
202 return 0; 244 return 0;
203 245
204rsnd_dma_init_err: 246rsnd_dma_attach_err:
205 rsnd_dma_quit(io, dma); 247 rsnd_dmaen_remove(mod, io, priv);
206rsnd_dma_channel_err: 248rsnd_dma_channel_err:
207 249
208 /* 250 /*
@@ -214,22 +256,11 @@ rsnd_dma_channel_err:
214 return -EAGAIN; 256 return -EAGAIN;
215} 257}
216 258
217static void rsnd_dmaen_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma) 259static struct rsnd_mod_ops rsnd_dmaen_ops = {
218{
219 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
220
221 if (dmaen->chan)
222 dma_release_channel(dmaen->chan);
223
224 dmaen->chan = NULL;
225}
226
227static struct rsnd_dma_ops rsnd_dmaen_ops = {
228 .name = "audmac", 260 .name = "audmac",
229 .start = rsnd_dmaen_start, 261 .start = rsnd_dmaen_start,
230 .stop = rsnd_dmaen_stop, 262 .stop = rsnd_dmaen_stop,
231 .init = rsnd_dmaen_init, 263 .remove = rsnd_dmaen_remove,
232 .quit = rsnd_dmaen_quit,
233}; 264};
234 265
235/* 266/*
@@ -307,7 +338,7 @@ static u32 rsnd_dmapp_get_chcr(struct rsnd_dai_stream *io,
307 (0x10 * rsnd_dma_to_dmapp(dma)->dmapp_id)) 338 (0x10 * rsnd_dma_to_dmapp(dma)->dmapp_id))
308static void rsnd_dmapp_write(struct rsnd_dma *dma, u32 data, u32 reg) 339static void rsnd_dmapp_write(struct rsnd_dma *dma, u32 data, u32 reg)
309{ 340{
310 struct rsnd_mod *mod = rsnd_dma_to_mod(dma); 341 struct rsnd_mod *mod = rsnd_mod_get(dma);
311 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 342 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
312 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv); 343 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
313 struct device *dev = rsnd_priv_to_dev(priv); 344 struct device *dev = rsnd_priv_to_dev(priv);
@@ -319,38 +350,48 @@ static void rsnd_dmapp_write(struct rsnd_dma *dma, u32 data, u32 reg)
319 350
320static u32 rsnd_dmapp_read(struct rsnd_dma *dma, u32 reg) 351static u32 rsnd_dmapp_read(struct rsnd_dma *dma, u32 reg)
321{ 352{
322 struct rsnd_mod *mod = rsnd_dma_to_mod(dma); 353 struct rsnd_mod *mod = rsnd_mod_get(dma);
323 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 354 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
324 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv); 355 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
325 356
326 return ioread32(rsnd_dmapp_addr(dmac, dma, reg)); 357 return ioread32(rsnd_dmapp_addr(dmac, dma, reg));
327} 358}
328 359
329static void rsnd_dmapp_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma) 360static int rsnd_dmapp_stop(struct rsnd_mod *mod,
361 struct rsnd_dai_stream *io,
362 struct rsnd_priv *priv)
330{ 363{
364 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
331 int i; 365 int i;
332 366
333 rsnd_dmapp_write(dma, 0, PDMACHCR); 367 rsnd_dmapp_write(dma, 0, PDMACHCR);
334 368
335 for (i = 0; i < 1024; i++) { 369 for (i = 0; i < 1024; i++) {
336 if (0 == rsnd_dmapp_read(dma, PDMACHCR)) 370 if (0 == rsnd_dmapp_read(dma, PDMACHCR))
337 return; 371 return 0;
338 udelay(1); 372 udelay(1);
339 } 373 }
374
375 return -EIO;
340} 376}
341 377
342static void rsnd_dmapp_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma) 378static int rsnd_dmapp_start(struct rsnd_mod *mod,
379 struct rsnd_dai_stream *io,
380 struct rsnd_priv *priv)
343{ 381{
382 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
344 struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma); 383 struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
345 384
346 rsnd_dmapp_write(dma, dma->src_addr, PDMASAR); 385 rsnd_dmapp_write(dma, dma->src_addr, PDMASAR);
347 rsnd_dmapp_write(dma, dma->dst_addr, PDMADAR); 386 rsnd_dmapp_write(dma, dma->dst_addr, PDMADAR);
348 rsnd_dmapp_write(dma, dmapp->chcr, PDMACHCR); 387 rsnd_dmapp_write(dma, dmapp->chcr, PDMACHCR);
388
389 return 0;
349} 390}
350 391
351static int rsnd_dmapp_init(struct rsnd_dai_stream *io, 392static int rsnd_dmapp_attach(struct rsnd_dai_stream *io,
352 struct rsnd_dma *dma, int id, 393 struct rsnd_dma *dma, int id,
353 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to) 394 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
354{ 395{
355 struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma); 396 struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
356 struct rsnd_priv *priv = rsnd_io_to_priv(io); 397 struct rsnd_priv *priv = rsnd_io_to_priv(io);
@@ -362,19 +403,16 @@ static int rsnd_dmapp_init(struct rsnd_dai_stream *io,
362 403
363 dmac->dmapp_num++; 404 dmac->dmapp_num++;
364 405
365 rsnd_dmapp_stop(io, dma);
366
367 dev_dbg(dev, "id/src/dst/chcr = %d/%pad/%pad/%08x\n", 406 dev_dbg(dev, "id/src/dst/chcr = %d/%pad/%pad/%08x\n",
368 dmapp->dmapp_id, &dma->src_addr, &dma->dst_addr, dmapp->chcr); 407 dmapp->dmapp_id, &dma->src_addr, &dma->dst_addr, dmapp->chcr);
369 408
370 return 0; 409 return 0;
371} 410}
372 411
373static struct rsnd_dma_ops rsnd_dmapp_ops = { 412static struct rsnd_mod_ops rsnd_dmapp_ops = {
374 .name = "audmac-pp", 413 .name = "audmac-pp",
375 .start = rsnd_dmapp_start, 414 .start = rsnd_dmapp_start,
376 .stop = rsnd_dmapp_stop, 415 .stop = rsnd_dmapp_stop,
377 .init = rsnd_dmapp_init,
378 .quit = rsnd_dmapp_stop, 416 .quit = rsnd_dmapp_stop,
379}; 417};
380 418
@@ -497,13 +535,12 @@ static dma_addr_t rsnd_dma_addr(struct rsnd_dai_stream *io,
497} 535}
498 536
499#define MOD_MAX (RSND_MOD_MAX + 1) /* +Memory */ 537#define MOD_MAX (RSND_MOD_MAX + 1) /* +Memory */
500static void rsnd_dma_of_path(struct rsnd_dma *dma, 538static void rsnd_dma_of_path(struct rsnd_mod *this,
501 struct rsnd_dai_stream *io, 539 struct rsnd_dai_stream *io,
502 int is_play, 540 int is_play,
503 struct rsnd_mod **mod_from, 541 struct rsnd_mod **mod_from,
504 struct rsnd_mod **mod_to) 542 struct rsnd_mod **mod_to)
505{ 543{
506 struct rsnd_mod *this = rsnd_dma_to_mod(dma);
507 struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io); 544 struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
508 struct rsnd_mod *src = rsnd_io_to_mod_src(io); 545 struct rsnd_mod *src = rsnd_io_to_mod_src(io);
509 struct rsnd_mod *ctu = rsnd_io_to_mod_ctu(io); 546 struct rsnd_mod *ctu = rsnd_io_to_mod_ctu(io);
@@ -513,7 +550,7 @@ static void rsnd_dma_of_path(struct rsnd_dma *dma,
513 struct rsnd_mod *mod_start, *mod_end; 550 struct rsnd_mod *mod_start, *mod_end;
514 struct rsnd_priv *priv = rsnd_mod_to_priv(this); 551 struct rsnd_priv *priv = rsnd_mod_to_priv(this);
515 struct device *dev = rsnd_priv_to_dev(priv); 552 struct device *dev = rsnd_priv_to_dev(priv);
516 int nr, i; 553 int nr, i, idx;
517 554
518 if (!ssi) 555 if (!ssi)
519 return; 556 return;
@@ -542,23 +579,24 @@ static void rsnd_dma_of_path(struct rsnd_dma *dma,
542 mod_start = (is_play) ? NULL : ssi; 579 mod_start = (is_play) ? NULL : ssi;
543 mod_end = (is_play) ? ssi : NULL; 580 mod_end = (is_play) ? ssi : NULL;
544 581
545 mod[0] = mod_start; 582 idx = 0;
583 mod[idx++] = mod_start;
546 for (i = 1; i < nr; i++) { 584 for (i = 1; i < nr; i++) {
547 if (src) { 585 if (src) {
548 mod[i] = src; 586 mod[idx++] = src;
549 src = NULL; 587 src = NULL;
550 } else if (ctu) { 588 } else if (ctu) {
551 mod[i] = ctu; 589 mod[idx++] = ctu;
552 ctu = NULL; 590 ctu = NULL;
553 } else if (mix) { 591 } else if (mix) {
554 mod[i] = mix; 592 mod[idx++] = mix;
555 mix = NULL; 593 mix = NULL;
556 } else if (dvc) { 594 } else if (dvc) {
557 mod[i] = dvc; 595 mod[idx++] = dvc;
558 dvc = NULL; 596 dvc = NULL;
559 } 597 }
560 } 598 }
561 mod[i] = mod_end; 599 mod[idx] = mod_end;
562 600
563 /* 601 /*
564 * | SSI | SRC | 602 * | SSI | SRC |
@@ -567,8 +605,8 @@ static void rsnd_dma_of_path(struct rsnd_dma *dma,
567 * !is_play | * | o | 605 * !is_play | * | o |
568 */ 606 */
569 if ((this == ssi) == (is_play)) { 607 if ((this == ssi) == (is_play)) {
570 *mod_from = mod[nr - 1]; 608 *mod_from = mod[idx - 1];
571 *mod_to = mod[nr]; 609 *mod_to = mod[idx];
572 } else { 610 } else {
573 *mod_from = mod[0]; 611 *mod_from = mod[0];
574 *mod_to = mod[1]; 612 *mod_to = mod[1];
@@ -576,7 +614,7 @@ static void rsnd_dma_of_path(struct rsnd_dma *dma,
576 614
577 dev_dbg(dev, "module connection (this is %s[%d])\n", 615 dev_dbg(dev, "module connection (this is %s[%d])\n",
578 rsnd_mod_name(this), rsnd_mod_id(this)); 616 rsnd_mod_name(this), rsnd_mod_id(this));
579 for (i = 0; i <= nr; i++) { 617 for (i = 0; i <= idx; i++) {
580 dev_dbg(dev, " %s[%d]%s\n", 618 dev_dbg(dev, " %s[%d]%s\n",
581 rsnd_mod_name(mod[i]), rsnd_mod_id(mod[i]), 619 rsnd_mod_name(mod[i]), rsnd_mod_id(mod[i]),
582 (mod[i] == *mod_from) ? " from" : 620 (mod[i] == *mod_from) ? " from" :
@@ -584,36 +622,22 @@ static void rsnd_dma_of_path(struct rsnd_dma *dma,
584 } 622 }
585} 623}
586 624
587void rsnd_dma_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma) 625struct rsnd_mod *rsnd_dma_attach(struct rsnd_dai_stream *io,
588{ 626 struct rsnd_mod *mod, int id)
589 dma->ops->stop(io, dma);
590}
591
592void rsnd_dma_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
593{
594 dma->ops->start(io, dma);
595}
596
597void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma)
598{
599 struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
600 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
601 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
602
603 if (!dmac)
604 return;
605
606 dma->ops->quit(io, dma);
607}
608
609int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id)
610{ 627{
628 struct rsnd_mod *dma_mod;
611 struct rsnd_mod *mod_from = NULL; 629 struct rsnd_mod *mod_from = NULL;
612 struct rsnd_mod *mod_to = NULL; 630 struct rsnd_mod *mod_to = NULL;
613 struct rsnd_priv *priv = rsnd_io_to_priv(io); 631 struct rsnd_priv *priv = rsnd_io_to_priv(io);
614 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv); 632 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
633 struct rsnd_dma *dma;
615 struct device *dev = rsnd_priv_to_dev(priv); 634 struct device *dev = rsnd_priv_to_dev(priv);
635 struct rsnd_mod_ops *ops;
636 enum rsnd_mod_type type;
637 int (*attach)(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id,
638 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to);
616 int is_play = rsnd_io_is_play(io); 639 int is_play = rsnd_io_is_play(io);
640 int ret, dma_id;
617 641
618 /* 642 /*
619 * DMA failed. try to PIO mode 643 * DMA failed. try to PIO mode
@@ -622,35 +646,64 @@ int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id)
622 * rsnd_rdai_continuance_probe() 646 * rsnd_rdai_continuance_probe()
623 */ 647 */
624 if (!dmac) 648 if (!dmac)
625 return -EAGAIN; 649 return ERR_PTR(-EAGAIN);
626 650
627 rsnd_dma_of_path(dma, io, is_play, &mod_from, &mod_to); 651 dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL);
652 if (!dma)
653 return ERR_PTR(-ENOMEM);
654
655 rsnd_dma_of_path(mod, io, is_play, &mod_from, &mod_to);
628 656
629 dma->src_addr = rsnd_dma_addr(io, mod_from, is_play, 1); 657 dma->src_addr = rsnd_dma_addr(io, mod_from, is_play, 1);
630 dma->dst_addr = rsnd_dma_addr(io, mod_to, is_play, 0); 658 dma->dst_addr = rsnd_dma_addr(io, mod_to, is_play, 0);
631 659
632 /* for Gen2 */ 660 /* for Gen2 */
633 if (mod_from && mod_to) 661 if (mod_from && mod_to) {
634 dma->ops = &rsnd_dmapp_ops; 662 ops = &rsnd_dmapp_ops;
635 else 663 attach = rsnd_dmapp_attach;
636 dma->ops = &rsnd_dmaen_ops; 664 dma_id = dmac->dmapp_num;
665 type = RSND_MOD_AUDMAPP;
666 } else {
667 ops = &rsnd_dmaen_ops;
668 attach = rsnd_dmaen_attach;
669 dma_id = dmac->dmaen_num;
670 type = RSND_MOD_AUDMA;
671 }
637 672
638 /* for Gen1, overwrite */ 673 /* for Gen1, overwrite */
639 if (rsnd_is_gen1(priv)) 674 if (rsnd_is_gen1(priv)) {
640 dma->ops = &rsnd_dmaen_ops; 675 ops = &rsnd_dmaen_ops;
676 attach = rsnd_dmaen_attach;
677 dma_id = dmac->dmaen_num;
678 type = RSND_MOD_AUDMA;
679 }
680
681 dma_mod = rsnd_mod_get(dma);
682
683 ret = rsnd_mod_init(priv, dma_mod,
684 ops, NULL, type, dma_id);
685 if (ret < 0)
686 return ERR_PTR(ret);
641 687
642 dev_dbg(dev, "%s %s[%d] -> %s[%d]\n", 688 dev_dbg(dev, "%s[%d] %s[%d] -> %s[%d]\n",
643 dma->ops->name, 689 rsnd_mod_name(dma_mod), rsnd_mod_id(dma_mod),
644 rsnd_mod_name(mod_from), rsnd_mod_id(mod_from), 690 rsnd_mod_name(mod_from), rsnd_mod_id(mod_from),
645 rsnd_mod_name(mod_to), rsnd_mod_id(mod_to)); 691 rsnd_mod_name(mod_to), rsnd_mod_id(mod_to));
646 692
647 return dma->ops->init(io, dma, id, mod_from, mod_to); 693 ret = attach(io, dma, id, mod_from, mod_to);
694 if (ret < 0)
695 return ERR_PTR(ret);
696
697 ret = rsnd_dai_connect(dma_mod, io, type);
698 if (ret < 0)
699 return ERR_PTR(ret);
700
701 return rsnd_mod_get(dma);
648} 702}
649 703
650int rsnd_dma_probe(struct platform_device *pdev, 704int rsnd_dma_probe(struct rsnd_priv *priv)
651 const struct rsnd_of_data *of_data,
652 struct rsnd_priv *priv)
653{ 705{
706 struct platform_device *pdev = rsnd_priv_to_pdev(priv);
654 struct device *dev = rsnd_priv_to_dev(priv); 707 struct device *dev = rsnd_priv_to_dev(priv);
655 struct rsnd_dma_ctrl *dmac; 708 struct rsnd_dma_ctrl *dmac;
656 struct resource *res; 709 struct resource *res;
diff --git a/sound/soc/sh/rcar/dvc.c b/sound/soc/sh/rcar/dvc.c
index 58f690900e6d..d45ffe496397 100644
--- a/sound/soc/sh/rcar/dvc.c
+++ b/sound/soc/sh/rcar/dvc.c
@@ -15,7 +15,6 @@
15#define DVC_NAME "dvc" 15#define DVC_NAME "dvc"
16 16
17struct rsnd_dvc { 17struct rsnd_dvc {
18 struct rsnd_dvc_platform_info *info; /* rcar_snd.h */
19 struct rsnd_mod mod; 18 struct rsnd_mod mod;
20 struct rsnd_kctrl_cfg_m volume; 19 struct rsnd_kctrl_cfg_m volume;
21 struct rsnd_kctrl_cfg_m mute; 20 struct rsnd_kctrl_cfg_m mute;
@@ -24,6 +23,7 @@ struct rsnd_dvc {
24 struct rsnd_kctrl_cfg_s rdown; /* Ramp Rate Down */ 23 struct rsnd_kctrl_cfg_s rdown; /* Ramp Rate Down */
25}; 24};
26 25
26#define rsnd_dvc_get(priv, id) ((struct rsnd_dvc *)(priv->dvc) + id)
27#define rsnd_dvc_nr(priv) ((priv)->dvc_nr) 27#define rsnd_dvc_nr(priv) ((priv)->dvc_nr)
28#define rsnd_dvc_of_node(priv) \ 28#define rsnd_dvc_of_node(priv) \
29 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,dvc") 29 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,dvc")
@@ -64,79 +64,142 @@ static const char * const dvc_ramp_rate[] = {
64 "0.125 dB/8192 steps", /* 10111 */ 64 "0.125 dB/8192 steps", /* 10111 */
65}; 65};
66 66
67static void rsnd_dvc_soft_reset(struct rsnd_mod *mod) 67static void rsnd_dvc_activation(struct rsnd_mod *mod)
68{ 68{
69 rsnd_mod_write(mod, DVC_SWRSR, 0); 69 rsnd_mod_write(mod, DVC_SWRSR, 0);
70 rsnd_mod_write(mod, DVC_SWRSR, 1); 70 rsnd_mod_write(mod, DVC_SWRSR, 1);
71} 71}
72 72
73#define rsnd_dvc_initialize_lock(mod) __rsnd_dvc_initialize_lock(mod, 1) 73static void rsnd_dvc_halt(struct rsnd_mod *mod)
74#define rsnd_dvc_initialize_unlock(mod) __rsnd_dvc_initialize_lock(mod, 0)
75static void __rsnd_dvc_initialize_lock(struct rsnd_mod *mod, u32 enable)
76{ 74{
77 rsnd_mod_write(mod, DVC_DVUIR, enable); 75 rsnd_mod_write(mod, DVC_DVUIR, 1);
76 rsnd_mod_write(mod, DVC_SWRSR, 0);
78} 77}
79 78
80static void rsnd_dvc_volume_update(struct rsnd_dai_stream *io, 79#define rsnd_dvc_get_vrpdr(dvc) (dvc->rup.val << 8 | dvc->rdown.val)
81 struct rsnd_mod *mod) 80#define rsnd_dvc_get_vrdbr(dvc) (0x3ff - (dvc->volume.val[0] >> 13))
81
82static void rsnd_dvc_volume_parameter(struct rsnd_dai_stream *io,
83 struct rsnd_mod *mod)
82{ 84{
83 struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod); 85 struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod);
84 u32 val[RSND_DVC_CHANNELS]; 86 u32 val[RSND_DVC_CHANNELS];
85 u32 dvucr = 0;
86 u32 mute = 0;
87 int i; 87 int i;
88 88
89 for (i = 0; i < dvc->mute.cfg.size; i++) 89 /* Enable Ramp */
90 mute |= (!!dvc->mute.cfg.val[i]) << i; 90 if (dvc->ren.val)
91 for (i = 0; i < RSND_DVC_CHANNELS; i++)
92 val[i] = dvc->volume.cfg.max;
93 else
94 for (i = 0; i < RSND_DVC_CHANNELS; i++)
95 val[i] = dvc->volume.val[i];
91 96
92 /* Disable DVC Register access */ 97 /* Enable Digital Volume */
93 rsnd_mod_write(mod, DVC_DVUER, 0); 98 rsnd_mod_write(mod, DVC_VOL0R, val[0]);
99 rsnd_mod_write(mod, DVC_VOL1R, val[1]);
100 rsnd_mod_write(mod, DVC_VOL2R, val[2]);
101 rsnd_mod_write(mod, DVC_VOL3R, val[3]);
102 rsnd_mod_write(mod, DVC_VOL4R, val[4]);
103 rsnd_mod_write(mod, DVC_VOL5R, val[5]);
104 rsnd_mod_write(mod, DVC_VOL6R, val[6]);
105 rsnd_mod_write(mod, DVC_VOL7R, val[7]);
106}
107
108static void rsnd_dvc_volume_init(struct rsnd_dai_stream *io,
109 struct rsnd_mod *mod)
110{
111 struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod);
112 u32 adinr = 0;
113 u32 dvucr = 0;
114 u32 vrctr = 0;
115 u32 vrpdr = 0;
116 u32 vrdbr = 0;
117
118 adinr = rsnd_get_adinr_bit(mod, io) |
119 rsnd_get_adinr_chan(mod, io);
120
121 /* Enable Digital Volume, Zero Cross Mute Mode */
122 dvucr |= 0x101;
94 123
95 /* Enable Ramp */ 124 /* Enable Ramp */
96 if (dvc->ren.val) { 125 if (dvc->ren.val) {
97 dvucr |= 0x10; 126 dvucr |= 0x10;
98 127
99 /* Digital Volume Max */
100 for (i = 0; i < RSND_DVC_CHANNELS; i++)
101 val[i] = dvc->volume.cfg.max;
102
103 rsnd_mod_write(mod, DVC_VRCTR, 0xff);
104 rsnd_mod_write(mod, DVC_VRPDR, dvc->rup.val << 8 |
105 dvc->rdown.val);
106 /* 128 /*
107 * FIXME !! 129 * FIXME !!
108 * use scale-downed Digital Volume 130 * use scale-downed Digital Volume
109 * as Volume Ramp 131 * as Volume Ramp
110 * 7F FFFF -> 3FF 132 * 7F FFFF -> 3FF
111 */ 133 */
112 rsnd_mod_write(mod, DVC_VRDBR, 134 vrctr = 0xff;
113 0x3ff - (dvc->volume.val[0] >> 13)); 135 vrpdr = rsnd_dvc_get_vrpdr(dvc);
114 136 vrdbr = rsnd_dvc_get_vrdbr(dvc);
115 } else {
116 for (i = 0; i < RSND_DVC_CHANNELS; i++)
117 val[i] = dvc->volume.val[i];
118 } 137 }
119 138
120 /* Enable Digital Volume */ 139 /* Initialize operation */
121 dvucr |= 0x100; 140 rsnd_mod_write(mod, DVC_DVUIR, 1);
122 rsnd_mod_write(mod, DVC_VOL0R, val[0]); 141
123 rsnd_mod_write(mod, DVC_VOL1R, val[1]); 142 /* General Information */
143 rsnd_mod_write(mod, DVC_ADINR, adinr);
144 rsnd_mod_write(mod, DVC_DVUCR, dvucr);
145
146 /* Volume Ramp Parameter */
147 rsnd_mod_write(mod, DVC_VRCTR, vrctr);
148 rsnd_mod_write(mod, DVC_VRPDR, vrpdr);
149 rsnd_mod_write(mod, DVC_VRDBR, vrdbr);
150
151 /* Digital Volume Function Parameter */
152 rsnd_dvc_volume_parameter(io, mod);
153
154 /* cancel operation */
155 rsnd_mod_write(mod, DVC_DVUIR, 0);
156}
157
158static void rsnd_dvc_volume_update(struct rsnd_dai_stream *io,
159 struct rsnd_mod *mod)
160{
161 struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod);
162 u32 zcmcr = 0;
163 u32 vrpdr = 0;
164 u32 vrdbr = 0;
165 int i;
166
167 for (i = 0; i < dvc->mute.cfg.size; i++)
168 zcmcr |= (!!dvc->mute.cfg.val[i]) << i;
124 169
125 /* Enable Mute */ 170 if (dvc->ren.val) {
126 if (mute) { 171 vrpdr = rsnd_dvc_get_vrpdr(dvc);
127 dvucr |= 0x1; 172 vrdbr = rsnd_dvc_get_vrdbr(dvc);
128 rsnd_mod_write(mod, DVC_ZCMCR, mute);
129 } 173 }
130 174
131 rsnd_mod_write(mod, DVC_DVUCR, dvucr); 175 /* Disable DVC Register access */
176 rsnd_mod_write(mod, DVC_DVUER, 0);
177
178 /* Zero Cross Mute Function */
179 rsnd_mod_write(mod, DVC_ZCMCR, zcmcr);
180
181 /* Volume Ramp Function */
182 rsnd_mod_write(mod, DVC_VRPDR, vrpdr);
183 rsnd_mod_write(mod, DVC_VRDBR, vrdbr);
184 /* add DVC_VRWTR here */
185
186 /* Digital Volume Function Parameter */
187 rsnd_dvc_volume_parameter(io, mod);
132 188
133 /* Enable DVC Register access */ 189 /* Enable DVC Register access */
134 rsnd_mod_write(mod, DVC_DVUER, 1); 190 rsnd_mod_write(mod, DVC_DVUER, 1);
135} 191}
136 192
137static int rsnd_dvc_remove_gen2(struct rsnd_mod *mod, 193static int rsnd_dvc_probe_(struct rsnd_mod *mod,
138 struct rsnd_dai_stream *io, 194 struct rsnd_dai_stream *io,
139 struct rsnd_priv *priv) 195 struct rsnd_priv *priv)
196{
197 return rsnd_cmd_attach(io, rsnd_mod_id(mod));
198}
199
200static int rsnd_dvc_remove_(struct rsnd_mod *mod,
201 struct rsnd_dai_stream *io,
202 struct rsnd_priv *priv)
140{ 203{
141 struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod); 204 struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod);
142 205
@@ -155,19 +218,12 @@ static int rsnd_dvc_init(struct rsnd_mod *mod,
155{ 218{
156 rsnd_mod_power_on(mod); 219 rsnd_mod_power_on(mod);
157 220
158 rsnd_dvc_soft_reset(mod); 221 rsnd_dvc_activation(mod);
159
160 rsnd_dvc_initialize_lock(mod);
161
162 rsnd_path_parse(priv, io);
163 222
164 rsnd_mod_write(mod, DVC_ADINR, rsnd_get_adinr_bit(mod, io)); 223 rsnd_dvc_volume_init(io, mod);
165 224
166 /* ch0/ch1 Volume */
167 rsnd_dvc_volume_update(io, mod); 225 rsnd_dvc_volume_update(io, mod);
168 226
169 rsnd_adg_set_cmd_timsel_gen2(mod, io);
170
171 return 0; 227 return 0;
172} 228}
173 229
@@ -175,27 +231,9 @@ static int rsnd_dvc_quit(struct rsnd_mod *mod,
175 struct rsnd_dai_stream *io, 231 struct rsnd_dai_stream *io,
176 struct rsnd_priv *priv) 232 struct rsnd_priv *priv)
177{ 233{
178 rsnd_mod_power_off(mod); 234 rsnd_dvc_halt(mod);
179 235
180 return 0; 236 rsnd_mod_power_off(mod);
181}
182
183static int rsnd_dvc_start(struct rsnd_mod *mod,
184 struct rsnd_dai_stream *io,
185 struct rsnd_priv *priv)
186{
187 rsnd_dvc_initialize_unlock(mod);
188
189 rsnd_mod_write(mod, CMD_CTRL, 0x10);
190
191 return 0;
192}
193
194static int rsnd_dvc_stop(struct rsnd_mod *mod,
195 struct rsnd_dai_stream *io,
196 struct rsnd_priv *priv)
197{
198 rsnd_mod_write(mod, CMD_CTRL, 0);
199 237
200 return 0; 238 return 0;
201} 239}
@@ -206,6 +244,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
206{ 244{
207 struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod); 245 struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod);
208 int is_play = rsnd_io_is_play(io); 246 int is_play = rsnd_io_is_play(io);
247 int slots = rsnd_get_slot(io);
209 int ret; 248 int ret;
210 249
211 /* Volume */ 250 /* Volume */
@@ -213,7 +252,8 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
213 is_play ? 252 is_play ?
214 "DVC Out Playback Volume" : "DVC In Capture Volume", 253 "DVC Out Playback Volume" : "DVC In Capture Volume",
215 rsnd_dvc_volume_update, 254 rsnd_dvc_volume_update,
216 &dvc->volume, 0x00800000 - 1); 255 &dvc->volume, slots,
256 0x00800000 - 1);
217 if (ret < 0) 257 if (ret < 0)
218 return ret; 258 return ret;
219 259
@@ -222,7 +262,8 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
222 is_play ? 262 is_play ?
223 "DVC Out Mute Switch" : "DVC In Mute Switch", 263 "DVC Out Mute Switch" : "DVC In Mute Switch",
224 rsnd_dvc_volume_update, 264 rsnd_dvc_volume_update,
225 &dvc->mute, 1); 265 &dvc->mute, slots,
266 1);
226 if (ret < 0) 267 if (ret < 0)
227 return ret; 268 return ret;
228 269
@@ -269,11 +310,10 @@ static struct dma_chan *rsnd_dvc_dma_req(struct rsnd_dai_stream *io,
269static struct rsnd_mod_ops rsnd_dvc_ops = { 310static struct rsnd_mod_ops rsnd_dvc_ops = {
270 .name = DVC_NAME, 311 .name = DVC_NAME,
271 .dma_req = rsnd_dvc_dma_req, 312 .dma_req = rsnd_dvc_dma_req,
272 .remove = rsnd_dvc_remove_gen2, 313 .probe = rsnd_dvc_probe_,
314 .remove = rsnd_dvc_remove_,
273 .init = rsnd_dvc_init, 315 .init = rsnd_dvc_init,
274 .quit = rsnd_dvc_quit, 316 .quit = rsnd_dvc_quit,
275 .start = rsnd_dvc_start,
276 .stop = rsnd_dvc_stop,
277 .pcm_new = rsnd_dvc_pcm_new, 317 .pcm_new = rsnd_dvc_pcm_new,
278}; 318};
279 319
@@ -282,50 +322,13 @@ struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id)
282 if (WARN_ON(id < 0 || id >= rsnd_dvc_nr(priv))) 322 if (WARN_ON(id < 0 || id >= rsnd_dvc_nr(priv)))
283 id = 0; 323 id = 0;
284 324
285 return rsnd_mod_get((struct rsnd_dvc *)(priv->dvc) + id); 325 return rsnd_mod_get(rsnd_dvc_get(priv, id));
286} 326}
287 327
288static void rsnd_of_parse_dvc(struct platform_device *pdev, 328int rsnd_dvc_probe(struct rsnd_priv *priv)
289 const struct rsnd_of_data *of_data,
290 struct rsnd_priv *priv)
291{ 329{
292 struct device_node *node; 330 struct device_node *node;
293 struct rsnd_dvc_platform_info *dvc_info; 331 struct device_node *np;
294 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
295 struct device *dev = &pdev->dev;
296 int nr;
297
298 if (!of_data)
299 return;
300
301 node = of_get_child_by_name(dev->of_node, "rcar_sound,dvc");
302 if (!node)
303 return;
304
305 nr = of_get_child_count(node);
306 if (!nr)
307 goto rsnd_of_parse_dvc_end;
308
309 dvc_info = devm_kzalloc(dev,
310 sizeof(struct rsnd_dvc_platform_info) * nr,
311 GFP_KERNEL);
312 if (!dvc_info) {
313 dev_err(dev, "dvc info allocation error\n");
314 goto rsnd_of_parse_dvc_end;
315 }
316
317 info->dvc_info = dvc_info;
318 info->dvc_info_nr = nr;
319
320rsnd_of_parse_dvc_end:
321 of_node_put(node);
322}
323
324int rsnd_dvc_probe(struct platform_device *pdev,
325 const struct rsnd_of_data *of_data,
326 struct rsnd_priv *priv)
327{
328 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
329 struct device *dev = rsnd_priv_to_dev(priv); 332 struct device *dev = rsnd_priv_to_dev(priv);
330 struct rsnd_dvc *dvc; 333 struct rsnd_dvc *dvc;
331 struct clk *clk; 334 struct clk *clk;
@@ -336,40 +339,54 @@ int rsnd_dvc_probe(struct platform_device *pdev,
336 if (rsnd_is_gen1(priv)) 339 if (rsnd_is_gen1(priv))
337 return 0; 340 return 0;
338 341
339 rsnd_of_parse_dvc(pdev, of_data, priv); 342 node = rsnd_dvc_of_node(priv);
343 if (!node)
344 return 0; /* not used is not error */
340 345
341 nr = info->dvc_info_nr; 346 nr = of_get_child_count(node);
342 if (!nr) 347 if (!nr) {
343 return 0; 348 ret = -EINVAL;
349 goto rsnd_dvc_probe_done;
350 }
344 351
345 dvc = devm_kzalloc(dev, sizeof(*dvc) * nr, GFP_KERNEL); 352 dvc = devm_kzalloc(dev, sizeof(*dvc) * nr, GFP_KERNEL);
346 if (!dvc) 353 if (!dvc) {
347 return -ENOMEM; 354 ret = -ENOMEM;
355 goto rsnd_dvc_probe_done;
356 }
348 357
349 priv->dvc_nr = nr; 358 priv->dvc_nr = nr;
350 priv->dvc = dvc; 359 priv->dvc = dvc;
351 360
352 for_each_rsnd_dvc(dvc, priv, i) { 361 i = 0;
362 ret = 0;
363 for_each_child_of_node(node, np) {
364 dvc = rsnd_dvc_get(priv, i);
365
353 snprintf(name, RSND_DVC_NAME_SIZE, "%s.%d", 366 snprintf(name, RSND_DVC_NAME_SIZE, "%s.%d",
354 DVC_NAME, i); 367 DVC_NAME, i);
355 368
356 clk = devm_clk_get(dev, name); 369 clk = devm_clk_get(dev, name);
357 if (IS_ERR(clk)) 370 if (IS_ERR(clk)) {
358 return PTR_ERR(clk); 371 ret = PTR_ERR(clk);
359 372 goto rsnd_dvc_probe_done;
360 dvc->info = &info->dvc_info[i]; 373 }
361 374
362 ret = rsnd_mod_init(priv, rsnd_mod_get(dvc), &rsnd_dvc_ops, 375 ret = rsnd_mod_init(priv, rsnd_mod_get(dvc), &rsnd_dvc_ops,
363 clk, RSND_MOD_DVC, i); 376 clk, RSND_MOD_DVC, i);
364 if (ret) 377 if (ret)
365 return ret; 378 goto rsnd_dvc_probe_done;
379
380 i++;
366 } 381 }
367 382
368 return 0; 383rsnd_dvc_probe_done:
384 of_node_put(node);
385
386 return ret;
369} 387}
370 388
371void rsnd_dvc_remove(struct platform_device *pdev, 389void rsnd_dvc_remove(struct rsnd_priv *priv)
372 struct rsnd_priv *priv)
373{ 390{
374 struct rsnd_dvc *dvc; 391 struct rsnd_dvc *dvc;
375 int i; 392 int i;
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index edcf4cc2e84f..ea24247eba73 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -31,29 +31,33 @@ struct rsnd_gen {
31 31
32 /* RSND_REG_MAX base */ 32 /* RSND_REG_MAX base */
33 struct regmap_field *regs[RSND_REG_MAX]; 33 struct regmap_field *regs[RSND_REG_MAX];
34 const char *reg_name[RSND_REG_MAX];
34}; 35};
35 36
36#define rsnd_priv_to_gen(p) ((struct rsnd_gen *)(p)->gen) 37#define rsnd_priv_to_gen(p) ((struct rsnd_gen *)(p)->gen)
38#define rsnd_reg_name(gen, id) ((gen)->reg_name[id])
37 39
38struct rsnd_regmap_field_conf { 40struct rsnd_regmap_field_conf {
39 int idx; 41 int idx;
40 unsigned int reg_offset; 42 unsigned int reg_offset;
41 unsigned int id_offset; 43 unsigned int id_offset;
44 const char *reg_name;
42}; 45};
43 46
44#define RSND_REG_SET(id, offset, _id_offset) \ 47#define RSND_REG_SET(id, offset, _id_offset, n) \
45{ \ 48{ \
46 .idx = id, \ 49 .idx = id, \
47 .reg_offset = offset, \ 50 .reg_offset = offset, \
48 .id_offset = _id_offset, \ 51 .id_offset = _id_offset, \
52 .reg_name = n, \
49} 53}
50/* single address mapping */ 54/* single address mapping */
51#define RSND_GEN_S_REG(id, offset) \ 55#define RSND_GEN_S_REG(id, offset) \
52 RSND_REG_SET(RSND_REG_##id, offset, 0) 56 RSND_REG_SET(RSND_REG_##id, offset, 0, #id)
53 57
54/* multi address mapping */ 58/* multi address mapping */
55#define RSND_GEN_M_REG(id, offset, _id_offset) \ 59#define RSND_GEN_M_REG(id, offset, _id_offset) \
56 RSND_REG_SET(RSND_REG_##id, offset, _id_offset) 60 RSND_REG_SET(RSND_REG_##id, offset, _id_offset, #id)
57 61
58/* 62/*
59 * basic function 63 * basic function
@@ -83,8 +87,9 @@ u32 rsnd_read(struct rsnd_priv *priv,
83 87
84 regmap_fields_read(gen->regs[reg], rsnd_mod_id(mod), &val); 88 regmap_fields_read(gen->regs[reg], rsnd_mod_id(mod), &val);
85 89
86 dev_dbg(dev, "r %s[%d] - %4d : %08x\n", 90 dev_dbg(dev, "r %s[%d] - %-18s (%4d) : %08x\n",
87 rsnd_mod_name(mod), rsnd_mod_id(mod), reg, val); 91 rsnd_mod_name(mod), rsnd_mod_id(mod),
92 rsnd_reg_name(gen, reg), reg, val);
88 93
89 return val; 94 return val;
90} 95}
@@ -99,10 +104,11 @@ void rsnd_write(struct rsnd_priv *priv,
99 if (!rsnd_is_accessible_reg(priv, gen, reg)) 104 if (!rsnd_is_accessible_reg(priv, gen, reg))
100 return; 105 return;
101 106
102 dev_dbg(dev, "w %s[%d] - %4d : %08x\n",
103 rsnd_mod_name(mod), rsnd_mod_id(mod), reg, data);
104
105 regmap_fields_write(gen->regs[reg], rsnd_mod_id(mod), data); 107 regmap_fields_write(gen->regs[reg], rsnd_mod_id(mod), data);
108
109 dev_dbg(dev, "w %s[%d] - %-18s (%4d) : %08x\n",
110 rsnd_mod_name(mod), rsnd_mod_id(mod),
111 rsnd_reg_name(gen, reg), reg, data);
106} 112}
107 113
108void rsnd_force_write(struct rsnd_priv *priv, 114void rsnd_force_write(struct rsnd_priv *priv,
@@ -115,10 +121,11 @@ void rsnd_force_write(struct rsnd_priv *priv,
115 if (!rsnd_is_accessible_reg(priv, gen, reg)) 121 if (!rsnd_is_accessible_reg(priv, gen, reg))
116 return; 122 return;
117 123
118 dev_dbg(dev, "w %s[%d] - %4d : %08x\n",
119 rsnd_mod_name(mod), rsnd_mod_id(mod), reg, data);
120
121 regmap_fields_force_write(gen->regs[reg], rsnd_mod_id(mod), data); 124 regmap_fields_force_write(gen->regs[reg], rsnd_mod_id(mod), data);
125
126 dev_dbg(dev, "w %s[%d] - %-18s (%4d) : %08x\n",
127 rsnd_mod_name(mod), rsnd_mod_id(mod),
128 rsnd_reg_name(gen, reg), reg, data);
122} 129}
123 130
124void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod, 131void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod,
@@ -130,11 +137,13 @@ void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod,
130 if (!rsnd_is_accessible_reg(priv, gen, reg)) 137 if (!rsnd_is_accessible_reg(priv, gen, reg))
131 return; 138 return;
132 139
133 dev_dbg(dev, "b %s[%d] - %4d : %08x/%08x\n",
134 rsnd_mod_name(mod), rsnd_mod_id(mod), reg, data, mask);
135
136 regmap_fields_update_bits(gen->regs[reg], rsnd_mod_id(mod), 140 regmap_fields_update_bits(gen->regs[reg], rsnd_mod_id(mod),
137 mask, data); 141 mask, data);
142
143 dev_dbg(dev, "b %s[%d] - %-18s (%4d) : %08x/%08x\n",
144 rsnd_mod_name(mod), rsnd_mod_id(mod),
145 rsnd_reg_name(gen, reg), reg, data, mask);
146
138} 147}
139 148
140phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id) 149phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id)
@@ -150,7 +159,7 @@ static int _rsnd_gen_regmap_init(struct rsnd_priv *priv,
150 int id_size, 159 int id_size,
151 int reg_id, 160 int reg_id,
152 const char *name, 161 const char *name,
153 struct rsnd_regmap_field_conf *conf, 162 const struct rsnd_regmap_field_conf *conf,
154 int conf_size) 163 int conf_size)
155{ 164{
156 struct platform_device *pdev = rsnd_priv_to_pdev(priv); 165 struct platform_device *pdev = rsnd_priv_to_pdev(priv);
@@ -203,6 +212,7 @@ static int _rsnd_gen_regmap_init(struct rsnd_priv *priv,
203 212
204 /* RSND_REG_MAX base */ 213 /* RSND_REG_MAX base */
205 gen->regs[conf[i].idx] = regs; 214 gen->regs[conf[i].idx] = regs;
215 gen->reg_name[conf[i].idx] = conf[i].reg_name;
206 } 216 }
207 217
208 return 0; 218 return 0;
@@ -211,25 +221,31 @@ static int _rsnd_gen_regmap_init(struct rsnd_priv *priv,
211/* 221/*
212 * Gen2 222 * Gen2
213 */ 223 */
214static int rsnd_gen2_probe(struct platform_device *pdev, 224static int rsnd_gen2_probe(struct rsnd_priv *priv)
215 struct rsnd_priv *priv)
216{ 225{
217 struct rsnd_regmap_field_conf conf_ssiu[] = { 226 const static struct rsnd_regmap_field_conf conf_ssiu[] = {
218 RSND_GEN_S_REG(SSI_MODE0, 0x800), 227 RSND_GEN_S_REG(SSI_MODE0, 0x800),
219 RSND_GEN_S_REG(SSI_MODE1, 0x804), 228 RSND_GEN_S_REG(SSI_MODE1, 0x804),
229 RSND_GEN_S_REG(SSI_MODE2, 0x808),
230 RSND_GEN_S_REG(SSI_CONTROL, 0x810),
231
220 /* FIXME: it needs SSI_MODE2/3 in the future */ 232 /* FIXME: it needs SSI_MODE2/3 in the future */
221 RSND_GEN_M_REG(SSI_BUSIF_MODE, 0x0, 0x80), 233 RSND_GEN_M_REG(SSI_BUSIF_MODE, 0x0, 0x80),
222 RSND_GEN_M_REG(SSI_BUSIF_ADINR, 0x4, 0x80), 234 RSND_GEN_M_REG(SSI_BUSIF_ADINR, 0x4, 0x80),
223 RSND_GEN_M_REG(SSI_BUSIF_DALIGN,0x8, 0x80), 235 RSND_GEN_M_REG(SSI_BUSIF_DALIGN,0x8, 0x80),
236 RSND_GEN_M_REG(SSI_MODE, 0xc, 0x80),
224 RSND_GEN_M_REG(SSI_CTRL, 0x10, 0x80), 237 RSND_GEN_M_REG(SSI_CTRL, 0x10, 0x80),
225 RSND_GEN_M_REG(SSI_INT_ENABLE, 0x18, 0x80), 238 RSND_GEN_M_REG(SSI_INT_ENABLE, 0x18, 0x80),
226 }; 239 };
227 struct rsnd_regmap_field_conf conf_scu[] = { 240
228 RSND_GEN_M_REG(SRC_BUSIF_MODE, 0x0, 0x20), 241 const static struct rsnd_regmap_field_conf conf_scu[] = {
242 RSND_GEN_M_REG(SRC_I_BUSIF_MODE,0x0, 0x20),
243 RSND_GEN_M_REG(SRC_O_BUSIF_MODE,0x4, 0x20),
229 RSND_GEN_M_REG(SRC_BUSIF_DALIGN,0x8, 0x20), 244 RSND_GEN_M_REG(SRC_BUSIF_DALIGN,0x8, 0x20),
230 RSND_GEN_M_REG(SRC_ROUTE_MODE0, 0xc, 0x20), 245 RSND_GEN_M_REG(SRC_ROUTE_MODE0, 0xc, 0x20),
231 RSND_GEN_M_REG(SRC_CTRL, 0x10, 0x20), 246 RSND_GEN_M_REG(SRC_CTRL, 0x10, 0x20),
232 RSND_GEN_M_REG(SRC_INT_ENABLE0, 0x18, 0x20), 247 RSND_GEN_M_REG(SRC_INT_ENABLE0, 0x18, 0x20),
248 RSND_GEN_M_REG(CMD_BUSIF_DALIGN,0x188, 0x20),
233 RSND_GEN_M_REG(CMD_ROUTE_SLCT, 0x18c, 0x20), 249 RSND_GEN_M_REG(CMD_ROUTE_SLCT, 0x18c, 0x20),
234 RSND_GEN_M_REG(CMD_CTRL, 0x190, 0x20), 250 RSND_GEN_M_REG(CMD_CTRL, 0x190, 0x20),
235 RSND_GEN_S_REG(SCU_SYS_STATUS0, 0x1c8), 251 RSND_GEN_S_REG(SCU_SYS_STATUS0, 0x1c8),
@@ -266,9 +282,15 @@ static int rsnd_gen2_probe(struct platform_device *pdev,
266 RSND_GEN_M_REG(DVC_VRDBR, 0xe20, 0x100), 282 RSND_GEN_M_REG(DVC_VRDBR, 0xe20, 0x100),
267 RSND_GEN_M_REG(DVC_VOL0R, 0xe28, 0x100), 283 RSND_GEN_M_REG(DVC_VOL0R, 0xe28, 0x100),
268 RSND_GEN_M_REG(DVC_VOL1R, 0xe2c, 0x100), 284 RSND_GEN_M_REG(DVC_VOL1R, 0xe2c, 0x100),
285 RSND_GEN_M_REG(DVC_VOL2R, 0xe30, 0x100),
286 RSND_GEN_M_REG(DVC_VOL3R, 0xe34, 0x100),
287 RSND_GEN_M_REG(DVC_VOL4R, 0xe38, 0x100),
288 RSND_GEN_M_REG(DVC_VOL5R, 0xe3c, 0x100),
289 RSND_GEN_M_REG(DVC_VOL6R, 0xe40, 0x100),
290 RSND_GEN_M_REG(DVC_VOL7R, 0xe44, 0x100),
269 RSND_GEN_M_REG(DVC_DVUER, 0xe48, 0x100), 291 RSND_GEN_M_REG(DVC_DVUER, 0xe48, 0x100),
270 }; 292 };
271 struct rsnd_regmap_field_conf conf_adg[] = { 293 const static struct rsnd_regmap_field_conf conf_adg[] = {
272 RSND_GEN_S_REG(BRRA, 0x00), 294 RSND_GEN_S_REG(BRRA, 0x00),
273 RSND_GEN_S_REG(BRRB, 0x04), 295 RSND_GEN_S_REG(BRRB, 0x04),
274 RSND_GEN_S_REG(SSICKR, 0x08), 296 RSND_GEN_S_REG(SSICKR, 0x08),
@@ -288,7 +310,7 @@ static int rsnd_gen2_probe(struct platform_device *pdev,
288 RSND_GEN_S_REG(SRCOUT_TIMSEL4, 0x58), 310 RSND_GEN_S_REG(SRCOUT_TIMSEL4, 0x58),
289 RSND_GEN_S_REG(CMDOUT_TIMSEL, 0x5c), 311 RSND_GEN_S_REG(CMDOUT_TIMSEL, 0x5c),
290 }; 312 };
291 struct rsnd_regmap_field_conf conf_ssi[] = { 313 const static struct rsnd_regmap_field_conf conf_ssi[] = {
292 RSND_GEN_M_REG(SSICR, 0x00, 0x40), 314 RSND_GEN_M_REG(SSICR, 0x00, 0x40),
293 RSND_GEN_M_REG(SSISR, 0x04, 0x40), 315 RSND_GEN_M_REG(SSISR, 0x04, 0x40),
294 RSND_GEN_M_REG(SSITDR, 0x08, 0x40), 316 RSND_GEN_M_REG(SSITDR, 0x08, 0x40),
@@ -317,65 +339,30 @@ static int rsnd_gen2_probe(struct platform_device *pdev,
317 * Gen1 339 * Gen1
318 */ 340 */
319 341
320static int rsnd_gen1_probe(struct platform_device *pdev, 342static int rsnd_gen1_probe(struct rsnd_priv *priv)
321 struct rsnd_priv *priv)
322{ 343{
323 struct rsnd_regmap_field_conf conf_sru[] = { 344 const static struct rsnd_regmap_field_conf conf_adg[] = {
324 RSND_GEN_S_REG(SRC_ROUTE_SEL, 0x00),
325 RSND_GEN_S_REG(SRC_TMG_SEL0, 0x08),
326 RSND_GEN_S_REG(SRC_TMG_SEL1, 0x0c),
327 RSND_GEN_S_REG(SRC_TMG_SEL2, 0x10),
328 RSND_GEN_S_REG(SRC_ROUTE_CTRL, 0xc0),
329 RSND_GEN_S_REG(SSI_MODE0, 0xD0),
330 RSND_GEN_S_REG(SSI_MODE1, 0xD4),
331 RSND_GEN_M_REG(SRC_BUSIF_MODE, 0x20, 0x4),
332 RSND_GEN_M_REG(SRC_ROUTE_MODE0, 0x50, 0x8),
333 RSND_GEN_M_REG(SRC_SWRSR, 0x200, 0x40),
334 RSND_GEN_M_REG(SRC_SRCIR, 0x204, 0x40),
335 RSND_GEN_M_REG(SRC_ADINR, 0x214, 0x40),
336 RSND_GEN_M_REG(SRC_IFSCR, 0x21c, 0x40),
337 RSND_GEN_M_REG(SRC_IFSVR, 0x220, 0x40),
338 RSND_GEN_M_REG(SRC_SRCCR, 0x224, 0x40),
339 RSND_GEN_M_REG(SRC_MNFSR, 0x228, 0x40),
340 /*
341 * ADD US
342 *
343 * SRC_STATUS
344 * SRC_INT_EN
345 * SCU_SYS_STATUS0
346 * SCU_SYS_STATUS1
347 * SCU_SYS_INT_EN0
348 * SCU_SYS_INT_EN1
349 */
350 };
351 struct rsnd_regmap_field_conf conf_adg[] = {
352 RSND_GEN_S_REG(BRRA, 0x00), 345 RSND_GEN_S_REG(BRRA, 0x00),
353 RSND_GEN_S_REG(BRRB, 0x04), 346 RSND_GEN_S_REG(BRRB, 0x04),
354 RSND_GEN_S_REG(SSICKR, 0x08), 347 RSND_GEN_S_REG(SSICKR, 0x08),
355 RSND_GEN_S_REG(AUDIO_CLK_SEL0, 0x0c), 348 RSND_GEN_S_REG(AUDIO_CLK_SEL0, 0x0c),
356 RSND_GEN_S_REG(AUDIO_CLK_SEL1, 0x10), 349 RSND_GEN_S_REG(AUDIO_CLK_SEL1, 0x10),
357 RSND_GEN_S_REG(AUDIO_CLK_SEL3, 0x18),
358 RSND_GEN_S_REG(AUDIO_CLK_SEL4, 0x1c),
359 RSND_GEN_S_REG(AUDIO_CLK_SEL5, 0x20),
360 }; 350 };
361 struct rsnd_regmap_field_conf conf_ssi[] = { 351 const static struct rsnd_regmap_field_conf conf_ssi[] = {
362 RSND_GEN_M_REG(SSICR, 0x00, 0x40), 352 RSND_GEN_M_REG(SSICR, 0x00, 0x40),
363 RSND_GEN_M_REG(SSISR, 0x04, 0x40), 353 RSND_GEN_M_REG(SSISR, 0x04, 0x40),
364 RSND_GEN_M_REG(SSITDR, 0x08, 0x40), 354 RSND_GEN_M_REG(SSITDR, 0x08, 0x40),
365 RSND_GEN_M_REG(SSIRDR, 0x0c, 0x40), 355 RSND_GEN_M_REG(SSIRDR, 0x0c, 0x40),
366 RSND_GEN_M_REG(SSIWSR, 0x20, 0x40), 356 RSND_GEN_M_REG(SSIWSR, 0x20, 0x40),
367 }; 357 };
368 int ret_sru;
369 int ret_adg; 358 int ret_adg;
370 int ret_ssi; 359 int ret_ssi;
371 360
372 ret_sru = rsnd_gen_regmap_init(priv, 9, RSND_GEN1_SRU, "sru", conf_sru);
373 ret_adg = rsnd_gen_regmap_init(priv, 9, RSND_GEN1_ADG, "adg", conf_adg); 361 ret_adg = rsnd_gen_regmap_init(priv, 9, RSND_GEN1_ADG, "adg", conf_adg);
374 ret_ssi = rsnd_gen_regmap_init(priv, 9, RSND_GEN1_SSI, "ssi", conf_ssi); 362 ret_ssi = rsnd_gen_regmap_init(priv, 9, RSND_GEN1_SSI, "ssi", conf_ssi);
375 if (ret_sru < 0 || 363 if (ret_adg < 0 ||
376 ret_adg < 0 ||
377 ret_ssi < 0) 364 ret_ssi < 0)
378 return ret_sru | ret_adg | ret_ssi; 365 return ret_adg | ret_ssi;
379 366
380 return 0; 367 return 0;
381} 368}
@@ -383,28 +370,12 @@ static int rsnd_gen1_probe(struct platform_device *pdev,
383/* 370/*
384 * Gen 371 * Gen
385 */ 372 */
386static void rsnd_of_parse_gen(struct platform_device *pdev, 373int rsnd_gen_probe(struct rsnd_priv *priv)
387 const struct rsnd_of_data *of_data,
388 struct rsnd_priv *priv)
389{
390 struct rcar_snd_info *info = priv->info;
391
392 if (!of_data)
393 return;
394
395 info->flags = of_data->flags;
396}
397
398int rsnd_gen_probe(struct platform_device *pdev,
399 const struct rsnd_of_data *of_data,
400 struct rsnd_priv *priv)
401{ 374{
402 struct device *dev = rsnd_priv_to_dev(priv); 375 struct device *dev = rsnd_priv_to_dev(priv);
403 struct rsnd_gen *gen; 376 struct rsnd_gen *gen;
404 int ret; 377 int ret;
405 378
406 rsnd_of_parse_gen(pdev, of_data, priv);
407
408 gen = devm_kzalloc(dev, sizeof(*gen), GFP_KERNEL); 379 gen = devm_kzalloc(dev, sizeof(*gen), GFP_KERNEL);
409 if (!gen) { 380 if (!gen) {
410 dev_err(dev, "GEN allocate failed\n"); 381 dev_err(dev, "GEN allocate failed\n");
@@ -415,9 +386,9 @@ int rsnd_gen_probe(struct platform_device *pdev,
415 386
416 ret = -ENODEV; 387 ret = -ENODEV;
417 if (rsnd_is_gen1(priv)) 388 if (rsnd_is_gen1(priv))
418 ret = rsnd_gen1_probe(pdev, priv); 389 ret = rsnd_gen1_probe(priv);
419 else if (rsnd_is_gen2(priv)) 390 else if (rsnd_is_gen2(priv))
420 ret = rsnd_gen2_probe(pdev, priv); 391 ret = rsnd_gen2_probe(priv);
421 392
422 if (ret < 0) 393 if (ret < 0)
423 dev_err(dev, "unknown generation R-Car sound device\n"); 394 dev_err(dev, "unknown generation R-Car sound device\n");
diff --git a/sound/soc/sh/rcar/mix.c b/sound/soc/sh/rcar/mix.c
index 953dd0be9b60..65542b6a89e9 100644
--- a/sound/soc/sh/rcar/mix.c
+++ b/sound/soc/sh/rcar/mix.c
@@ -13,10 +13,10 @@
13#define MIX_NAME "mix" 13#define MIX_NAME "mix"
14 14
15struct rsnd_mix { 15struct rsnd_mix {
16 struct rsnd_mix_platform_info *info; /* rcar_snd.h */
17 struct rsnd_mod mod; 16 struct rsnd_mod mod;
18}; 17};
19 18
19#define rsnd_mix_get(priv, id) ((struct rsnd_mix *)(priv->mix) + id)
20#define rsnd_mix_nr(priv) ((priv)->mix_nr) 20#define rsnd_mix_nr(priv) ((priv)->mix_nr)
21#define for_each_rsnd_mix(pos, priv, i) \ 21#define for_each_rsnd_mix(pos, priv, i) \
22 for ((i) = 0; \ 22 for ((i) = 0; \
@@ -24,58 +24,77 @@ struct rsnd_mix {
24 ((pos) = (struct rsnd_mix *)(priv)->mix + i); \ 24 ((pos) = (struct rsnd_mix *)(priv)->mix + i); \
25 i++) 25 i++)
26 26
27 27static void rsnd_mix_activation(struct rsnd_mod *mod)
28static void rsnd_mix_soft_reset(struct rsnd_mod *mod)
29{ 28{
30 rsnd_mod_write(mod, MIX_SWRSR, 0); 29 rsnd_mod_write(mod, MIX_SWRSR, 0);
31 rsnd_mod_write(mod, MIX_SWRSR, 1); 30 rsnd_mod_write(mod, MIX_SWRSR, 1);
32} 31}
33 32
34#define rsnd_mix_initialize_lock(mod) __rsnd_mix_initialize_lock(mod, 1) 33static void rsnd_mix_halt(struct rsnd_mod *mod)
35#define rsnd_mix_initialize_unlock(mod) __rsnd_mix_initialize_lock(mod, 0) 34{
36static void __rsnd_mix_initialize_lock(struct rsnd_mod *mod, u32 enable) 35 rsnd_mod_write(mod, MIX_MIXIR, 1);
36 rsnd_mod_write(mod, MIX_SWRSR, 0);
37}
38
39static void rsnd_mix_volume_parameter(struct rsnd_dai_stream *io,
40 struct rsnd_mod *mod)
37{ 41{
38 rsnd_mod_write(mod, MIX_MIXIR, enable); 42 rsnd_mod_write(mod, MIX_MDBAR, 0);
43 rsnd_mod_write(mod, MIX_MDBBR, 0);
44 rsnd_mod_write(mod, MIX_MDBCR, 0);
45 rsnd_mod_write(mod, MIX_MDBDR, 0);
46}
47
48static void rsnd_mix_volume_init(struct rsnd_dai_stream *io,
49 struct rsnd_mod *mod)
50{
51 rsnd_mod_write(mod, MIX_MIXIR, 1);
52
53 /* General Information */
54 rsnd_mod_write(mod, MIX_ADINR, rsnd_get_adinr_chan(mod, io));
55
56 /* volume step */
57 rsnd_mod_write(mod, MIX_MIXMR, 0);
58 rsnd_mod_write(mod, MIX_MVPDR, 0);
59
60 /* common volume parameter */
61 rsnd_mix_volume_parameter(io, mod);
62
63 rsnd_mod_write(mod, MIX_MIXIR, 0);
39} 64}
40 65
41static void rsnd_mix_volume_update(struct rsnd_dai_stream *io, 66static void rsnd_mix_volume_update(struct rsnd_dai_stream *io,
42 struct rsnd_mod *mod) 67 struct rsnd_mod *mod)
43{ 68{
44
45 /* Disable MIX dB setting */ 69 /* Disable MIX dB setting */
46 rsnd_mod_write(mod, MIX_MDBER, 0); 70 rsnd_mod_write(mod, MIX_MDBER, 0);
47 71
48 rsnd_mod_write(mod, MIX_MDBAR, 0); 72 /* common volume parameter */
49 rsnd_mod_write(mod, MIX_MDBBR, 0); 73 rsnd_mix_volume_parameter(io, mod);
50 rsnd_mod_write(mod, MIX_MDBCR, 0);
51 rsnd_mod_write(mod, MIX_MDBDR, 0);
52 74
53 /* Enable MIX dB setting */ 75 /* Enable MIX dB setting */
54 rsnd_mod_write(mod, MIX_MDBER, 1); 76 rsnd_mod_write(mod, MIX_MDBER, 1);
55} 77}
56 78
79static int rsnd_mix_probe_(struct rsnd_mod *mod,
80 struct rsnd_dai_stream *io,
81 struct rsnd_priv *priv)
82{
83 return rsnd_cmd_attach(io, rsnd_mod_id(mod));
84}
85
57static int rsnd_mix_init(struct rsnd_mod *mod, 86static int rsnd_mix_init(struct rsnd_mod *mod,
58 struct rsnd_dai_stream *io, 87 struct rsnd_dai_stream *io,
59 struct rsnd_priv *priv) 88 struct rsnd_priv *priv)
60{ 89{
61 rsnd_mod_power_on(mod); 90 rsnd_mod_power_on(mod);
62 91
63 rsnd_mix_soft_reset(mod); 92 rsnd_mix_activation(mod);
64
65 rsnd_mix_initialize_lock(mod);
66
67 rsnd_mod_write(mod, MIX_ADINR, rsnd_get_adinr_chan(mod, io));
68
69 rsnd_path_parse(priv, io);
70 93
71 /* volume step */ 94 rsnd_mix_volume_init(io, mod);
72 rsnd_mod_write(mod, MIX_MIXMR, 0);
73 rsnd_mod_write(mod, MIX_MVPDR, 0);
74 95
75 rsnd_mix_volume_update(io, mod); 96 rsnd_mix_volume_update(io, mod);
76 97
77 rsnd_mix_initialize_unlock(mod);
78
79 return 0; 98 return 0;
80} 99}
81 100
@@ -83,6 +102,8 @@ static int rsnd_mix_quit(struct rsnd_mod *mod,
83 struct rsnd_dai_stream *io, 102 struct rsnd_dai_stream *io,
84 struct rsnd_priv *priv) 103 struct rsnd_priv *priv)
85{ 104{
105 rsnd_mix_halt(mod);
106
86 rsnd_mod_power_off(mod); 107 rsnd_mod_power_off(mod);
87 108
88 return 0; 109 return 0;
@@ -90,6 +111,7 @@ static int rsnd_mix_quit(struct rsnd_mod *mod,
90 111
91static struct rsnd_mod_ops rsnd_mix_ops = { 112static struct rsnd_mod_ops rsnd_mix_ops = {
92 .name = MIX_NAME, 113 .name = MIX_NAME,
114 .probe = rsnd_mix_probe_,
93 .init = rsnd_mix_init, 115 .init = rsnd_mix_init,
94 .quit = rsnd_mix_quit, 116 .quit = rsnd_mix_quit,
95}; 117};
@@ -99,51 +121,13 @@ struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id)
99 if (WARN_ON(id < 0 || id >= rsnd_mix_nr(priv))) 121 if (WARN_ON(id < 0 || id >= rsnd_mix_nr(priv)))
100 id = 0; 122 id = 0;
101 123
102 return rsnd_mod_get((struct rsnd_mix *)(priv->mix) + id); 124 return rsnd_mod_get(rsnd_mix_get(priv, id));
103} 125}
104 126
105static void rsnd_of_parse_mix(struct platform_device *pdev, 127int rsnd_mix_probe(struct rsnd_priv *priv)
106 const struct rsnd_of_data *of_data,
107 struct rsnd_priv *priv)
108{ 128{
109 struct device_node *node; 129 struct device_node *node;
110 struct rsnd_mix_platform_info *mix_info; 130 struct device_node *np;
111 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
112 struct device *dev = &pdev->dev;
113 int nr;
114
115 if (!of_data)
116 return;
117
118 node = of_get_child_by_name(dev->of_node, "rcar_sound,mix");
119 if (!node)
120 return;
121
122 nr = of_get_child_count(node);
123 if (!nr)
124 goto rsnd_of_parse_mix_end;
125
126 mix_info = devm_kzalloc(dev,
127 sizeof(struct rsnd_mix_platform_info) * nr,
128 GFP_KERNEL);
129 if (!mix_info) {
130 dev_err(dev, "mix info allocation error\n");
131 goto rsnd_of_parse_mix_end;
132 }
133
134 info->mix_info = mix_info;
135 info->mix_info_nr = nr;
136
137rsnd_of_parse_mix_end:
138 of_node_put(node);
139
140}
141
142int rsnd_mix_probe(struct platform_device *pdev,
143 const struct rsnd_of_data *of_data,
144 struct rsnd_priv *priv)
145{
146 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
147 struct device *dev = rsnd_priv_to_dev(priv); 131 struct device *dev = rsnd_priv_to_dev(priv);
148 struct rsnd_mix *mix; 132 struct rsnd_mix *mix;
149 struct clk *clk; 133 struct clk *clk;
@@ -154,40 +138,54 @@ int rsnd_mix_probe(struct platform_device *pdev,
154 if (rsnd_is_gen1(priv)) 138 if (rsnd_is_gen1(priv))
155 return 0; 139 return 0;
156 140
157 rsnd_of_parse_mix(pdev, of_data, priv); 141 node = rsnd_mix_of_node(priv);
142 if (!node)
143 return 0; /* not used is not error */
158 144
159 nr = info->mix_info_nr; 145 nr = of_get_child_count(node);
160 if (!nr) 146 if (!nr) {
161 return 0; 147 ret = -EINVAL;
148 goto rsnd_mix_probe_done;
149 }
162 150
163 mix = devm_kzalloc(dev, sizeof(*mix) * nr, GFP_KERNEL); 151 mix = devm_kzalloc(dev, sizeof(*mix) * nr, GFP_KERNEL);
164 if (!mix) 152 if (!mix) {
165 return -ENOMEM; 153 ret = -ENOMEM;
154 goto rsnd_mix_probe_done;
155 }
166 156
167 priv->mix_nr = nr; 157 priv->mix_nr = nr;
168 priv->mix = mix; 158 priv->mix = mix;
169 159
170 for_each_rsnd_mix(mix, priv, i) { 160 i = 0;
161 ret = 0;
162 for_each_child_of_node(node, np) {
163 mix = rsnd_mix_get(priv, i);
164
171 snprintf(name, MIX_NAME_SIZE, "%s.%d", 165 snprintf(name, MIX_NAME_SIZE, "%s.%d",
172 MIX_NAME, i); 166 MIX_NAME, i);
173 167
174 clk = devm_clk_get(dev, name); 168 clk = devm_clk_get(dev, name);
175 if (IS_ERR(clk)) 169 if (IS_ERR(clk)) {
176 return PTR_ERR(clk); 170 ret = PTR_ERR(clk);
177 171 goto rsnd_mix_probe_done;
178 mix->info = &info->mix_info[i]; 172 }
179 173
180 ret = rsnd_mod_init(priv, rsnd_mod_get(mix), &rsnd_mix_ops, 174 ret = rsnd_mod_init(priv, rsnd_mod_get(mix), &rsnd_mix_ops,
181 clk, RSND_MOD_MIX, i); 175 clk, RSND_MOD_MIX, i);
182 if (ret) 176 if (ret)
183 return ret; 177 goto rsnd_mix_probe_done;
178
179 i++;
184 } 180 }
185 181
186 return 0; 182rsnd_mix_probe_done:
183 of_node_put(node);
184
185 return ret;
187} 186}
188 187
189void rsnd_mix_remove(struct platform_device *pdev, 188void rsnd_mix_remove(struct rsnd_priv *priv)
190 struct rsnd_priv *priv)
191{ 189{
192 struct rsnd_mix *mix; 190 struct rsnd_mix *mix;
193 int i; 191 int i;
diff --git a/sound/soc/sh/rcar/rcar_snd.h b/sound/soc/sh/rcar/rcar_snd.h
deleted file mode 100644
index d8e33d38da43..000000000000
--- a/sound/soc/sh/rcar/rcar_snd.h
+++ /dev/null
@@ -1,117 +0,0 @@
1/*
2 * Renesas R-Car SRU/SCU/SSIU/SSI support
3 *
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#ifndef RCAR_SND_H
13#define RCAR_SND_H
14
15
16#define RSND_GEN1_SRU 0
17#define RSND_GEN1_ADG 1
18#define RSND_GEN1_SSI 2
19
20#define RSND_GEN2_SCU 0
21#define RSND_GEN2_ADG 1
22#define RSND_GEN2_SSIU 2
23#define RSND_GEN2_SSI 3
24
25#define RSND_BASE_MAX 4
26
27/*
28 * flags
29 *
30 * 0xAB000000
31 *
32 * A : clock sharing settings
33 * B : SSI direction
34 */
35#define RSND_SSI_CLK_PIN_SHARE (1 << 31)
36#define RSND_SSI_NO_BUSIF (1 << 30) /* SSI+DMA without BUSIF */
37
38#define RSND_SSI(_dma_id, _irq, _flags) \
39{ .dma_id = _dma_id, .irq = _irq, .flags = _flags }
40#define RSND_SSI_UNUSED \
41{ .dma_id = -1, .irq = -1, .flags = 0 }
42
43struct rsnd_ssi_platform_info {
44 int dma_id;
45 int irq;
46 u32 flags;
47};
48
49#define RSND_SRC(rate, _dma_id) \
50{ .convert_rate = rate, .dma_id = _dma_id, }
51#define RSND_SRC_UNUSED \
52{ .convert_rate = 0, .dma_id = -1, }
53
54struct rsnd_src_platform_info {
55 u32 convert_rate; /* sampling rate convert */
56 int dma_id; /* for Gen2 SCU */
57 int irq;
58};
59
60/*
61 * flags
62 */
63struct rsnd_ctu_platform_info {
64 u32 flags;
65};
66
67struct rsnd_mix_platform_info {
68 u32 flags;
69};
70
71struct rsnd_dvc_platform_info {
72 u32 flags;
73};
74
75struct rsnd_dai_path_info {
76 struct rsnd_ssi_platform_info *ssi;
77 struct rsnd_src_platform_info *src;
78 struct rsnd_ctu_platform_info *ctu;
79 struct rsnd_mix_platform_info *mix;
80 struct rsnd_dvc_platform_info *dvc;
81};
82
83struct rsnd_dai_platform_info {
84 struct rsnd_dai_path_info playback;
85 struct rsnd_dai_path_info capture;
86};
87
88/*
89 * flags
90 *
91 * 0x0000000A
92 *
93 * A : generation
94 */
95#define RSND_GEN_MASK (0xF << 0)
96#define RSND_GEN1 (1 << 0) /* fixme */
97#define RSND_GEN2 (2 << 0) /* fixme */
98
99struct rcar_snd_info {
100 u32 flags;
101 struct rsnd_ssi_platform_info *ssi_info;
102 int ssi_info_nr;
103 struct rsnd_src_platform_info *src_info;
104 int src_info_nr;
105 struct rsnd_ctu_platform_info *ctu_info;
106 int ctu_info_nr;
107 struct rsnd_mix_platform_info *mix_info;
108 int mix_info_nr;
109 struct rsnd_dvc_platform_info *dvc_info;
110 int dvc_info_nr;
111 struct rsnd_dai_platform_info *dai_info;
112 int dai_info_nr;
113 int (*start)(int id);
114 int (*stop)(int id);
115};
116
117#endif
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 085329878525..317dd793149a 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -24,7 +24,16 @@
24#include <sound/soc.h> 24#include <sound/soc.h>
25#include <sound/pcm_params.h> 25#include <sound/pcm_params.h>
26 26
27#include "rcar_snd.h" 27#define RSND_GEN1_SRU 0
28#define RSND_GEN1_ADG 1
29#define RSND_GEN1_SSI 2
30
31#define RSND_GEN2_SCU 0
32#define RSND_GEN2_ADG 1
33#define RSND_GEN2_SSIU 2
34#define RSND_GEN2_SSI 3
35
36#define RSND_BASE_MAX 4
28 37
29/* 38/*
30 * pseudo register 39 * pseudo register
@@ -34,10 +43,19 @@
34 * see gen1/gen2 for detail 43 * see gen1/gen2 for detail
35 */ 44 */
36enum rsnd_reg { 45enum rsnd_reg {
37 /* SRU/SCU/SSIU */ 46 /* SCU (SRC/SSIU/MIX/CTU/DVC) */
47 RSND_REG_SSI_MODE, /* Gen2 only */
38 RSND_REG_SSI_MODE0, 48 RSND_REG_SSI_MODE0,
39 RSND_REG_SSI_MODE1, 49 RSND_REG_SSI_MODE1,
40 RSND_REG_SRC_BUSIF_MODE, 50 RSND_REG_SSI_MODE2,
51 RSND_REG_SSI_CONTROL,
52 RSND_REG_SSI_CTRL, /* Gen2 only */
53 RSND_REG_SSI_BUSIF_MODE, /* Gen2 only */
54 RSND_REG_SSI_BUSIF_ADINR, /* Gen2 only */
55 RSND_REG_SSI_BUSIF_DALIGN, /* Gen2 only */
56 RSND_REG_SSI_INT_ENABLE, /* Gen2 only */
57 RSND_REG_SRC_I_BUSIF_MODE,
58 RSND_REG_SRC_O_BUSIF_MODE,
41 RSND_REG_SRC_ROUTE_MODE0, 59 RSND_REG_SRC_ROUTE_MODE0,
42 RSND_REG_SRC_SWRSR, 60 RSND_REG_SRC_SWRSR,
43 RSND_REG_SRC_SRCIR, 61 RSND_REG_SRC_SRCIR,
@@ -45,9 +63,29 @@ enum rsnd_reg {
45 RSND_REG_SRC_IFSCR, 63 RSND_REG_SRC_IFSCR,
46 RSND_REG_SRC_IFSVR, 64 RSND_REG_SRC_IFSVR,
47 RSND_REG_SRC_SRCCR, 65 RSND_REG_SRC_SRCCR,
66 RSND_REG_SRC_CTRL, /* Gen2 only */
67 RSND_REG_SRC_BSDSR, /* Gen2 only */
68 RSND_REG_SRC_BSISR, /* Gen2 only */
69 RSND_REG_SRC_INT_ENABLE0, /* Gen2 only */
70 RSND_REG_SRC_BUSIF_DALIGN, /* Gen2 only */
71 RSND_REG_SRCIN_TIMSEL0, /* Gen2 only */
72 RSND_REG_SRCIN_TIMSEL1, /* Gen2 only */
73 RSND_REG_SRCIN_TIMSEL2, /* Gen2 only */
74 RSND_REG_SRCIN_TIMSEL3, /* Gen2 only */
75 RSND_REG_SRCIN_TIMSEL4, /* Gen2 only */
76 RSND_REG_SRCOUT_TIMSEL0, /* Gen2 only */
77 RSND_REG_SRCOUT_TIMSEL1, /* Gen2 only */
78 RSND_REG_SRCOUT_TIMSEL2, /* Gen2 only */
79 RSND_REG_SRCOUT_TIMSEL3, /* Gen2 only */
80 RSND_REG_SRCOUT_TIMSEL4, /* Gen2 only */
48 RSND_REG_SCU_SYS_STATUS0, 81 RSND_REG_SCU_SYS_STATUS0,
82 RSND_REG_SCU_SYS_STATUS1, /* Gen2 only */
49 RSND_REG_SCU_SYS_INT_EN0, 83 RSND_REG_SCU_SYS_INT_EN0,
84 RSND_REG_SCU_SYS_INT_EN1, /* Gen2 only */
85 RSND_REG_CMD_CTRL, /* Gen2 only */
86 RSND_REG_CMD_BUSIF_DALIGN, /* Gen2 only */
50 RSND_REG_CMD_ROUTE_SLCT, 87 RSND_REG_CMD_ROUTE_SLCT,
88 RSND_REG_CMDOUT_TIMSEL, /* Gen2 only */
51 RSND_REG_CTU_CTUIR, 89 RSND_REG_CTU_CTUIR,
52 RSND_REG_CTU_ADINR, 90 RSND_REG_CTU_ADINR,
53 RSND_REG_MIX_SWRSR, 91 RSND_REG_MIX_SWRSR,
@@ -67,14 +105,25 @@ enum rsnd_reg {
67 RSND_REG_DVC_ZCMCR, 105 RSND_REG_DVC_ZCMCR,
68 RSND_REG_DVC_VOL0R, 106 RSND_REG_DVC_VOL0R,
69 RSND_REG_DVC_VOL1R, 107 RSND_REG_DVC_VOL1R,
108 RSND_REG_DVC_VOL2R,
109 RSND_REG_DVC_VOL3R,
110 RSND_REG_DVC_VOL4R,
111 RSND_REG_DVC_VOL5R,
112 RSND_REG_DVC_VOL6R,
113 RSND_REG_DVC_VOL7R,
70 RSND_REG_DVC_DVUER, 114 RSND_REG_DVC_DVUER,
115 RSND_REG_DVC_VRCTR, /* Gen2 only */
116 RSND_REG_DVC_VRPDR, /* Gen2 only */
117 RSND_REG_DVC_VRDBR, /* Gen2 only */
71 118
72 /* ADG */ 119 /* ADG */
73 RSND_REG_BRRA, 120 RSND_REG_BRRA,
74 RSND_REG_BRRB, 121 RSND_REG_BRRB,
75 RSND_REG_SSICKR, 122 RSND_REG_SSICKR,
123 RSND_REG_DIV_EN, /* Gen2 only */
76 RSND_REG_AUDIO_CLK_SEL0, 124 RSND_REG_AUDIO_CLK_SEL0,
77 RSND_REG_AUDIO_CLK_SEL1, 125 RSND_REG_AUDIO_CLK_SEL1,
126 RSND_REG_AUDIO_CLK_SEL2, /* Gen2 only */
78 127
79 /* SSI */ 128 /* SSI */
80 RSND_REG_SSICR, 129 RSND_REG_SSICR,
@@ -83,83 +132,9 @@ enum rsnd_reg {
83 RSND_REG_SSIRDR, 132 RSND_REG_SSIRDR,
84 RSND_REG_SSIWSR, 133 RSND_REG_SSIWSR,
85 134
86 /* SHARE see below */
87 RSND_REG_SHARE01,
88 RSND_REG_SHARE02,
89 RSND_REG_SHARE03,
90 RSND_REG_SHARE04,
91 RSND_REG_SHARE05,
92 RSND_REG_SHARE06,
93 RSND_REG_SHARE07,
94 RSND_REG_SHARE08,
95 RSND_REG_SHARE09,
96 RSND_REG_SHARE10,
97 RSND_REG_SHARE11,
98 RSND_REG_SHARE12,
99 RSND_REG_SHARE13,
100 RSND_REG_SHARE14,
101 RSND_REG_SHARE15,
102 RSND_REG_SHARE16,
103 RSND_REG_SHARE17,
104 RSND_REG_SHARE18,
105 RSND_REG_SHARE19,
106 RSND_REG_SHARE20,
107 RSND_REG_SHARE21,
108 RSND_REG_SHARE22,
109 RSND_REG_SHARE23,
110 RSND_REG_SHARE24,
111 RSND_REG_SHARE25,
112 RSND_REG_SHARE26,
113 RSND_REG_SHARE27,
114 RSND_REG_SHARE28,
115 RSND_REG_SHARE29,
116
117 RSND_REG_MAX, 135 RSND_REG_MAX,
118}; 136};
119 137
120/* Gen1 only */
121#define RSND_REG_SRC_ROUTE_SEL RSND_REG_SHARE01
122#define RSND_REG_SRC_TMG_SEL0 RSND_REG_SHARE02
123#define RSND_REG_SRC_TMG_SEL1 RSND_REG_SHARE03
124#define RSND_REG_SRC_TMG_SEL2 RSND_REG_SHARE04
125#define RSND_REG_SRC_ROUTE_CTRL RSND_REG_SHARE05
126#define RSND_REG_SRC_MNFSR RSND_REG_SHARE06
127#define RSND_REG_AUDIO_CLK_SEL3 RSND_REG_SHARE07
128#define RSND_REG_AUDIO_CLK_SEL4 RSND_REG_SHARE08
129#define RSND_REG_AUDIO_CLK_SEL5 RSND_REG_SHARE09
130
131/* Gen2 only */
132#define RSND_REG_SRC_CTRL RSND_REG_SHARE01
133#define RSND_REG_SSI_CTRL RSND_REG_SHARE02
134#define RSND_REG_SSI_BUSIF_MODE RSND_REG_SHARE03
135#define RSND_REG_SSI_BUSIF_ADINR RSND_REG_SHARE04
136#define RSND_REG_SSI_INT_ENABLE RSND_REG_SHARE05
137#define RSND_REG_SRC_BSDSR RSND_REG_SHARE06
138#define RSND_REG_SRC_BSISR RSND_REG_SHARE07
139#define RSND_REG_DIV_EN RSND_REG_SHARE08
140#define RSND_REG_SRCIN_TIMSEL0 RSND_REG_SHARE09
141#define RSND_REG_SRCIN_TIMSEL1 RSND_REG_SHARE10
142#define RSND_REG_SRCIN_TIMSEL2 RSND_REG_SHARE11
143#define RSND_REG_SRCIN_TIMSEL3 RSND_REG_SHARE12
144#define RSND_REG_SRCIN_TIMSEL4 RSND_REG_SHARE13
145#define RSND_REG_SRCOUT_TIMSEL0 RSND_REG_SHARE14
146#define RSND_REG_SRCOUT_TIMSEL1 RSND_REG_SHARE15
147#define RSND_REG_SRCOUT_TIMSEL2 RSND_REG_SHARE16
148#define RSND_REG_SRCOUT_TIMSEL3 RSND_REG_SHARE17
149#define RSND_REG_SRCOUT_TIMSEL4 RSND_REG_SHARE18
150#define RSND_REG_AUDIO_CLK_SEL2 RSND_REG_SHARE19
151#define RSND_REG_CMD_CTRL RSND_REG_SHARE20
152#define RSND_REG_CMDOUT_TIMSEL RSND_REG_SHARE21
153#define RSND_REG_SSI_BUSIF_DALIGN RSND_REG_SHARE22
154#define RSND_REG_DVC_VRCTR RSND_REG_SHARE23
155#define RSND_REG_DVC_VRPDR RSND_REG_SHARE24
156#define RSND_REG_DVC_VRDBR RSND_REG_SHARE25
157#define RSND_REG_SCU_SYS_STATUS1 RSND_REG_SHARE26
158#define RSND_REG_SCU_SYS_INT_EN1 RSND_REG_SHARE27
159#define RSND_REG_SRC_INT_ENABLE0 RSND_REG_SHARE28
160#define RSND_REG_SRC_BUSIF_DALIGN RSND_REG_SHARE29
161
162struct rsnd_of_data;
163struct rsnd_priv; 138struct rsnd_priv;
164struct rsnd_mod; 139struct rsnd_mod;
165struct rsnd_dai; 140struct rsnd_dai;
@@ -187,43 +162,13 @@ void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg,
187u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io); 162u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
188u32 rsnd_get_adinr_chan(struct rsnd_mod *mod, struct rsnd_dai_stream *io); 163u32 rsnd_get_adinr_chan(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
189u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io); 164u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
190void rsnd_path_parse(struct rsnd_priv *priv,
191 struct rsnd_dai_stream *io);
192 165
193/* 166/*
194 * R-Car DMA 167 * R-Car DMA
195 */ 168 */
196struct rsnd_dma; 169struct rsnd_mod *rsnd_dma_attach(struct rsnd_dai_stream *io,
197 170 struct rsnd_mod *mod, int id);
198struct rsnd_dmaen { 171int rsnd_dma_probe(struct rsnd_priv *priv);
199 struct dma_chan *chan;
200};
201
202struct rsnd_dmapp {
203 int dmapp_id;
204 u32 chcr;
205};
206
207struct rsnd_dma {
208 struct rsnd_dma_ops *ops;
209 dma_addr_t src_addr;
210 dma_addr_t dst_addr;
211 union {
212 struct rsnd_dmaen en;
213 struct rsnd_dmapp pp;
214 } dma;
215};
216#define rsnd_dma_to_dmaen(dma) (&(dma)->dma.en)
217#define rsnd_dma_to_dmapp(dma) (&(dma)->dma.pp)
218#define rsnd_dma_to_mod(_dma) container_of((_dma), struct rsnd_mod, dma)
219
220void rsnd_dma_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
221void rsnd_dma_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
222int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id);
223void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma);
224int rsnd_dma_probe(struct platform_device *pdev,
225 const struct rsnd_of_data *of_data,
226 struct rsnd_priv *priv);
227struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, 172struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node,
228 struct rsnd_mod *mod, char *name); 173 struct rsnd_mod *mod, char *name);
229 174
@@ -231,11 +176,19 @@ struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node,
231 * R-Car sound mod 176 * R-Car sound mod
232 */ 177 */
233enum rsnd_mod_type { 178enum rsnd_mod_type {
234 RSND_MOD_DVC = 0, 179 RSND_MOD_AUDMAPP,
180 RSND_MOD_AUDMA,
181 RSND_MOD_DVC,
235 RSND_MOD_MIX, 182 RSND_MOD_MIX,
236 RSND_MOD_CTU, 183 RSND_MOD_CTU,
184 RSND_MOD_CMD,
237 RSND_MOD_SRC, 185 RSND_MOD_SRC,
186 RSND_MOD_SSIM3, /* SSI multi 3 */
187 RSND_MOD_SSIM2, /* SSI multi 2 */
188 RSND_MOD_SSIM1, /* SSI multi 1 */
189 RSND_MOD_SSIP, /* SSI parent */
238 RSND_MOD_SSI, 190 RSND_MOD_SSI,
191 RSND_MOD_SSIU,
239 RSND_MOD_MAX, 192 RSND_MOD_MAX,
240}; 193};
241 194
@@ -278,10 +231,8 @@ struct rsnd_mod {
278 int id; 231 int id;
279 enum rsnd_mod_type type; 232 enum rsnd_mod_type type;
280 struct rsnd_mod_ops *ops; 233 struct rsnd_mod_ops *ops;
281 struct rsnd_dma dma;
282 struct rsnd_priv *priv; 234 struct rsnd_priv *priv;
283 struct clk *clk; 235 struct clk *clk;
284 u32 status;
285}; 236};
286/* 237/*
287 * status 238 * status
@@ -328,7 +279,6 @@ struct rsnd_mod {
328#define __rsnd_mod_call_hw_params 0 279#define __rsnd_mod_call_hw_params 0
329 280
330#define rsnd_mod_to_priv(mod) ((mod)->priv) 281#define rsnd_mod_to_priv(mod) ((mod)->priv)
331#define rsnd_mod_to_dma(mod) (&(mod)->dma)
332#define rsnd_mod_id(mod) ((mod) ? (mod)->id : -1) 282#define rsnd_mod_id(mod) ((mod) ? (mod)->id : -1)
333#define rsnd_mod_power_on(mod) clk_enable((mod)->clk) 283#define rsnd_mod_power_on(mod) clk_enable((mod)->clk)
334#define rsnd_mod_power_off(mod) clk_disable((mod)->clk) 284#define rsnd_mod_power_off(mod) clk_disable((mod)->clk)
@@ -347,6 +297,17 @@ struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io,
347void rsnd_mod_interrupt(struct rsnd_mod *mod, 297void rsnd_mod_interrupt(struct rsnd_mod *mod,
348 void (*callback)(struct rsnd_mod *mod, 298 void (*callback)(struct rsnd_mod *mod,
349 struct rsnd_dai_stream *io)); 299 struct rsnd_dai_stream *io));
300void rsnd_parse_connect_common(struct rsnd_dai *rdai,
301 struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id),
302 struct device_node *node,
303 struct device_node *playback,
304 struct device_node *capture);
305
306void rsnd_set_slot(struct rsnd_dai *rdai,
307 int slots, int slots_total);
308int rsnd_get_slot(struct rsnd_dai_stream *io);
309int rsnd_get_slot_width(struct rsnd_dai_stream *io);
310int rsnd_get_slot_num(struct rsnd_dai_stream *io);
350 311
351/* 312/*
352 * R-Car sound DAI 313 * R-Car sound DAI
@@ -358,6 +319,7 @@ struct rsnd_dai_stream {
358 struct rsnd_mod *mod[RSND_MOD_MAX]; 319 struct rsnd_mod *mod[RSND_MOD_MAX];
359 struct rsnd_dai_path_info *info; /* rcar_snd.h */ 320 struct rsnd_dai_path_info *info; /* rcar_snd.h */
360 struct rsnd_dai *rdai; 321 struct rsnd_dai *rdai;
322 u32 mod_status[RSND_MOD_MAX];
361 int byte_pos; 323 int byte_pos;
362 int period_pos; 324 int period_pos;
363 int byte_per_period; 325 int byte_per_period;
@@ -365,10 +327,12 @@ struct rsnd_dai_stream {
365}; 327};
366#define rsnd_io_to_mod(io, i) ((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL) 328#define rsnd_io_to_mod(io, i) ((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL)
367#define rsnd_io_to_mod_ssi(io) rsnd_io_to_mod((io), RSND_MOD_SSI) 329#define rsnd_io_to_mod_ssi(io) rsnd_io_to_mod((io), RSND_MOD_SSI)
330#define rsnd_io_to_mod_ssip(io) rsnd_io_to_mod((io), RSND_MOD_SSIP)
368#define rsnd_io_to_mod_src(io) rsnd_io_to_mod((io), RSND_MOD_SRC) 331#define rsnd_io_to_mod_src(io) rsnd_io_to_mod((io), RSND_MOD_SRC)
369#define rsnd_io_to_mod_ctu(io) rsnd_io_to_mod((io), RSND_MOD_CTU) 332#define rsnd_io_to_mod_ctu(io) rsnd_io_to_mod((io), RSND_MOD_CTU)
370#define rsnd_io_to_mod_mix(io) rsnd_io_to_mod((io), RSND_MOD_MIX) 333#define rsnd_io_to_mod_mix(io) rsnd_io_to_mod((io), RSND_MOD_MIX)
371#define rsnd_io_to_mod_dvc(io) rsnd_io_to_mod((io), RSND_MOD_DVC) 334#define rsnd_io_to_mod_dvc(io) rsnd_io_to_mod((io), RSND_MOD_DVC)
335#define rsnd_io_to_mod_cmd(io) rsnd_io_to_mod((io), RSND_MOD_CMD)
372#define rsnd_io_to_rdai(io) ((io)->rdai) 336#define rsnd_io_to_rdai(io) ((io)->rdai)
373#define rsnd_io_to_priv(io) (rsnd_rdai_to_priv(rsnd_io_to_rdai(io))) 337#define rsnd_io_to_priv(io) (rsnd_rdai_to_priv(rsnd_io_to_rdai(io)))
374#define rsnd_io_is_play(io) (&rsnd_io_to_rdai(io)->playback == io) 338#define rsnd_io_is_play(io) (&rsnd_io_to_rdai(io)->playback == io)
@@ -382,6 +346,9 @@ struct rsnd_dai {
382 struct rsnd_dai_stream capture; 346 struct rsnd_dai_stream capture;
383 struct rsnd_priv *priv; 347 struct rsnd_priv *priv;
384 348
349 int slots;
350 int slots_num;
351
385 unsigned int clk_master:1; 352 unsigned int clk_master:1;
386 unsigned int bit_clk_inv:1; 353 unsigned int bit_clk_inv:1;
387 unsigned int frm_clk_inv:1; 354 unsigned int frm_clk_inv:1;
@@ -403,33 +370,28 @@ struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id);
403bool rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int cnt); 370bool rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int cnt);
404void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io); 371void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io);
405int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional); 372int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);
373int rsnd_dai_connect(struct rsnd_mod *mod,
374 struct rsnd_dai_stream *io,
375 enum rsnd_mod_type type);
376#define rsnd_dai_of_node(priv) \
377 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,dai")
406 378
407/* 379/*
408 * R-Car Gen1/Gen2 380 * R-Car Gen1/Gen2
409 */ 381 */
410int rsnd_gen_probe(struct platform_device *pdev, 382int rsnd_gen_probe(struct rsnd_priv *priv);
411 const struct rsnd_of_data *of_data,
412 struct rsnd_priv *priv);
413void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv, 383void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
414 struct rsnd_mod *mod, 384 struct rsnd_mod *mod,
415 enum rsnd_reg reg); 385 enum rsnd_reg reg);
416phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id); 386phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id);
417 387
418#define rsnd_is_gen1(s) (((s)->info->flags & RSND_GEN_MASK) == RSND_GEN1)
419#define rsnd_is_gen2(s) (((s)->info->flags & RSND_GEN_MASK) == RSND_GEN2)
420
421/* 388/*
422 * R-Car ADG 389 * R-Car ADG
423 */ 390 */
424int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod); 391int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod);
425int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate); 392int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate);
426int rsnd_adg_probe(struct platform_device *pdev, 393int rsnd_adg_probe(struct rsnd_priv *priv);
427 const struct rsnd_of_data *of_data, 394void rsnd_adg_remove(struct rsnd_priv *priv);
428 struct rsnd_priv *priv);
429int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv,
430 struct rsnd_mod *mod,
431 unsigned int src_rate,
432 unsigned int dst_rate);
433int rsnd_adg_set_convert_clk_gen2(struct rsnd_mod *mod, 395int rsnd_adg_set_convert_clk_gen2(struct rsnd_mod *mod,
434 struct rsnd_dai_stream *io, 396 struct rsnd_dai_stream *io,
435 unsigned int src_rate, 397 unsigned int src_rate,
@@ -442,15 +404,14 @@ int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod,
442/* 404/*
443 * R-Car sound priv 405 * R-Car sound priv
444 */ 406 */
445struct rsnd_of_data {
446 u32 flags;
447};
448
449struct rsnd_priv { 407struct rsnd_priv {
450 408
451 struct platform_device *pdev; 409 struct platform_device *pdev;
452 struct rcar_snd_info *info;
453 spinlock_t lock; 410 spinlock_t lock;
411 unsigned long flags;
412#define RSND_GEN_MASK (0xF << 0)
413#define RSND_GEN1 (1 << 0)
414#define RSND_GEN2 (2 << 0)
454 415
455 /* 416 /*
456 * below value will be filled on rsnd_gen_probe() 417 * below value will be filled on rsnd_gen_probe()
@@ -474,6 +435,12 @@ struct rsnd_priv {
474 int ssi_nr; 435 int ssi_nr;
475 436
476 /* 437 /*
438 * below value will be filled on rsnd_ssiu_probe()
439 */
440 void *ssiu;
441 int ssiu_nr;
442
443 /*
477 * below value will be filled on rsnd_src_probe() 444 * below value will be filled on rsnd_src_probe()
478 */ 445 */
479 void *src; 446 void *src;
@@ -498,6 +465,12 @@ struct rsnd_priv {
498 int dvc_nr; 465 int dvc_nr;
499 466
500 /* 467 /*
468 * below value will be filled on rsnd_cmd_probe()
469 */
470 void *cmd;
471 int cmd_nr;
472
473 /*
501 * below value will be filled on rsnd_dai_probe() 474 * below value will be filled on rsnd_dai_probe()
502 */ 475 */
503 struct snd_soc_dai_driver *daidrv; 476 struct snd_soc_dai_driver *daidrv;
@@ -507,7 +480,9 @@ struct rsnd_priv {
507 480
508#define rsnd_priv_to_pdev(priv) ((priv)->pdev) 481#define rsnd_priv_to_pdev(priv) ((priv)->pdev)
509#define rsnd_priv_to_dev(priv) (&(rsnd_priv_to_pdev(priv)->dev)) 482#define rsnd_priv_to_dev(priv) (&(rsnd_priv_to_pdev(priv)->dev))
510#define rsnd_priv_to_info(priv) ((priv)->info) 483
484#define rsnd_is_gen1(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN1)
485#define rsnd_is_gen2(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN2)
511 486
512/* 487/*
513 * rsnd_kctrl 488 * rsnd_kctrl
@@ -523,7 +498,7 @@ struct rsnd_kctrl_cfg {
523 struct snd_kcontrol *kctrl; 498 struct snd_kcontrol *kctrl;
524}; 499};
525 500
526#define RSND_DVC_CHANNELS 2 501#define RSND_DVC_CHANNELS 8
527struct rsnd_kctrl_cfg_m { 502struct rsnd_kctrl_cfg_m {
528 struct rsnd_kctrl_cfg cfg; 503 struct rsnd_kctrl_cfg cfg;
529 u32 val[RSND_DVC_CHANNELS]; 504 u32 val[RSND_DVC_CHANNELS];
@@ -544,6 +519,7 @@ int rsnd_kctrl_new_m(struct rsnd_mod *mod,
544 void (*update)(struct rsnd_dai_stream *io, 519 void (*update)(struct rsnd_dai_stream *io,
545 struct rsnd_mod *mod), 520 struct rsnd_mod *mod),
546 struct rsnd_kctrl_cfg_m *_cfg, 521 struct rsnd_kctrl_cfg_m *_cfg,
522 int ch_size,
547 u32 max); 523 u32 max);
548int rsnd_kctrl_new_s(struct rsnd_mod *mod, 524int rsnd_kctrl_new_s(struct rsnd_mod *mod,
549 struct rsnd_dai_stream *io, 525 struct rsnd_dai_stream *io,
@@ -566,70 +542,93 @@ int rsnd_kctrl_new_e(struct rsnd_mod *mod,
566/* 542/*
567 * R-Car SSI 543 * R-Car SSI
568 */ 544 */
569int rsnd_ssi_probe(struct platform_device *pdev, 545int rsnd_ssi_probe(struct rsnd_priv *priv);
570 const struct rsnd_of_data *of_data, 546void rsnd_ssi_remove(struct rsnd_priv *priv);
571 struct rsnd_priv *priv);
572void rsnd_ssi_remove(struct platform_device *pdev,
573 struct rsnd_priv *priv);
574struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); 547struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
575int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod); 548int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);
576int rsnd_ssi_use_busif(struct rsnd_dai_stream *io); 549int rsnd_ssi_use_busif(struct rsnd_dai_stream *io);
550u32 rsnd_ssi_multi_slaves(struct rsnd_dai_stream *io);
577 551
578#define rsnd_ssi_is_pin_sharing(io) \ 552#define rsnd_ssi_is_pin_sharing(io) \
579 __rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io)) 553 __rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io))
580int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); 554int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod);
581 555
556#define rsnd_ssi_of_node(priv) \
557 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ssi")
558void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
559 struct device_node *playback,
560 struct device_node *capture);
561
562/*
563 * R-Car SSIU
564 */
565int rsnd_ssiu_attach(struct rsnd_dai_stream *io,
566 struct rsnd_mod *mod);
567int rsnd_ssiu_probe(struct rsnd_priv *priv);
568void rsnd_ssiu_remove(struct rsnd_priv *priv);
569
582/* 570/*
583 * R-Car SRC 571 * R-Car SRC
584 */ 572 */
585int rsnd_src_probe(struct platform_device *pdev, 573int rsnd_src_probe(struct rsnd_priv *priv);
586 const struct rsnd_of_data *of_data, 574void rsnd_src_remove(struct rsnd_priv *priv);
587 struct rsnd_priv *priv);
588void rsnd_src_remove(struct platform_device *pdev,
589 struct rsnd_priv *priv);
590struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id); 575struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id);
591unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv, 576unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
592 struct rsnd_dai_stream *io, 577 struct rsnd_dai_stream *io,
593 struct snd_pcm_runtime *runtime); 578 struct snd_pcm_runtime *runtime);
594int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod, 579#define rsnd_src_of_node(priv) \
595 struct rsnd_dai_stream *io, 580 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,src")
596 int use_busif); 581#define rsnd_parse_connect_src(rdai, playback, capture) \
597int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod, 582 rsnd_parse_connect_common(rdai, rsnd_src_mod_get, \
598 struct rsnd_dai_stream *io); 583 rsnd_src_of_node(rsnd_rdai_to_priv(rdai)), \
599int rsnd_src_ssi_irq_enable(struct rsnd_mod *ssi_mod); 584 playback, capture)
600int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod);
601 585
602/* 586/*
603 * R-Car CTU 587 * R-Car CTU
604 */ 588 */
605int rsnd_ctu_probe(struct platform_device *pdev, 589int rsnd_ctu_probe(struct rsnd_priv *priv);
606 const struct rsnd_of_data *of_data, 590void rsnd_ctu_remove(struct rsnd_priv *priv);
607 struct rsnd_priv *priv);
608
609void rsnd_ctu_remove(struct platform_device *pdev,
610 struct rsnd_priv *priv);
611struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id); 591struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id);
592#define rsnd_ctu_of_node(priv) \
593 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ctu")
594#define rsnd_parse_connect_ctu(rdai, playback, capture) \
595 rsnd_parse_connect_common(rdai, rsnd_ctu_mod_get, \
596 rsnd_ctu_of_node(rsnd_rdai_to_priv(rdai)), \
597 playback, capture)
612 598
613/* 599/*
614 * R-Car MIX 600 * R-Car MIX
615 */ 601 */
616int rsnd_mix_probe(struct platform_device *pdev, 602int rsnd_mix_probe(struct rsnd_priv *priv);
617 const struct rsnd_of_data *of_data, 603void rsnd_mix_remove(struct rsnd_priv *priv);
618 struct rsnd_priv *priv);
619
620void rsnd_mix_remove(struct platform_device *pdev,
621 struct rsnd_priv *priv);
622struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id); 604struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id);
605#define rsnd_mix_of_node(priv) \
606 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,mix")
607#define rsnd_parse_connect_mix(rdai, playback, capture) \
608 rsnd_parse_connect_common(rdai, rsnd_mix_mod_get, \
609 rsnd_mix_of_node(rsnd_rdai_to_priv(rdai)), \
610 playback, capture)
623 611
624/* 612/*
625 * R-Car DVC 613 * R-Car DVC
626 */ 614 */
627int rsnd_dvc_probe(struct platform_device *pdev, 615int rsnd_dvc_probe(struct rsnd_priv *priv);
628 const struct rsnd_of_data *of_data, 616void rsnd_dvc_remove(struct rsnd_priv *priv);
629 struct rsnd_priv *priv);
630void rsnd_dvc_remove(struct platform_device *pdev,
631 struct rsnd_priv *priv);
632struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id); 617struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id);
618#define rsnd_dvc_of_node(priv) \
619 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,dvc")
620#define rsnd_parse_connect_dvc(rdai, playback, capture) \
621 rsnd_parse_connect_common(rdai, rsnd_dvc_mod_get, \
622 rsnd_dvc_of_node(rsnd_rdai_to_priv(rdai)), \
623 playback, capture)
624
625/*
626 * R-Car CMD
627 */
628int rsnd_cmd_probe(struct rsnd_priv *priv);
629void rsnd_cmd_remove(struct rsnd_priv *priv);
630int rsnd_cmd_attach(struct rsnd_dai_stream *io, int id);
631struct rsnd_mod *rsnd_cmd_mod_get(struct rsnd_priv *priv, int id);
633 632
634#ifdef DEBUG 633#ifdef DEBUG
635void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type); 634void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type);
diff --git a/sound/soc/sh/rcar/rsrc-card.c b/sound/soc/sh/rcar/rsrc-card.c
index d61db9c385ea..8a357fdf1077 100644
--- a/sound/soc/sh/rcar/rsrc-card.c
+++ b/sound/soc/sh/rcar/rsrc-card.c
@@ -48,8 +48,11 @@ MODULE_DEVICE_TABLE(of, rsrc_card_of_match);
48 48
49#define DAI_NAME_NUM 32 49#define DAI_NAME_NUM 32
50struct rsrc_card_dai { 50struct rsrc_card_dai {
51 unsigned int fmt;
52 unsigned int sysclk; 51 unsigned int sysclk;
52 unsigned int tx_slot_mask;
53 unsigned int rx_slot_mask;
54 int slots;
55 int slot_width;
53 struct clk *clk; 56 struct clk *clk;
54 char dai_name[DAI_NAME_NUM]; 57 char dai_name[DAI_NAME_NUM];
55}; 58};
@@ -75,7 +78,7 @@ static int rsrc_card_startup(struct snd_pcm_substream *substream)
75 struct snd_soc_pcm_runtime *rtd = substream->private_data; 78 struct snd_soc_pcm_runtime *rtd = substream->private_data;
76 struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card); 79 struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
77 struct rsrc_card_dai *dai_props = 80 struct rsrc_card_dai *dai_props =
78 rsrc_priv_to_props(priv, rtd - rtd->card->rtd); 81 rsrc_priv_to_props(priv, rtd->num);
79 82
80 return clk_prepare_enable(dai_props->clk); 83 return clk_prepare_enable(dai_props->clk);
81} 84}
@@ -85,7 +88,7 @@ static void rsrc_card_shutdown(struct snd_pcm_substream *substream)
85 struct snd_soc_pcm_runtime *rtd = substream->private_data; 88 struct snd_soc_pcm_runtime *rtd = substream->private_data;
86 struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card); 89 struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
87 struct rsrc_card_dai *dai_props = 90 struct rsrc_card_dai *dai_props =
88 rsrc_priv_to_props(priv, rtd - rtd->card->rtd); 91 rsrc_priv_to_props(priv, rtd->num);
89 92
90 clk_disable_unprepare(dai_props->clk); 93 clk_disable_unprepare(dai_props->clk);
91} 94}
@@ -101,7 +104,7 @@ static int rsrc_card_dai_init(struct snd_soc_pcm_runtime *rtd)
101 struct snd_soc_dai *dai; 104 struct snd_soc_dai *dai;
102 struct snd_soc_dai_link *dai_link; 105 struct snd_soc_dai_link *dai_link;
103 struct rsrc_card_dai *dai_props; 106 struct rsrc_card_dai *dai_props;
104 int num = rtd - rtd->card->rtd; 107 int num = rtd->num;
105 int ret; 108 int ret;
106 109
107 dai_link = rsrc_priv_to_link(priv, num); 110 dai_link = rsrc_priv_to_link(priv, num);
@@ -110,18 +113,22 @@ static int rsrc_card_dai_init(struct snd_soc_pcm_runtime *rtd)
110 rtd->cpu_dai : 113 rtd->cpu_dai :
111 rtd->codec_dai; 114 rtd->codec_dai;
112 115
113 if (dai_props->fmt) { 116 if (dai_props->sysclk) {
114 ret = snd_soc_dai_set_fmt(dai, dai_props->fmt); 117 ret = snd_soc_dai_set_sysclk(dai, 0, dai_props->sysclk, 0);
115 if (ret && ret != -ENOTSUPP) { 118 if (ret && ret != -ENOTSUPP) {
116 dev_err(dai->dev, "set_fmt error\n"); 119 dev_err(dai->dev, "set_sysclk error\n");
117 goto err; 120 goto err;
118 } 121 }
119 } 122 }
120 123
121 if (dai_props->sysclk) { 124 if (dai_props->slots) {
122 ret = snd_soc_dai_set_sysclk(dai, 0, dai_props->sysclk, 0); 125 ret = snd_soc_dai_set_tdm_slot(dai,
126 dai_props->tx_slot_mask,
127 dai_props->rx_slot_mask,
128 dai_props->slots,
129 dai_props->slot_width);
123 if (ret && ret != -ENOTSUPP) { 130 if (ret && ret != -ENOTSUPP) {
124 dev_err(dai->dev, "set_sysclk error\n"); 131 dev_err(dai->dev, "set_tdm_slot error\n");
125 goto err; 132 goto err;
126 } 133 }
127 } 134 }
@@ -148,14 +155,13 @@ static int rsrc_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
148} 155}
149 156
150static int rsrc_card_parse_daifmt(struct device_node *node, 157static int rsrc_card_parse_daifmt(struct device_node *node,
151 struct device_node *np, 158 struct device_node *codec,
152 struct rsrc_card_priv *priv, 159 struct rsrc_card_priv *priv,
153 int idx, bool is_fe) 160 struct snd_soc_dai_link *dai_link,
161 unsigned int *retfmt)
154{ 162{
155 struct rsrc_card_dai *dai_props = rsrc_priv_to_props(priv, idx);
156 struct device_node *bitclkmaster = NULL; 163 struct device_node *bitclkmaster = NULL;
157 struct device_node *framemaster = NULL; 164 struct device_node *framemaster = NULL;
158 struct device_node *codec = is_fe ? NULL : np;
159 unsigned int daifmt; 165 unsigned int daifmt;
160 166
161 daifmt = snd_soc_of_parse_daifmt(node, NULL, 167 daifmt = snd_soc_of_parse_daifmt(node, NULL,
@@ -172,11 +178,11 @@ static int rsrc_card_parse_daifmt(struct device_node *node,
172 daifmt |= (codec == framemaster) ? 178 daifmt |= (codec == framemaster) ?
173 SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS; 179 SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS;
174 180
175 dai_props->fmt = daifmt;
176
177 of_node_put(bitclkmaster); 181 of_node_put(bitclkmaster);
178 of_node_put(framemaster); 182 of_node_put(framemaster);
179 183
184 *retfmt = daifmt;
185
180 return 0; 186 return 0;
181} 187}
182 188
@@ -198,6 +204,15 @@ static int rsrc_card_parse_links(struct device_node *np,
198 if (ret) 204 if (ret)
199 return ret; 205 return ret;
200 206
207 /* Parse TDM slot */
208 ret = snd_soc_of_parse_tdm_slot(np,
209 &dai_props->tx_slot_mask,
210 &dai_props->rx_slot_mask,
211 &dai_props->slots,
212 &dai_props->slot_width);
213 if (ret)
214 return ret;
215
201 if (is_fe) { 216 if (is_fe) {
202 /* BE is dummy */ 217 /* BE is dummy */
203 dai_link->codec_of_node = NULL; 218 dai_link->codec_of_node = NULL;
@@ -208,7 +223,9 @@ static int rsrc_card_parse_links(struct device_node *np,
208 dai_link->dynamic = 1; 223 dai_link->dynamic = 1;
209 dai_link->dpcm_merged_format = 1; 224 dai_link->dpcm_merged_format = 1;
210 dai_link->cpu_of_node = args.np; 225 dai_link->cpu_of_node = args.np;
211 snd_soc_of_get_dai_name(np, &dai_link->cpu_dai_name); 226 ret = snd_soc_of_get_dai_name(np, &dai_link->cpu_dai_name);
227 if (ret < 0)
228 return ret;
212 229
213 /* set dai_name */ 230 /* set dai_name */
214 snprintf(dai_props->dai_name, DAI_NAME_NUM, "fe.%s", 231 snprintf(dai_props->dai_name, DAI_NAME_NUM, "fe.%s",
@@ -240,7 +257,9 @@ static int rsrc_card_parse_links(struct device_node *np,
240 dai_link->no_pcm = 1; 257 dai_link->no_pcm = 1;
241 dai_link->be_hw_params_fixup = rsrc_card_be_hw_params_fixup; 258 dai_link->be_hw_params_fixup = rsrc_card_be_hw_params_fixup;
242 dai_link->codec_of_node = args.np; 259 dai_link->codec_of_node = args.np;
243 snd_soc_of_get_dai_name(np, &dai_link->codec_dai_name); 260 ret = snd_soc_of_get_dai_name(np, &dai_link->codec_dai_name);
261 if (ret < 0)
262 return ret;
244 263
245 /* additional name prefix */ 264 /* additional name prefix */
246 if (of_data) { 265 if (of_data) {
@@ -305,23 +324,16 @@ static int rsrc_card_parse_clk(struct device_node *np,
305 return 0; 324 return 0;
306} 325}
307 326
308static int rsrc_card_dai_link_of(struct device_node *node, 327static int rsrc_card_dai_sub_link_of(struct device_node *node,
309 struct device_node *np, 328 struct device_node *np,
310 struct rsrc_card_priv *priv, 329 struct rsrc_card_priv *priv,
311 int idx) 330 int idx, bool is_fe)
312{ 331{
313 struct device *dev = rsrc_priv_to_dev(priv); 332 struct device *dev = rsrc_priv_to_dev(priv);
333 struct snd_soc_dai_link *dai_link = rsrc_priv_to_link(priv, idx);
314 struct rsrc_card_dai *dai_props = rsrc_priv_to_props(priv, idx); 334 struct rsrc_card_dai *dai_props = rsrc_priv_to_props(priv, idx);
315 bool is_fe = false;
316 int ret; 335 int ret;
317 336
318 if (0 == strcmp(np->name, "cpu"))
319 is_fe = true;
320
321 ret = rsrc_card_parse_daifmt(node, np, priv, idx, is_fe);
322 if (ret < 0)
323 return ret;
324
325 ret = rsrc_card_parse_links(np, priv, idx, is_fe); 337 ret = rsrc_card_parse_links(np, priv, idx, is_fe);
326 if (ret < 0) 338 if (ret < 0)
327 return ret; 339 return ret;
@@ -332,12 +344,54 @@ static int rsrc_card_dai_link_of(struct device_node *node,
332 344
333 dev_dbg(dev, "\t%s / %04x / %d\n", 345 dev_dbg(dev, "\t%s / %04x / %d\n",
334 dai_props->dai_name, 346 dai_props->dai_name,
335 dai_props->fmt, 347 dai_link->dai_fmt,
336 dai_props->sysclk); 348 dai_props->sysclk);
337 349
338 return ret; 350 return ret;
339} 351}
340 352
353static int rsrc_card_dai_link_of(struct device_node *node,
354 struct rsrc_card_priv *priv)
355{
356 struct snd_soc_dai_link *dai_link;
357 struct device_node *np;
358 unsigned int daifmt = 0;
359 int ret, i;
360 bool is_fe;
361
362 /* find 1st codec */
363 i = 0;
364 for_each_child_of_node(node, np) {
365 dai_link = rsrc_priv_to_link(priv, i);
366
367 if (strcmp(np->name, "codec") == 0) {
368 ret = rsrc_card_parse_daifmt(node, np, priv,
369 dai_link, &daifmt);
370 if (ret < 0)
371 return ret;
372 break;
373 }
374 i++;
375 }
376
377 i = 0;
378 for_each_child_of_node(node, np) {
379 dai_link = rsrc_priv_to_link(priv, i);
380 dai_link->dai_fmt = daifmt;
381
382 is_fe = false;
383 if (strcmp(np->name, "cpu") == 0)
384 is_fe = true;
385
386 ret = rsrc_card_dai_sub_link_of(node, np, priv, i, is_fe);
387 if (ret < 0)
388 return ret;
389 i++;
390 }
391
392 return 0;
393}
394
341static int rsrc_card_parse_of(struct device_node *node, 395static int rsrc_card_parse_of(struct device_node *node,
342 struct rsrc_card_priv *priv, 396 struct rsrc_card_priv *priv,
343 struct device *dev) 397 struct device *dev)
@@ -345,9 +399,8 @@ static int rsrc_card_parse_of(struct device_node *node,
345 const struct rsrc_card_of_data *of_data = rsrc_dev_to_of_data(dev); 399 const struct rsrc_card_of_data *of_data = rsrc_dev_to_of_data(dev);
346 struct rsrc_card_dai *props; 400 struct rsrc_card_dai *props;
347 struct snd_soc_dai_link *links; 401 struct snd_soc_dai_link *links;
348 struct device_node *np;
349 int ret; 402 int ret;
350 int i, num; 403 int num;
351 404
352 if (!node) 405 if (!node)
353 return -EINVAL; 406 return -EINVAL;
@@ -388,13 +441,9 @@ static int rsrc_card_parse_of(struct device_node *node,
388 priv->snd_card.name ? priv->snd_card.name : "", 441 priv->snd_card.name ? priv->snd_card.name : "",
389 priv->convert_rate); 442 priv->convert_rate);
390 443
391 i = 0; 444 ret = rsrc_card_dai_link_of(node, priv);
392 for_each_child_of_node(node, np) { 445 if (ret < 0)
393 ret = rsrc_card_dai_link_of(node, np, priv, i); 446 return ret;
394 if (ret < 0)
395 return ret;
396 i++;
397 }
398 447
399 if (!priv->snd_card.name) 448 if (!priv->snd_card.name)
400 priv->snd_card.name = priv->snd_card.dai_link->name; 449 priv->snd_card.name = priv->snd_card.dai_link->name;
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
index 68b439ed22d7..5eda056d9f20 100644
--- a/sound/soc/sh/rcar/src.c
+++ b/sound/soc/sh/rcar/src.c
@@ -20,20 +20,21 @@
20#define OUF_SRC(id) ((1 << (id + 16)) | (1 << id)) 20#define OUF_SRC(id) ((1 << (id + 16)) | (1 << id))
21 21
22struct rsnd_src { 22struct rsnd_src {
23 struct rsnd_src_platform_info *info; /* rcar_snd.h */
24 struct rsnd_mod mod; 23 struct rsnd_mod mod;
24 struct rsnd_mod *dma;
25 struct rsnd_kctrl_cfg_s sen; /* sync convert enable */ 25 struct rsnd_kctrl_cfg_s sen; /* sync convert enable */
26 struct rsnd_kctrl_cfg_s sync; /* sync convert */ 26 struct rsnd_kctrl_cfg_s sync; /* sync convert */
27 u32 convert_rate; /* sampling rate convert */ 27 u32 convert_rate; /* sampling rate convert */
28 int err; 28 int err;
29 int irq;
29}; 30};
30 31
31#define RSND_SRC_NAME_SIZE 16 32#define RSND_SRC_NAME_SIZE 16
32 33
34#define rsnd_src_get(priv, id) ((struct rsnd_src *)(priv->src) + id)
35#define rsnd_src_to_dma(src) ((src)->dma)
33#define rsnd_src_nr(priv) ((priv)->src_nr) 36#define rsnd_src_nr(priv) ((priv)->src_nr)
34#define rsnd_enable_sync_convert(src) ((src)->sen.val) 37#define rsnd_enable_sync_convert(src) ((src)->sen.val)
35#define rsnd_src_of_node(priv) \
36 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,src")
37 38
38#define rsnd_mod_to_src(_mod) \ 39#define rsnd_mod_to_src(_mod) \
39 container_of((_mod), struct rsnd_src, mod) 40 container_of((_mod), struct rsnd_src, mod)
@@ -69,67 +70,16 @@ struct rsnd_src {
69 * |-----------------| 70 * |-----------------|
70 */ 71 */
71 72
72/* 73static void rsnd_src_activation(struct rsnd_mod *mod)
73 * How to use SRC bypass mode for debugging
74 *
75 * SRC has bypass mode, and it is useful for debugging.
76 * In Gen2 case,
77 * SRCm_MODE controls whether SRC is used or not
78 * SSI_MODE0 controls whether SSIU which receives SRC data
79 * is used or not.
80 * Both SRCm_MODE/SSI_MODE0 settings are needed if you use SRC,
81 * but SRC bypass mode needs SSI_MODE0 only.
82 *
83 * This driver request
84 * struct rsnd_src_platform_info {
85 * u32 convert_rate;
86 * int dma_id;
87 * }
88 *
89 * rsnd_src_convert_rate() indicates
90 * above convert_rate, and it controls
91 * whether SRC is used or not.
92 *
93 * ex) doesn't use SRC
94 * static struct rsnd_dai_platform_info rsnd_dai = {
95 * .playback = { .ssi = &rsnd_ssi[0], },
96 * };
97 *
98 * ex) uses SRC
99 * static struct rsnd_src_platform_info rsnd_src[] = {
100 * RSND_SCU(48000, 0),
101 * ...
102 * };
103 * static struct rsnd_dai_platform_info rsnd_dai = {
104 * .playback = { .ssi = &rsnd_ssi[0], .src = &rsnd_src[0] },
105 * };
106 *
107 * ex) uses SRC bypass mode
108 * static struct rsnd_src_platform_info rsnd_src[] = {
109 * RSND_SCU(0, 0),
110 * ...
111 * };
112 * static struct rsnd_dai_platform_info rsnd_dai = {
113 * .playback = { .ssi = &rsnd_ssi[0], .src = &rsnd_src[0] },
114 * };
115 *
116 */
117
118/*
119 * Gen1/Gen2 common functions
120 */
121static void rsnd_src_soft_reset(struct rsnd_mod *mod)
122{ 74{
123 rsnd_mod_write(mod, SRC_SWRSR, 0); 75 rsnd_mod_write(mod, SRC_SWRSR, 0);
124 rsnd_mod_write(mod, SRC_SWRSR, 1); 76 rsnd_mod_write(mod, SRC_SWRSR, 1);
125} 77}
126 78
127 79static void rsnd_src_halt(struct rsnd_mod *mod)
128#define rsnd_src_initialize_lock(mod) __rsnd_src_initialize_lock(mod, 1)
129#define rsnd_src_initialize_unlock(mod) __rsnd_src_initialize_lock(mod, 0)
130static void __rsnd_src_initialize_lock(struct rsnd_mod *mod, u32 enable)
131{ 80{
132 rsnd_mod_write(mod, SRC_SRCIR, enable); 81 rsnd_mod_write(mod, SRC_SRCIR, 1);
82 rsnd_mod_write(mod, SRC_SWRSR, 0);
133} 83}
134 84
135static struct dma_chan *rsnd_src_dma_req(struct rsnd_dai_stream *io, 85static struct dma_chan *rsnd_src_dma_req(struct rsnd_dai_stream *io,
@@ -143,99 +93,6 @@ static struct dma_chan *rsnd_src_dma_req(struct rsnd_dai_stream *io,
143 is_play ? "rx" : "tx"); 93 is_play ? "rx" : "tx");
144} 94}
145 95
146int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod,
147 struct rsnd_dai_stream *io,
148 int use_busif)
149{
150 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
151 int ssi_id = rsnd_mod_id(ssi_mod);
152
153 /*
154 * SSI_MODE0
155 */
156 rsnd_mod_bset(ssi_mod, SSI_MODE0, (1 << ssi_id),
157 !use_busif << ssi_id);
158
159 /*
160 * SSI_MODE1
161 */
162 if (rsnd_ssi_is_pin_sharing(io)) {
163 int shift = -1;
164 switch (ssi_id) {
165 case 1:
166 shift = 0;
167 break;
168 case 2:
169 shift = 2;
170 break;
171 case 4:
172 shift = 16;
173 break;
174 }
175
176 if (shift >= 0)
177 rsnd_mod_bset(ssi_mod, SSI_MODE1,
178 0x3 << shift,
179 rsnd_rdai_is_clk_master(rdai) ?
180 0x2 << shift : 0x1 << shift);
181 }
182
183 /*
184 * DMA settings for SSIU
185 */
186 if (use_busif) {
187 u32 val = rsnd_get_dalign(ssi_mod, io);
188
189 rsnd_mod_write(ssi_mod, SSI_BUSIF_ADINR,
190 rsnd_get_adinr_bit(ssi_mod, io));
191 rsnd_mod_write(ssi_mod, SSI_BUSIF_MODE, 1);
192 rsnd_mod_write(ssi_mod, SSI_CTRL, 0x1);
193
194 rsnd_mod_write(ssi_mod, SSI_BUSIF_DALIGN, val);
195 }
196
197 return 0;
198}
199
200int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod,
201 struct rsnd_dai_stream *io)
202{
203 /*
204 * DMA settings for SSIU
205 */
206 rsnd_mod_write(ssi_mod, SSI_CTRL, 0);
207
208 return 0;
209}
210
211int rsnd_src_ssi_irq_enable(struct rsnd_mod *ssi_mod)
212{
213 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
214
215 if (rsnd_is_gen1(priv))
216 return 0;
217
218 /* enable SSI interrupt if Gen2 */
219 rsnd_mod_write(ssi_mod, SSI_INT_ENABLE,
220 rsnd_ssi_is_dma_mode(ssi_mod) ?
221 0x0e000000 : 0x0f000000);
222
223 return 0;
224}
225
226int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod)
227{
228 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
229
230 if (rsnd_is_gen1(priv))
231 return 0;
232
233 /* disable SSI interrupt if Gen2 */
234 rsnd_mod_write(ssi_mod, SSI_INT_ENABLE, 0x00000000);
235
236 return 0;
237}
238
239static u32 rsnd_src_convert_rate(struct rsnd_dai_stream *io, 96static u32 rsnd_src_convert_rate(struct rsnd_dai_stream *io,
240 struct rsnd_src *src) 97 struct rsnd_src *src)
241{ 98{
@@ -283,34 +140,6 @@ unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
283 return rate; 140 return rate;
284} 141}
285 142
286static int rsnd_src_set_convert_rate(struct rsnd_mod *mod,
287 struct rsnd_dai_stream *io)
288{
289 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
290 struct rsnd_src *src = rsnd_mod_to_src(mod);
291 u32 convert_rate = rsnd_src_convert_rate(io, src);
292 u32 fsrate = 0;
293
294 if (convert_rate)
295 fsrate = 0x0400000 / convert_rate * runtime->rate;
296
297 /* Set channel number and output bit length */
298 rsnd_mod_write(mod, SRC_ADINR, rsnd_get_adinr_bit(mod, io));
299
300 /* Enable the initial value of IFS */
301 if (fsrate) {
302 rsnd_mod_write(mod, SRC_IFSCR, 1);
303
304 /* Set initial value of IFS */
305 rsnd_mod_write(mod, SRC_IFSVR, fsrate);
306 }
307
308 /* use DMA transfer */
309 rsnd_mod_write(mod, SRC_BUSIF_MODE, 1);
310
311 return 0;
312}
313
314static int rsnd_src_hw_params(struct rsnd_mod *mod, 143static int rsnd_src_hw_params(struct rsnd_mod *mod,
315 struct rsnd_dai_stream *io, 144 struct rsnd_dai_stream *io,
316 struct snd_pcm_substream *substream, 145 struct snd_pcm_substream *substream,
@@ -319,9 +148,6 @@ static int rsnd_src_hw_params(struct rsnd_mod *mod,
319 struct rsnd_src *src = rsnd_mod_to_src(mod); 148 struct rsnd_src *src = rsnd_mod_to_src(mod);
320 struct snd_soc_pcm_runtime *fe = substream->private_data; 149 struct snd_soc_pcm_runtime *fe = substream->private_data;
321 150
322 /* default value (mainly for non-DT) */
323 src->convert_rate = src->info->convert_rate;
324
325 /* 151 /*
326 * SRC assumes that it is used under DPCM if user want to use 152 * SRC assumes that it is used under DPCM if user want to use
327 * sampling rate convert. Then, SRC should be FE. 153 * sampling rate convert. Then, SRC should be FE.
@@ -347,250 +173,112 @@ static int rsnd_src_hw_params(struct rsnd_mod *mod,
347 return 0; 173 return 0;
348} 174}
349 175
350static int rsnd_src_init(struct rsnd_mod *mod, 176static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
351 struct rsnd_priv *priv) 177 struct rsnd_mod *mod)
352{
353 struct rsnd_src *src = rsnd_mod_to_src(mod);
354
355 rsnd_mod_power_on(mod);
356
357 rsnd_src_soft_reset(mod);
358
359 rsnd_src_initialize_lock(mod);
360
361 src->err = 0;
362
363 /* reset sync convert_rate */
364 src->sync.val = 0;
365
366 return 0;
367}
368
369static int rsnd_src_quit(struct rsnd_mod *mod,
370 struct rsnd_dai_stream *io,
371 struct rsnd_priv *priv)
372{ 178{
373 struct rsnd_src *src = rsnd_mod_to_src(mod); 179 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
374 struct device *dev = rsnd_priv_to_dev(priv); 180 struct device *dev = rsnd_priv_to_dev(priv);
181 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
182 struct rsnd_src *src = rsnd_mod_to_src(mod);
183 u32 convert_rate = rsnd_src_convert_rate(io, src);
184 u32 ifscr, fsrate, adinr;
185 u32 cr, route;
186 u32 bsdsr, bsisr;
187 uint ratio;
375 188
376 rsnd_mod_power_off(mod); 189 if (!runtime)
377 190 return;
378 if (src->err)
379 dev_warn(dev, "%s[%d] under/over flow err = %d\n",
380 rsnd_mod_name(mod), rsnd_mod_id(mod), src->err);
381
382 src->convert_rate = 0;
383
384 /* reset sync convert_rate */
385 src->sync.val = 0;
386
387 return 0;
388}
389
390static int rsnd_src_start(struct rsnd_mod *mod)
391{
392 rsnd_src_initialize_unlock(mod);
393
394 return 0;
395}
396
397static int rsnd_src_stop(struct rsnd_mod *mod)
398{
399 /* nothing to do */
400 return 0;
401}
402 191
403/* 192 /* 6 - 1/6 are very enough ratio for SRC_BSDSR */
404 * Gen1 functions 193 if (!convert_rate)
405 */ 194 ratio = 0;
406static int rsnd_src_set_route_gen1(struct rsnd_dai_stream *io, 195 else if (convert_rate > runtime->rate)
407 struct rsnd_mod *mod) 196 ratio = 100 * convert_rate / runtime->rate;
408{ 197 else
409 struct src_route_config { 198 ratio = 100 * runtime->rate / convert_rate;
410 u32 mask;
411 int shift;
412 } routes[] = {
413 { 0xF, 0, }, /* 0 */
414 { 0xF, 4, }, /* 1 */
415 { 0xF, 8, }, /* 2 */
416 { 0x7, 12, }, /* 3 */
417 { 0x7, 16, }, /* 4 */
418 { 0x7, 20, }, /* 5 */
419 { 0x7, 24, }, /* 6 */
420 { 0x3, 28, }, /* 7 */
421 { 0x3, 30, }, /* 8 */
422 };
423 u32 mask;
424 u32 val;
425 int id;
426 199
427 id = rsnd_mod_id(mod); 200 if (ratio > 600) {
428 if (id < 0 || id >= ARRAY_SIZE(routes)) 201 dev_err(dev, "FSO/FSI ratio error\n");
429 return -EIO; 202 return;
203 }
430 204
431 /* 205 /*
432 * SRC_ROUTE_SELECT 206 * SRC_ADINR
433 */ 207 */
434 val = rsnd_io_is_play(io) ? 0x1 : 0x2; 208 adinr = rsnd_get_adinr_bit(mod, io) |
435 val = val << routes[id].shift; 209 rsnd_get_adinr_chan(mod, io);
436 mask = routes[id].mask << routes[id].shift;
437
438 rsnd_mod_bset(mod, SRC_ROUTE_SEL, mask, val);
439
440 return 0;
441}
442
443static int rsnd_src_set_convert_timing_gen1(struct rsnd_dai_stream *io,
444 struct rsnd_mod *mod)
445{
446 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
447 struct rsnd_src *src = rsnd_mod_to_src(mod);
448 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
449 u32 convert_rate = rsnd_src_convert_rate(io, src);
450 u32 mask;
451 u32 val;
452 int shift;
453 int id = rsnd_mod_id(mod);
454 int ret;
455 210
456 /* 211 /*
457 * SRC_TIMING_SELECT 212 * SRC_IFSCR / SRC_IFSVR
458 */ 213 */
459 shift = (id % 4) * 8; 214 ifscr = 0;
460 mask = 0x1F << shift; 215 fsrate = 0;
216 if (convert_rate) {
217 ifscr = 1;
218 fsrate = 0x0400000 / convert_rate * runtime->rate;
219 }
461 220
462 /* 221 /*
463 * ADG is used as source clock if SRC was used, 222 * SRC_SRCCR / SRC_ROUTE_MODE0
464 * then, SSI WS is used as destination clock.
465 * SSI WS is used as source clock if SRC is not used
466 * (when playback, source/destination become reverse when capture)
467 */ 223 */
468 ret = 0; 224 cr = 0x00011110;
225 route = 0x0;
469 if (convert_rate) { 226 if (convert_rate) {
470 /* use ADG */ 227 route = 0x1;
471 val = 0;
472 ret = rsnd_adg_set_convert_clk_gen1(priv, mod,
473 runtime->rate,
474 convert_rate);
475 } else if (8 == id) {
476 /* use SSI WS, but SRU8 is special */
477 val = id << shift;
478 } else {
479 /* use SSI WS */
480 val = (id + 1) << shift;
481 }
482 228
483 if (ret < 0) 229 if (rsnd_enable_sync_convert(src)) {
484 return ret; 230 cr |= 0x1;
231 route |= rsnd_io_is_play(io) ?
232 (0x1 << 24) : (0x1 << 25);
233 }
234 }
485 235
486 switch (id / 4) { 236 /*
487 case 0: 237 * SRC_BSDSR / SRC_BSISR
488 rsnd_mod_bset(mod, SRC_TMG_SEL0, mask, val); 238 */
489 break; 239 switch (rsnd_mod_id(mod)) {
490 case 1: 240 case 5:
491 rsnd_mod_bset(mod, SRC_TMG_SEL1, mask, val); 241 case 6:
242 case 7:
243 case 8:
244 bsdsr = 0x02400000; /* 6 - 1/6 */
245 bsisr = 0x00100060; /* 6 - 1/6 */
492 break; 246 break;
493 case 2: 247 default:
494 rsnd_mod_bset(mod, SRC_TMG_SEL2, mask, val); 248 bsdsr = 0x01800000; /* 6 - 1/6 */
249 bsisr = 0x00100060 ;/* 6 - 1/6 */
495 break; 250 break;
496 } 251 }
497 252
498 return 0; 253 rsnd_mod_write(mod, SRC_SRCIR, 1); /* initialize */
499} 254 rsnd_mod_write(mod, SRC_ADINR, adinr);
500 255 rsnd_mod_write(mod, SRC_IFSCR, ifscr);
501static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod, 256 rsnd_mod_write(mod, SRC_IFSVR, fsrate);
502 struct rsnd_dai_stream *io) 257 rsnd_mod_write(mod, SRC_SRCCR, cr);
503{ 258 rsnd_mod_write(mod, SRC_BSDSR, bsdsr);
504 struct rsnd_src *src = rsnd_mod_to_src(mod); 259 rsnd_mod_write(mod, SRC_BSISR, bsisr);
505 int ret; 260 rsnd_mod_write(mod, SRC_SRCIR, 0); /* cancel initialize */
506
507 ret = rsnd_src_set_convert_rate(mod, io);
508 if (ret < 0)
509 return ret;
510
511 /* Select SRC mode (fixed value) */
512 rsnd_mod_write(mod, SRC_SRCCR, 0x00010110);
513
514 /* Set the restriction value of the FS ratio (98%) */
515 rsnd_mod_write(mod, SRC_MNFSR,
516 rsnd_mod_read(mod, SRC_IFSVR) / 100 * 98);
517
518 /* Gen1/Gen2 are not compatible */
519 if (rsnd_src_convert_rate(io, src))
520 rsnd_mod_write(mod, SRC_ROUTE_MODE0, 1);
521
522 /* no SRC_BFSSR settings, since SRC_SRCCR::BUFMD is 0 */
523
524 return 0;
525}
526
527static int rsnd_src_init_gen1(struct rsnd_mod *mod,
528 struct rsnd_dai_stream *io,
529 struct rsnd_priv *priv)
530{
531 int ret;
532
533 ret = rsnd_src_init(mod, priv);
534 if (ret < 0)
535 return ret;
536
537 ret = rsnd_src_set_route_gen1(io, mod);
538 if (ret < 0)
539 return ret;
540
541 ret = rsnd_src_set_convert_rate_gen1(mod, io);
542 if (ret < 0)
543 return ret;
544
545 ret = rsnd_src_set_convert_timing_gen1(io, mod);
546 if (ret < 0)
547 return ret;
548
549 return 0;
550}
551
552static int rsnd_src_start_gen1(struct rsnd_mod *mod,
553 struct rsnd_dai_stream *io,
554 struct rsnd_priv *priv)
555{
556 int id = rsnd_mod_id(mod);
557
558 rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), (1 << id));
559
560 return rsnd_src_start(mod);
561}
562
563static int rsnd_src_stop_gen1(struct rsnd_mod *mod,
564 struct rsnd_dai_stream *io,
565 struct rsnd_priv *priv)
566{
567 int id = rsnd_mod_id(mod);
568 261
569 rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), 0); 262 rsnd_mod_write(mod, SRC_ROUTE_MODE0, route);
263 rsnd_mod_write(mod, SRC_I_BUSIF_MODE, 1);
264 rsnd_mod_write(mod, SRC_O_BUSIF_MODE, 1);
265 rsnd_mod_write(mod, SRC_BUSIF_DALIGN, rsnd_get_dalign(mod, io));
570 266
571 return rsnd_src_stop(mod); 267 if (convert_rate)
268 rsnd_adg_set_convert_clk_gen2(mod, io,
269 runtime->rate,
270 convert_rate);
271 else
272 rsnd_adg_set_convert_timing_gen2(mod, io);
572} 273}
573 274
574static struct rsnd_mod_ops rsnd_src_gen1_ops = { 275#define rsnd_src_irq_enable(mod) rsnd_src_irq_ctrol(mod, 1)
575 .name = SRC_NAME, 276#define rsnd_src_irq_disable(mod) rsnd_src_irq_ctrol(mod, 0)
576 .dma_req = rsnd_src_dma_req, 277static void rsnd_src_irq_ctrol(struct rsnd_mod *mod, int enable)
577 .init = rsnd_src_init_gen1,
578 .quit = rsnd_src_quit,
579 .start = rsnd_src_start_gen1,
580 .stop = rsnd_src_stop_gen1,
581 .hw_params = rsnd_src_hw_params,
582};
583
584/*
585 * Gen2 functions
586 */
587#define rsnd_src_irq_enable_gen2(mod) rsnd_src_irq_ctrol_gen2(mod, 1)
588#define rsnd_src_irq_disable_gen2(mod) rsnd_src_irq_ctrol_gen2(mod, 0)
589static void rsnd_src_irq_ctrol_gen2(struct rsnd_mod *mod, int enable)
590{ 278{
591 struct rsnd_src *src = rsnd_mod_to_src(mod); 279 struct rsnd_src *src = rsnd_mod_to_src(mod);
592 u32 sys_int_val, int_val, sys_int_mask; 280 u32 sys_int_val, int_val, sys_int_mask;
593 int irq = src->info->irq; 281 int irq = src->irq;
594 int id = rsnd_mod_id(mod); 282 int id = rsnd_mod_id(mod);
595 283
596 sys_int_val = 284 sys_int_val =
@@ -600,7 +288,7 @@ static void rsnd_src_irq_ctrol_gen2(struct rsnd_mod *mod, int enable)
600 /* 288 /*
601 * IRQ is not supported on non-DT 289 * IRQ is not supported on non-DT
602 * see 290 * see
603 * rsnd_src_probe_gen2() 291 * rsnd_src_probe_()
604 */ 292 */
605 if ((irq <= 0) || !enable) { 293 if ((irq <= 0) || !enable) {
606 sys_int_val = 0; 294 sys_int_val = 0;
@@ -620,7 +308,7 @@ static void rsnd_src_irq_ctrol_gen2(struct rsnd_mod *mod, int enable)
620 rsnd_mod_bset(mod, SCU_SYS_INT_EN1, sys_int_mask, sys_int_val); 308 rsnd_mod_bset(mod, SCU_SYS_INT_EN1, sys_int_mask, sys_int_val);
621} 309}
622 310
623static void rsnd_src_error_clear_gen2(struct rsnd_mod *mod) 311static void rsnd_src_status_clear(struct rsnd_mod *mod)
624{ 312{
625 u32 val = OUF_SRC(rsnd_mod_id(mod)); 313 u32 val = OUF_SRC(rsnd_mod_id(mod));
626 314
@@ -628,7 +316,7 @@ static void rsnd_src_error_clear_gen2(struct rsnd_mod *mod)
628 rsnd_mod_bset(mod, SCU_SYS_STATUS1, val, val); 316 rsnd_mod_bset(mod, SCU_SYS_STATUS1, val, val);
629} 317}
630 318
631static bool rsnd_src_error_record_gen2(struct rsnd_mod *mod) 319static bool rsnd_src_record_error(struct rsnd_mod *mod)
632{ 320{
633 struct rsnd_src *src = rsnd_mod_to_src(mod); 321 struct rsnd_src *src = rsnd_mod_to_src(mod);
634 u32 val0, val1; 322 u32 val0, val1;
@@ -652,22 +340,16 @@ static bool rsnd_src_error_record_gen2(struct rsnd_mod *mod)
652 ret = true; 340 ret = true;
653 } 341 }
654 342
655 /* clear error static */
656 rsnd_src_error_clear_gen2(mod);
657
658 return ret; 343 return ret;
659} 344}
660 345
661static int _rsnd_src_start_gen2(struct rsnd_mod *mod, 346static int rsnd_src_start(struct rsnd_mod *mod,
662 struct rsnd_dai_stream *io) 347 struct rsnd_dai_stream *io,
348 struct rsnd_priv *priv)
663{ 349{
664 struct rsnd_src *src = rsnd_mod_to_src(mod); 350 struct rsnd_src *src = rsnd_mod_to_src(mod);
665 u32 val; 351 u32 val;
666 352
667 val = rsnd_get_dalign(mod, io);
668
669 rsnd_mod_write(mod, SRC_BUSIF_DALIGN, val);
670
671 /* 353 /*
672 * WORKAROUND 354 * WORKAROUND
673 * 355 *
@@ -678,247 +360,149 @@ static int _rsnd_src_start_gen2(struct rsnd_mod *mod,
678 360
679 rsnd_mod_write(mod, SRC_CTRL, val); 361 rsnd_mod_write(mod, SRC_CTRL, val);
680 362
681 rsnd_src_error_clear_gen2(mod); 363 return 0;
682 364}
683 rsnd_src_start(mod);
684 365
685 rsnd_src_irq_enable_gen2(mod); 366static int rsnd_src_stop(struct rsnd_mod *mod,
367 struct rsnd_dai_stream *io,
368 struct rsnd_priv *priv)
369{
370 /*
371 * stop SRC output only
372 * see rsnd_src_quit
373 */
374 rsnd_mod_write(mod, SRC_CTRL, 0x01);
686 375
687 return 0; 376 return 0;
688} 377}
689 378
690static int _rsnd_src_stop_gen2(struct rsnd_mod *mod) 379static int rsnd_src_init(struct rsnd_mod *mod,
380 struct rsnd_dai_stream *io,
381 struct rsnd_priv *priv)
691{ 382{
692 rsnd_src_irq_disable_gen2(mod); 383 struct rsnd_src *src = rsnd_mod_to_src(mod);
693 384
694 rsnd_mod_write(mod, SRC_CTRL, 0); 385 rsnd_mod_power_on(mod);
386
387 rsnd_src_activation(mod);
388
389 rsnd_src_set_convert_rate(io, mod);
695 390
696 rsnd_src_error_record_gen2(mod); 391 rsnd_src_status_clear(mod);
392
393 rsnd_src_irq_enable(mod);
394
395 src->err = 0;
697 396
698 return rsnd_src_stop(mod); 397 /* reset sync convert_rate */
398 src->sync.val = 0;
399
400 return 0;
699} 401}
700 402
701static void __rsnd_src_interrupt_gen2(struct rsnd_mod *mod, 403static int rsnd_src_quit(struct rsnd_mod *mod,
702 struct rsnd_dai_stream *io) 404 struct rsnd_dai_stream *io,
405 struct rsnd_priv *priv)
703{ 406{
704 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 407 struct rsnd_src *src = rsnd_mod_to_src(mod);
705 408 struct device *dev = rsnd_priv_to_dev(priv);
706 spin_lock(&priv->lock);
707 409
708 /* ignore all cases if not working */ 410 rsnd_src_irq_disable(mod);
709 if (!rsnd_io_is_working(io))
710 goto rsnd_src_interrupt_gen2_out;
711 411
712 if (rsnd_src_error_record_gen2(mod)) { 412 /* stop both out/in */
713 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 413 rsnd_mod_write(mod, SRC_CTRL, 0);
714 struct rsnd_src *src = rsnd_mod_to_src(mod);
715 struct device *dev = rsnd_priv_to_dev(priv);
716 414
717 dev_dbg(dev, "%s[%d] restart\n", 415 rsnd_src_halt(mod);
718 rsnd_mod_name(mod), rsnd_mod_id(mod));
719 416
720 _rsnd_src_stop_gen2(mod); 417 rsnd_mod_power_off(mod);
721 if (src->err < 1024)
722 _rsnd_src_start_gen2(mod, io);
723 else
724 dev_warn(dev, "no more SRC restart\n");
725 }
726 418
727rsnd_src_interrupt_gen2_out: 419 if (src->err)
728 spin_unlock(&priv->lock); 420 dev_warn(dev, "%s[%d] under/over flow err = %d\n",
729} 421 rsnd_mod_name(mod), rsnd_mod_id(mod), src->err);
730 422
731static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data) 423 src->convert_rate = 0;
732{
733 struct rsnd_mod *mod = data;
734 424
735 rsnd_mod_interrupt(mod, __rsnd_src_interrupt_gen2); 425 /* reset sync convert_rate */
426 src->sync.val = 0;
736 427
737 return IRQ_HANDLED; 428 return 0;
738} 429}
739 430
740static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod, 431static void __rsnd_src_interrupt(struct rsnd_mod *mod,
741 struct rsnd_dai_stream *io) 432 struct rsnd_dai_stream *io)
742{ 433{
743 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 434 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
744 struct device *dev = rsnd_priv_to_dev(priv);
745 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
746 struct rsnd_src *src = rsnd_mod_to_src(mod); 435 struct rsnd_src *src = rsnd_mod_to_src(mod);
747 u32 convert_rate = rsnd_src_convert_rate(io, src); 436 struct device *dev = rsnd_priv_to_dev(priv);
748 u32 cr, route;
749 uint ratio;
750 int ret;
751 437
752 /* 6 - 1/6 are very enough ratio for SRC_BSDSR */ 438 spin_lock(&priv->lock);
753 if (!convert_rate)
754 ratio = 0;
755 else if (convert_rate > runtime->rate)
756 ratio = 100 * convert_rate / runtime->rate;
757 else
758 ratio = 100 * runtime->rate / convert_rate;
759 439
760 if (ratio > 600) { 440 /* ignore all cases if not working */
761 dev_err(dev, "FSO/FSI ratio error\n"); 441 if (!rsnd_io_is_working(io))
762 return -EINVAL; 442 goto rsnd_src_interrupt_out;
763 }
764 443
765 ret = rsnd_src_set_convert_rate(mod, io); 444 if (rsnd_src_record_error(mod)) {
766 if (ret < 0)
767 return ret;
768 445
769 cr = 0x00011110; 446 dev_dbg(dev, "%s[%d] restart\n",
770 route = 0x0; 447 rsnd_mod_name(mod), rsnd_mod_id(mod));
771 if (convert_rate) {
772 route = 0x1;
773 448
774 if (rsnd_enable_sync_convert(src)) { 449 rsnd_src_stop(mod, io, priv);
775 cr |= 0x1; 450 rsnd_src_start(mod, io, priv);
776 route |= rsnd_io_is_play(io) ?
777 (0x1 << 24) : (0x1 << 25);
778 }
779 } 451 }
780 452
781 rsnd_mod_write(mod, SRC_SRCCR, cr); 453 if (src->err > 1024) {
782 rsnd_mod_write(mod, SRC_ROUTE_MODE0, route); 454 rsnd_src_irq_disable(mod);
783 455
784 switch (rsnd_mod_id(mod)) { 456 dev_warn(dev, "no more %s[%d] restart\n",
785 case 5: 457 rsnd_mod_name(mod), rsnd_mod_id(mod));
786 case 6:
787 case 7:
788 case 8:
789 rsnd_mod_write(mod, SRC_BSDSR, 0x02400000);
790 break;
791 default:
792 rsnd_mod_write(mod, SRC_BSDSR, 0x01800000);
793 break;
794 } 458 }
795 459
796 rsnd_mod_write(mod, SRC_BSISR, 0x00100060); 460 rsnd_src_status_clear(mod);
461rsnd_src_interrupt_out:
797 462
798 return 0; 463 spin_unlock(&priv->lock);
799} 464}
800 465
801static int rsnd_src_set_convert_timing_gen2(struct rsnd_dai_stream *io, 466static irqreturn_t rsnd_src_interrupt(int irq, void *data)
802 struct rsnd_mod *mod)
803{ 467{
804 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); 468 struct rsnd_mod *mod = data;
805 struct rsnd_src *src = rsnd_mod_to_src(mod);
806 u32 convert_rate = rsnd_src_convert_rate(io, src);
807 int ret;
808 469
809 if (convert_rate) 470 rsnd_mod_interrupt(mod, __rsnd_src_interrupt);
810 ret = rsnd_adg_set_convert_clk_gen2(mod, io,
811 runtime->rate,
812 convert_rate);
813 else
814 ret = rsnd_adg_set_convert_timing_gen2(mod, io);
815 471
816 return ret; 472 return IRQ_HANDLED;
817} 473}
818 474
819static int rsnd_src_probe_gen2(struct rsnd_mod *mod, 475static int rsnd_src_probe_(struct rsnd_mod *mod,
820 struct rsnd_dai_stream *io, 476 struct rsnd_dai_stream *io,
821 struct rsnd_priv *priv) 477 struct rsnd_priv *priv)
822{ 478{
823 struct rsnd_src *src = rsnd_mod_to_src(mod); 479 struct rsnd_src *src = rsnd_mod_to_src(mod);
824 struct device *dev = rsnd_priv_to_dev(priv); 480 struct device *dev = rsnd_priv_to_dev(priv);
825 int irq = src->info->irq; 481 int irq = src->irq;
826 int ret; 482 int ret;
827 483
828 if (irq > 0) { 484 if (irq > 0) {
829 /* 485 /*
830 * IRQ is not supported on non-DT 486 * IRQ is not supported on non-DT
831 * see 487 * see
832 * rsnd_src_irq_enable_gen2() 488 * rsnd_src_irq_enable()
833 */ 489 */
834 ret = devm_request_irq(dev, irq, 490 ret = devm_request_irq(dev, irq,
835 rsnd_src_interrupt_gen2, 491 rsnd_src_interrupt,
836 IRQF_SHARED, 492 IRQF_SHARED,
837 dev_name(dev), mod); 493 dev_name(dev), mod);
838 if (ret) 494 if (ret)
839 return ret; 495 return ret;
840 } 496 }
841 497
842 ret = rsnd_dma_init(io, 498 src->dma = rsnd_dma_attach(io, mod, 0);
843 rsnd_mod_to_dma(mod), 499 if (IS_ERR(src->dma))
844 src->info->dma_id); 500 return PTR_ERR(src->dma);
845 501
846 return ret; 502 return ret;
847} 503}
848 504
849static int rsnd_src_remove_gen2(struct rsnd_mod *mod, 505static int rsnd_src_pcm_new(struct rsnd_mod *mod,
850 struct rsnd_dai_stream *io,
851 struct rsnd_priv *priv)
852{
853 rsnd_dma_quit(io, rsnd_mod_to_dma(mod));
854
855 return 0;
856}
857
858static int rsnd_src_init_gen2(struct rsnd_mod *mod,
859 struct rsnd_dai_stream *io,
860 struct rsnd_priv *priv)
861{
862 int ret;
863
864 ret = rsnd_src_init(mod, priv);
865 if (ret < 0)
866 return ret;
867
868 ret = rsnd_src_set_convert_rate_gen2(mod, io);
869 if (ret < 0)
870 return ret;
871
872 ret = rsnd_src_set_convert_timing_gen2(io, mod);
873 if (ret < 0)
874 return ret;
875
876 return 0;
877}
878
879static int rsnd_src_start_gen2(struct rsnd_mod *mod,
880 struct rsnd_dai_stream *io,
881 struct rsnd_priv *priv)
882{
883 rsnd_dma_start(io, rsnd_mod_to_dma(mod));
884
885 return _rsnd_src_start_gen2(mod, io);
886}
887
888static int rsnd_src_stop_gen2(struct rsnd_mod *mod,
889 struct rsnd_dai_stream *io,
890 struct rsnd_priv *priv)
891{
892 int ret;
893
894 ret = _rsnd_src_stop_gen2(mod);
895
896 rsnd_dma_stop(io, rsnd_mod_to_dma(mod));
897
898 return ret;
899}
900
901static void rsnd_src_reconvert_update(struct rsnd_dai_stream *io,
902 struct rsnd_mod *mod)
903{
904 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
905 struct rsnd_src *src = rsnd_mod_to_src(mod);
906 u32 convert_rate = rsnd_src_convert_rate(io, src);
907 u32 fsrate;
908
909 if (!runtime)
910 return;
911
912 if (!convert_rate)
913 convert_rate = runtime->rate;
914
915 fsrate = 0x0400000 / convert_rate * runtime->rate;
916
917 /* update IFS */
918 rsnd_mod_write(mod, SRC_IFSVR, fsrate);
919}
920
921static int rsnd_src_pcm_new_gen2(struct rsnd_mod *mod,
922 struct rsnd_dai_stream *io, 506 struct rsnd_dai_stream *io,
923 struct snd_soc_pcm_runtime *rtd) 507 struct snd_soc_pcm_runtime *rtd)
924{ 508{
@@ -950,7 +534,7 @@ static int rsnd_src_pcm_new_gen2(struct rsnd_mod *mod,
950 rsnd_io_is_play(io) ? 534 rsnd_io_is_play(io) ?
951 "SRC Out Rate Switch" : 535 "SRC Out Rate Switch" :
952 "SRC In Rate Switch", 536 "SRC In Rate Switch",
953 rsnd_src_reconvert_update, 537 rsnd_src_set_convert_rate,
954 &src->sen, 1); 538 &src->sen, 1);
955 if (ret < 0) 539 if (ret < 0)
956 return ret; 540 return ret;
@@ -959,23 +543,22 @@ static int rsnd_src_pcm_new_gen2(struct rsnd_mod *mod,
959 rsnd_io_is_play(io) ? 543 rsnd_io_is_play(io) ?
960 "SRC Out Rate" : 544 "SRC Out Rate" :
961 "SRC In Rate", 545 "SRC In Rate",
962 rsnd_src_reconvert_update, 546 rsnd_src_set_convert_rate,
963 &src->sync, 192000); 547 &src->sync, 192000);
964 548
965 return ret; 549 return ret;
966} 550}
967 551
968static struct rsnd_mod_ops rsnd_src_gen2_ops = { 552static struct rsnd_mod_ops rsnd_src_ops = {
969 .name = SRC_NAME, 553 .name = SRC_NAME,
970 .dma_req = rsnd_src_dma_req, 554 .dma_req = rsnd_src_dma_req,
971 .probe = rsnd_src_probe_gen2, 555 .probe = rsnd_src_probe_,
972 .remove = rsnd_src_remove_gen2, 556 .init = rsnd_src_init,
973 .init = rsnd_src_init_gen2,
974 .quit = rsnd_src_quit, 557 .quit = rsnd_src_quit,
975 .start = rsnd_src_start_gen2, 558 .start = rsnd_src_start,
976 .stop = rsnd_src_stop_gen2, 559 .stop = rsnd_src_stop,
977 .hw_params = rsnd_src_hw_params, 560 .hw_params = rsnd_src_hw_params,
978 .pcm_new = rsnd_src_pcm_new_gen2, 561 .pcm_new = rsnd_src_pcm_new,
979}; 562};
980 563
981struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id) 564struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
@@ -983,113 +566,78 @@ struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
983 if (WARN_ON(id < 0 || id >= rsnd_src_nr(priv))) 566 if (WARN_ON(id < 0 || id >= rsnd_src_nr(priv)))
984 id = 0; 567 id = 0;
985 568
986 return rsnd_mod_get((struct rsnd_src *)(priv->src) + id); 569 return rsnd_mod_get(rsnd_src_get(priv, id));
987} 570}
988 571
989static void rsnd_of_parse_src(struct platform_device *pdev, 572int rsnd_src_probe(struct rsnd_priv *priv)
990 const struct rsnd_of_data *of_data,
991 struct rsnd_priv *priv)
992{ 573{
993 struct device_node *src_node; 574 struct device_node *node;
994 struct device_node *np; 575 struct device_node *np;
995 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
996 struct rsnd_src_platform_info *src_info;
997 struct device *dev = &pdev->dev;
998 int nr, i;
999
1000 if (!of_data)
1001 return;
1002
1003 src_node = rsnd_src_of_node(priv);
1004 if (!src_node)
1005 return;
1006
1007 nr = of_get_child_count(src_node);
1008 if (!nr)
1009 goto rsnd_of_parse_src_end;
1010
1011 src_info = devm_kzalloc(dev,
1012 sizeof(struct rsnd_src_platform_info) * nr,
1013 GFP_KERNEL);
1014 if (!src_info) {
1015 dev_err(dev, "src info allocation error\n");
1016 goto rsnd_of_parse_src_end;
1017 }
1018
1019 info->src_info = src_info;
1020 info->src_info_nr = nr;
1021
1022 i = 0;
1023 for_each_child_of_node(src_node, np) {
1024 src_info[i].irq = irq_of_parse_and_map(np, 0);
1025
1026 i++;
1027 }
1028
1029rsnd_of_parse_src_end:
1030 of_node_put(src_node);
1031}
1032
1033int rsnd_src_probe(struct platform_device *pdev,
1034 const struct rsnd_of_data *of_data,
1035 struct rsnd_priv *priv)
1036{
1037 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
1038 struct device *dev = rsnd_priv_to_dev(priv); 576 struct device *dev = rsnd_priv_to_dev(priv);
1039 struct rsnd_src *src; 577 struct rsnd_src *src;
1040 struct rsnd_mod_ops *ops;
1041 struct clk *clk; 578 struct clk *clk;
1042 char name[RSND_SRC_NAME_SIZE]; 579 char name[RSND_SRC_NAME_SIZE];
1043 int i, nr, ret; 580 int i, nr, ret;
1044 581
1045 ops = NULL; 582 /* This driver doesn't support Gen1 at this point */
1046 if (rsnd_is_gen1(priv)) { 583 if (rsnd_is_gen1(priv))
1047 ops = &rsnd_src_gen1_ops; 584 return 0;
1048 dev_warn(dev, "Gen1 support will be removed soon\n");
1049 }
1050 if (rsnd_is_gen2(priv))
1051 ops = &rsnd_src_gen2_ops;
1052 if (!ops) {
1053 dev_err(dev, "unknown Generation\n");
1054 return -EIO;
1055 }
1056 585
1057 rsnd_of_parse_src(pdev, of_data, priv); 586 node = rsnd_src_of_node(priv);
587 if (!node)
588 return 0; /* not used is not error */
1058 589
1059 /* 590 nr = of_get_child_count(node);
1060 * init SRC 591 if (!nr) {
1061 */ 592 ret = -EINVAL;
1062 nr = info->src_info_nr; 593 goto rsnd_src_probe_done;
1063 if (!nr) 594 }
1064 return 0;
1065 595
1066 src = devm_kzalloc(dev, sizeof(*src) * nr, GFP_KERNEL); 596 src = devm_kzalloc(dev, sizeof(*src) * nr, GFP_KERNEL);
1067 if (!src) 597 if (!src) {
1068 return -ENOMEM; 598 ret = -ENOMEM;
599 goto rsnd_src_probe_done;
600 }
1069 601
1070 priv->src_nr = nr; 602 priv->src_nr = nr;
1071 priv->src = src; 603 priv->src = src;
1072 604
1073 for_each_rsnd_src(src, priv, i) { 605 i = 0;
606 for_each_child_of_node(node, np) {
607 src = rsnd_src_get(priv, i);
608
1074 snprintf(name, RSND_SRC_NAME_SIZE, "%s.%d", 609 snprintf(name, RSND_SRC_NAME_SIZE, "%s.%d",
1075 SRC_NAME, i); 610 SRC_NAME, i);
1076 611
1077 clk = devm_clk_get(dev, name); 612 src->irq = irq_of_parse_and_map(np, 0);
1078 if (IS_ERR(clk)) 613 if (!src->irq) {
1079 return PTR_ERR(clk); 614 ret = -EINVAL;
615 goto rsnd_src_probe_done;
616 }
1080 617
1081 src->info = &info->src_info[i]; 618 clk = devm_clk_get(dev, name);
619 if (IS_ERR(clk)) {
620 ret = PTR_ERR(clk);
621 goto rsnd_src_probe_done;
622 }
1082 623
1083 ret = rsnd_mod_init(priv, rsnd_mod_get(src), ops, clk, RSND_MOD_SRC, i); 624 ret = rsnd_mod_init(priv, rsnd_mod_get(src),
625 &rsnd_src_ops, clk, RSND_MOD_SRC, i);
1084 if (ret) 626 if (ret)
1085 return ret; 627 goto rsnd_src_probe_done;
628
629 i++;
1086 } 630 }
1087 631
1088 return 0; 632 ret = 0;
633
634rsnd_src_probe_done:
635 of_node_put(node);
636
637 return ret;
1089} 638}
1090 639
1091void rsnd_src_remove(struct platform_device *pdev, 640void rsnd_src_remove(struct rsnd_priv *priv)
1092 struct rsnd_priv *priv)
1093{ 641{
1094 struct rsnd_src *src; 642 struct rsnd_src *src;
1095 int i; 643 int i;
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 1427ec21bd7e..7ee89da4dd5f 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -24,7 +24,9 @@
24#define OIEN (1 << 26) /* Overflow Interrupt Enable */ 24#define OIEN (1 << 26) /* Overflow Interrupt Enable */
25#define IIEN (1 << 25) /* Idle Mode Interrupt Enable */ 25#define IIEN (1 << 25) /* Idle Mode Interrupt Enable */
26#define DIEN (1 << 24) /* Data Interrupt Enable */ 26#define DIEN (1 << 24) /* Data Interrupt Enable */
27 27#define CHNL_4 (1 << 22) /* Channels */
28#define CHNL_6 (2 << 22) /* Channels */
29#define CHNL_8 (3 << 22) /* Channels */
28#define DWL_8 (0 << 19) /* Data Word Length */ 30#define DWL_8 (0 << 19) /* Data Word Length */
29#define DWL_16 (1 << 19) /* Data Word Length */ 31#define DWL_16 (1 << 19) /* Data Word Length */
30#define DWL_18 (2 << 19) /* Data Word Length */ 32#define DWL_18 (2 << 19) /* Data Word Length */
@@ -39,6 +41,7 @@
39#define SCKP (1 << 13) /* Serial Bit Clock Polarity */ 41#define SCKP (1 << 13) /* Serial Bit Clock Polarity */
40#define SWSP (1 << 12) /* Serial WS Polarity */ 42#define SWSP (1 << 12) /* Serial WS Polarity */
41#define SDTA (1 << 10) /* Serial Data Alignment */ 43#define SDTA (1 << 10) /* Serial Data Alignment */
44#define PDTA (1 << 9) /* Parallel Data Alignment */
42#define DEL (1 << 8) /* Serial Data Delay */ 45#define DEL (1 << 8) /* Serial Data Delay */
43#define CKDV(v) (v << 4) /* Serial Clock Division Ratio */ 46#define CKDV(v) (v << 4) /* Serial Clock Division Ratio */
44#define TRMD (1 << 1) /* Transmit/Receive Mode Select */ 47#define TRMD (1 << 1) /* Transmit/Receive Mode Select */
@@ -56,35 +59,44 @@
56 * SSIWSR 59 * SSIWSR
57 */ 60 */
58#define CONT (1 << 8) /* WS Continue Function */ 61#define CONT (1 << 8) /* WS Continue Function */
62#define WS_MODE (1 << 0) /* WS Mode */
59 63
60#define SSI_NAME "ssi" 64#define SSI_NAME "ssi"
61 65
62struct rsnd_ssi { 66struct rsnd_ssi {
63 struct rsnd_ssi_platform_info *info; /* rcar_snd.h */
64 struct rsnd_ssi *parent; 67 struct rsnd_ssi *parent;
65 struct rsnd_mod mod; 68 struct rsnd_mod mod;
69 struct rsnd_mod *dma;
66 70
71 u32 flags;
67 u32 cr_own; 72 u32 cr_own;
68 u32 cr_clk; 73 u32 cr_clk;
74 u32 cr_mode;
75 u32 wsr;
69 int chan; 76 int chan;
77 int rate;
70 int err; 78 int err;
79 int irq;
71 unsigned int usrcnt; 80 unsigned int usrcnt;
72}; 81};
73 82
83/* flags */
84#define RSND_SSI_CLK_PIN_SHARE (1 << 0)
85#define RSND_SSI_NO_BUSIF (1 << 1) /* SSI+DMA without BUSIF */
86
74#define for_each_rsnd_ssi(pos, priv, i) \ 87#define for_each_rsnd_ssi(pos, priv, i) \
75 for (i = 0; \ 88 for (i = 0; \
76 (i < rsnd_ssi_nr(priv)) && \ 89 (i < rsnd_ssi_nr(priv)) && \
77 ((pos) = ((struct rsnd_ssi *)(priv)->ssi + i)); \ 90 ((pos) = ((struct rsnd_ssi *)(priv)->ssi + i)); \
78 i++) 91 i++)
79 92
93#define rsnd_ssi_get(priv, id) ((struct rsnd_ssi *)(priv->ssi) + id)
94#define rsnd_ssi_to_dma(mod) ((ssi)->dma)
80#define rsnd_ssi_nr(priv) ((priv)->ssi_nr) 95#define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
81#define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod) 96#define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
82#define rsnd_ssi_pio_available(ssi) ((ssi)->info->irq > 0) 97#define rsnd_ssi_mode_flags(p) ((p)->flags)
83#define rsnd_ssi_parent(ssi) ((ssi)->parent) 98#define rsnd_ssi_is_parent(ssi, io) ((ssi) == rsnd_io_to_mod_ssip(io))
84#define rsnd_ssi_mode_flags(p) ((p)->info->flags) 99#define rsnd_ssi_is_multi_slave(ssi, io) ((mod) != rsnd_io_to_mod_ssi(io))
85#define rsnd_ssi_dai_id(ssi) ((ssi)->info->dai_id)
86#define rsnd_ssi_of_node(priv) \
87 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ssi")
88 100
89int rsnd_ssi_use_busif(struct rsnd_dai_stream *io) 101int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
90{ 102{
@@ -103,6 +115,16 @@ int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
103 return use_busif; 115 return use_busif;
104} 116}
105 117
118static void rsnd_ssi_status_clear(struct rsnd_mod *mod)
119{
120 rsnd_mod_write(mod, SSISR, 0);
121}
122
123static u32 rsnd_ssi_status_get(struct rsnd_mod *mod)
124{
125 return rsnd_mod_read(mod, SSISR);
126}
127
106static void rsnd_ssi_status_check(struct rsnd_mod *mod, 128static void rsnd_ssi_status_check(struct rsnd_mod *mod,
107 u32 bit) 129 u32 bit)
108{ 130{
@@ -112,7 +134,7 @@ static void rsnd_ssi_status_check(struct rsnd_mod *mod,
112 int i; 134 int i;
113 135
114 for (i = 0; i < 1024; i++) { 136 for (i = 0; i < 1024; i++) {
115 status = rsnd_mod_read(mod, SSISR); 137 status = rsnd_ssi_status_get(mod);
116 if (status & bit) 138 if (status & bit)
117 return; 139 return;
118 140
@@ -122,13 +144,79 @@ static void rsnd_ssi_status_check(struct rsnd_mod *mod,
122 dev_warn(dev, "status check failed\n"); 144 dev_warn(dev, "status check failed\n");
123} 145}
124 146
147static int rsnd_ssi_irq_enable(struct rsnd_mod *ssi_mod)
148{
149 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
150
151 if (rsnd_is_gen1(priv))
152 return 0;
153
154 /* enable SSI interrupt if Gen2 */
155 rsnd_mod_write(ssi_mod, SSI_INT_ENABLE,
156 rsnd_ssi_is_dma_mode(ssi_mod) ?
157 0x0e000000 : 0x0f000000);
158
159 return 0;
160}
161
162static int rsnd_ssi_irq_disable(struct rsnd_mod *ssi_mod)
163{
164 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
165
166 if (rsnd_is_gen1(priv))
167 return 0;
168
169 /* disable SSI interrupt if Gen2 */
170 rsnd_mod_write(ssi_mod, SSI_INT_ENABLE, 0x00000000);
171
172 return 0;
173}
174
175u32 rsnd_ssi_multi_slaves(struct rsnd_dai_stream *io)
176{
177 struct rsnd_mod *mod;
178 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
179 struct rsnd_priv *priv = rsnd_io_to_priv(io);
180 struct device *dev = rsnd_priv_to_dev(priv);
181 enum rsnd_mod_type types[] = {
182 RSND_MOD_SSIM1,
183 RSND_MOD_SSIM2,
184 RSND_MOD_SSIM3,
185 };
186 int i, mask;
187
188 switch (runtime->channels) {
189 case 2: /* Multi channel is not needed for Stereo */
190 return 0;
191 case 6:
192 break;
193 default:
194 dev_err(dev, "unsupported channel\n");
195 return 0;
196 }
197
198 mask = 0;
199 for (i = 0; i < ARRAY_SIZE(types); i++) {
200 mod = rsnd_io_to_mod(io, types[i]);
201 if (!mod)
202 continue;
203
204 mask |= 1 << rsnd_mod_id(mod);
205 }
206
207 return mask;
208}
209
125static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi, 210static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
126 struct rsnd_dai_stream *io) 211 struct rsnd_dai_stream *io)
127{ 212{
128 struct rsnd_priv *priv = rsnd_io_to_priv(io); 213 struct rsnd_priv *priv = rsnd_io_to_priv(io);
129 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); 214 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
130 struct device *dev = rsnd_priv_to_dev(priv); 215 struct device *dev = rsnd_priv_to_dev(priv);
216 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
131 struct rsnd_mod *mod = rsnd_mod_get(ssi); 217 struct rsnd_mod *mod = rsnd_mod_get(ssi);
218 struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
219 int slots = rsnd_get_slot_width(io);
132 int j, ret; 220 int j, ret;
133 int ssi_clk_mul_table[] = { 221 int ssi_clk_mul_table[] = {
134 1, 2, 4, 8, 16, 6, 12, 222 1, 2, 4, 8, 16, 6, 12,
@@ -136,6 +224,24 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
136 unsigned int main_rate; 224 unsigned int main_rate;
137 unsigned int rate = rsnd_src_get_ssi_rate(priv, io, runtime); 225 unsigned int rate = rsnd_src_get_ssi_rate(priv, io, runtime);
138 226
227 if (!rsnd_rdai_is_clk_master(rdai))
228 return 0;
229
230 if (ssi_parent_mod && !rsnd_ssi_is_parent(mod, io))
231 return 0;
232
233 if (rsnd_ssi_is_multi_slave(mod, io))
234 return 0;
235
236 if (ssi->usrcnt > 1) {
237 if (ssi->rate != rate) {
238 dev_err(dev, "SSI parent/child should use same rate\n");
239 return -EINVAL;
240 }
241
242 return 0;
243 }
244
139 /* 245 /*
140 * Find best clock, and try to start ADG 246 * Find best clock, and try to start ADG
141 */ 247 */
@@ -143,15 +249,18 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
143 249
144 /* 250 /*
145 * this driver is assuming that 251 * this driver is assuming that
146 * system word is 64fs (= 2 x 32bit) 252 * system word is 32bit x slots
147 * see rsnd_ssi_init() 253 * see rsnd_ssi_init()
148 */ 254 */
149 main_rate = rate * 32 * 2 * ssi_clk_mul_table[j]; 255 main_rate = rate * 32 * slots * ssi_clk_mul_table[j];
150 256
151 ret = rsnd_adg_ssi_clk_try_start(mod, main_rate); 257 ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
152 if (0 == ret) { 258 if (0 == ret) {
153 ssi->cr_clk = FORCE | SWL_32 | 259 ssi->cr_clk = FORCE | SWL_32 |
154 SCKD | SWSD | CKDV(j); 260 SCKD | SWSD | CKDV(j);
261 ssi->wsr = CONT;
262
263 ssi->rate = rate;
155 264
156 dev_dbg(dev, "%s[%d] outputs %u Hz\n", 265 dev_dbg(dev, "%s[%d] outputs %u Hz\n",
157 rsnd_mod_name(mod), 266 rsnd_mod_name(mod),
@@ -165,113 +274,91 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
165 return -EIO; 274 return -EIO;
166} 275}
167 276
168static void rsnd_ssi_master_clk_stop(struct rsnd_ssi *ssi) 277static void rsnd_ssi_master_clk_stop(struct rsnd_ssi *ssi,
278 struct rsnd_dai_stream *io)
169{ 279{
280 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
170 struct rsnd_mod *mod = rsnd_mod_get(ssi); 281 struct rsnd_mod *mod = rsnd_mod_get(ssi);
282 struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
283
284 if (!rsnd_rdai_is_clk_master(rdai))
285 return;
286
287 if (ssi_parent_mod && !rsnd_ssi_is_parent(mod, io))
288 return;
289
290 if (ssi->usrcnt > 1)
291 return;
292
293 ssi->cr_clk = 0;
294 ssi->rate = 0;
171 295
172 ssi->cr_clk = 0;
173 rsnd_adg_ssi_clk_stop(mod); 296 rsnd_adg_ssi_clk_stop(mod);
174} 297}
175 298
176static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi, 299static int rsnd_ssi_config_init(struct rsnd_ssi *ssi,
177 struct rsnd_dai_stream *io) 300 struct rsnd_dai_stream *io)
178{ 301{
179 struct rsnd_priv *priv = rsnd_io_to_priv(io);
180 struct rsnd_dai *rdai = rsnd_io_to_rdai(io); 302 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
181 struct device *dev = rsnd_priv_to_dev(priv); 303 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
182 struct rsnd_mod *mod = rsnd_mod_get(ssi); 304 u32 cr_own;
183 u32 cr_mode; 305 u32 cr_mode;
184 u32 cr; 306 u32 wsr;
307 int is_tdm;
185 308
186 if (0 == ssi->usrcnt) { 309 is_tdm = (rsnd_get_slot_width(io) >= 6) ? 1 : 0;
187 rsnd_mod_power_on(mod);
188 310
189 if (rsnd_rdai_is_clk_master(rdai)) { 311 /*
190 struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi); 312 * always use 32bit system word.
313 * see also rsnd_ssi_master_clk_enable()
314 */
315 cr_own = FORCE | SWL_32 | PDTA;
191 316
192 if (ssi_parent) 317 if (rdai->bit_clk_inv)
193 rsnd_ssi_hw_start(ssi_parent, io); 318 cr_own |= SCKP;
194 else 319 if (rdai->frm_clk_inv ^ is_tdm)
195 rsnd_ssi_master_clk_start(ssi, io); 320 cr_own |= SWSP;
196 } 321 if (rdai->data_alignment)
322 cr_own |= SDTA;
323 if (rdai->sys_delay)
324 cr_own |= DEL;
325 if (rsnd_io_is_play(io))
326 cr_own |= TRMD;
327
328 switch (runtime->sample_bits) {
329 case 16:
330 cr_own |= DWL_16;
331 break;
332 case 32:
333 cr_own |= DWL_24;
334 break;
335 default:
336 return -EINVAL;
197 } 337 }
198 338
199 if (rsnd_ssi_is_dma_mode(mod)) { 339 if (rsnd_ssi_is_dma_mode(rsnd_mod_get(ssi))) {
200 cr_mode = UIEN | OIEN | /* over/under run */ 340 cr_mode = UIEN | OIEN | /* over/under run */
201 DMEN; /* DMA : enable DMA */ 341 DMEN; /* DMA : enable DMA */
202 } else { 342 } else {
203 cr_mode = DIEN; /* PIO : enable Data interrupt */ 343 cr_mode = DIEN; /* PIO : enable Data interrupt */
204 } 344 }
205 345
206 cr = ssi->cr_own | 346 /*
207 ssi->cr_clk | 347 * TDM Extend Mode
208 cr_mode | 348 * see
209 EN; 349 * rsnd_ssiu_init_gen2()
210 350 */
211 rsnd_mod_write(mod, SSICR, cr); 351 wsr = ssi->wsr;
212 352 if (is_tdm) {
213 /* enable WS continue */ 353 wsr |= WS_MODE;
214 if (rsnd_rdai_is_clk_master(rdai)) 354 cr_own |= CHNL_8;
215 rsnd_mod_write(mod, SSIWSR, CONT);
216
217 /* clear error status */
218 rsnd_mod_write(mod, SSISR, 0);
219
220 ssi->usrcnt++;
221
222 dev_dbg(dev, "%s[%d] hw started\n",
223 rsnd_mod_name(mod), rsnd_mod_id(mod));
224}
225
226static void rsnd_ssi_hw_stop(struct rsnd_dai_stream *io, struct rsnd_ssi *ssi)
227{
228 struct rsnd_mod *mod = rsnd_mod_get(ssi);
229 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
230 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
231 struct device *dev = rsnd_priv_to_dev(priv);
232 u32 cr;
233
234 if (0 == ssi->usrcnt) {
235 dev_err(dev, "%s called without starting\n", __func__);
236 return;
237 } 355 }
238 356
239 ssi->usrcnt--; 357 ssi->cr_own = cr_own;
240 358 ssi->cr_mode = cr_mode;
241 if (0 == ssi->usrcnt) { 359 ssi->wsr = wsr;
242 /*
243 * disable all IRQ,
244 * and, wait all data was sent
245 */
246 cr = ssi->cr_own |
247 ssi->cr_clk;
248
249 rsnd_mod_write(mod, SSICR, cr | EN);
250 rsnd_ssi_status_check(mod, DIRQ);
251 360
252 /* 361 return 0;
253 * disable SSI,
254 * and, wait idle state
255 */
256 rsnd_mod_write(mod, SSICR, cr); /* disabled all */
257 rsnd_ssi_status_check(mod, IIRQ);
258
259 if (rsnd_rdai_is_clk_master(rdai)) {
260 struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);
261
262 if (ssi_parent)
263 rsnd_ssi_hw_stop(io, ssi_parent);
264 else
265 rsnd_ssi_master_clk_stop(ssi);
266 }
267
268 rsnd_mod_power_off(mod);
269
270 ssi->chan = 0;
271 }
272
273 dev_dbg(dev, "%s[%d] hw stopped\n",
274 rsnd_mod_name(mod), rsnd_mod_id(mod));
275} 362}
276 363
277/* 364/*
@@ -282,49 +369,30 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
282 struct rsnd_priv *priv) 369 struct rsnd_priv *priv)
283{ 370{
284 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 371 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
285 struct rsnd_dai *rdai = rsnd_io_to_rdai(io); 372 int ret;
286 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); 373
287 u32 cr; 374 ssi->usrcnt++;
288 375
289 cr = FORCE; 376 rsnd_mod_power_on(mod);
290 377
291 /* 378 ret = rsnd_ssi_master_clk_start(ssi, io);
292 * always use 32bit system word for easy clock calculation. 379 if (ret < 0)
293 * see also rsnd_ssi_master_clk_enable() 380 return ret;
294 */
295 cr |= SWL_32;
296 381
297 /* 382 if (rsnd_ssi_is_parent(mod, io))
298 * init clock settings for SSICR 383 return 0;
299 */
300 switch (runtime->sample_bits) {
301 case 16:
302 cr |= DWL_16;
303 break;
304 case 32:
305 cr |= DWL_24;
306 break;
307 default:
308 return -EIO;
309 }
310 384
311 if (rdai->bit_clk_inv) 385 ret = rsnd_ssi_config_init(ssi, io);
312 cr |= SCKP; 386 if (ret < 0)
313 if (rdai->frm_clk_inv) 387 return ret;
314 cr |= SWSP;
315 if (rdai->data_alignment)
316 cr |= SDTA;
317 if (rdai->sys_delay)
318 cr |= DEL;
319 if (rsnd_io_is_play(io))
320 cr |= TRMD;
321 388
322 /*
323 * set ssi parameter
324 */
325 ssi->cr_own = cr;
326 ssi->err = -1; /* ignore 1st error */ 389 ssi->err = -1; /* ignore 1st error */
327 390
391 /* clear error status */
392 rsnd_ssi_status_clear(mod);
393
394 rsnd_ssi_irq_enable(mod);
395
328 return 0; 396 return 0;
329} 397}
330 398
@@ -335,12 +403,29 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod,
335 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 403 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
336 struct device *dev = rsnd_priv_to_dev(priv); 404 struct device *dev = rsnd_priv_to_dev(priv);
337 405
338 if (ssi->err > 0) 406 if (!ssi->usrcnt) {
339 dev_warn(dev, "%s[%d] under/over flow err = %d\n", 407 dev_err(dev, "%s[%d] usrcnt error\n",
340 rsnd_mod_name(mod), rsnd_mod_id(mod), ssi->err); 408 rsnd_mod_name(mod), rsnd_mod_id(mod));
409 return -EIO;
410 }
411
412 if (!rsnd_ssi_is_parent(mod, io)) {
413 if (ssi->err > 0)
414 dev_warn(dev, "%s[%d] under/over flow err = %d\n",
415 rsnd_mod_name(mod), rsnd_mod_id(mod),
416 ssi->err);
417
418 ssi->cr_own = 0;
419 ssi->err = 0;
420
421 rsnd_ssi_irq_disable(mod);
422 }
341 423
342 ssi->cr_own = 0; 424 rsnd_ssi_master_clk_stop(ssi, io);
343 ssi->err = 0; 425
426 rsnd_mod_power_off(mod);
427
428 ssi->usrcnt--;
344 429
345 return 0; 430 return 0;
346} 431}
@@ -351,14 +436,13 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
351 struct snd_pcm_hw_params *params) 436 struct snd_pcm_hw_params *params)
352{ 437{
353 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 438 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
354 struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);
355 int chan = params_channels(params); 439 int chan = params_channels(params);
356 440
357 /* 441 /*
358 * Already working. 442 * Already working.
359 * It will happen if SSI has parent/child connection. 443 * It will happen if SSI has parent/child connection.
360 */ 444 */
361 if (ssi->usrcnt) { 445 if (ssi->usrcnt > 1) {
362 /* 446 /*
363 * it is error if child <-> parent SSI uses 447 * it is error if child <-> parent SSI uses
364 * different channels. 448 * different channels.
@@ -367,39 +451,83 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
367 return -EIO; 451 return -EIO;
368 } 452 }
369 453
370 /* It will be removed on rsnd_ssi_hw_stop */
371 ssi->chan = chan; 454 ssi->chan = chan;
372 if (ssi_parent)
373 return rsnd_ssi_hw_params(rsnd_mod_get(ssi_parent), io,
374 substream, params);
375 455
376 return 0; 456 return 0;
377} 457}
378 458
379static void rsnd_ssi_record_error(struct rsnd_ssi *ssi, u32 status) 459static u32 rsnd_ssi_record_error(struct rsnd_ssi *ssi)
380{ 460{
381 struct rsnd_mod *mod = rsnd_mod_get(ssi); 461 struct rsnd_mod *mod = rsnd_mod_get(ssi);
462 u32 status = rsnd_ssi_status_get(mod);
382 463
383 /* under/over flow error */ 464 /* under/over flow error */
384 if (status & (UIRQ | OIRQ)) { 465 if (status & (UIRQ | OIRQ))
385 ssi->err++; 466 ssi->err++;
386 467
387 /* clear error status */ 468 return status;
388 rsnd_mod_write(mod, SSISR, 0); 469}
389 } 470
471static int __rsnd_ssi_start(struct rsnd_mod *mod,
472 struct rsnd_dai_stream *io,
473 struct rsnd_priv *priv)
474{
475 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
476 u32 cr;
477
478 cr = ssi->cr_own |
479 ssi->cr_clk |
480 ssi->cr_mode;
481
482 /*
483 * EN will be set via SSIU :: SSI_CONTROL
484 * if Multi channel mode
485 */
486 if (!rsnd_ssi_multi_slaves(io))
487 cr |= EN;
488
489 rsnd_mod_write(mod, SSICR, cr);
490 rsnd_mod_write(mod, SSIWSR, ssi->wsr);
491
492 return 0;
390} 493}
391 494
392static int rsnd_ssi_start(struct rsnd_mod *mod, 495static int rsnd_ssi_start(struct rsnd_mod *mod,
393 struct rsnd_dai_stream *io, 496 struct rsnd_dai_stream *io,
394 struct rsnd_priv *priv) 497 struct rsnd_priv *priv)
395{ 498{
499 /*
500 * no limit to start
501 * see also
502 * rsnd_ssi_stop
503 * rsnd_ssi_interrupt
504 */
505 return __rsnd_ssi_start(mod, io, priv);
506}
507
508static int __rsnd_ssi_stop(struct rsnd_mod *mod,
509 struct rsnd_dai_stream *io,
510 struct rsnd_priv *priv)
511{
396 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 512 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
513 u32 cr;
397 514
398 rsnd_src_ssiu_start(mod, io, rsnd_ssi_use_busif(io)); 515 /*
516 * disable all IRQ,
517 * and, wait all data was sent
518 */
519 cr = ssi->cr_own |
520 ssi->cr_clk;
399 521
400 rsnd_ssi_hw_start(ssi, io); 522 rsnd_mod_write(mod, SSICR, cr | EN);
523 rsnd_ssi_status_check(mod, DIRQ);
401 524
402 rsnd_src_ssi_irq_enable(mod); 525 /*
526 * disable SSI,
527 * and, wait idle state
528 */
529 rsnd_mod_write(mod, SSICR, cr); /* disabled all */
530 rsnd_ssi_status_check(mod, IIRQ);
403 531
404 return 0; 532 return 0;
405} 533}
@@ -410,15 +538,16 @@ static int rsnd_ssi_stop(struct rsnd_mod *mod,
410{ 538{
411 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 539 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
412 540
413 rsnd_src_ssi_irq_disable(mod); 541 /*
414 542 * don't stop if not last user
415 rsnd_ssi_record_error(ssi, rsnd_mod_read(mod, SSISR)); 543 * see also
416 544 * rsnd_ssi_start
417 rsnd_ssi_hw_stop(io, ssi); 545 * rsnd_ssi_interrupt
418 546 */
419 rsnd_src_ssiu_stop(mod, io); 547 if (ssi->usrcnt > 1)
548 return 0;
420 549
421 return 0; 550 return __rsnd_ssi_stop(mod, io, priv);
422} 551}
423 552
424static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, 553static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
@@ -426,6 +555,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
426{ 555{
427 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 556 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
428 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 557 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
558 struct device *dev = rsnd_priv_to_dev(priv);
429 int is_dma = rsnd_ssi_is_dma_mode(mod); 559 int is_dma = rsnd_ssi_is_dma_mode(mod);
430 u32 status; 560 u32 status;
431 bool elapsed = false; 561 bool elapsed = false;
@@ -436,7 +566,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
436 if (!rsnd_io_is_working(io)) 566 if (!rsnd_io_is_working(io))
437 goto rsnd_ssi_interrupt_out; 567 goto rsnd_ssi_interrupt_out;
438 568
439 status = rsnd_mod_read(mod, SSISR); 569 status = rsnd_ssi_record_error(ssi);
440 570
441 /* PIO only */ 571 /* PIO only */
442 if (!is_dma && (status & DIRQ)) { 572 if (!is_dma && (status & DIRQ)) {
@@ -459,23 +589,24 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
459 589
460 /* DMA only */ 590 /* DMA only */
461 if (is_dma && (status & (UIRQ | OIRQ))) { 591 if (is_dma && (status & (UIRQ | OIRQ))) {
462 struct device *dev = rsnd_priv_to_dev(priv);
463
464 /* 592 /*
465 * restart SSI 593 * restart SSI
466 */ 594 */
467 dev_dbg(dev, "%s[%d] restart\n", 595 dev_dbg(dev, "%s[%d] restart\n",
468 rsnd_mod_name(mod), rsnd_mod_id(mod)); 596 rsnd_mod_name(mod), rsnd_mod_id(mod));
469 597
470 rsnd_ssi_stop(mod, io, priv); 598 __rsnd_ssi_stop(mod, io, priv);
471 if (ssi->err < 1024) 599 __rsnd_ssi_start(mod, io, priv);
472 rsnd_ssi_start(mod, io, priv);
473 else
474 dev_warn(dev, "no more SSI restart\n");
475 } 600 }
476 601
477 rsnd_ssi_record_error(ssi, status); 602 if (ssi->err > 1024) {
603 rsnd_ssi_irq_disable(mod);
478 604
605 dev_warn(dev, "no more %s[%d] restart\n",
606 rsnd_mod_name(mod), rsnd_mod_id(mod));
607 }
608
609 rsnd_ssi_status_clear(mod);
479rsnd_ssi_interrupt_out: 610rsnd_ssi_interrupt_out:
480 spin_unlock(&priv->lock); 611 spin_unlock(&priv->lock);
481 612
@@ -495,15 +626,49 @@ static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
495/* 626/*
496 * SSI PIO 627 * SSI PIO
497 */ 628 */
498static int rsnd_ssi_pio_probe(struct rsnd_mod *mod, 629static void rsnd_ssi_parent_attach(struct rsnd_mod *mod,
499 struct rsnd_dai_stream *io, 630 struct rsnd_dai_stream *io,
500 struct rsnd_priv *priv) 631 struct rsnd_priv *priv)
632{
633 if (!__rsnd_ssi_is_pin_sharing(mod))
634 return;
635
636 switch (rsnd_mod_id(mod)) {
637 case 1:
638 case 2:
639 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 0), io, RSND_MOD_SSIP);
640 break;
641 case 4:
642 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 3), io, RSND_MOD_SSIP);
643 break;
644 case 8:
645 rsnd_dai_connect(rsnd_ssi_mod_get(priv, 7), io, RSND_MOD_SSIP);
646 break;
647 }
648}
649
650static int rsnd_ssi_common_probe(struct rsnd_mod *mod,
651 struct rsnd_dai_stream *io,
652 struct rsnd_priv *priv)
501{ 653{
502 struct device *dev = rsnd_priv_to_dev(priv); 654 struct device *dev = rsnd_priv_to_dev(priv);
503 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 655 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
504 int ret; 656 int ret;
505 657
506 ret = devm_request_irq(dev, ssi->info->irq, 658 /*
659 * SSIP/SSIU/IRQ are not needed on
660 * SSI Multi slaves
661 */
662 if (rsnd_ssi_is_multi_slave(mod, io))
663 return 0;
664
665 rsnd_ssi_parent_attach(mod, io, priv);
666
667 ret = rsnd_ssiu_attach(io, mod);
668 if (ret < 0)
669 return ret;
670
671 ret = devm_request_irq(dev, ssi->irq,
507 rsnd_ssi_interrupt, 672 rsnd_ssi_interrupt,
508 IRQF_SHARED, 673 IRQF_SHARED,
509 dev_name(dev), mod); 674 dev_name(dev), mod);
@@ -513,7 +678,7 @@ static int rsnd_ssi_pio_probe(struct rsnd_mod *mod,
513 678
514static struct rsnd_mod_ops rsnd_ssi_pio_ops = { 679static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
515 .name = SSI_NAME, 680 .name = SSI_NAME,
516 .probe = rsnd_ssi_pio_probe, 681 .probe = rsnd_ssi_common_probe,
517 .init = rsnd_ssi_init, 682 .init = rsnd_ssi_init,
518 .quit = rsnd_ssi_quit, 683 .quit = rsnd_ssi_quit,
519 .start = rsnd_ssi_start, 684 .start = rsnd_ssi_start,
@@ -526,20 +691,23 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
526 struct rsnd_priv *priv) 691 struct rsnd_priv *priv)
527{ 692{
528 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 693 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
529 struct device *dev = rsnd_priv_to_dev(priv); 694 int dma_id = 0; /* not needed */
530 int dma_id = ssi->info->dma_id;
531 int ret; 695 int ret;
532 696
533 ret = devm_request_irq(dev, ssi->info->irq, 697 /*
534 rsnd_ssi_interrupt, 698 * SSIP/SSIU/IRQ/DMA are not needed on
535 IRQF_SHARED, 699 * SSI Multi slaves
536 dev_name(dev), mod); 700 */
701 if (rsnd_ssi_is_multi_slave(mod, io))
702 return 0;
703
704 ret = rsnd_ssi_common_probe(mod, io, priv);
537 if (ret) 705 if (ret)
538 return ret; 706 return ret;
539 707
540 ret = rsnd_dma_init( 708 ssi->dma = rsnd_dma_attach(io, mod, dma_id);
541 io, rsnd_mod_to_dma(mod), 709 if (IS_ERR(ssi->dma))
542 dma_id); 710 return PTR_ERR(ssi->dma);
543 711
544 return ret; 712 return ret;
545} 713}
@@ -550,9 +718,7 @@ static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
550{ 718{
551 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 719 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
552 struct device *dev = rsnd_priv_to_dev(priv); 720 struct device *dev = rsnd_priv_to_dev(priv);
553 int irq = ssi->info->irq; 721 int irq = ssi->irq;
554
555 rsnd_dma_quit(io, rsnd_mod_to_dma(mod));
556 722
557 /* PIO will request IRQ again */ 723 /* PIO will request IRQ again */
558 devm_free_irq(dev, irq, mod); 724 devm_free_irq(dev, irq, mod);
@@ -581,32 +747,6 @@ static int rsnd_ssi_fallback(struct rsnd_mod *mod,
581 return 0; 747 return 0;
582} 748}
583 749
584static int rsnd_ssi_dma_start(struct rsnd_mod *mod,
585 struct rsnd_dai_stream *io,
586 struct rsnd_priv *priv)
587{
588 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
589
590 rsnd_dma_start(io, dma);
591
592 rsnd_ssi_start(mod, io, priv);
593
594 return 0;
595}
596
597static int rsnd_ssi_dma_stop(struct rsnd_mod *mod,
598 struct rsnd_dai_stream *io,
599 struct rsnd_priv *priv)
600{
601 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
602
603 rsnd_ssi_stop(mod, io, priv);
604
605 rsnd_dma_stop(io, dma);
606
607 return 0;
608}
609
610static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io, 750static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
611 struct rsnd_mod *mod) 751 struct rsnd_mod *mod)
612{ 752{
@@ -630,8 +770,8 @@ static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
630 .remove = rsnd_ssi_dma_remove, 770 .remove = rsnd_ssi_dma_remove,
631 .init = rsnd_ssi_init, 771 .init = rsnd_ssi_init,
632 .quit = rsnd_ssi_quit, 772 .quit = rsnd_ssi_quit,
633 .start = rsnd_ssi_dma_start, 773 .start = rsnd_ssi_start,
634 .stop = rsnd_ssi_dma_stop, 774 .stop = rsnd_ssi_stop,
635 .fallback = rsnd_ssi_fallback, 775 .fallback = rsnd_ssi_fallback,
636 .hw_params = rsnd_ssi_hw_params, 776 .hw_params = rsnd_ssi_hw_params,
637}; 777};
@@ -652,110 +792,76 @@ static struct rsnd_mod_ops rsnd_ssi_non_ops = {
652/* 792/*
653 * ssi mod function 793 * ssi mod function
654 */ 794 */
655struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id) 795static void rsnd_ssi_connect(struct rsnd_mod *mod,
796 struct rsnd_dai_stream *io)
656{ 797{
657 if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv))) 798 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
658 id = 0; 799 enum rsnd_mod_type types[] = {
659 800 RSND_MOD_SSI,
660 return rsnd_mod_get((struct rsnd_ssi *)(priv->ssi) + id); 801 RSND_MOD_SSIM1,
661} 802 RSND_MOD_SSIM2,
662 803 RSND_MOD_SSIM3,
663int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod) 804 };
664{ 805 enum rsnd_mod_type type;
665 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 806 int i;
666
667 return !!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_CLK_PIN_SHARE);
668}
669
670static void rsnd_ssi_parent_setup(struct rsnd_priv *priv, struct rsnd_ssi *ssi)
671{
672 struct rsnd_mod *mod = rsnd_mod_get(ssi);
673
674 if (!__rsnd_ssi_is_pin_sharing(mod))
675 return;
676 807
677 switch (rsnd_mod_id(mod)) { 808 /* try SSI -> SSIM1 -> SSIM2 -> SSIM3 */
678 case 1: 809 for (i = 0; i < ARRAY_SIZE(types); i++) {
679 case 2: 810 type = types[i];
680 ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 0)); 811 if (!rsnd_io_to_mod(io, type)) {
681 break; 812 rsnd_dai_connect(mod, io, type);
682 case 4: 813 rsnd_set_slot(rdai, 2 * (i + 1), (i + 1));
683 ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 3)); 814 return;
684 break; 815 }
685 case 8:
686 ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 7));
687 break;
688 } 816 }
689} 817}
690 818
691 819void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
692static void rsnd_of_parse_ssi(struct platform_device *pdev, 820 struct device_node *playback,
693 const struct rsnd_of_data *of_data, 821 struct device_node *capture)
694 struct rsnd_priv *priv)
695{ 822{
823 struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
696 struct device_node *node; 824 struct device_node *node;
697 struct device_node *np; 825 struct device_node *np;
698 struct rsnd_ssi_platform_info *ssi_info; 826 struct rsnd_mod *mod;
699 struct rcar_snd_info *info = rsnd_priv_to_info(priv); 827 int i;
700 struct device *dev = &pdev->dev;
701 int nr, i;
702 828
703 node = rsnd_ssi_of_node(priv); 829 node = rsnd_ssi_of_node(priv);
704 if (!node) 830 if (!node)
705 return; 831 return;
706 832
707 nr = of_get_child_count(node); 833 i = 0;
708 if (!nr)
709 goto rsnd_of_parse_ssi_end;
710
711 ssi_info = devm_kzalloc(dev,
712 sizeof(struct rsnd_ssi_platform_info) * nr,
713 GFP_KERNEL);
714 if (!ssi_info) {
715 dev_err(dev, "ssi info allocation error\n");
716 goto rsnd_of_parse_ssi_end;
717 }
718
719 info->ssi_info = ssi_info;
720 info->ssi_info_nr = nr;
721
722 i = -1;
723 for_each_child_of_node(node, np) { 834 for_each_child_of_node(node, np) {
835 mod = rsnd_ssi_mod_get(priv, i);
836 if (np == playback)
837 rsnd_ssi_connect(mod, &rdai->playback);
838 if (np == capture)
839 rsnd_ssi_connect(mod, &rdai->capture);
724 i++; 840 i++;
841 }
725 842
726 ssi_info = info->ssi_info + i; 843 of_node_put(node);
727 844}
728 /*
729 * pin settings
730 */
731 if (of_get_property(np, "shared-pin", NULL))
732 ssi_info->flags |= RSND_SSI_CLK_PIN_SHARE;
733 845
734 /* 846struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
735 * irq 847{
736 */ 848 if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv)))
737 ssi_info->irq = irq_of_parse_and_map(np, 0); 849 id = 0;
738 850
739 /* 851 return rsnd_mod_get(rsnd_ssi_get(priv, id));
740 * DMA 852}
741 */
742 ssi_info->dma_id = of_get_property(np, "pio-transfer", NULL) ?
743 0 : 1;
744 853
745 if (of_get_property(np, "no-busif", NULL)) 854int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
746 ssi_info->flags |= RSND_SSI_NO_BUSIF; 855{
747 } 856 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
748 857
749rsnd_of_parse_ssi_end: 858 return !!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_CLK_PIN_SHARE);
750 of_node_put(node);
751} 859}
752 860
753int rsnd_ssi_probe(struct platform_device *pdev, 861int rsnd_ssi_probe(struct rsnd_priv *priv)
754 const struct rsnd_of_data *of_data,
755 struct rsnd_priv *priv)
756{ 862{
757 struct rcar_snd_info *info = rsnd_priv_to_info(priv); 863 struct device_node *node;
758 struct rsnd_ssi_platform_info *pinfo; 864 struct device_node *np;
759 struct device *dev = rsnd_priv_to_dev(priv); 865 struct device *dev = rsnd_priv_to_dev(priv);
760 struct rsnd_mod_ops *ops; 866 struct rsnd_mod_ops *ops;
761 struct clk *clk; 867 struct clk *clk;
@@ -763,50 +869,73 @@ int rsnd_ssi_probe(struct platform_device *pdev,
763 char name[RSND_SSI_NAME_SIZE]; 869 char name[RSND_SSI_NAME_SIZE];
764 int i, nr, ret; 870 int i, nr, ret;
765 871
766 rsnd_of_parse_ssi(pdev, of_data, priv); 872 node = rsnd_ssi_of_node(priv);
873 if (!node)
874 return -EINVAL;
875
876 nr = of_get_child_count(node);
877 if (!nr) {
878 ret = -EINVAL;
879 goto rsnd_ssi_probe_done;
880 }
767 881
768 /*
769 * init SSI
770 */
771 nr = info->ssi_info_nr;
772 ssi = devm_kzalloc(dev, sizeof(*ssi) * nr, GFP_KERNEL); 882 ssi = devm_kzalloc(dev, sizeof(*ssi) * nr, GFP_KERNEL);
773 if (!ssi) 883 if (!ssi) {
774 return -ENOMEM; 884 ret = -ENOMEM;
885 goto rsnd_ssi_probe_done;
886 }
775 887
776 priv->ssi = ssi; 888 priv->ssi = ssi;
777 priv->ssi_nr = nr; 889 priv->ssi_nr = nr;
778 890
779 for_each_rsnd_ssi(ssi, priv, i) { 891 i = 0;
780 pinfo = &info->ssi_info[i]; 892 for_each_child_of_node(node, np) {
893 ssi = rsnd_ssi_get(priv, i);
781 894
782 snprintf(name, RSND_SSI_NAME_SIZE, "%s.%d", 895 snprintf(name, RSND_SSI_NAME_SIZE, "%s.%d",
783 SSI_NAME, i); 896 SSI_NAME, i);
784 897
785 clk = devm_clk_get(dev, name); 898 clk = devm_clk_get(dev, name);
786 if (IS_ERR(clk)) 899 if (IS_ERR(clk)) {
787 return PTR_ERR(clk); 900 ret = PTR_ERR(clk);
901 goto rsnd_ssi_probe_done;
902 }
788 903
789 ssi->info = pinfo; 904 if (of_get_property(np, "shared-pin", NULL))
905 ssi->flags |= RSND_SSI_CLK_PIN_SHARE;
906
907 if (of_get_property(np, "no-busif", NULL))
908 ssi->flags |= RSND_SSI_NO_BUSIF;
909
910 ssi->irq = irq_of_parse_and_map(np, 0);
911 if (!ssi->irq) {
912 ret = -EINVAL;
913 goto rsnd_ssi_probe_done;
914 }
790 915
791 ops = &rsnd_ssi_non_ops; 916 ops = &rsnd_ssi_non_ops;
792 if (pinfo->dma_id > 0) 917 if (of_get_property(np, "pio-transfer", NULL))
793 ops = &rsnd_ssi_dma_ops;
794 else if (rsnd_ssi_pio_available(ssi))
795 ops = &rsnd_ssi_pio_ops; 918 ops = &rsnd_ssi_pio_ops;
919 else
920 ops = &rsnd_ssi_dma_ops;
796 921
797 ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk, 922 ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
798 RSND_MOD_SSI, i); 923 RSND_MOD_SSI, i);
799 if (ret) 924 if (ret)
800 return ret; 925 goto rsnd_ssi_probe_done;
801 926
802 rsnd_ssi_parent_setup(priv, ssi); 927 i++;
803 } 928 }
804 929
805 return 0; 930 ret = 0;
931
932rsnd_ssi_probe_done:
933 of_node_put(node);
934
935 return ret;
806} 936}
807 937
808void rsnd_ssi_remove(struct platform_device *pdev, 938void rsnd_ssi_remove(struct rsnd_priv *priv)
809 struct rsnd_priv *priv)
810{ 939{
811 struct rsnd_ssi *ssi; 940 struct rsnd_ssi *ssi;
812 int i; 941 int i;
diff --git a/sound/soc/sh/rcar/ssiu.c b/sound/soc/sh/rcar/ssiu.c
new file mode 100644
index 000000000000..06d72828e5bc
--- /dev/null
+++ b/sound/soc/sh/rcar/ssiu.c
@@ -0,0 +1,225 @@
1/*
2 * Renesas R-Car SSIU support
3 *
4 * Copyright (c) 2015 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10#include "rsnd.h"
11
12#define SSIU_NAME "ssiu"
13
14struct rsnd_ssiu {
15 struct rsnd_mod mod;
16};
17
18#define rsnd_ssiu_nr(priv) ((priv)->ssiu_nr)
19#define for_each_rsnd_ssiu(pos, priv, i) \
20 for (i = 0; \
21 (i < rsnd_ssiu_nr(priv)) && \
22 ((pos) = ((struct rsnd_ssiu *)(priv)->ssiu + i)); \
23 i++)
24
25static int rsnd_ssiu_init(struct rsnd_mod *mod,
26 struct rsnd_dai_stream *io,
27 struct rsnd_priv *priv)
28{
29 struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
30 u32 multi_ssi_slaves = rsnd_ssi_multi_slaves(io);
31 int use_busif = rsnd_ssi_use_busif(io);
32 int id = rsnd_mod_id(mod);
33 u32 mask1, val1;
34 u32 mask2, val2;
35
36 /*
37 * SSI_MODE0
38 */
39 rsnd_mod_bset(mod, SSI_MODE0, (1 << id), !use_busif << id);
40
41 /*
42 * SSI_MODE1
43 */
44 mask1 = (1 << 4) | (1 << 20); /* mask sync bit */
45 mask2 = (1 << 4); /* mask sync bit */
46 val1 = val2 = 0;
47 if (rsnd_ssi_is_pin_sharing(io)) {
48 int shift = -1;
49
50 switch (id) {
51 case 1:
52 shift = 0;
53 break;
54 case 2:
55 shift = 2;
56 break;
57 case 4:
58 shift = 16;
59 break;
60 default:
61 return -EINVAL;
62 }
63
64 mask1 |= 0x3 << shift;
65 val1 = rsnd_rdai_is_clk_master(rdai) ?
66 0x2 << shift : 0x1 << shift;
67
68 } else if (multi_ssi_slaves) {
69
70 mask2 |= 0x00000007;
71 mask1 |= 0x0000000f;
72
73 switch (multi_ssi_slaves) {
74 case 0x0206: /* SSI0/1/2/9 */
75 val2 = (1 << 4) | /* SSI0129 sync */
76 (rsnd_rdai_is_clk_master(rdai) ? 0x2 : 0x1);
77 /* fall through */
78 case 0x0006: /* SSI0/1/2 */
79 val1 = rsnd_rdai_is_clk_master(rdai) ?
80 0xa : 0x5;
81
82 if (!val2) /* SSI012 sync */
83 val1 |= (1 << 4);
84 }
85 }
86
87 rsnd_mod_bset(mod, SSI_MODE1, mask1, val1);
88 rsnd_mod_bset(mod, SSI_MODE2, mask2, val2);
89
90 return 0;
91}
92
93static struct rsnd_mod_ops rsnd_ssiu_ops_gen1 = {
94 .name = SSIU_NAME,
95 .init = rsnd_ssiu_init,
96};
97
98static int rsnd_ssiu_init_gen2(struct rsnd_mod *mod,
99 struct rsnd_dai_stream *io,
100 struct rsnd_priv *priv)
101{
102 int ret;
103
104 ret = rsnd_ssiu_init(mod, io, priv);
105 if (ret < 0)
106 return ret;
107
108 if (rsnd_get_slot_width(io) >= 6) {
109 /*
110 * TDM Extend Mode
111 * see
112 * rsnd_ssi_config_init()
113 */
114 rsnd_mod_write(mod, SSI_MODE, 0x1);
115 }
116
117 if (rsnd_ssi_use_busif(io)) {
118 u32 val = rsnd_get_dalign(mod, io);
119
120 rsnd_mod_write(mod, SSI_BUSIF_ADINR,
121 rsnd_get_adinr_bit(mod, io) |
122 rsnd_get_adinr_chan(mod, io));
123 rsnd_mod_write(mod, SSI_BUSIF_MODE, 1);
124 rsnd_mod_write(mod, SSI_BUSIF_DALIGN, val);
125 }
126
127 return 0;
128}
129
130static int rsnd_ssiu_start_gen2(struct rsnd_mod *mod,
131 struct rsnd_dai_stream *io,
132 struct rsnd_priv *priv)
133{
134 if (!rsnd_ssi_use_busif(io))
135 return 0;
136
137 rsnd_mod_write(mod, SSI_CTRL, 0x1);
138
139 if (rsnd_ssi_multi_slaves(io))
140 rsnd_mod_write(mod, SSI_CONTROL, 0x1);
141
142 return 0;
143}
144
145static int rsnd_ssiu_stop_gen2(struct rsnd_mod *mod,
146 struct rsnd_dai_stream *io,
147 struct rsnd_priv *priv)
148{
149 if (!rsnd_ssi_use_busif(io))
150 return 0;
151
152 rsnd_mod_write(mod, SSI_CTRL, 0);
153
154 if (rsnd_ssi_multi_slaves(io))
155 rsnd_mod_write(mod, SSI_CONTROL, 0);
156
157 return 0;
158}
159
160static struct rsnd_mod_ops rsnd_ssiu_ops_gen2 = {
161 .name = SSIU_NAME,
162 .init = rsnd_ssiu_init_gen2,
163 .start = rsnd_ssiu_start_gen2,
164 .stop = rsnd_ssiu_stop_gen2,
165};
166
167static struct rsnd_mod *rsnd_ssiu_mod_get(struct rsnd_priv *priv, int id)
168{
169 if (WARN_ON(id < 0 || id >= rsnd_ssiu_nr(priv)))
170 id = 0;
171
172 return rsnd_mod_get((struct rsnd_ssiu *)(priv->ssiu) + id);
173}
174
175int rsnd_ssiu_attach(struct rsnd_dai_stream *io,
176 struct rsnd_mod *ssi_mod)
177{
178 struct rsnd_priv *priv = rsnd_io_to_priv(io);
179 struct rsnd_mod *mod = rsnd_ssiu_mod_get(priv, rsnd_mod_id(ssi_mod));
180
181 rsnd_mod_confirm_ssi(ssi_mod);
182
183 return rsnd_dai_connect(mod, io, mod->type);
184}
185
186int rsnd_ssiu_probe(struct rsnd_priv *priv)
187{
188 struct device *dev = rsnd_priv_to_dev(priv);
189 struct rsnd_ssiu *ssiu;
190 static struct rsnd_mod_ops *ops;
191 int i, nr, ret;
192
193 /* same number to SSI */
194 nr = priv->ssi_nr;
195 ssiu = devm_kzalloc(dev, sizeof(*ssiu) * nr, GFP_KERNEL);
196 if (!ssiu)
197 return -ENOMEM;
198
199 priv->ssiu = ssiu;
200 priv->ssiu_nr = nr;
201
202 if (rsnd_is_gen1(priv))
203 ops = &rsnd_ssiu_ops_gen1;
204 else
205 ops = &rsnd_ssiu_ops_gen2;
206
207 for_each_rsnd_ssiu(ssiu, priv, i) {
208 ret = rsnd_mod_init(priv, rsnd_mod_get(ssiu),
209 ops, NULL, RSND_MOD_SSIU, i);
210 if (ret)
211 return ret;
212 }
213
214 return 0;
215}
216
217void rsnd_ssiu_remove(struct rsnd_priv *priv)
218{
219 struct rsnd_ssiu *ssiu;
220 int i;
221
222 for_each_rsnd_ssiu(ssiu, priv, i) {
223 rsnd_mod_quit(rsnd_mod_get(ssiu));
224 }
225}
diff --git a/sound/soc/soc-ac97.c b/sound/soc/soc-ac97.c
index d40efc9fe0a9..733f5128eeff 100644
--- a/sound/soc/soc-ac97.c
+++ b/sound/soc/soc-ac97.c
@@ -20,6 +20,7 @@
20#include <linux/delay.h> 20#include <linux/delay.h>
21#include <linux/export.h> 21#include <linux/export.h>
22#include <linux/gpio.h> 22#include <linux/gpio.h>
23#include <linux/gpio/driver.h>
23#include <linux/init.h> 24#include <linux/init.h>
24#include <linux/of_gpio.h> 25#include <linux/of_gpio.h>
25#include <linux/of.h> 26#include <linux/of.h>
@@ -38,6 +39,14 @@ struct snd_ac97_reset_cfg {
38 int gpio_reset; 39 int gpio_reset;
39}; 40};
40 41
42struct snd_ac97_gpio_priv {
43#ifdef CONFIG_GPIOLIB
44 struct gpio_chip gpio_chip;
45#endif
46 unsigned int gpios_set;
47 struct snd_soc_codec *codec;
48};
49
41static struct snd_ac97_bus soc_ac97_bus = { 50static struct snd_ac97_bus soc_ac97_bus = {
42 .ops = NULL, /* Gets initialized in snd_soc_set_ac97_ops() */ 51 .ops = NULL, /* Gets initialized in snd_soc_set_ac97_ops() */
43}; 52};
@@ -47,6 +56,117 @@ static void soc_ac97_device_release(struct device *dev)
47 kfree(to_ac97_t(dev)); 56 kfree(to_ac97_t(dev));
48} 57}
49 58
59#ifdef CONFIG_GPIOLIB
60static inline struct snd_soc_codec *gpio_to_codec(struct gpio_chip *chip)
61{
62 struct snd_ac97_gpio_priv *gpio_priv =
63 container_of(chip, struct snd_ac97_gpio_priv, gpio_chip);
64
65 return gpio_priv->codec;
66}
67
68static int snd_soc_ac97_gpio_request(struct gpio_chip *chip, unsigned offset)
69{
70 if (offset >= AC97_NUM_GPIOS)
71 return -EINVAL;
72
73 return 0;
74}
75
76static int snd_soc_ac97_gpio_direction_in(struct gpio_chip *chip,
77 unsigned offset)
78{
79 struct snd_soc_codec *codec = gpio_to_codec(chip);
80
81 dev_dbg(codec->dev, "set gpio %d to output\n", offset);
82 return snd_soc_update_bits(codec, AC97_GPIO_CFG,
83 1 << offset, 1 << offset);
84}
85
86static int snd_soc_ac97_gpio_get(struct gpio_chip *chip, unsigned offset)
87{
88 struct snd_soc_codec *codec = gpio_to_codec(chip);
89 int ret;
90
91 ret = snd_soc_read(codec, AC97_GPIO_STATUS);
92 dev_dbg(codec->dev, "get gpio %d : %d\n", offset,
93 ret < 0 ? ret : ret & (1 << offset));
94
95 return ret < 0 ? ret : !!(ret & (1 << offset));
96}
97
98static void snd_soc_ac97_gpio_set(struct gpio_chip *chip, unsigned offset,
99 int value)
100{
101 struct snd_ac97_gpio_priv *gpio_priv =
102 container_of(chip, struct snd_ac97_gpio_priv, gpio_chip);
103 struct snd_soc_codec *codec = gpio_to_codec(chip);
104
105 gpio_priv->gpios_set &= ~(1 << offset);
106 gpio_priv->gpios_set |= (!!value) << offset;
107 snd_soc_write(codec, AC97_GPIO_STATUS, gpio_priv->gpios_set);
108 dev_dbg(codec->dev, "set gpio %d to %d\n", offset, !!value);
109}
110
111static int snd_soc_ac97_gpio_direction_out(struct gpio_chip *chip,
112 unsigned offset, int value)
113{
114 struct snd_soc_codec *codec = gpio_to_codec(chip);
115
116 dev_dbg(codec->dev, "set gpio %d to output\n", offset);
117 snd_soc_ac97_gpio_set(chip, offset, value);
118 return snd_soc_update_bits(codec, AC97_GPIO_CFG, 1 << offset, 0);
119}
120
121static struct gpio_chip snd_soc_ac97_gpio_chip = {
122 .label = "snd_soc_ac97",
123 .owner = THIS_MODULE,
124 .request = snd_soc_ac97_gpio_request,
125 .direction_input = snd_soc_ac97_gpio_direction_in,
126 .get = snd_soc_ac97_gpio_get,
127 .direction_output = snd_soc_ac97_gpio_direction_out,
128 .set = snd_soc_ac97_gpio_set,
129 .can_sleep = 1,
130};
131
132static int snd_soc_ac97_init_gpio(struct snd_ac97 *ac97,
133 struct snd_soc_codec *codec)
134{
135 struct snd_ac97_gpio_priv *gpio_priv;
136 int ret;
137
138 gpio_priv = devm_kzalloc(codec->dev, sizeof(*gpio_priv), GFP_KERNEL);
139 if (!gpio_priv)
140 return -ENOMEM;
141 ac97->gpio_priv = gpio_priv;
142 gpio_priv->codec = codec;
143 gpio_priv->gpio_chip = snd_soc_ac97_gpio_chip;
144 gpio_priv->gpio_chip.ngpio = AC97_NUM_GPIOS;
145 gpio_priv->gpio_chip.dev = codec->dev;
146 gpio_priv->gpio_chip.base = -1;
147
148 ret = gpiochip_add(&gpio_priv->gpio_chip);
149 if (ret != 0)
150 dev_err(codec->dev, "Failed to add GPIOs: %d\n", ret);
151 return ret;
152}
153
154static void snd_soc_ac97_free_gpio(struct snd_ac97 *ac97)
155{
156 gpiochip_remove(&ac97->gpio_priv->gpio_chip);
157}
158#else
159static int snd_soc_ac97_init_gpio(struct snd_ac97 *ac97,
160 struct snd_soc_codec *codec)
161{
162 return 0;
163}
164
165static void snd_soc_ac97_free_gpio(struct snd_ac97 *ac97)
166{
167}
168#endif
169
50/** 170/**
51 * snd_soc_alloc_ac97_codec() - Allocate new a AC'97 device 171 * snd_soc_alloc_ac97_codec() - Allocate new a AC'97 device
52 * @codec: The CODEC for which to create the AC'97 device 172 * @codec: The CODEC for which to create the AC'97 device
@@ -119,6 +239,10 @@ struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
119 if (ret) 239 if (ret)
120 goto err_put_device; 240 goto err_put_device;
121 241
242 ret = snd_soc_ac97_init_gpio(ac97, codec);
243 if (ret)
244 goto err_put_device;
245
122 return ac97; 246 return ac97;
123 247
124err_put_device: 248err_put_device:
@@ -135,6 +259,7 @@ EXPORT_SYMBOL_GPL(snd_soc_new_ac97_codec);
135 */ 259 */
136void snd_soc_free_ac97_codec(struct snd_ac97 *ac97) 260void snd_soc_free_ac97_codec(struct snd_ac97 *ac97)
137{ 261{
262 snd_soc_ac97_free_gpio(ac97);
138 device_del(&ac97->dev); 263 device_del(&ac97->dev);
139 ac97->bus = NULL; 264 ac97->bus = NULL;
140 put_device(&ac97->dev); 265 put_device(&ac97->dev);
diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c
index 12a9820feac1..875733c52953 100644
--- a/sound/soc/soc-compress.c
+++ b/sound/soc/soc-compress.c
@@ -630,6 +630,7 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
630 struct snd_pcm *be_pcm; 630 struct snd_pcm *be_pcm;
631 char new_name[64]; 631 char new_name[64];
632 int ret = 0, direction = 0; 632 int ret = 0, direction = 0;
633 int playback = 0, capture = 0;
633 634
634 if (rtd->num_codecs > 1) { 635 if (rtd->num_codecs > 1) {
635 dev_err(rtd->card->dev, "Multicodec not supported for compressed stream\n"); 636 dev_err(rtd->card->dev, "Multicodec not supported for compressed stream\n");
@@ -641,11 +642,27 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
641 rtd->dai_link->stream_name, codec_dai->name, num); 642 rtd->dai_link->stream_name, codec_dai->name, num);
642 643
643 if (codec_dai->driver->playback.channels_min) 644 if (codec_dai->driver->playback.channels_min)
645 playback = 1;
646 if (codec_dai->driver->capture.channels_min)
647 capture = 1;
648
649 capture = capture && cpu_dai->driver->capture.channels_min;
650 playback = playback && cpu_dai->driver->playback.channels_min;
651
652 /*
653 * Compress devices are unidirectional so only one of the directions
654 * should be set, check for that (xor)
655 */
656 if (playback + capture != 1) {
657 dev_err(rtd->card->dev, "Invalid direction for compress P %d, C %d\n",
658 playback, capture);
659 return -EINVAL;
660 }
661
662 if(playback)
644 direction = SND_COMPRESS_PLAYBACK; 663 direction = SND_COMPRESS_PLAYBACK;
645 else if (codec_dai->driver->capture.channels_min)
646 direction = SND_COMPRESS_CAPTURE;
647 else 664 else
648 return -EINVAL; 665 direction = SND_COMPRESS_CAPTURE;
649 666
650 compr = kzalloc(sizeof(*compr), GFP_KERNEL); 667 compr = kzalloc(sizeof(*compr), GFP_KERNEL);
651 if (compr == NULL) { 668 if (compr == NULL) {
@@ -689,7 +706,13 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
689 compr->ops->copy = soc_compr_copy; 706 compr->ops->copy = soc_compr_copy;
690 707
691 mutex_init(&compr->lock); 708 mutex_init(&compr->lock);
692 ret = snd_compress_new(rtd->card->snd_card, num, direction, compr); 709
710 snprintf(new_name, sizeof(new_name), "%s %s-%d",
711 rtd->dai_link->stream_name,
712 rtd->codec_dai->name, num);
713
714 ret = snd_compress_new(rtd->card->snd_card, num, direction,
715 new_name, compr);
693 if (ret < 0) { 716 if (ret < 0) {
694 pr_err("compress asoc: can't create compress for codec %s\n", 717 pr_err("compress asoc: can't create compress for codec %s\n",
695 codec->component.name); 718 codec->component.name);
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index a1305f827a98..790ee2bf1a47 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -537,26 +537,75 @@ static inline void snd_soc_debugfs_exit(void)
537struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card, 537struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
538 const char *dai_link, int stream) 538 const char *dai_link, int stream)
539{ 539{
540 int i; 540 struct snd_soc_pcm_runtime *rtd;
541 541
542 for (i = 0; i < card->num_links; i++) { 542 list_for_each_entry(rtd, &card->rtd_list, list) {
543 if (card->rtd[i].dai_link->no_pcm && 543 if (rtd->dai_link->no_pcm &&
544 !strcmp(card->rtd[i].dai_link->name, dai_link)) 544 !strcmp(rtd->dai_link->name, dai_link))
545 return card->rtd[i].pcm->streams[stream].substream; 545 return rtd->pcm->streams[stream].substream;
546 } 546 }
547 dev_dbg(card->dev, "ASoC: failed to find dai link %s\n", dai_link); 547 dev_dbg(card->dev, "ASoC: failed to find dai link %s\n", dai_link);
548 return NULL; 548 return NULL;
549} 549}
550EXPORT_SYMBOL_GPL(snd_soc_get_dai_substream); 550EXPORT_SYMBOL_GPL(snd_soc_get_dai_substream);
551 551
552static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
553 struct snd_soc_card *card, struct snd_soc_dai_link *dai_link)
554{
555 struct snd_soc_pcm_runtime *rtd;
556
557 rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime), GFP_KERNEL);
558 if (!rtd)
559 return NULL;
560
561 rtd->card = card;
562 rtd->dai_link = dai_link;
563 rtd->codec_dais = kzalloc(sizeof(struct snd_soc_dai *) *
564 dai_link->num_codecs,
565 GFP_KERNEL);
566 if (!rtd->codec_dais) {
567 kfree(rtd);
568 return NULL;
569 }
570
571 return rtd;
572}
573
574static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd)
575{
576 if (rtd && rtd->codec_dais)
577 kfree(rtd->codec_dais);
578 kfree(rtd);
579}
580
581static void soc_add_pcm_runtime(struct snd_soc_card *card,
582 struct snd_soc_pcm_runtime *rtd)
583{
584 list_add_tail(&rtd->list, &card->rtd_list);
585 rtd->num = card->num_rtd;
586 card->num_rtd++;
587}
588
589static void soc_remove_pcm_runtimes(struct snd_soc_card *card)
590{
591 struct snd_soc_pcm_runtime *rtd, *_rtd;
592
593 list_for_each_entry_safe(rtd, _rtd, &card->rtd_list, list) {
594 list_del(&rtd->list);
595 soc_free_pcm_runtime(rtd);
596 }
597
598 card->num_rtd = 0;
599}
600
552struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card, 601struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
553 const char *dai_link) 602 const char *dai_link)
554{ 603{
555 int i; 604 struct snd_soc_pcm_runtime *rtd;
556 605
557 for (i = 0; i < card->num_links; i++) { 606 list_for_each_entry(rtd, &card->rtd_list, list) {
558 if (!strcmp(card->rtd[i].dai_link->name, dai_link)) 607 if (!strcmp(rtd->dai_link->name, dai_link))
559 return &card->rtd[i]; 608 return rtd;
560 } 609 }
561 dev_dbg(card->dev, "ASoC: failed to find rtd %s\n", dai_link); 610 dev_dbg(card->dev, "ASoC: failed to find rtd %s\n", dai_link);
562 return NULL; 611 return NULL;
@@ -578,7 +627,8 @@ int snd_soc_suspend(struct device *dev)
578{ 627{
579 struct snd_soc_card *card = dev_get_drvdata(dev); 628 struct snd_soc_card *card = dev_get_drvdata(dev);
580 struct snd_soc_codec *codec; 629 struct snd_soc_codec *codec;
581 int i, j; 630 struct snd_soc_pcm_runtime *rtd;
631 int i;
582 632
583 /* If the card is not initialized yet there is nothing to do */ 633 /* If the card is not initialized yet there is nothing to do */
584 if (!card->instantiated) 634 if (!card->instantiated)
@@ -595,13 +645,13 @@ int snd_soc_suspend(struct device *dev)
595 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot); 645 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot);
596 646
597 /* mute any active DACs */ 647 /* mute any active DACs */
598 for (i = 0; i < card->num_rtd; i++) { 648 list_for_each_entry(rtd, &card->rtd_list, list) {
599 649
600 if (card->rtd[i].dai_link->ignore_suspend) 650 if (rtd->dai_link->ignore_suspend)
601 continue; 651 continue;
602 652
603 for (j = 0; j < card->rtd[i].num_codecs; j++) { 653 for (i = 0; i < rtd->num_codecs; i++) {
604 struct snd_soc_dai *dai = card->rtd[i].codec_dais[j]; 654 struct snd_soc_dai *dai = rtd->codec_dais[i];
605 struct snd_soc_dai_driver *drv = dai->driver; 655 struct snd_soc_dai_driver *drv = dai->driver;
606 656
607 if (drv->ops->digital_mute && dai->playback_active) 657 if (drv->ops->digital_mute && dai->playback_active)
@@ -610,20 +660,20 @@ int snd_soc_suspend(struct device *dev)
610 } 660 }
611 661
612 /* suspend all pcms */ 662 /* suspend all pcms */
613 for (i = 0; i < card->num_rtd; i++) { 663 list_for_each_entry(rtd, &card->rtd_list, list) {
614 if (card->rtd[i].dai_link->ignore_suspend) 664 if (rtd->dai_link->ignore_suspend)
615 continue; 665 continue;
616 666
617 snd_pcm_suspend_all(card->rtd[i].pcm); 667 snd_pcm_suspend_all(rtd->pcm);
618 } 668 }
619 669
620 if (card->suspend_pre) 670 if (card->suspend_pre)
621 card->suspend_pre(card); 671 card->suspend_pre(card);
622 672
623 for (i = 0; i < card->num_rtd; i++) { 673 list_for_each_entry(rtd, &card->rtd_list, list) {
624 struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; 674 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
625 675
626 if (card->rtd[i].dai_link->ignore_suspend) 676 if (rtd->dai_link->ignore_suspend)
627 continue; 677 continue;
628 678
629 if (cpu_dai->driver->suspend && !cpu_dai->driver->bus_control) 679 if (cpu_dai->driver->suspend && !cpu_dai->driver->bus_control)
@@ -631,19 +681,19 @@ int snd_soc_suspend(struct device *dev)
631 } 681 }
632 682
633 /* close any waiting streams */ 683 /* close any waiting streams */
634 for (i = 0; i < card->num_rtd; i++) 684 list_for_each_entry(rtd, &card->rtd_list, list)
635 flush_delayed_work(&card->rtd[i].delayed_work); 685 flush_delayed_work(&rtd->delayed_work);
636 686
637 for (i = 0; i < card->num_rtd; i++) { 687 list_for_each_entry(rtd, &card->rtd_list, list) {
638 688
639 if (card->rtd[i].dai_link->ignore_suspend) 689 if (rtd->dai_link->ignore_suspend)
640 continue; 690 continue;
641 691
642 snd_soc_dapm_stream_event(&card->rtd[i], 692 snd_soc_dapm_stream_event(rtd,
643 SNDRV_PCM_STREAM_PLAYBACK, 693 SNDRV_PCM_STREAM_PLAYBACK,
644 SND_SOC_DAPM_STREAM_SUSPEND); 694 SND_SOC_DAPM_STREAM_SUSPEND);
645 695
646 snd_soc_dapm_stream_event(&card->rtd[i], 696 snd_soc_dapm_stream_event(rtd,
647 SNDRV_PCM_STREAM_CAPTURE, 697 SNDRV_PCM_STREAM_CAPTURE,
648 SND_SOC_DAPM_STREAM_SUSPEND); 698 SND_SOC_DAPM_STREAM_SUSPEND);
649 } 699 }
@@ -690,10 +740,10 @@ int snd_soc_suspend(struct device *dev)
690 } 740 }
691 } 741 }
692 742
693 for (i = 0; i < card->num_rtd; i++) { 743 list_for_each_entry(rtd, &card->rtd_list, list) {
694 struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; 744 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
695 745
696 if (card->rtd[i].dai_link->ignore_suspend) 746 if (rtd->dai_link->ignore_suspend)
697 continue; 747 continue;
698 748
699 if (cpu_dai->driver->suspend && cpu_dai->driver->bus_control) 749 if (cpu_dai->driver->suspend && cpu_dai->driver->bus_control)
@@ -717,8 +767,9 @@ static void soc_resume_deferred(struct work_struct *work)
717{ 767{
718 struct snd_soc_card *card = 768 struct snd_soc_card *card =
719 container_of(work, struct snd_soc_card, deferred_resume_work); 769 container_of(work, struct snd_soc_card, deferred_resume_work);
770 struct snd_soc_pcm_runtime *rtd;
720 struct snd_soc_codec *codec; 771 struct snd_soc_codec *codec;
721 int i, j; 772 int i;
722 773
723 /* our power state is still SNDRV_CTL_POWER_D3hot from suspend time, 774 /* our power state is still SNDRV_CTL_POWER_D3hot from suspend time,
724 * so userspace apps are blocked from touching us 775 * so userspace apps are blocked from touching us
@@ -733,10 +784,10 @@ static void soc_resume_deferred(struct work_struct *work)
733 card->resume_pre(card); 784 card->resume_pre(card);
734 785
735 /* resume control bus DAIs */ 786 /* resume control bus DAIs */
736 for (i = 0; i < card->num_rtd; i++) { 787 list_for_each_entry(rtd, &card->rtd_list, list) {
737 struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; 788 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
738 789
739 if (card->rtd[i].dai_link->ignore_suspend) 790 if (rtd->dai_link->ignore_suspend)
740 continue; 791 continue;
741 792
742 if (cpu_dai->driver->resume && cpu_dai->driver->bus_control) 793 if (cpu_dai->driver->resume && cpu_dai->driver->bus_control)
@@ -751,28 +802,28 @@ static void soc_resume_deferred(struct work_struct *work)
751 } 802 }
752 } 803 }
753 804
754 for (i = 0; i < card->num_rtd; i++) { 805 list_for_each_entry(rtd, &card->rtd_list, list) {
755 806
756 if (card->rtd[i].dai_link->ignore_suspend) 807 if (rtd->dai_link->ignore_suspend)
757 continue; 808 continue;
758 809
759 snd_soc_dapm_stream_event(&card->rtd[i], 810 snd_soc_dapm_stream_event(rtd,
760 SNDRV_PCM_STREAM_PLAYBACK, 811 SNDRV_PCM_STREAM_PLAYBACK,
761 SND_SOC_DAPM_STREAM_RESUME); 812 SND_SOC_DAPM_STREAM_RESUME);
762 813
763 snd_soc_dapm_stream_event(&card->rtd[i], 814 snd_soc_dapm_stream_event(rtd,
764 SNDRV_PCM_STREAM_CAPTURE, 815 SNDRV_PCM_STREAM_CAPTURE,
765 SND_SOC_DAPM_STREAM_RESUME); 816 SND_SOC_DAPM_STREAM_RESUME);
766 } 817 }
767 818
768 /* unmute any active DACs */ 819 /* unmute any active DACs */
769 for (i = 0; i < card->num_rtd; i++) { 820 list_for_each_entry(rtd, &card->rtd_list, list) {
770 821
771 if (card->rtd[i].dai_link->ignore_suspend) 822 if (rtd->dai_link->ignore_suspend)
772 continue; 823 continue;
773 824
774 for (j = 0; j < card->rtd[i].num_codecs; j++) { 825 for (i = 0; i < rtd->num_codecs; i++) {
775 struct snd_soc_dai *dai = card->rtd[i].codec_dais[j]; 826 struct snd_soc_dai *dai = rtd->codec_dais[i];
776 struct snd_soc_dai_driver *drv = dai->driver; 827 struct snd_soc_dai_driver *drv = dai->driver;
777 828
778 if (drv->ops->digital_mute && dai->playback_active) 829 if (drv->ops->digital_mute && dai->playback_active)
@@ -780,10 +831,10 @@ static void soc_resume_deferred(struct work_struct *work)
780 } 831 }
781 } 832 }
782 833
783 for (i = 0; i < card->num_rtd; i++) { 834 list_for_each_entry(rtd, &card->rtd_list, list) {
784 struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; 835 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
785 836
786 if (card->rtd[i].dai_link->ignore_suspend) 837 if (rtd->dai_link->ignore_suspend)
787 continue; 838 continue;
788 839
789 if (cpu_dai->driver->resume && !cpu_dai->driver->bus_control) 840 if (cpu_dai->driver->resume && !cpu_dai->driver->bus_control)
@@ -808,15 +859,14 @@ int snd_soc_resume(struct device *dev)
808{ 859{
809 struct snd_soc_card *card = dev_get_drvdata(dev); 860 struct snd_soc_card *card = dev_get_drvdata(dev);
810 bool bus_control = false; 861 bool bus_control = false;
811 int i; 862 struct snd_soc_pcm_runtime *rtd;
812 863
813 /* If the card is not initialized yet there is nothing to do */ 864 /* If the card is not initialized yet there is nothing to do */
814 if (!card->instantiated) 865 if (!card->instantiated)
815 return 0; 866 return 0;
816 867
817 /* activate pins from sleep state */ 868 /* activate pins from sleep state */
818 for (i = 0; i < card->num_rtd; i++) { 869 list_for_each_entry(rtd, &card->rtd_list, list) {
819 struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
820 struct snd_soc_dai **codec_dais = rtd->codec_dais; 870 struct snd_soc_dai **codec_dais = rtd->codec_dais;
821 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 871 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
822 int j; 872 int j;
@@ -837,8 +887,8 @@ int snd_soc_resume(struct device *dev)
837 * have that problem and may take a substantial amount of time to resume 887 * have that problem and may take a substantial amount of time to resume
838 * due to I/O costs and anti-pop so handle them out of line. 888 * due to I/O costs and anti-pop so handle them out of line.
839 */ 889 */
840 for (i = 0; i < card->num_rtd; i++) { 890 list_for_each_entry(rtd, &card->rtd_list, list) {
841 struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai; 891 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
842 bus_control |= cpu_dai->driver->bus_control; 892 bus_control |= cpu_dai->driver->bus_control;
843 } 893 }
844 if (bus_control) { 894 if (bus_control) {
@@ -910,18 +960,41 @@ static struct snd_soc_dai *snd_soc_find_dai(
910 return NULL; 960 return NULL;
911} 961}
912 962
913static int soc_bind_dai_link(struct snd_soc_card *card, int num) 963static bool soc_is_dai_link_bound(struct snd_soc_card *card,
964 struct snd_soc_dai_link *dai_link)
914{ 965{
915 struct snd_soc_dai_link *dai_link = &card->dai_link[num]; 966 struct snd_soc_pcm_runtime *rtd;
916 struct snd_soc_pcm_runtime *rtd = &card->rtd[num]; 967
968 list_for_each_entry(rtd, &card->rtd_list, list) {
969 if (rtd->dai_link == dai_link)
970 return true;
971 }
972
973 return false;
974}
975
976static int soc_bind_dai_link(struct snd_soc_card *card,
977 struct snd_soc_dai_link *dai_link)
978{
979 struct snd_soc_pcm_runtime *rtd;
917 struct snd_soc_dai_link_component *codecs = dai_link->codecs; 980 struct snd_soc_dai_link_component *codecs = dai_link->codecs;
918 struct snd_soc_dai_link_component cpu_dai_component; 981 struct snd_soc_dai_link_component cpu_dai_component;
919 struct snd_soc_dai **codec_dais = rtd->codec_dais; 982 struct snd_soc_dai **codec_dais;
920 struct snd_soc_platform *platform; 983 struct snd_soc_platform *platform;
921 const char *platform_name; 984 const char *platform_name;
922 int i; 985 int i;
923 986
924 dev_dbg(card->dev, "ASoC: binding %s at idx %d\n", dai_link->name, num); 987 dev_dbg(card->dev, "ASoC: binding %s\n", dai_link->name);
988
989 rtd = soc_new_pcm_runtime(card, dai_link);
990 if (!rtd)
991 return -ENOMEM;
992
993 if (soc_is_dai_link_bound(card, dai_link)) {
994 dev_dbg(card->dev, "ASoC: dai link %s already bound\n",
995 dai_link->name);
996 return 0;
997 }
925 998
926 cpu_dai_component.name = dai_link->cpu_name; 999 cpu_dai_component.name = dai_link->cpu_name;
927 cpu_dai_component.of_node = dai_link->cpu_of_node; 1000 cpu_dai_component.of_node = dai_link->cpu_of_node;
@@ -930,18 +1003,19 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
930 if (!rtd->cpu_dai) { 1003 if (!rtd->cpu_dai) {
931 dev_err(card->dev, "ASoC: CPU DAI %s not registered\n", 1004 dev_err(card->dev, "ASoC: CPU DAI %s not registered\n",
932 dai_link->cpu_dai_name); 1005 dai_link->cpu_dai_name);
933 return -EPROBE_DEFER; 1006 goto _err_defer;
934 } 1007 }
935 1008
936 rtd->num_codecs = dai_link->num_codecs; 1009 rtd->num_codecs = dai_link->num_codecs;
937 1010
938 /* Find CODEC from registered CODECs */ 1011 /* Find CODEC from registered CODECs */
1012 codec_dais = rtd->codec_dais;
939 for (i = 0; i < rtd->num_codecs; i++) { 1013 for (i = 0; i < rtd->num_codecs; i++) {
940 codec_dais[i] = snd_soc_find_dai(&codecs[i]); 1014 codec_dais[i] = snd_soc_find_dai(&codecs[i]);
941 if (!codec_dais[i]) { 1015 if (!codec_dais[i]) {
942 dev_err(card->dev, "ASoC: CODEC DAI %s not registered\n", 1016 dev_err(card->dev, "ASoC: CODEC DAI %s not registered\n",
943 codecs[i].dai_name); 1017 codecs[i].dai_name);
944 return -EPROBE_DEFER; 1018 goto _err_defer;
945 } 1019 }
946 } 1020 }
947 1021
@@ -973,9 +1047,12 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
973 return -EPROBE_DEFER; 1047 return -EPROBE_DEFER;
974 } 1048 }
975 1049
976 card->num_rtd++; 1050 soc_add_pcm_runtime(card, rtd);
977
978 return 0; 1051 return 0;
1052
1053_err_defer:
1054 soc_free_pcm_runtime(rtd);
1055 return -EPROBE_DEFER;
979} 1056}
980 1057
981static void soc_remove_component(struct snd_soc_component *component) 1058static void soc_remove_component(struct snd_soc_component *component)
@@ -1014,9 +1091,9 @@ static void soc_remove_dai(struct snd_soc_dai *dai, int order)
1014 } 1091 }
1015} 1092}
1016 1093
1017static void soc_remove_link_dais(struct snd_soc_card *card, int num, int order) 1094static void soc_remove_link_dais(struct snd_soc_card *card,
1095 struct snd_soc_pcm_runtime *rtd, int order)
1018{ 1096{
1019 struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
1020 int i; 1097 int i;
1021 1098
1022 /* unregister the rtd device */ 1099 /* unregister the rtd device */
@@ -1032,10 +1109,9 @@ static void soc_remove_link_dais(struct snd_soc_card *card, int num, int order)
1032 soc_remove_dai(rtd->cpu_dai, order); 1109 soc_remove_dai(rtd->cpu_dai, order);
1033} 1110}
1034 1111
1035static void soc_remove_link_components(struct snd_soc_card *card, int num, 1112static void soc_remove_link_components(struct snd_soc_card *card,
1036 int order) 1113 struct snd_soc_pcm_runtime *rtd, int order)
1037{ 1114{
1038 struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
1039 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 1115 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1040 struct snd_soc_platform *platform = rtd->platform; 1116 struct snd_soc_platform *platform = rtd->platform;
1041 struct snd_soc_component *component; 1117 struct snd_soc_component *component;
@@ -1061,23 +1137,200 @@ static void soc_remove_link_components(struct snd_soc_card *card, int num,
1061 1137
1062static void soc_remove_dai_links(struct snd_soc_card *card) 1138static void soc_remove_dai_links(struct snd_soc_card *card)
1063{ 1139{
1064 int dai, order; 1140 int order;
1141 struct snd_soc_pcm_runtime *rtd;
1142 struct snd_soc_dai_link *link, *_link;
1065 1143
1066 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST; 1144 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1067 order++) { 1145 order++) {
1068 for (dai = 0; dai < card->num_rtd; dai++) 1146 list_for_each_entry(rtd, &card->rtd_list, list)
1069 soc_remove_link_dais(card, dai, order); 1147 soc_remove_link_dais(card, rtd, order);
1070 } 1148 }
1071 1149
1072 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST; 1150 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1073 order++) { 1151 order++) {
1074 for (dai = 0; dai < card->num_rtd; dai++) 1152 list_for_each_entry(rtd, &card->rtd_list, list)
1075 soc_remove_link_components(card, dai, order); 1153 soc_remove_link_components(card, rtd, order);
1076 } 1154 }
1077 1155
1078 card->num_rtd = 0; 1156 list_for_each_entry_safe(link, _link, &card->dai_link_list, list) {
1157 if (link->dobj.type == SND_SOC_DOBJ_DAI_LINK)
1158 dev_warn(card->dev, "Topology forgot to remove link %s?\n",
1159 link->name);
1160
1161 list_del(&link->list);
1162 card->num_dai_links--;
1163 }
1079} 1164}
1080 1165
1166static int snd_soc_init_multicodec(struct snd_soc_card *card,
1167 struct snd_soc_dai_link *dai_link)
1168{
1169 /* Legacy codec/codec_dai link is a single entry in multicodec */
1170 if (dai_link->codec_name || dai_link->codec_of_node ||
1171 dai_link->codec_dai_name) {
1172 dai_link->num_codecs = 1;
1173
1174 dai_link->codecs = devm_kzalloc(card->dev,
1175 sizeof(struct snd_soc_dai_link_component),
1176 GFP_KERNEL);
1177 if (!dai_link->codecs)
1178 return -ENOMEM;
1179
1180 dai_link->codecs[0].name = dai_link->codec_name;
1181 dai_link->codecs[0].of_node = dai_link->codec_of_node;
1182 dai_link->codecs[0].dai_name = dai_link->codec_dai_name;
1183 }
1184
1185 if (!dai_link->codecs) {
1186 dev_err(card->dev, "ASoC: DAI link has no CODECs\n");
1187 return -EINVAL;
1188 }
1189
1190 return 0;
1191}
1192
1193static int soc_init_dai_link(struct snd_soc_card *card,
1194 struct snd_soc_dai_link *link)
1195{
1196 int i, ret;
1197
1198 ret = snd_soc_init_multicodec(card, link);
1199 if (ret) {
1200 dev_err(card->dev, "ASoC: failed to init multicodec\n");
1201 return ret;
1202 }
1203
1204 for (i = 0; i < link->num_codecs; i++) {
1205 /*
1206 * Codec must be specified by 1 of name or OF node,
1207 * not both or neither.
1208 */
1209 if (!!link->codecs[i].name ==
1210 !!link->codecs[i].of_node) {
1211 dev_err(card->dev, "ASoC: Neither/both codec name/of_node are set for %s\n",
1212 link->name);
1213 return -EINVAL;
1214 }
1215 /* Codec DAI name must be specified */
1216 if (!link->codecs[i].dai_name) {
1217 dev_err(card->dev, "ASoC: codec_dai_name not set for %s\n",
1218 link->name);
1219 return -EINVAL;
1220 }
1221 }
1222
1223 /*
1224 * Platform may be specified by either name or OF node, but
1225 * can be left unspecified, and a dummy platform will be used.
1226 */
1227 if (link->platform_name && link->platform_of_node) {
1228 dev_err(card->dev,
1229 "ASoC: Both platform name/of_node are set for %s\n",
1230 link->name);
1231 return -EINVAL;
1232 }
1233
1234 /*
1235 * CPU device may be specified by either name or OF node, but
1236 * can be left unspecified, and will be matched based on DAI
1237 * name alone..
1238 */
1239 if (link->cpu_name && link->cpu_of_node) {
1240 dev_err(card->dev,
1241 "ASoC: Neither/both cpu name/of_node are set for %s\n",
1242 link->name);
1243 return -EINVAL;
1244 }
1245 /*
1246 * At least one of CPU DAI name or CPU device name/node must be
1247 * specified
1248 */
1249 if (!link->cpu_dai_name &&
1250 !(link->cpu_name || link->cpu_of_node)) {
1251 dev_err(card->dev,
1252 "ASoC: Neither cpu_dai_name nor cpu_name/of_node are set for %s\n",
1253 link->name);
1254 return -EINVAL;
1255 }
1256
1257 return 0;
1258}
1259
1260/**
1261 * snd_soc_add_dai_link - Add a DAI link dynamically
1262 * @card: The ASoC card to which the DAI link is added
1263 * @dai_link: The new DAI link to add
1264 *
1265 * This function adds a DAI link to the ASoC card's link list.
1266 *
1267 * Note: Topology can use this API to add DAI links when probing the
1268 * topology component. And machine drivers can still define static
1269 * DAI links in dai_link array.
1270 */
1271int snd_soc_add_dai_link(struct snd_soc_card *card,
1272 struct snd_soc_dai_link *dai_link)
1273{
1274 if (dai_link->dobj.type
1275 && dai_link->dobj.type != SND_SOC_DOBJ_DAI_LINK) {
1276 dev_err(card->dev, "Invalid dai link type %d\n",
1277 dai_link->dobj.type);
1278 return -EINVAL;
1279 }
1280
1281 lockdep_assert_held(&client_mutex);
1282 /* Notify the machine driver for extra initialization
1283 * on the link created by topology.
1284 */
1285 if (dai_link->dobj.type && card->add_dai_link)
1286 card->add_dai_link(card, dai_link);
1287
1288 list_add_tail(&dai_link->list, &card->dai_link_list);
1289 card->num_dai_links++;
1290
1291 return 0;
1292}
1293EXPORT_SYMBOL_GPL(snd_soc_add_dai_link);
1294
1295/**
1296 * snd_soc_remove_dai_link - Remove a DAI link from the list
1297 * @card: The ASoC card that owns the link
1298 * @dai_link: The DAI link to remove
1299 *
1300 * This function removes a DAI link from the ASoC card's link list.
1301 *
1302 * For DAI links previously added by topology, topology should
1303 * remove them by using the dobj embedded in the link.
1304 */
1305void snd_soc_remove_dai_link(struct snd_soc_card *card,
1306 struct snd_soc_dai_link *dai_link)
1307{
1308 struct snd_soc_dai_link *link, *_link;
1309
1310 if (dai_link->dobj.type
1311 && dai_link->dobj.type != SND_SOC_DOBJ_DAI_LINK) {
1312 dev_err(card->dev, "Invalid dai link type %d\n",
1313 dai_link->dobj.type);
1314 return;
1315 }
1316
1317 lockdep_assert_held(&client_mutex);
1318 /* Notify the machine driver for extra destruction
1319 * on the link created by topology.
1320 */
1321 if (dai_link->dobj.type && card->remove_dai_link)
1322 card->remove_dai_link(card, dai_link);
1323
1324 list_for_each_entry_safe(link, _link, &card->dai_link_list, list) {
1325 if (link == dai_link) {
1326 list_del(&link->list);
1327 card->num_dai_links--;
1328 return;
1329 }
1330 }
1331}
1332EXPORT_SYMBOL_GPL(snd_soc_remove_dai_link);
1333
1081static void soc_set_name_prefix(struct snd_soc_card *card, 1334static void soc_set_name_prefix(struct snd_soc_card *card,
1082 struct snd_soc_component *component) 1335 struct snd_soc_component *component)
1083{ 1336{
@@ -1160,6 +1413,16 @@ static int soc_probe_component(struct snd_soc_card *card,
1160 component->name); 1413 component->name);
1161 } 1414 }
1162 1415
1416 /* machine specific init */
1417 if (component->init) {
1418 ret = component->init(component);
1419 if (ret < 0) {
1420 dev_err(component->dev,
1421 "Failed to do machine specific init %d\n", ret);
1422 goto err_probe;
1423 }
1424 }
1425
1163 if (component->controls) 1426 if (component->controls)
1164 snd_soc_add_component_controls(component, component->controls, 1427 snd_soc_add_component_controls(component, component->controls,
1165 component->num_controls); 1428 component->num_controls);
@@ -1220,10 +1483,10 @@ static int soc_post_component_init(struct snd_soc_pcm_runtime *rtd,
1220 return 0; 1483 return 0;
1221} 1484}
1222 1485
1223static int soc_probe_link_components(struct snd_soc_card *card, int num, 1486static int soc_probe_link_components(struct snd_soc_card *card,
1487 struct snd_soc_pcm_runtime *rtd,
1224 int order) 1488 int order)
1225{ 1489{
1226 struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
1227 struct snd_soc_platform *platform = rtd->platform; 1490 struct snd_soc_platform *platform = rtd->platform;
1228 struct snd_soc_component *component; 1491 struct snd_soc_component *component;
1229 int i, ret; 1492 int i, ret;
@@ -1283,35 +1546,35 @@ static int soc_link_dai_widgets(struct snd_soc_card *card,
1283{ 1546{
1284 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 1547 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1285 struct snd_soc_dai *codec_dai = rtd->codec_dai; 1548 struct snd_soc_dai *codec_dai = rtd->codec_dai;
1286 struct snd_soc_dapm_widget *play_w, *capture_w; 1549 struct snd_soc_dapm_widget *sink, *source;
1287 int ret; 1550 int ret;
1288 1551
1289 if (rtd->num_codecs > 1) 1552 if (rtd->num_codecs > 1)
1290 dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n"); 1553 dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n");
1291 1554
1292 /* link the DAI widgets */ 1555 /* link the DAI widgets */
1293 play_w = codec_dai->playback_widget; 1556 sink = codec_dai->playback_widget;
1294 capture_w = cpu_dai->capture_widget; 1557 source = cpu_dai->capture_widget;
1295 if (play_w && capture_w) { 1558 if (sink && source) {
1296 ret = snd_soc_dapm_new_pcm(card, dai_link->params, 1559 ret = snd_soc_dapm_new_pcm(card, dai_link->params,
1297 dai_link->num_params, capture_w, 1560 dai_link->num_params,
1298 play_w); 1561 source, sink);
1299 if (ret != 0) { 1562 if (ret != 0) {
1300 dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n", 1563 dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
1301 play_w->name, capture_w->name, ret); 1564 sink->name, source->name, ret);
1302 return ret; 1565 return ret;
1303 } 1566 }
1304 } 1567 }
1305 1568
1306 play_w = cpu_dai->playback_widget; 1569 sink = cpu_dai->playback_widget;
1307 capture_w = codec_dai->capture_widget; 1570 source = codec_dai->capture_widget;
1308 if (play_w && capture_w) { 1571 if (sink && source) {
1309 ret = snd_soc_dapm_new_pcm(card, dai_link->params, 1572 ret = snd_soc_dapm_new_pcm(card, dai_link->params,
1310 dai_link->num_params, capture_w, 1573 dai_link->num_params,
1311 play_w); 1574 source, sink);
1312 if (ret != 0) { 1575 if (ret != 0) {
1313 dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n", 1576 dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
1314 play_w->name, capture_w->name, ret); 1577 sink->name, source->name, ret);
1315 return ret; 1578 return ret;
1316 } 1579 }
1317 } 1580 }
@@ -1319,15 +1582,15 @@ static int soc_link_dai_widgets(struct snd_soc_card *card,
1319 return 0; 1582 return 0;
1320} 1583}
1321 1584
1322static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order) 1585static int soc_probe_link_dais(struct snd_soc_card *card,
1586 struct snd_soc_pcm_runtime *rtd, int order)
1323{ 1587{
1324 struct snd_soc_dai_link *dai_link = &card->dai_link[num]; 1588 struct snd_soc_dai_link *dai_link = rtd->dai_link;
1325 struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
1326 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 1589 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1327 int i, ret; 1590 int i, ret;
1328 1591
1329 dev_dbg(card->dev, "ASoC: probe %s dai link %d late %d\n", 1592 dev_dbg(card->dev, "ASoC: probe %s dai link %d late %d\n",
1330 card->name, num, order); 1593 card->name, rtd->num, order);
1331 1594
1332 /* set default power off timeout */ 1595 /* set default power off timeout */
1333 rtd->pmdown_time = pmdown_time; 1596 rtd->pmdown_time = pmdown_time;
@@ -1372,7 +1635,7 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
1372 1635
1373 if (cpu_dai->driver->compress_new) { 1636 if (cpu_dai->driver->compress_new) {
1374 /*create compress_device"*/ 1637 /*create compress_device"*/
1375 ret = cpu_dai->driver->compress_new(rtd, num); 1638 ret = cpu_dai->driver->compress_new(rtd, rtd->num);
1376 if (ret < 0) { 1639 if (ret < 0) {
1377 dev_err(card->dev, "ASoC: can't create compress %s\n", 1640 dev_err(card->dev, "ASoC: can't create compress %s\n",
1378 dai_link->stream_name); 1641 dai_link->stream_name);
@@ -1382,7 +1645,7 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
1382 1645
1383 if (!dai_link->params) { 1646 if (!dai_link->params) {
1384 /* create the pcm */ 1647 /* create the pcm */
1385 ret = soc_new_pcm(rtd, num); 1648 ret = soc_new_pcm(rtd, rtd->num);
1386 if (ret < 0) { 1649 if (ret < 0) {
1387 dev_err(card->dev, "ASoC: can't create pcm %s :%d\n", 1650 dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
1388 dai_link->stream_name, ret); 1651 dai_link->stream_name, ret);
@@ -1404,65 +1667,81 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
1404 1667
1405static int soc_bind_aux_dev(struct snd_soc_card *card, int num) 1668static int soc_bind_aux_dev(struct snd_soc_card *card, int num)
1406{ 1669{
1407 struct snd_soc_pcm_runtime *rtd = &card->rtd_aux[num];
1408 struct snd_soc_aux_dev *aux_dev = &card->aux_dev[num]; 1670 struct snd_soc_aux_dev *aux_dev = &card->aux_dev[num];
1409 const char *name = aux_dev->codec_name; 1671 struct snd_soc_component *component;
1410 1672 const char *name;
1411 rtd->component = soc_find_component(aux_dev->codec_of_node, name); 1673 struct device_node *codec_of_node;
1412 if (!rtd->component) { 1674
1413 if (aux_dev->codec_of_node) 1675 if (aux_dev->codec_of_node || aux_dev->codec_name) {
1414 name = of_node_full_name(aux_dev->codec_of_node); 1676 /* codecs, usually analog devices */
1415 1677 name = aux_dev->codec_name;
1416 dev_err(card->dev, "ASoC: %s not registered\n", name); 1678 codec_of_node = aux_dev->codec_of_node;
1417 return -EPROBE_DEFER; 1679 component = soc_find_component(codec_of_node, name);
1680 if (!component) {
1681 if (codec_of_node)
1682 name = of_node_full_name(codec_of_node);
1683 goto err_defer;
1684 }
1685 } else if (aux_dev->name) {
1686 /* generic components */
1687 name = aux_dev->name;
1688 component = soc_find_component(NULL, name);
1689 if (!component)
1690 goto err_defer;
1691 } else {
1692 dev_err(card->dev, "ASoC: Invalid auxiliary device\n");
1693 return -EINVAL;
1418 } 1694 }
1419 1695
1420 /* 1696 component->init = aux_dev->init;
1421 * Some places still reference rtd->codec, so we have to keep that 1697 list_add(&component->list_aux, &card->aux_comp_list);
1422 * initialized if the component is a CODEC. Once all those references
1423 * have been removed, this code can be removed as well.
1424 */
1425 rtd->codec = rtd->component->codec;
1426
1427 return 0; 1698 return 0;
1699
1700err_defer:
1701 dev_err(card->dev, "ASoC: %s not registered\n", name);
1702 return -EPROBE_DEFER;
1428} 1703}
1429 1704
1430static int soc_probe_aux_dev(struct snd_soc_card *card, int num) 1705static int soc_probe_aux_devices(struct snd_soc_card *card)
1431{ 1706{
1432 struct snd_soc_pcm_runtime *rtd = &card->rtd_aux[num]; 1707 struct snd_soc_component *comp;
1433 struct snd_soc_aux_dev *aux_dev = &card->aux_dev[num]; 1708 int order;
1434 int ret; 1709 int ret;
1435 1710
1436 ret = soc_probe_component(card, rtd->component); 1711 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1437 if (ret < 0) 1712 order++) {
1438 return ret; 1713 list_for_each_entry(comp, &card->aux_comp_list, list_aux) {
1439 1714 if (comp->driver->probe_order == order) {
1440 /* do machine specific initialization */ 1715 ret = soc_probe_component(card, comp);
1441 if (aux_dev->init) { 1716 if (ret < 0) {
1442 ret = aux_dev->init(rtd->component); 1717 dev_err(card->dev,
1443 if (ret < 0) { 1718 "ASoC: failed to probe aux component %s %d\n",
1444 dev_err(card->dev, "ASoC: failed to init %s: %d\n", 1719 comp->name, ret);
1445 aux_dev->name, ret); 1720 return ret;
1446 return ret; 1721 }
1722 }
1447 } 1723 }
1448 } 1724 }
1449 1725
1450 return soc_post_component_init(rtd, aux_dev->name); 1726 return 0;
1451} 1727}
1452 1728
1453static void soc_remove_aux_dev(struct snd_soc_card *card, int num) 1729static void soc_remove_aux_devices(struct snd_soc_card *card)
1454{ 1730{
1455 struct snd_soc_pcm_runtime *rtd = &card->rtd_aux[num]; 1731 struct snd_soc_component *comp, *_comp;
1456 struct snd_soc_component *component = rtd->component; 1732 int order;
1457 1733
1458 /* unregister the rtd device */ 1734 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1459 if (rtd->dev_registered) { 1735 order++) {
1460 device_unregister(rtd->dev); 1736 list_for_each_entry_safe(comp, _comp,
1461 rtd->dev_registered = 0; 1737 &card->aux_comp_list, list_aux) {
1738 if (comp->driver->remove_order == order) {
1739 soc_remove_component(comp);
1740 /* remove it from the card's aux_comp_list */
1741 list_del(&comp->list_aux);
1742 }
1743 }
1462 } 1744 }
1463
1464 if (component)
1465 soc_remove_component(component);
1466} 1745}
1467 1746
1468static int snd_soc_init_codec_cache(struct snd_soc_codec *codec) 1747static int snd_soc_init_codec_cache(struct snd_soc_codec *codec)
@@ -1552,6 +1831,8 @@ EXPORT_SYMBOL_GPL(snd_soc_runtime_set_dai_fmt);
1552static int snd_soc_instantiate_card(struct snd_soc_card *card) 1831static int snd_soc_instantiate_card(struct snd_soc_card *card)
1553{ 1832{
1554 struct snd_soc_codec *codec; 1833 struct snd_soc_codec *codec;
1834 struct snd_soc_pcm_runtime *rtd;
1835 struct snd_soc_dai_link *dai_link;
1555 int ret, i, order; 1836 int ret, i, order;
1556 1837
1557 mutex_lock(&client_mutex); 1838 mutex_lock(&client_mutex);
@@ -1559,7 +1840,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
1559 1840
1560 /* bind DAIs */ 1841 /* bind DAIs */
1561 for (i = 0; i < card->num_links; i++) { 1842 for (i = 0; i < card->num_links; i++) {
1562 ret = soc_bind_dai_link(card, i); 1843 ret = soc_bind_dai_link(card, &card->dai_link[i]);
1563 if (ret != 0) 1844 if (ret != 0)
1564 goto base_error; 1845 goto base_error;
1565 } 1846 }
@@ -1571,6 +1852,10 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
1571 goto base_error; 1852 goto base_error;
1572 } 1853 }
1573 1854
1855 /* add predefined DAI links to the list */
1856 for (i = 0; i < card->num_links; i++)
1857 snd_soc_add_dai_link(card, card->dai_link+i);
1858
1574 /* initialize the register cache for each available codec */ 1859 /* initialize the register cache for each available codec */
1575 list_for_each_entry(codec, &codec_list, list) { 1860 list_for_each_entry(codec, &codec_list, list) {
1576 if (codec->cache_init) 1861 if (codec->cache_init)
@@ -1624,8 +1909,8 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
1624 /* probe all components used by DAI links on this card */ 1909 /* probe all components used by DAI links on this card */
1625 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST; 1910 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1626 order++) { 1911 order++) {
1627 for (i = 0; i < card->num_links; i++) { 1912 list_for_each_entry(rtd, &card->rtd_list, list) {
1628 ret = soc_probe_link_components(card, i, order); 1913 ret = soc_probe_link_components(card, rtd, order);
1629 if (ret < 0) { 1914 if (ret < 0) {
1630 dev_err(card->dev, 1915 dev_err(card->dev,
1631 "ASoC: failed to instantiate card %d\n", 1916 "ASoC: failed to instantiate card %d\n",
@@ -1635,11 +1920,31 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
1635 } 1920 }
1636 } 1921 }
1637 1922
1923 /* probe auxiliary components */
1924 ret = soc_probe_aux_devices(card);
1925 if (ret < 0)
1926 goto probe_dai_err;
1927
1928 /* Find new DAI links added during probing components and bind them.
1929 * Components with topology may bring new DAIs and DAI links.
1930 */
1931 list_for_each_entry(dai_link, &card->dai_link_list, list) {
1932 if (soc_is_dai_link_bound(card, dai_link))
1933 continue;
1934
1935 ret = soc_init_dai_link(card, dai_link);
1936 if (ret)
1937 goto probe_dai_err;
1938 ret = soc_bind_dai_link(card, dai_link);
1939 if (ret)
1940 goto probe_dai_err;
1941 }
1942
1638 /* probe all DAI links on this card */ 1943 /* probe all DAI links on this card */
1639 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST; 1944 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1640 order++) { 1945 order++) {
1641 for (i = 0; i < card->num_links; i++) { 1946 list_for_each_entry(rtd, &card->rtd_list, list) {
1642 ret = soc_probe_link_dais(card, i, order); 1947 ret = soc_probe_link_dais(card, rtd, order);
1643 if (ret < 0) { 1948 if (ret < 0) {
1644 dev_err(card->dev, 1949 dev_err(card->dev,
1645 "ASoC: failed to instantiate card %d\n", 1950 "ASoC: failed to instantiate card %d\n",
@@ -1649,16 +1954,6 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
1649 } 1954 }
1650 } 1955 }
1651 1956
1652 for (i = 0; i < card->num_aux_devs; i++) {
1653 ret = soc_probe_aux_dev(card, i);
1654 if (ret < 0) {
1655 dev_err(card->dev,
1656 "ASoC: failed to add auxiliary devices %d\n",
1657 ret);
1658 goto probe_aux_dev_err;
1659 }
1660 }
1661
1662 snd_soc_dapm_link_dai_widgets(card); 1957 snd_soc_dapm_link_dai_widgets(card);
1663 snd_soc_dapm_connect_dai_link_widgets(card); 1958 snd_soc_dapm_connect_dai_link_widgets(card);
1664 1959
@@ -1718,8 +2013,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
1718 return 0; 2013 return 0;
1719 2014
1720probe_aux_dev_err: 2015probe_aux_dev_err:
1721 for (i = 0; i < card->num_aux_devs; i++) 2016 soc_remove_aux_devices(card);
1722 soc_remove_aux_dev(card, i);
1723 2017
1724probe_dai_err: 2018probe_dai_err:
1725 soc_remove_dai_links(card); 2019 soc_remove_dai_links(card);
@@ -1733,6 +2027,7 @@ card_probe_error:
1733 snd_card_free(card->snd_card); 2027 snd_card_free(card->snd_card);
1734 2028
1735base_error: 2029base_error:
2030 soc_remove_pcm_runtimes(card);
1736 mutex_unlock(&card->mutex); 2031 mutex_unlock(&card->mutex);
1737 mutex_unlock(&client_mutex); 2032 mutex_unlock(&client_mutex);
1738 2033
@@ -1763,20 +2058,18 @@ static int soc_probe(struct platform_device *pdev)
1763 2058
1764static int soc_cleanup_card_resources(struct snd_soc_card *card) 2059static int soc_cleanup_card_resources(struct snd_soc_card *card)
1765{ 2060{
1766 int i; 2061 struct snd_soc_pcm_runtime *rtd;
1767 2062
1768 /* make sure any delayed work runs */ 2063 /* make sure any delayed work runs */
1769 for (i = 0; i < card->num_rtd; i++) { 2064 list_for_each_entry(rtd, &card->rtd_list, list)
1770 struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
1771 flush_delayed_work(&rtd->delayed_work); 2065 flush_delayed_work(&rtd->delayed_work);
1772 }
1773
1774 /* remove auxiliary devices */
1775 for (i = 0; i < card->num_aux_devs; i++)
1776 soc_remove_aux_dev(card, i);
1777 2066
1778 /* remove and free each DAI */ 2067 /* remove and free each DAI */
1779 soc_remove_dai_links(card); 2068 soc_remove_dai_links(card);
2069 soc_remove_pcm_runtimes(card);
2070
2071 /* remove auxiliary devices */
2072 soc_remove_aux_devices(card);
1780 2073
1781 soc_cleanup_card_debugfs(card); 2074 soc_cleanup_card_debugfs(card);
1782 2075
@@ -1803,29 +2096,26 @@ static int soc_remove(struct platform_device *pdev)
1803int snd_soc_poweroff(struct device *dev) 2096int snd_soc_poweroff(struct device *dev)
1804{ 2097{
1805 struct snd_soc_card *card = dev_get_drvdata(dev); 2098 struct snd_soc_card *card = dev_get_drvdata(dev);
1806 int i; 2099 struct snd_soc_pcm_runtime *rtd;
1807 2100
1808 if (!card->instantiated) 2101 if (!card->instantiated)
1809 return 0; 2102 return 0;
1810 2103
1811 /* Flush out pmdown_time work - we actually do want to run it 2104 /* Flush out pmdown_time work - we actually do want to run it
1812 * now, we're shutting down so no imminent restart. */ 2105 * now, we're shutting down so no imminent restart. */
1813 for (i = 0; i < card->num_rtd; i++) { 2106 list_for_each_entry(rtd, &card->rtd_list, list)
1814 struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
1815 flush_delayed_work(&rtd->delayed_work); 2107 flush_delayed_work(&rtd->delayed_work);
1816 }
1817 2108
1818 snd_soc_dapm_shutdown(card); 2109 snd_soc_dapm_shutdown(card);
1819 2110
1820 /* deactivate pins to sleep state */ 2111 /* deactivate pins to sleep state */
1821 for (i = 0; i < card->num_rtd; i++) { 2112 list_for_each_entry(rtd, &card->rtd_list, list) {
1822 struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
1823 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 2113 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1824 int j; 2114 int i;
1825 2115
1826 pinctrl_pm_select_sleep_state(cpu_dai->dev); 2116 pinctrl_pm_select_sleep_state(cpu_dai->dev);
1827 for (j = 0; j < rtd->num_codecs; j++) { 2117 for (i = 0; i < rtd->num_codecs; i++) {
1828 struct snd_soc_dai *codec_dai = rtd->codec_dais[j]; 2118 struct snd_soc_dai *codec_dai = rtd->codec_dais[i];
1829 pinctrl_pm_select_sleep_state(codec_dai->dev); 2119 pinctrl_pm_select_sleep_state(codec_dai->dev);
1830 } 2120 }
1831 } 2121 }
@@ -2301,33 +2591,6 @@ int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
2301} 2591}
2302EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute); 2592EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute);
2303 2593
2304static int snd_soc_init_multicodec(struct snd_soc_card *card,
2305 struct snd_soc_dai_link *dai_link)
2306{
2307 /* Legacy codec/codec_dai link is a single entry in multicodec */
2308 if (dai_link->codec_name || dai_link->codec_of_node ||
2309 dai_link->codec_dai_name) {
2310 dai_link->num_codecs = 1;
2311
2312 dai_link->codecs = devm_kzalloc(card->dev,
2313 sizeof(struct snd_soc_dai_link_component),
2314 GFP_KERNEL);
2315 if (!dai_link->codecs)
2316 return -ENOMEM;
2317
2318 dai_link->codecs[0].name = dai_link->codec_name;
2319 dai_link->codecs[0].of_node = dai_link->codec_of_node;
2320 dai_link->codecs[0].dai_name = dai_link->codec_dai_name;
2321 }
2322
2323 if (!dai_link->codecs) {
2324 dev_err(card->dev, "ASoC: DAI link has no CODECs\n");
2325 return -EINVAL;
2326 }
2327
2328 return 0;
2329}
2330
2331/** 2594/**
2332 * snd_soc_register_card - Register a card with the ASoC core 2595 * snd_soc_register_card - Register a card with the ASoC core
2333 * 2596 *
@@ -2336,7 +2599,8 @@ static int snd_soc_init_multicodec(struct snd_soc_card *card,
2336 */ 2599 */
2337int snd_soc_register_card(struct snd_soc_card *card) 2600int snd_soc_register_card(struct snd_soc_card *card)
2338{ 2601{
2339 int i, j, ret; 2602 int i, ret;
2603 struct snd_soc_pcm_runtime *rtd;
2340 2604
2341 if (!card->name || !card->dev) 2605 if (!card->name || !card->dev)
2342 return -EINVAL; 2606 return -EINVAL;
@@ -2344,63 +2608,11 @@ int snd_soc_register_card(struct snd_soc_card *card)
2344 for (i = 0; i < card->num_links; i++) { 2608 for (i = 0; i < card->num_links; i++) {
2345 struct snd_soc_dai_link *link = &card->dai_link[i]; 2609 struct snd_soc_dai_link *link = &card->dai_link[i];
2346 2610
2347 ret = snd_soc_init_multicodec(card, link); 2611 ret = soc_init_dai_link(card, link);
2348 if (ret) { 2612 if (ret) {
2349 dev_err(card->dev, "ASoC: failed to init multicodec\n"); 2613 dev_err(card->dev, "ASoC: failed to init link %s\n",
2350 return ret;
2351 }
2352
2353 for (j = 0; j < link->num_codecs; j++) {
2354 /*
2355 * Codec must be specified by 1 of name or OF node,
2356 * not both or neither.
2357 */
2358 if (!!link->codecs[j].name ==
2359 !!link->codecs[j].of_node) {
2360 dev_err(card->dev, "ASoC: Neither/both codec name/of_node are set for %s\n",
2361 link->name);
2362 return -EINVAL;
2363 }
2364 /* Codec DAI name must be specified */
2365 if (!link->codecs[j].dai_name) {
2366 dev_err(card->dev, "ASoC: codec_dai_name not set for %s\n",
2367 link->name);
2368 return -EINVAL;
2369 }
2370 }
2371
2372 /*
2373 * Platform may be specified by either name or OF node, but
2374 * can be left unspecified, and a dummy platform will be used.
2375 */
2376 if (link->platform_name && link->platform_of_node) {
2377 dev_err(card->dev,
2378 "ASoC: Both platform name/of_node are set for %s\n",
2379 link->name); 2614 link->name);
2380 return -EINVAL; 2615 return ret;
2381 }
2382
2383 /*
2384 * CPU device may be specified by either name or OF node, but
2385 * can be left unspecified, and will be matched based on DAI
2386 * name alone..
2387 */
2388 if (link->cpu_name && link->cpu_of_node) {
2389 dev_err(card->dev,
2390 "ASoC: Neither/both cpu name/of_node are set for %s\n",
2391 link->name);
2392 return -EINVAL;
2393 }
2394 /*
2395 * At least one of CPU DAI name or CPU device name/node must be
2396 * specified
2397 */
2398 if (!link->cpu_dai_name &&
2399 !(link->cpu_name || link->cpu_of_node)) {
2400 dev_err(card->dev,
2401 "ASoC: Neither cpu_dai_name nor cpu_name/of_node are set for %s\n",
2402 link->name);
2403 return -EINVAL;
2404 } 2616 }
2405 } 2617 }
2406 2618
@@ -2408,28 +2620,11 @@ int snd_soc_register_card(struct snd_soc_card *card)
2408 2620
2409 snd_soc_initialize_card_lists(card); 2621 snd_soc_initialize_card_lists(card);
2410 2622
2411 card->rtd = devm_kzalloc(card->dev, 2623 INIT_LIST_HEAD(&card->dai_link_list);
2412 sizeof(struct snd_soc_pcm_runtime) * 2624 card->num_dai_links = 0;
2413 (card->num_links + card->num_aux_devs),
2414 GFP_KERNEL);
2415 if (card->rtd == NULL)
2416 return -ENOMEM;
2417 card->num_rtd = 0;
2418 card->rtd_aux = &card->rtd[card->num_links];
2419
2420 for (i = 0; i < card->num_links; i++) {
2421 card->rtd[i].card = card;
2422 card->rtd[i].dai_link = &card->dai_link[i];
2423 card->rtd[i].codec_dais = devm_kzalloc(card->dev,
2424 sizeof(struct snd_soc_dai *) *
2425 (card->rtd[i].dai_link->num_codecs),
2426 GFP_KERNEL);
2427 if (card->rtd[i].codec_dais == NULL)
2428 return -ENOMEM;
2429 }
2430 2625
2431 for (i = 0; i < card->num_aux_devs; i++) 2626 INIT_LIST_HEAD(&card->rtd_list);
2432 card->rtd_aux[i].card = card; 2627 card->num_rtd = 0;
2433 2628
2434 INIT_LIST_HEAD(&card->dapm_dirty); 2629 INIT_LIST_HEAD(&card->dapm_dirty);
2435 INIT_LIST_HEAD(&card->dobj_list); 2630 INIT_LIST_HEAD(&card->dobj_list);
@@ -2442,8 +2637,7 @@ int snd_soc_register_card(struct snd_soc_card *card)
2442 return ret; 2637 return ret;
2443 2638
2444 /* deactivate pins to sleep state */ 2639 /* deactivate pins to sleep state */
2445 for (i = 0; i < card->num_rtd; i++) { 2640 list_for_each_entry(rtd, &card->rtd_list, list) {
2446 struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
2447 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 2641 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2448 int j; 2642 int j;
2449 2643
@@ -2558,6 +2752,56 @@ static void snd_soc_unregister_dais(struct snd_soc_component *component)
2558 } 2752 }
2559} 2753}
2560 2754
2755/* Create a DAI and add it to the component's DAI list */
2756static struct snd_soc_dai *soc_add_dai(struct snd_soc_component *component,
2757 struct snd_soc_dai_driver *dai_drv,
2758 bool legacy_dai_naming)
2759{
2760 struct device *dev = component->dev;
2761 struct snd_soc_dai *dai;
2762
2763 dev_dbg(dev, "ASoC: dynamically register DAI %s\n", dev_name(dev));
2764
2765 dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL);
2766 if (dai == NULL)
2767 return NULL;
2768
2769 /*
2770 * Back in the old days when we still had component-less DAIs,
2771 * instead of having a static name, component-less DAIs would
2772 * inherit the name of the parent device so it is possible to
2773 * register multiple instances of the DAI. We still need to keep
2774 * the same naming style even though those DAIs are not
2775 * component-less anymore.
2776 */
2777 if (legacy_dai_naming &&
2778 (dai_drv->id == 0 || dai_drv->name == NULL)) {
2779 dai->name = fmt_single_name(dev, &dai->id);
2780 } else {
2781 dai->name = fmt_multiple_name(dev, dai_drv);
2782 if (dai_drv->id)
2783 dai->id = dai_drv->id;
2784 else
2785 dai->id = component->num_dai;
2786 }
2787 if (dai->name == NULL) {
2788 kfree(dai);
2789 return NULL;
2790 }
2791
2792 dai->component = component;
2793 dai->dev = dev;
2794 dai->driver = dai_drv;
2795 if (!dai->driver->ops)
2796 dai->driver->ops = &null_dai_ops;
2797
2798 list_add(&dai->list, &component->dai_list);
2799 component->num_dai++;
2800
2801 dev_dbg(dev, "ASoC: Registered DAI '%s'\n", dai->name);
2802 return dai;
2803}
2804
2561/** 2805/**
2562 * snd_soc_register_dais - Register a DAI with the ASoC core 2806 * snd_soc_register_dais - Register a DAI with the ASoC core
2563 * 2807 *
@@ -2579,58 +2823,66 @@ static int snd_soc_register_dais(struct snd_soc_component *component,
2579 dev_dbg(dev, "ASoC: dai register %s #%Zu\n", dev_name(dev), count); 2823 dev_dbg(dev, "ASoC: dai register %s #%Zu\n", dev_name(dev), count);
2580 2824
2581 component->dai_drv = dai_drv; 2825 component->dai_drv = dai_drv;
2582 component->num_dai = count;
2583 2826
2584 for (i = 0; i < count; i++) { 2827 for (i = 0; i < count; i++) {
2585 2828
2586 dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL); 2829 dai = soc_add_dai(component, dai_drv + i,
2830 count == 1 && legacy_dai_naming);
2587 if (dai == NULL) { 2831 if (dai == NULL) {
2588 ret = -ENOMEM; 2832 ret = -ENOMEM;
2589 goto err; 2833 goto err;
2590 } 2834 }
2835 }
2591 2836
2592 /* 2837 return 0;
2593 * Back in the old days when we still had component-less DAIs,
2594 * instead of having a static name, component-less DAIs would
2595 * inherit the name of the parent device so it is possible to
2596 * register multiple instances of the DAI. We still need to keep
2597 * the same naming style even though those DAIs are not
2598 * component-less anymore.
2599 */
2600 if (count == 1 && legacy_dai_naming &&
2601 (dai_drv[i].id == 0 || dai_drv[i].name == NULL)) {
2602 dai->name = fmt_single_name(dev, &dai->id);
2603 } else {
2604 dai->name = fmt_multiple_name(dev, &dai_drv[i]);
2605 if (dai_drv[i].id)
2606 dai->id = dai_drv[i].id;
2607 else
2608 dai->id = i;
2609 }
2610 if (dai->name == NULL) {
2611 kfree(dai);
2612 ret = -ENOMEM;
2613 goto err;
2614 }
2615 2838
2616 dai->component = component; 2839err:
2617 dai->dev = dev; 2840 snd_soc_unregister_dais(component);
2618 dai->driver = &dai_drv[i];
2619 if (!dai->driver->ops)
2620 dai->driver->ops = &null_dai_ops;
2621 2841
2622 list_add(&dai->list, &component->dai_list); 2842 return ret;
2843}
2844
2845/**
2846 * snd_soc_register_dai - Register a DAI dynamically & create its widgets
2847 *
2848 * @component: The component the DAIs are registered for
2849 * @dai_drv: DAI driver to use for the DAI
2850 *
2851 * Topology can use this API to register DAIs when probing a component.
2852 * These DAIs's widgets will be freed in the card cleanup and the DAIs
2853 * will be freed in the component cleanup.
2854 */
2855int snd_soc_register_dai(struct snd_soc_component *component,
2856 struct snd_soc_dai_driver *dai_drv)
2857{
2858 struct snd_soc_dapm_context *dapm =
2859 snd_soc_component_get_dapm(component);
2860 struct snd_soc_dai *dai;
2861 int ret;
2623 2862
2624 dev_dbg(dev, "ASoC: Registered DAI '%s'\n", dai->name); 2863 if (dai_drv->dobj.type != SND_SOC_DOBJ_PCM) {
2864 dev_err(component->dev, "Invalid dai type %d\n",
2865 dai_drv->dobj.type);
2866 return -EINVAL;
2625 } 2867 }
2626 2868
2627 return 0; 2869 lockdep_assert_held(&client_mutex);
2870 dai = soc_add_dai(component, dai_drv, false);
2871 if (!dai)
2872 return -ENOMEM;
2628 2873
2629err: 2874 /* Create the DAI widgets here. After adding DAIs, topology may
2630 snd_soc_unregister_dais(component); 2875 * also add routes that need these widgets as source or sink.
2876 */
2877 ret = snd_soc_dapm_new_dai_widgets(dapm, dai);
2878 if (ret != 0) {
2879 dev_err(component->dev,
2880 "Failed to create DAI widgets %d\n", ret);
2881 }
2631 2882
2632 return ret; 2883 return ret;
2633} 2884}
2885EXPORT_SYMBOL_GPL(snd_soc_register_dai);
2634 2886
2635static void snd_soc_component_seq_notifier(struct snd_soc_dapm_context *dapm, 2887static void snd_soc_component_seq_notifier(struct snd_soc_dapm_context *dapm,
2636 enum snd_soc_dapm_type type, int subseq) 2888 enum snd_soc_dapm_type type, int subseq)
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 7d009428934a..5a2812fa8946 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -1300,7 +1300,7 @@ static int dapm_supply_check_power(struct snd_soc_dapm_widget *w)
1300 1300
1301static int dapm_always_on_check_power(struct snd_soc_dapm_widget *w) 1301static int dapm_always_on_check_power(struct snd_soc_dapm_widget *w)
1302{ 1302{
1303 return 1; 1303 return w->connected;
1304} 1304}
1305 1305
1306static int dapm_seq_compare(struct snd_soc_dapm_widget *a, 1306static int dapm_seq_compare(struct snd_soc_dapm_widget *a,
@@ -3358,6 +3358,11 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
3358 w->is_ep = SND_SOC_DAPM_EP_SOURCE; 3358 w->is_ep = SND_SOC_DAPM_EP_SOURCE;
3359 w->power_check = dapm_always_on_check_power; 3359 w->power_check = dapm_always_on_check_power;
3360 break; 3360 break;
3361 case snd_soc_dapm_sink:
3362 w->is_ep = SND_SOC_DAPM_EP_SINK;
3363 w->power_check = dapm_always_on_check_power;
3364 break;
3365
3361 case snd_soc_dapm_mux: 3366 case snd_soc_dapm_mux:
3362 case snd_soc_dapm_demux: 3367 case snd_soc_dapm_demux:
3363 case snd_soc_dapm_switch: 3368 case snd_soc_dapm_switch:
@@ -3900,13 +3905,10 @@ static void soc_dapm_dai_stream_event(struct snd_soc_dai *dai, int stream,
3900 3905
3901void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card) 3906void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
3902{ 3907{
3903 struct snd_soc_pcm_runtime *rtd = card->rtd; 3908 struct snd_soc_pcm_runtime *rtd;
3904 int i;
3905 3909
3906 /* for each BE DAI link... */ 3910 /* for each BE DAI link... */
3907 for (i = 0; i < card->num_rtd; i++) { 3911 list_for_each_entry(rtd, &card->rtd_list, list) {
3908 rtd = &card->rtd[i];
3909
3910 /* 3912 /*
3911 * dynamic FE links have no fixed DAI mapping. 3913 * dynamic FE links have no fixed DAI mapping.
3912 * CODEC<->CODEC links have no direct connection. 3914 * CODEC<->CODEC links have no direct connection.
diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c
index 2f67ba6d7a8f..a513a34a51d2 100644
--- a/sound/soc/soc-ops.c
+++ b/sound/soc/soc-ops.c
@@ -779,11 +779,11 @@ int snd_soc_bytes_tlv_callback(struct snd_kcontrol *kcontrol, int op_flag,
779 switch (op_flag) { 779 switch (op_flag) {
780 case SNDRV_CTL_TLV_OP_READ: 780 case SNDRV_CTL_TLV_OP_READ:
781 if (params->get) 781 if (params->get)
782 ret = params->get(tlv, count); 782 ret = params->get(kcontrol, tlv, count);
783 break; 783 break;
784 case SNDRV_CTL_TLV_OP_WRITE: 784 case SNDRV_CTL_TLV_OP_WRITE:
785 if (params->put) 785 if (params->put)
786 ret = params->put(tlv, count); 786 ret = params->put(kcontrol, tlv, count);
787 break; 787 break;
788 } 788 }
789 return ret; 789 return ret;
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index c86dc96e8986..e898b427be7e 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -599,10 +599,15 @@ platform_err:
599out: 599out:
600 mutex_unlock(&rtd->pcm_mutex); 600 mutex_unlock(&rtd->pcm_mutex);
601 601
602 pm_runtime_put(platform->dev); 602 pm_runtime_mark_last_busy(platform->dev);
603 for (i = 0; i < rtd->num_codecs; i++) 603 pm_runtime_put_autosuspend(platform->dev);
604 pm_runtime_put(rtd->codec_dais[i]->dev); 604 for (i = 0; i < rtd->num_codecs; i++) {
605 pm_runtime_put(cpu_dai->dev); 605 pm_runtime_mark_last_busy(rtd->codec_dais[i]->dev);
606 pm_runtime_put_autosuspend(rtd->codec_dais[i]->dev);
607 }
608
609 pm_runtime_mark_last_busy(cpu_dai->dev);
610 pm_runtime_put_autosuspend(cpu_dai->dev);
606 for (i = 0; i < rtd->num_codecs; i++) { 611 for (i = 0; i < rtd->num_codecs; i++) {
607 if (!rtd->codec_dais[i]->active) 612 if (!rtd->codec_dais[i]->active)
608 pinctrl_pm_select_sleep_state(rtd->codec_dais[i]->dev); 613 pinctrl_pm_select_sleep_state(rtd->codec_dais[i]->dev);
@@ -706,10 +711,17 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
706 711
707 mutex_unlock(&rtd->pcm_mutex); 712 mutex_unlock(&rtd->pcm_mutex);
708 713
709 pm_runtime_put(platform->dev); 714 pm_runtime_mark_last_busy(platform->dev);
710 for (i = 0; i < rtd->num_codecs; i++) 715 pm_runtime_put_autosuspend(platform->dev);
711 pm_runtime_put(rtd->codec_dais[i]->dev); 716
712 pm_runtime_put(cpu_dai->dev); 717 for (i = 0; i < rtd->num_codecs; i++) {
718 pm_runtime_mark_last_busy(rtd->codec_dais[i]->dev);
719 pm_runtime_put_autosuspend(rtd->codec_dais[i]->dev);
720 }
721
722 pm_runtime_mark_last_busy(cpu_dai->dev);
723 pm_runtime_put_autosuspend(cpu_dai->dev);
724
713 for (i = 0; i < rtd->num_codecs; i++) { 725 for (i = 0; i < rtd->num_codecs; i++) {
714 if (!rtd->codec_dais[i]->active) 726 if (!rtd->codec_dais[i]->active)
715 pinctrl_pm_select_sleep_state(rtd->codec_dais[i]->dev); 727 pinctrl_pm_select_sleep_state(rtd->codec_dais[i]->dev);
@@ -1213,11 +1225,10 @@ static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,
1213 struct snd_soc_dapm_widget *widget, int stream) 1225 struct snd_soc_dapm_widget *widget, int stream)
1214{ 1226{
1215 struct snd_soc_pcm_runtime *be; 1227 struct snd_soc_pcm_runtime *be;
1216 int i, j; 1228 int i;
1217 1229
1218 if (stream == SNDRV_PCM_STREAM_PLAYBACK) { 1230 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
1219 for (i = 0; i < card->num_links; i++) { 1231 list_for_each_entry(be, &card->rtd_list, list) {
1220 be = &card->rtd[i];
1221 1232
1222 if (!be->dai_link->no_pcm) 1233 if (!be->dai_link->no_pcm)
1223 continue; 1234 continue;
@@ -1225,16 +1236,15 @@ static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,
1225 if (be->cpu_dai->playback_widget == widget) 1236 if (be->cpu_dai->playback_widget == widget)
1226 return be; 1237 return be;
1227 1238
1228 for (j = 0; j < be->num_codecs; j++) { 1239 for (i = 0; i < be->num_codecs; i++) {
1229 struct snd_soc_dai *dai = be->codec_dais[j]; 1240 struct snd_soc_dai *dai = be->codec_dais[i];
1230 if (dai->playback_widget == widget) 1241 if (dai->playback_widget == widget)
1231 return be; 1242 return be;
1232 } 1243 }
1233 } 1244 }
1234 } else { 1245 } else {
1235 1246
1236 for (i = 0; i < card->num_links; i++) { 1247 list_for_each_entry(be, &card->rtd_list, list) {
1237 be = &card->rtd[i];
1238 1248
1239 if (!be->dai_link->no_pcm) 1249 if (!be->dai_link->no_pcm)
1240 continue; 1250 continue;
@@ -1242,8 +1252,8 @@ static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,
1242 if (be->cpu_dai->capture_widget == widget) 1252 if (be->cpu_dai->capture_widget == widget)
1243 return be; 1253 return be;
1244 1254
1245 for (j = 0; j < be->num_codecs; j++) { 1255 for (i = 0; i < be->num_codecs; i++) {
1246 struct snd_soc_dai *dai = be->codec_dais[j]; 1256 struct snd_soc_dai *dai = be->codec_dais[i];
1247 if (dai->capture_widget == widget) 1257 if (dai->capture_widget == widget)
1248 return be; 1258 return be;
1249 } 1259 }
@@ -1616,6 +1626,56 @@ static void dpcm_set_fe_update_state(struct snd_soc_pcm_runtime *fe,
1616 snd_pcm_stream_unlock_irq(substream); 1626 snd_pcm_stream_unlock_irq(substream);
1617} 1627}
1618 1628
1629static int dpcm_apply_symmetry(struct snd_pcm_substream *fe_substream,
1630 int stream)
1631{
1632 struct snd_soc_dpcm *dpcm;
1633 struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
1634 struct snd_soc_dai *fe_cpu_dai = fe->cpu_dai;
1635 int err;
1636
1637 /* apply symmetry for FE */
1638 if (soc_pcm_has_symmetry(fe_substream))
1639 fe_substream->runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX;
1640
1641 /* Symmetry only applies if we've got an active stream. */
1642 if (fe_cpu_dai->active) {
1643 err = soc_pcm_apply_symmetry(fe_substream, fe_cpu_dai);
1644 if (err < 0)
1645 return err;
1646 }
1647
1648 /* apply symmetry for BE */
1649 list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
1650 struct snd_soc_pcm_runtime *be = dpcm->be;
1651 struct snd_pcm_substream *be_substream =
1652 snd_soc_dpcm_get_substream(be, stream);
1653 struct snd_soc_pcm_runtime *rtd = be_substream->private_data;
1654 int i;
1655
1656 if (soc_pcm_has_symmetry(be_substream))
1657 be_substream->runtime->hw.info |= SNDRV_PCM_INFO_JOINT_DUPLEX;
1658
1659 /* Symmetry only applies if we've got an active stream. */
1660 if (rtd->cpu_dai->active) {
1661 err = soc_pcm_apply_symmetry(be_substream, rtd->cpu_dai);
1662 if (err < 0)
1663 return err;
1664 }
1665
1666 for (i = 0; i < rtd->num_codecs; i++) {
1667 if (rtd->codec_dais[i]->active) {
1668 err = soc_pcm_apply_symmetry(be_substream,
1669 rtd->codec_dais[i]);
1670 if (err < 0)
1671 return err;
1672 }
1673 }
1674 }
1675
1676 return 0;
1677}
1678
1619static int dpcm_fe_dai_startup(struct snd_pcm_substream *fe_substream) 1679static int dpcm_fe_dai_startup(struct snd_pcm_substream *fe_substream)
1620{ 1680{
1621 struct snd_soc_pcm_runtime *fe = fe_substream->private_data; 1681 struct snd_soc_pcm_runtime *fe = fe_substream->private_data;
@@ -1644,6 +1704,13 @@ static int dpcm_fe_dai_startup(struct snd_pcm_substream *fe_substream)
1644 dpcm_set_fe_runtime(fe_substream); 1704 dpcm_set_fe_runtime(fe_substream);
1645 snd_pcm_limit_hw_rates(runtime); 1705 snd_pcm_limit_hw_rates(runtime);
1646 1706
1707 ret = dpcm_apply_symmetry(fe_substream, stream);
1708 if (ret < 0) {
1709 dev_err(fe->dev, "ASoC: failed to apply dpcm symmetry %d\n",
1710 ret);
1711 goto unwind;
1712 }
1713
1647 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO); 1714 dpcm_set_fe_update_state(fe, stream, SND_SOC_DPCM_UPDATE_NO);
1648 return 0; 1715 return 0;
1649 1716
@@ -2115,7 +2182,8 @@ int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream)
2115 continue; 2182 continue;
2116 2183
2117 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) && 2184 if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
2118 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP)) 2185 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
2186 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
2119 continue; 2187 continue;
2120 2188
2121 dev_dbg(be->dev, "ASoC: prepare BE %s\n", 2189 dev_dbg(be->dev, "ASoC: prepare BE %s\n",
@@ -2343,12 +2411,12 @@ static int dpcm_run_old_update(struct snd_soc_pcm_runtime *fe, int stream)
2343 */ 2411 */
2344int soc_dpcm_runtime_update(struct snd_soc_card *card) 2412int soc_dpcm_runtime_update(struct snd_soc_card *card)
2345{ 2413{
2346 int i, old, new, paths; 2414 struct snd_soc_pcm_runtime *fe;
2415 int old, new, paths;
2347 2416
2348 mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_RUNTIME); 2417 mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
2349 for (i = 0; i < card->num_rtd; i++) { 2418 list_for_each_entry(fe, &card->rtd_list, list) {
2350 struct snd_soc_dapm_widget_list *list; 2419 struct snd_soc_dapm_widget_list *list;
2351 struct snd_soc_pcm_runtime *fe = &card->rtd[i];
2352 2420
2353 /* make sure link is FE */ 2421 /* make sure link is FE */
2354 if (!fe->dai_link->dynamic) 2422 if (!fe->dai_link->dynamic)
diff --git a/sound/soc/sti/uniperif_player.c b/sound/soc/sti/uniperif_player.c
index 5c2bc53f0a9b..7aca6b92f718 100644
--- a/sound/soc/sti/uniperif_player.c
+++ b/sound/soc/sti/uniperif_player.c
@@ -251,8 +251,7 @@ static void uni_player_set_channel_status(struct uniperif *player,
251 * set one. 251 * set one.
252 */ 252 */
253 mutex_lock(&player->ctrl_lock); 253 mutex_lock(&player->ctrl_lock);
254 if (runtime && (player->stream_settings.iec958.status[3] 254 if (runtime) {
255 == IEC958_AES3_CON_FS_NOTID)) {
256 switch (runtime->rate) { 255 switch (runtime->rate) {
257 case 22050: 256 case 22050:
258 player->stream_settings.iec958.status[3] = 257 player->stream_settings.iec958.status[3] =
diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c
index 1bb896d78d09..44f170c73b06 100644
--- a/sound/soc/sunxi/sun4i-codec.c
+++ b/sound/soc/sunxi/sun4i-codec.c
@@ -28,6 +28,7 @@
28#include <linux/of_address.h> 28#include <linux/of_address.h>
29#include <linux/clk.h> 29#include <linux/clk.h>
30#include <linux/regmap.h> 30#include <linux/regmap.h>
31#include <linux/gpio/consumer.h>
31 32
32#include <sound/core.h> 33#include <sound/core.h>
33#include <sound/pcm.h> 34#include <sound/pcm.h>
@@ -70,6 +71,7 @@
70 71
71/* Codec ADC register offsets and bit fields */ 72/* Codec ADC register offsets and bit fields */
72#define SUN4I_CODEC_ADC_FIFOC (0x1c) 73#define SUN4I_CODEC_ADC_FIFOC (0x1c)
74#define SUN4I_CODEC_ADC_FIFOC_ADC_FS (29)
73#define SUN4I_CODEC_ADC_FIFOC_EN_AD (28) 75#define SUN4I_CODEC_ADC_FIFOC_EN_AD (28)
74#define SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE (24) 76#define SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE (24)
75#define SUN4I_CODEC_ADC_FIFOC_RX_TRIG_LEVEL (8) 77#define SUN4I_CODEC_ADC_FIFOC_RX_TRIG_LEVEL (8)
@@ -102,17 +104,14 @@ struct sun4i_codec {
102 struct regmap *regmap; 104 struct regmap *regmap;
103 struct clk *clk_apb; 105 struct clk *clk_apb;
104 struct clk *clk_module; 106 struct clk *clk_module;
107 struct gpio_desc *gpio_pa;
105 108
109 struct snd_dmaengine_dai_dma_data capture_dma_data;
106 struct snd_dmaengine_dai_dma_data playback_dma_data; 110 struct snd_dmaengine_dai_dma_data playback_dma_data;
107}; 111};
108 112
109static void sun4i_codec_start_playback(struct sun4i_codec *scodec) 113static void sun4i_codec_start_playback(struct sun4i_codec *scodec)
110{ 114{
111 /*
112 * FIXME: according to the BSP, we might need to drive a PA
113 * GPIO high here on some boards
114 */
115
116 /* Flush TX FIFO */ 115 /* Flush TX FIFO */
117 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, 116 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC,
118 BIT(SUN4I_CODEC_DAC_FIFOC_FIFO_FLUSH), 117 BIT(SUN4I_CODEC_DAC_FIFOC_FIFO_FLUSH),
@@ -126,37 +125,50 @@ static void sun4i_codec_start_playback(struct sun4i_codec *scodec)
126 125
127static void sun4i_codec_stop_playback(struct sun4i_codec *scodec) 126static void sun4i_codec_stop_playback(struct sun4i_codec *scodec)
128{ 127{
129 /*
130 * FIXME: according to the BSP, we might need to drive a PA
131 * GPIO low here on some boards
132 */
133
134 /* Disable DAC DRQ */ 128 /* Disable DAC DRQ */
135 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, 129 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC,
136 BIT(SUN4I_CODEC_DAC_FIFOC_DAC_DRQ_EN), 130 BIT(SUN4I_CODEC_DAC_FIFOC_DAC_DRQ_EN),
137 0); 131 0);
138} 132}
139 133
134static void sun4i_codec_start_capture(struct sun4i_codec *scodec)
135{
136 /* Enable ADC DRQ */
137 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC,
138 BIT(SUN4I_CODEC_ADC_FIFOC_ADC_DRQ_EN),
139 BIT(SUN4I_CODEC_ADC_FIFOC_ADC_DRQ_EN));
140}
141
142static void sun4i_codec_stop_capture(struct sun4i_codec *scodec)
143{
144 /* Disable ADC DRQ */
145 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC,
146 BIT(SUN4I_CODEC_ADC_FIFOC_ADC_DRQ_EN), 0);
147}
148
140static int sun4i_codec_trigger(struct snd_pcm_substream *substream, int cmd, 149static int sun4i_codec_trigger(struct snd_pcm_substream *substream, int cmd,
141 struct snd_soc_dai *dai) 150 struct snd_soc_dai *dai)
142{ 151{
143 struct snd_soc_pcm_runtime *rtd = substream->private_data; 152 struct snd_soc_pcm_runtime *rtd = substream->private_data;
144 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); 153 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card);
145 154
146 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
147 return -ENOTSUPP;
148
149 switch (cmd) { 155 switch (cmd) {
150 case SNDRV_PCM_TRIGGER_START: 156 case SNDRV_PCM_TRIGGER_START:
151 case SNDRV_PCM_TRIGGER_RESUME: 157 case SNDRV_PCM_TRIGGER_RESUME:
152 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 158 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
153 sun4i_codec_start_playback(scodec); 159 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
160 sun4i_codec_start_playback(scodec);
161 else
162 sun4i_codec_start_capture(scodec);
154 break; 163 break;
155 164
156 case SNDRV_PCM_TRIGGER_STOP: 165 case SNDRV_PCM_TRIGGER_STOP:
157 case SNDRV_PCM_TRIGGER_SUSPEND: 166 case SNDRV_PCM_TRIGGER_SUSPEND:
158 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 167 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
159 sun4i_codec_stop_playback(scodec); 168 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
169 sun4i_codec_stop_playback(scodec);
170 else
171 sun4i_codec_stop_capture(scodec);
160 break; 172 break;
161 173
162 default: 174 default:
@@ -166,15 +178,54 @@ static int sun4i_codec_trigger(struct snd_pcm_substream *substream, int cmd,
166 return 0; 178 return 0;
167} 179}
168 180
169static int sun4i_codec_prepare(struct snd_pcm_substream *substream, 181static int sun4i_codec_prepare_capture(struct snd_pcm_substream *substream,
170 struct snd_soc_dai *dai) 182 struct snd_soc_dai *dai)
171{ 183{
172 struct snd_soc_pcm_runtime *rtd = substream->private_data; 184 struct snd_soc_pcm_runtime *rtd = substream->private_data;
173 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); 185 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card);
174 u32 val;
175 186
176 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) 187
177 return -ENOTSUPP; 188 /* Flush RX FIFO */
189 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC,
190 BIT(SUN4I_CODEC_ADC_FIFOC_FIFO_FLUSH),
191 BIT(SUN4I_CODEC_ADC_FIFOC_FIFO_FLUSH));
192
193
194 /* Set RX FIFO trigger level */
195 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC,
196 0xf << SUN4I_CODEC_ADC_FIFOC_RX_TRIG_LEVEL,
197 0x7 << SUN4I_CODEC_ADC_FIFOC_RX_TRIG_LEVEL);
198
199 /*
200 * FIXME: Undocumented in the datasheet, but
201 * Allwinner's code mentions that it is related
202 * related to microphone gain
203 */
204 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_ACTL,
205 0x3 << 25,
206 0x1 << 25);
207
208 if (of_device_is_compatible(scodec->dev->of_node,
209 "allwinner,sun7i-a20-codec"))
210 /* FIXME: Undocumented bits */
211 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_TUNE,
212 0x3 << 8,
213 0x1 << 8);
214
215 /* Fill most significant bits with valid data MSB */
216 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC,
217 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE),
218 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE));
219
220 return 0;
221}
222
223static int sun4i_codec_prepare_playback(struct snd_pcm_substream *substream,
224 struct snd_soc_dai *dai)
225{
226 struct snd_soc_pcm_runtime *rtd = substream->private_data;
227 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card);
228 u32 val;
178 229
179 /* Flush the TX FIFO */ 230 /* Flush the TX FIFO */
180 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, 231 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC,
@@ -203,6 +254,15 @@ static int sun4i_codec_prepare(struct snd_pcm_substream *substream,
203 0); 254 0);
204 255
205 return 0; 256 return 0;
257};
258
259static int sun4i_codec_prepare(struct snd_pcm_substream *substream,
260 struct snd_soc_dai *dai)
261{
262 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
263 return sun4i_codec_prepare_playback(substream, dai);
264
265 return sun4i_codec_prepare_capture(substream, dai);
206} 266}
207 267
208static unsigned long sun4i_codec_get_mod_freq(struct snd_pcm_hw_params *params) 268static unsigned long sun4i_codec_get_mod_freq(struct snd_pcm_hw_params *params)
@@ -277,30 +337,32 @@ static int sun4i_codec_get_hw_rate(struct snd_pcm_hw_params *params)
277 } 337 }
278} 338}
279 339
280static int sun4i_codec_hw_params(struct snd_pcm_substream *substream, 340static int sun4i_codec_hw_params_capture(struct sun4i_codec *scodec,
281 struct snd_pcm_hw_params *params, 341 struct snd_pcm_hw_params *params,
282 struct snd_soc_dai *dai) 342 unsigned int hwrate)
283{ 343{
284 struct snd_soc_pcm_runtime *rtd = substream->private_data; 344 /* Set ADC sample rate */
285 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); 345 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC,
286 unsigned long clk_freq; 346 7 << SUN4I_CODEC_ADC_FIFOC_ADC_FS,
287 int ret, hwrate; 347 hwrate << SUN4I_CODEC_ADC_FIFOC_ADC_FS);
288 u32 val;
289
290 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
291 return -ENOTSUPP;
292 348
293 clk_freq = sun4i_codec_get_mod_freq(params); 349 /* Set the number of channels we want to use */
294 if (!clk_freq) 350 if (params_channels(params) == 1)
295 return -EINVAL; 351 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC,
352 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN),
353 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN));
354 else
355 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC,
356 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN), 0);
296 357
297 ret = clk_set_rate(scodec->clk_module, clk_freq); 358 return 0;
298 if (ret) 359}
299 return ret;
300 360
301 hwrate = sun4i_codec_get_hw_rate(params); 361static int sun4i_codec_hw_params_playback(struct sun4i_codec *scodec,
302 if (hwrate < 0) 362 struct snd_pcm_hw_params *params,
303 return hwrate; 363 unsigned int hwrate)
364{
365 u32 val;
304 366
305 /* Set DAC sample rate */ 367 /* Set DAC sample rate */
306 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, 368 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC,
@@ -345,6 +407,35 @@ static int sun4i_codec_hw_params(struct snd_pcm_substream *substream,
345 return 0; 407 return 0;
346} 408}
347 409
410static int sun4i_codec_hw_params(struct snd_pcm_substream *substream,
411 struct snd_pcm_hw_params *params,
412 struct snd_soc_dai *dai)
413{
414 struct snd_soc_pcm_runtime *rtd = substream->private_data;
415 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card);
416 unsigned long clk_freq;
417 int ret, hwrate;
418
419 clk_freq = sun4i_codec_get_mod_freq(params);
420 if (!clk_freq)
421 return -EINVAL;
422
423 ret = clk_set_rate(scodec->clk_module, clk_freq);
424 if (ret)
425 return ret;
426
427 hwrate = sun4i_codec_get_hw_rate(params);
428 if (hwrate < 0)
429 return hwrate;
430
431 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
432 return sun4i_codec_hw_params_playback(scodec, params,
433 hwrate);
434
435 return sun4i_codec_hw_params_capture(scodec, params,
436 hwrate);
437}
438
348static int sun4i_codec_startup(struct snd_pcm_substream *substream, 439static int sun4i_codec_startup(struct snd_pcm_substream *substream,
349 struct snd_soc_dai *dai) 440 struct snd_soc_dai *dai)
350{ 441{
@@ -395,6 +486,20 @@ static struct snd_soc_dai_driver sun4i_codec_dai = {
395 SNDRV_PCM_FMTBIT_S32_LE, 486 SNDRV_PCM_FMTBIT_S32_LE,
396 .sig_bits = 24, 487 .sig_bits = 24,
397 }, 488 },
489 .capture = {
490 .stream_name = "Codec Capture",
491 .channels_min = 1,
492 .channels_max = 2,
493 .rate_min = 8000,
494 .rate_max = 192000,
495 .rates = SNDRV_PCM_RATE_8000_48000 |
496 SNDRV_PCM_RATE_96000 |
497 SNDRV_PCM_RATE_192000 |
498 SNDRV_PCM_RATE_KNOT,
499 .formats = SNDRV_PCM_FMTBIT_S16_LE |
500 SNDRV_PCM_FMTBIT_S32_LE,
501 .sig_bits = 24,
502 },
398}; 503};
399 504
400/*** Codec ***/ 505/*** Codec ***/
@@ -429,12 +534,23 @@ static const struct snd_kcontrol_new sun4i_codec_pa_mixer_controls[] = {
429 SUN4I_CODEC_DAC_ACTL_MIXPAS, 1, 0), 534 SUN4I_CODEC_DAC_ACTL_MIXPAS, 1, 0),
430}; 535};
431 536
432static const struct snd_soc_dapm_widget sun4i_codec_dapm_widgets[] = { 537static const struct snd_soc_dapm_widget sun4i_codec_codec_dapm_widgets[] = {
538 /* Digital parts of the ADCs */
539 SND_SOC_DAPM_SUPPLY("ADC", SUN4I_CODEC_ADC_FIFOC,
540 SUN4I_CODEC_ADC_FIFOC_EN_AD, 0,
541 NULL, 0),
542
433 /* Digital parts of the DACs */ 543 /* Digital parts of the DACs */
434 SND_SOC_DAPM_SUPPLY("DAC", SUN4I_CODEC_DAC_DPC, 544 SND_SOC_DAPM_SUPPLY("DAC", SUN4I_CODEC_DAC_DPC,
435 SUN4I_CODEC_DAC_DPC_EN_DA, 0, 545 SUN4I_CODEC_DAC_DPC_EN_DA, 0,
436 NULL, 0), 546 NULL, 0),
437 547
548 /* Analog parts of the ADCs */
549 SND_SOC_DAPM_ADC("Left ADC", "Codec Capture", SUN4I_CODEC_ADC_ACTL,
550 SUN4I_CODEC_ADC_ACTL_ADC_L_EN, 0),
551 SND_SOC_DAPM_ADC("Right ADC", "Codec Capture", SUN4I_CODEC_ADC_ACTL,
552 SUN4I_CODEC_ADC_ACTL_ADC_R_EN, 0),
553
438 /* Analog parts of the DACs */ 554 /* Analog parts of the DACs */
439 SND_SOC_DAPM_DAC("Left DAC", "Codec Playback", SUN4I_CODEC_DAC_ACTL, 555 SND_SOC_DAPM_DAC("Left DAC", "Codec Playback", SUN4I_CODEC_DAC_ACTL,
440 SUN4I_CODEC_DAC_ACTL_DACAENL, 0), 556 SUN4I_CODEC_DAC_ACTL_DACAENL, 0),
@@ -453,6 +569,14 @@ static const struct snd_soc_dapm_widget sun4i_codec_dapm_widgets[] = {
453 SND_SOC_DAPM_SUPPLY("Mixer Enable", SUN4I_CODEC_DAC_ACTL, 569 SND_SOC_DAPM_SUPPLY("Mixer Enable", SUN4I_CODEC_DAC_ACTL,
454 SUN4I_CODEC_DAC_ACTL_MIXEN, 0, NULL, 0), 570 SUN4I_CODEC_DAC_ACTL_MIXEN, 0, NULL, 0),
455 571
572 /* VMIC */
573 SND_SOC_DAPM_SUPPLY("VMIC", SUN4I_CODEC_ADC_ACTL,
574 SUN4I_CODEC_ADC_ACTL_VMICEN, 0, NULL, 0),
575
576 /* Mic Pre-Amplifiers */
577 SND_SOC_DAPM_PGA("MIC1 Pre-Amplifier", SUN4I_CODEC_ADC_ACTL,
578 SUN4I_CODEC_ADC_ACTL_PREG1EN, 0, NULL, 0),
579
456 /* Power Amplifier */ 580 /* Power Amplifier */
457 SND_SOC_DAPM_MIXER("Power Amplifier", SUN4I_CODEC_ADC_ACTL, 581 SND_SOC_DAPM_MIXER("Power Amplifier", SUN4I_CODEC_ADC_ACTL,
458 SUN4I_CODEC_ADC_ACTL_PA_EN, 0, 582 SUN4I_CODEC_ADC_ACTL_PA_EN, 0,
@@ -461,15 +585,19 @@ static const struct snd_soc_dapm_widget sun4i_codec_dapm_widgets[] = {
461 SND_SOC_DAPM_SWITCH("Power Amplifier Mute", SND_SOC_NOPM, 0, 0, 585 SND_SOC_DAPM_SWITCH("Power Amplifier Mute", SND_SOC_NOPM, 0, 0,
462 &sun4i_codec_pa_mute), 586 &sun4i_codec_pa_mute),
463 587
588 SND_SOC_DAPM_INPUT("Mic1"),
589
464 SND_SOC_DAPM_OUTPUT("HP Right"), 590 SND_SOC_DAPM_OUTPUT("HP Right"),
465 SND_SOC_DAPM_OUTPUT("HP Left"), 591 SND_SOC_DAPM_OUTPUT("HP Left"),
466}; 592};
467 593
468static const struct snd_soc_dapm_route sun4i_codec_dapm_routes[] = { 594static const struct snd_soc_dapm_route sun4i_codec_codec_dapm_routes[] = {
469 /* Left DAC Routes */ 595 /* Left ADC / DAC Routes */
596 { "Left ADC", NULL, "ADC" },
470 { "Left DAC", NULL, "DAC" }, 597 { "Left DAC", NULL, "DAC" },
471 598
472 /* Right DAC Routes */ 599 /* Right ADC / DAC Routes */
600 { "Right ADC", NULL, "ADC" },
473 { "Right DAC", NULL, "DAC" }, 601 { "Right DAC", NULL, "DAC" },
474 602
475 /* Right Mixer Routes */ 603 /* Right Mixer Routes */
@@ -491,15 +619,21 @@ static const struct snd_soc_dapm_route sun4i_codec_dapm_routes[] = {
491 { "Power Amplifier Mute", "Switch", "Power Amplifier" }, 619 { "Power Amplifier Mute", "Switch", "Power Amplifier" },
492 { "HP Right", NULL, "Power Amplifier Mute" }, 620 { "HP Right", NULL, "Power Amplifier Mute" },
493 { "HP Left", NULL, "Power Amplifier Mute" }, 621 { "HP Left", NULL, "Power Amplifier Mute" },
622
623 /* Mic1 Routes */
624 { "Left ADC", NULL, "MIC1 Pre-Amplifier" },
625 { "Right ADC", NULL, "MIC1 Pre-Amplifier" },
626 { "MIC1 Pre-Amplifier", NULL, "Mic1"},
627 { "Mic1", NULL, "VMIC" },
494}; 628};
495 629
496static struct snd_soc_codec_driver sun4i_codec_codec = { 630static struct snd_soc_codec_driver sun4i_codec_codec = {
497 .controls = sun4i_codec_widgets, 631 .controls = sun4i_codec_widgets,
498 .num_controls = ARRAY_SIZE(sun4i_codec_widgets), 632 .num_controls = ARRAY_SIZE(sun4i_codec_widgets),
499 .dapm_widgets = sun4i_codec_dapm_widgets, 633 .dapm_widgets = sun4i_codec_codec_dapm_widgets,
500 .num_dapm_widgets = ARRAY_SIZE(sun4i_codec_dapm_widgets), 634 .num_dapm_widgets = ARRAY_SIZE(sun4i_codec_codec_dapm_widgets),
501 .dapm_routes = sun4i_codec_dapm_routes, 635 .dapm_routes = sun4i_codec_codec_dapm_routes,
502 .num_dapm_routes = ARRAY_SIZE(sun4i_codec_dapm_routes), 636 .num_dapm_routes = ARRAY_SIZE(sun4i_codec_codec_dapm_routes),
503}; 637};
504 638
505static const struct snd_soc_component_driver sun4i_codec_component = { 639static const struct snd_soc_component_driver sun4i_codec_component = {
@@ -516,7 +650,7 @@ static int sun4i_codec_dai_probe(struct snd_soc_dai *dai)
516 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(card); 650 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(card);
517 651
518 snd_soc_dai_init_dma_data(dai, &scodec->playback_dma_data, 652 snd_soc_dai_init_dma_data(dai, &scodec->playback_dma_data,
519 NULL); 653 &scodec->capture_dma_data);
520 654
521 return 0; 655 return 0;
522} 656}
@@ -532,6 +666,14 @@ static struct snd_soc_dai_driver dummy_cpu_dai = {
532 .formats = SUN4I_CODEC_FORMATS, 666 .formats = SUN4I_CODEC_FORMATS,
533 .sig_bits = 24, 667 .sig_bits = 24,
534 }, 668 },
669 .capture = {
670 .stream_name = "Capture",
671 .channels_min = 1,
672 .channels_max = 2,
673 .rates = SUN4I_CODEC_RATES,
674 .formats = SUN4I_CODEC_FORMATS,
675 .sig_bits = 24,
676 },
535}; 677};
536 678
537static const struct regmap_config sun4i_codec_regmap_config = { 679static const struct regmap_config sun4i_codec_regmap_config = {
@@ -569,6 +711,27 @@ static struct snd_soc_dai_link *sun4i_codec_create_link(struct device *dev,
569 return link; 711 return link;
570}; 712};
571 713
714static int sun4i_codec_spk_event(struct snd_soc_dapm_widget *w,
715 struct snd_kcontrol *k, int event)
716{
717 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(w->dapm->card);
718
719 if (scodec->gpio_pa)
720 gpiod_set_value_cansleep(scodec->gpio_pa,
721 !!SND_SOC_DAPM_EVENT_ON(event));
722
723 return 0;
724}
725
726static const struct snd_soc_dapm_widget sun4i_codec_card_dapm_widgets[] = {
727 SND_SOC_DAPM_SPK("Speaker", sun4i_codec_spk_event),
728};
729
730static const struct snd_soc_dapm_route sun4i_codec_card_dapm_routes[] = {
731 { "Speaker", NULL, "HP Right" },
732 { "Speaker", NULL, "HP Left" },
733};
734
572static struct snd_soc_card *sun4i_codec_create_card(struct device *dev) 735static struct snd_soc_card *sun4i_codec_create_card(struct device *dev)
573{ 736{
574 struct snd_soc_card *card; 737 struct snd_soc_card *card;
@@ -583,6 +746,10 @@ static struct snd_soc_card *sun4i_codec_create_card(struct device *dev)
583 746
584 card->dev = dev; 747 card->dev = dev;
585 card->name = "sun4i-codec"; 748 card->name = "sun4i-codec";
749 card->dapm_widgets = sun4i_codec_card_dapm_widgets;
750 card->num_dapm_widgets = ARRAY_SIZE(sun4i_codec_card_dapm_widgets);
751 card->dapm_routes = sun4i_codec_card_dapm_routes;
752 card->num_dapm_routes = ARRAY_SIZE(sun4i_codec_card_dapm_routes);
586 753
587 return card; 754 return card;
588}; 755};
@@ -634,11 +801,25 @@ static int sun4i_codec_probe(struct platform_device *pdev)
634 return -EINVAL; 801 return -EINVAL;
635 } 802 }
636 803
804 scodec->gpio_pa = devm_gpiod_get_optional(&pdev->dev, "allwinner,pa",
805 GPIOD_OUT_LOW);
806 if (IS_ERR(scodec->gpio_pa)) {
807 ret = PTR_ERR(scodec->gpio_pa);
808 if (ret != -EPROBE_DEFER)
809 dev_err(&pdev->dev, "Failed to get pa gpio: %d\n", ret);
810 return ret;
811 }
812
637 /* DMA configuration for TX FIFO */ 813 /* DMA configuration for TX FIFO */
638 scodec->playback_dma_data.addr = res->start + SUN4I_CODEC_DAC_TXDATA; 814 scodec->playback_dma_data.addr = res->start + SUN4I_CODEC_DAC_TXDATA;
639 scodec->playback_dma_data.maxburst = 4; 815 scodec->playback_dma_data.maxburst = 4;
640 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; 816 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
641 817
818 /* DMA configuration for RX FIFO */
819 scodec->capture_dma_data.addr = res->start + SUN4I_CODEC_ADC_RXDATA;
820 scodec->capture_dma_data.maxburst = 4;
821 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
822
642 ret = snd_soc_register_codec(&pdev->dev, &sun4i_codec_codec, 823 ret = snd_soc_register_codec(&pdev->dev, &sun4i_codec_codec,
643 &sun4i_codec_dai, 1); 824 &sun4i_codec_dai, 1);
644 if (ret) { 825 if (ret) {
diff --git a/sound/soc/tegra/tegra_alc5632.c b/sound/soc/tegra/tegra_alc5632.c
index ba272e21a6fa..deb597f7c302 100644
--- a/sound/soc/tegra/tegra_alc5632.c
+++ b/sound/soc/tegra/tegra_alc5632.c
@@ -101,12 +101,16 @@ static const struct snd_kcontrol_new tegra_alc5632_controls[] = {
101 101
102static int tegra_alc5632_asoc_init(struct snd_soc_pcm_runtime *rtd) 102static int tegra_alc5632_asoc_init(struct snd_soc_pcm_runtime *rtd)
103{ 103{
104 int ret;
104 struct tegra_alc5632 *machine = snd_soc_card_get_drvdata(rtd->card); 105 struct tegra_alc5632 *machine = snd_soc_card_get_drvdata(rtd->card);
105 106
106 snd_soc_card_jack_new(rtd->card, "Headset Jack", SND_JACK_HEADSET, 107 ret = snd_soc_card_jack_new(rtd->card, "Headset Jack",
107 &tegra_alc5632_hs_jack, 108 SND_JACK_HEADSET,
108 tegra_alc5632_hs_jack_pins, 109 &tegra_alc5632_hs_jack,
109 ARRAY_SIZE(tegra_alc5632_hs_jack_pins)); 110 tegra_alc5632_hs_jack_pins,
111 ARRAY_SIZE(tegra_alc5632_hs_jack_pins));
112 if (ret)
113 return ret;
110 114
111 if (gpio_is_valid(machine->gpio_hp_det)) { 115 if (gpio_is_valid(machine->gpio_hp_det)) {
112 tegra_alc5632_hp_jack_gpio.gpio = machine->gpio_hp_det; 116 tegra_alc5632_hp_jack_gpio.gpio = machine->gpio_hp_det;
diff --git a/sound/soc/tegra/tegra_wm8903.c b/sound/soc/tegra/tegra_wm8903.c
index 21604009bc1a..e485278e027a 100644
--- a/sound/soc/tegra/tegra_wm8903.c
+++ b/sound/soc/tegra/tegra_wm8903.c
@@ -199,7 +199,8 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)
199 199
200static int tegra_wm8903_remove(struct snd_soc_card *card) 200static int tegra_wm8903_remove(struct snd_soc_card *card)
201{ 201{
202 struct snd_soc_pcm_runtime *rtd = &(card->rtd[0]); 202 struct snd_soc_pcm_runtime *rtd =
203 snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
203 struct snd_soc_dai *codec_dai = rtd->codec_dai; 204 struct snd_soc_dai *codec_dai = rtd->codec_dai;
204 struct snd_soc_codec *codec = codec_dai->codec; 205 struct snd_soc_codec *codec = codec_dai->codec;
205 struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card); 206 struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card);
diff --git a/sound/synth/emux/emux_nrpn.c b/sound/synth/emux/emux_nrpn.c
index 00fc005ecf6e..9729a15b6ae6 100644
--- a/sound/synth/emux/emux_nrpn.c
+++ b/sound/synth/emux/emux_nrpn.c
@@ -48,7 +48,8 @@ struct nrpn_conv_table {
48 * convert NRPN/control values 48 * convert NRPN/control values
49 */ 49 */
50 50
51static int send_converted_effect(struct nrpn_conv_table *table, int num_tables, 51static int send_converted_effect(const struct nrpn_conv_table *table,
52 int num_tables,
52 struct snd_emux_port *port, 53 struct snd_emux_port *port,
53 struct snd_midi_channel *chan, 54 struct snd_midi_channel *chan,
54 int type, int val, int mode) 55 int type, int val, int mode)
@@ -179,7 +180,7 @@ static int fx_conv_Q(int val)
179} 180}
180 181
181 182
182static struct nrpn_conv_table awe_effects[] = 183static const struct nrpn_conv_table awe_effects[] =
183{ 184{
184 { 0, EMUX_FX_LFO1_DELAY, fx_lfo1_delay}, 185 { 0, EMUX_FX_LFO1_DELAY, fx_lfo1_delay},
185 { 1, EMUX_FX_LFO1_FREQ, fx_lfo1_freq}, 186 { 1, EMUX_FX_LFO1_FREQ, fx_lfo1_freq},
@@ -266,7 +267,7 @@ static int gs_vib_delay(int val)
266 return -(val - 64) * gs_sense[FX_VIBDELAY] / 50; 267 return -(val - 64) * gs_sense[FX_VIBDELAY] / 50;
267} 268}
268 269
269static struct nrpn_conv_table gs_effects[] = 270static const struct nrpn_conv_table gs_effects[] =
270{ 271{
271 {32, EMUX_FX_CUTOFF, gs_cutoff}, 272 {32, EMUX_FX_CUTOFF, gs_cutoff},
272 {33, EMUX_FX_FILTERQ, gs_filterQ}, 273 {33, EMUX_FX_FILTERQ, gs_filterQ},
@@ -350,7 +351,7 @@ static int xg_release(int val)
350 return -(val - 64) * xg_sense[FX_RELEASE] / 64; 351 return -(val - 64) * xg_sense[FX_RELEASE] / 64;
351} 352}
352 353
353static struct nrpn_conv_table xg_effects[] = 354static const struct nrpn_conv_table xg_effects[] =
354{ 355{
355 {71, EMUX_FX_CUTOFF, xg_cutoff}, 356 {71, EMUX_FX_CUTOFF, xg_cutoff},
356 {74, EMUX_FX_FILTERQ, xg_filterQ}, 357 {74, EMUX_FX_FILTERQ, xg_filterQ},
diff --git a/sound/usb/card.c b/sound/usb/card.c
index 18f56646ce86..1f09d9591276 100644
--- a/sound/usb/card.c
+++ b/sound/usb/card.c
@@ -675,6 +675,8 @@ int snd_usb_autoresume(struct snd_usb_audio *chip)
675 675
676void snd_usb_autosuspend(struct snd_usb_audio *chip) 676void snd_usb_autosuspend(struct snd_usb_audio *chip)
677{ 677{
678 if (atomic_read(&chip->shutdown))
679 return;
678 if (atomic_dec_and_test(&chip->active)) 680 if (atomic_dec_and_test(&chip->active))
679 usb_autopm_put_interface(chip->pm_intf); 681 usb_autopm_put_interface(chip->pm_intf);
680} 682}
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
index 5b4c58c3e2c5..cc39f63299ef 100644
--- a/sound/usb/midi.c
+++ b/sound/usb/midi.c
@@ -112,7 +112,7 @@ struct snd_usb_midi {
112 struct usb_interface *iface; 112 struct usb_interface *iface;
113 const struct snd_usb_audio_quirk *quirk; 113 const struct snd_usb_audio_quirk *quirk;
114 struct snd_rawmidi *rmidi; 114 struct snd_rawmidi *rmidi;
115 struct usb_protocol_ops *usb_protocol_ops; 115 const struct usb_protocol_ops *usb_protocol_ops;
116 struct list_head list; 116 struct list_head list;
117 struct timer_list error_timer; 117 struct timer_list error_timer;
118 spinlock_t disc_lock; 118 spinlock_t disc_lock;
@@ -671,31 +671,32 @@ static void snd_usbmidi_standard_output(struct snd_usb_midi_out_endpoint *ep,
671 } 671 }
672} 672}
673 673
674static struct usb_protocol_ops snd_usbmidi_standard_ops = { 674static const struct usb_protocol_ops snd_usbmidi_standard_ops = {
675 .input = snd_usbmidi_standard_input, 675 .input = snd_usbmidi_standard_input,
676 .output = snd_usbmidi_standard_output, 676 .output = snd_usbmidi_standard_output,
677 .output_packet = snd_usbmidi_output_standard_packet, 677 .output_packet = snd_usbmidi_output_standard_packet,
678}; 678};
679 679
680static struct usb_protocol_ops snd_usbmidi_midiman_ops = { 680static const struct usb_protocol_ops snd_usbmidi_midiman_ops = {
681 .input = snd_usbmidi_midiman_input, 681 .input = snd_usbmidi_midiman_input,
682 .output = snd_usbmidi_standard_output, 682 .output = snd_usbmidi_standard_output,
683 .output_packet = snd_usbmidi_output_midiman_packet, 683 .output_packet = snd_usbmidi_output_midiman_packet,
684}; 684};
685 685
686static struct usb_protocol_ops snd_usbmidi_maudio_broken_running_status_ops = { 686static const
687struct usb_protocol_ops snd_usbmidi_maudio_broken_running_status_ops = {
687 .input = snd_usbmidi_maudio_broken_running_status_input, 688 .input = snd_usbmidi_maudio_broken_running_status_input,
688 .output = snd_usbmidi_standard_output, 689 .output = snd_usbmidi_standard_output,
689 .output_packet = snd_usbmidi_output_standard_packet, 690 .output_packet = snd_usbmidi_output_standard_packet,
690}; 691};
691 692
692static struct usb_protocol_ops snd_usbmidi_cme_ops = { 693static const struct usb_protocol_ops snd_usbmidi_cme_ops = {
693 .input = snd_usbmidi_cme_input, 694 .input = snd_usbmidi_cme_input,
694 .output = snd_usbmidi_standard_output, 695 .output = snd_usbmidi_standard_output,
695 .output_packet = snd_usbmidi_output_standard_packet, 696 .output_packet = snd_usbmidi_output_standard_packet,
696}; 697};
697 698
698static struct usb_protocol_ops snd_usbmidi_ch345_broken_sysex_ops = { 699static const struct usb_protocol_ops snd_usbmidi_ch345_broken_sysex_ops = {
699 .input = ch345_broken_sysex_input, 700 .input = ch345_broken_sysex_input,
700 .output = snd_usbmidi_standard_output, 701 .output = snd_usbmidi_standard_output,
701 .output_packet = snd_usbmidi_output_standard_packet, 702 .output_packet = snd_usbmidi_output_standard_packet,
@@ -795,7 +796,7 @@ static void snd_usbmidi_akai_output(struct snd_usb_midi_out_endpoint *ep,
795 } 796 }
796} 797}
797 798
798static struct usb_protocol_ops snd_usbmidi_akai_ops = { 799static const struct usb_protocol_ops snd_usbmidi_akai_ops = {
799 .input = snd_usbmidi_akai_input, 800 .input = snd_usbmidi_akai_input,
800 .output = snd_usbmidi_akai_output, 801 .output = snd_usbmidi_akai_output,
801}; 802};
@@ -835,7 +836,7 @@ static void snd_usbmidi_novation_output(struct snd_usb_midi_out_endpoint *ep,
835 urb->transfer_buffer_length = 2 + count; 836 urb->transfer_buffer_length = 2 + count;
836} 837}
837 838
838static struct usb_protocol_ops snd_usbmidi_novation_ops = { 839static const struct usb_protocol_ops snd_usbmidi_novation_ops = {
839 .input = snd_usbmidi_novation_input, 840 .input = snd_usbmidi_novation_input,
840 .output = snd_usbmidi_novation_output, 841 .output = snd_usbmidi_novation_output,
841}; 842};
@@ -867,7 +868,7 @@ static void snd_usbmidi_raw_output(struct snd_usb_midi_out_endpoint *ep,
867 urb->transfer_buffer_length = count; 868 urb->transfer_buffer_length = count;
868} 869}
869 870
870static struct usb_protocol_ops snd_usbmidi_raw_ops = { 871static const struct usb_protocol_ops snd_usbmidi_raw_ops = {
871 .input = snd_usbmidi_raw_input, 872 .input = snd_usbmidi_raw_input,
872 .output = snd_usbmidi_raw_output, 873 .output = snd_usbmidi_raw_output,
873}; 874};
@@ -883,7 +884,7 @@ static void snd_usbmidi_ftdi_input(struct snd_usb_midi_in_endpoint *ep,
883 snd_usbmidi_input_data(ep, 0, buffer + 2, buffer_length - 2); 884 snd_usbmidi_input_data(ep, 0, buffer + 2, buffer_length - 2);
884} 885}
885 886
886static struct usb_protocol_ops snd_usbmidi_ftdi_ops = { 887static const struct usb_protocol_ops snd_usbmidi_ftdi_ops = {
887 .input = snd_usbmidi_ftdi_input, 888 .input = snd_usbmidi_ftdi_input,
888 .output = snd_usbmidi_raw_output, 889 .output = snd_usbmidi_raw_output,
889}; 890};
@@ -927,7 +928,7 @@ static void snd_usbmidi_us122l_output(struct snd_usb_midi_out_endpoint *ep,
927 urb->transfer_buffer_length = ep->max_transfer; 928 urb->transfer_buffer_length = ep->max_transfer;
928} 929}
929 930
930static struct usb_protocol_ops snd_usbmidi_122l_ops = { 931static const struct usb_protocol_ops snd_usbmidi_122l_ops = {
931 .input = snd_usbmidi_us122l_input, 932 .input = snd_usbmidi_us122l_input,
932 .output = snd_usbmidi_us122l_output, 933 .output = snd_usbmidi_us122l_output,
933}; 934};
@@ -1060,7 +1061,7 @@ static void snd_usbmidi_emagic_output(struct snd_usb_midi_out_endpoint *ep,
1060 urb->transfer_buffer_length = ep->max_transfer - buf_free; 1061 urb->transfer_buffer_length = ep->max_transfer - buf_free;
1061} 1062}
1062 1063
1063static struct usb_protocol_ops snd_usbmidi_emagic_ops = { 1064static const struct usb_protocol_ops snd_usbmidi_emagic_ops = {
1064 .input = snd_usbmidi_emagic_input, 1065 .input = snd_usbmidi_emagic_input,
1065 .output = snd_usbmidi_emagic_output, 1066 .output = snd_usbmidi_emagic_output,
1066 .init_out_endpoint = snd_usbmidi_emagic_init_out, 1067 .init_out_endpoint = snd_usbmidi_emagic_init_out,
@@ -2206,7 +2207,7 @@ static int snd_usbmidi_create_endpoints_midiman(struct snd_usb_midi *umidi,
2206 return 0; 2207 return 0;
2207} 2208}
2208 2209
2209static struct snd_rawmidi_global_ops snd_usbmidi_ops = { 2210static const struct snd_rawmidi_global_ops snd_usbmidi_ops = {
2210 .get_port_info = snd_usbmidi_get_port_info, 2211 .get_port_info = snd_usbmidi_get_port_info,
2211}; 2212};
2212 2213
diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c
index 9581089c28c5..c19a5dd05631 100644
--- a/sound/usb/misc/ua101.c
+++ b/sound/usb/misc/ua101.c
@@ -1037,7 +1037,7 @@ static int detect_usb_format(struct ua101 *ua)
1037 return -ENXIO; 1037 return -ENXIO;
1038 } 1038 }
1039 ua->capture.usb_pipe = usb_rcvisocpipe(ua->dev, usb_endpoint_num(epd)); 1039 ua->capture.usb_pipe = usb_rcvisocpipe(ua->dev, usb_endpoint_num(epd));
1040 ua->capture.max_packet_bytes = le16_to_cpu(epd->wMaxPacketSize); 1040 ua->capture.max_packet_bytes = usb_endpoint_maxp(epd);
1041 1041
1042 epd = &ua->intf[INTF_PLAYBACK]->altsetting[1].endpoint[0].desc; 1042 epd = &ua->intf[INTF_PLAYBACK]->altsetting[1].endpoint[0].desc;
1043 if (!usb_endpoint_is_isoc_out(epd)) { 1043 if (!usb_endpoint_is_isoc_out(epd)) {
@@ -1045,7 +1045,7 @@ static int detect_usb_format(struct ua101 *ua)
1045 return -ENXIO; 1045 return -ENXIO;
1046 } 1046 }
1047 ua->playback.usb_pipe = usb_sndisocpipe(ua->dev, usb_endpoint_num(epd)); 1047 ua->playback.usb_pipe = usb_sndisocpipe(ua->dev, usb_endpoint_num(epd));
1048 ua->playback.max_packet_bytes = le16_to_cpu(epd->wMaxPacketSize); 1048 ua->playback.max_packet_bytes = usb_endpoint_maxp(epd);
1049 return 0; 1049 return 0;
1050} 1050}
1051 1051
diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
index 0ce888dceed0..279025650568 100644
--- a/sound/usb/mixer_quirks.c
+++ b/sound/usb/mixer_quirks.c
@@ -793,7 +793,7 @@ static int snd_nativeinstruments_control_put(struct snd_kcontrol *kcontrol,
793 return 0; 793 return 0;
794 794
795 kcontrol->private_value &= ~(0xff << 24); 795 kcontrol->private_value &= ~(0xff << 24);
796 kcontrol->private_value |= newval; 796 kcontrol->private_value |= (unsigned int)newval << 24;
797 err = snd_ni_update_cur_val(list); 797 err = snd_ni_update_cur_val(list);
798 return err < 0 ? err : 1; 798 return err < 0 ? err : 1;
799} 799}
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index b6c0c8e3b450..23ea6d800c4c 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -1269,6 +1269,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
1269 case USB_ID(0x20b1, 0x3008): /* iFi Audio micro/nano iDSD */ 1269 case USB_ID(0x20b1, 0x3008): /* iFi Audio micro/nano iDSD */
1270 case USB_ID(0x20b1, 0x2008): /* Matrix Audio X-Sabre */ 1270 case USB_ID(0x20b1, 0x2008): /* Matrix Audio X-Sabre */
1271 case USB_ID(0x20b1, 0x300a): /* Matrix Audio Mini-i Pro */ 1271 case USB_ID(0x20b1, 0x300a): /* Matrix Audio Mini-i Pro */
1272 case USB_ID(0x22d8, 0x0416): /* OPPO HA-1*/
1272 if (fp->altsetting == 2) 1273 if (fp->altsetting == 2)
1273 return SNDRV_PCM_FMTBIT_DSD_U32_BE; 1274 return SNDRV_PCM_FMTBIT_DSD_U32_BE;
1274 break; 1275 break;
diff --git a/sound/usb/stream.c b/sound/usb/stream.c
index 8ee14f2365e7..c4dc577ab1bd 100644
--- a/sound/usb/stream.c
+++ b/sound/usb/stream.c
@@ -125,11 +125,9 @@ static int usb_chmap_ctl_info(struct snd_kcontrol *kcontrol,
125static bool have_dup_chmap(struct snd_usb_substream *subs, 125static bool have_dup_chmap(struct snd_usb_substream *subs,
126 struct audioformat *fp) 126 struct audioformat *fp)
127{ 127{
128 struct list_head *p; 128 struct audioformat *prev = fp;
129 129
130 for (p = fp->list.prev; p != &subs->fmt_list; p = p->prev) { 130 list_for_each_entry_continue_reverse(prev, &subs->fmt_list, list) {
131 struct audioformat *prev;
132 prev = list_entry(p, struct audioformat, list);
133 if (prev->chmap && 131 if (prev->chmap &&
134 !memcmp(prev->chmap, fp->chmap, sizeof(*fp->chmap))) 132 !memcmp(prev->chmap, fp->chmap, sizeof(*fp->chmap)))
135 return true; 133 return true;
diff --git a/sound/usb/usx2y/usbusx2yaudio.c b/sound/usb/usx2y/usbusx2yaudio.c
index 61d5dc2a3421..dd40ca9d858a 100644
--- a/sound/usb/usx2y/usbusx2yaudio.c
+++ b/sound/usb/usx2y/usbusx2yaudio.c
@@ -166,7 +166,7 @@ static int usX2Y_urb_play_prepare(struct snd_usX2Y_substream *subs,
166 /* set the buffer pointer */ 166 /* set the buffer pointer */
167 urb->transfer_buffer = runtime->dma_area + subs->hwptr * usX2Y->stride; 167 urb->transfer_buffer = runtime->dma_area + subs->hwptr * usX2Y->stride;
168 if ((subs->hwptr += count) >= runtime->buffer_size) 168 if ((subs->hwptr += count) >= runtime->buffer_size)
169 subs->hwptr -= runtime->buffer_size; 169 subs->hwptr -= runtime->buffer_size;
170 } 170 }
171 else 171 else
172 urb->transfer_buffer = subs->tmpbuf; 172 urb->transfer_buffer = subs->tmpbuf;