1 // SPDX-License-Identifier: MIT
3 * Copyright © 2022 Intel Corporation
10 #include "intel_display.h"
11 #include "intel_dkl_phy.h"
12 #include "intel_dkl_phy_regs.h"
15 * intel_dkl_phy_init - initialize Dekel PHY
16 * @i915: i915 device instance
18 void intel_dkl_phy_init(struct drm_i915_private *i915)
20 spin_lock_init(&i915->display.dkl.phy_lock);
24 dkl_phy_set_hip_idx(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg)
26 enum tc_port tc_port = DKL_REG_TC_PORT(reg);
28 drm_WARN_ON(&i915->drm, tc_port < TC_PORT_1 || tc_port >= I915_MAX_TC_PORTS);
31 HIP_INDEX_REG(tc_port),
32 HIP_INDEX_VAL(tc_port, reg.bank_idx));
36 * intel_dkl_phy_read - read a Dekel PHY register
37 * @i915: i915 device instance
38 * @reg: Dekel PHY register
40 * Read the @reg Dekel PHY register.
42 * Returns the read value.
45 intel_dkl_phy_read(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg)
49 spin_lock(&i915->display.dkl.phy_lock);
51 dkl_phy_set_hip_idx(i915, reg);
52 val = intel_de_read(i915, DKL_REG_MMIO(reg));
54 spin_unlock(&i915->display.dkl.phy_lock);
60 * intel_dkl_phy_write - write a Dekel PHY register
61 * @i915: i915 device instance
62 * @reg: Dekel PHY register
63 * @val: value to write
65 * Write @val to the @reg Dekel PHY register.
68 intel_dkl_phy_write(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg, u32 val)
70 spin_lock(&i915->display.dkl.phy_lock);
72 dkl_phy_set_hip_idx(i915, reg);
73 intel_de_write(i915, DKL_REG_MMIO(reg), val);
75 spin_unlock(&i915->display.dkl.phy_lock);
79 * intel_dkl_phy_rmw - read-modify-write a Dekel PHY register
80 * @i915: i915 device instance
81 * @reg: Dekel PHY register
82 * @clear: mask to clear
85 * Read the @reg Dekel PHY register, clearing then setting the @clear/@set bits in it, and writing
86 * this value back to the register if the value differs from the read one.
89 intel_dkl_phy_rmw(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg, u32 clear, u32 set)
91 spin_lock(&i915->display.dkl.phy_lock);
93 dkl_phy_set_hip_idx(i915, reg);
94 intel_de_rmw(i915, DKL_REG_MMIO(reg), clear, set);
96 spin_unlock(&i915->display.dkl.phy_lock);
100 * intel_dkl_phy_posting_read - do a posting read from a Dekel PHY register
101 * @i915: i915 device instance
102 * @reg: Dekel PHY register
104 * Read the @reg Dekel PHY register without returning the read value.
107 intel_dkl_phy_posting_read(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg)
109 spin_lock(&i915->display.dkl.phy_lock);
111 dkl_phy_set_hip_idx(i915, reg);
112 intel_de_posting_read(i915, DKL_REG_MMIO(reg));
114 spin_unlock(&i915->display.dkl.phy_lock);