aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_i2c.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_i2c.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_i2c.c48
1 files changed, 22 insertions, 26 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c
index 6c111c1fa3f9..02cb7da4124d 100644
--- a/drivers/gpu/drm/radeon/radeon_i2c.c
+++ b/drivers/gpu/drm/radeon/radeon_i2c.c
@@ -81,8 +81,9 @@ bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool requires_e
81 81
82/* bit banging i2c */ 82/* bit banging i2c */
83 83
84static void radeon_i2c_do_lock(struct radeon_i2c_chan *i2c, int lock_state) 84static int pre_xfer(struct i2c_adapter *i2c_adap)
85{ 85{
86 struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap);
86 struct radeon_device *rdev = i2c->dev->dev_private; 87 struct radeon_device *rdev = i2c->dev->dev_private;
87 struct radeon_i2c_bus_rec *rec = &i2c->rec; 88 struct radeon_i2c_bus_rec *rec = &i2c->rec;
88 uint32_t temp; 89 uint32_t temp;
@@ -137,19 +138,30 @@ static void radeon_i2c_do_lock(struct radeon_i2c_chan *i2c, int lock_state)
137 WREG32(rec->en_data_reg, temp); 138 WREG32(rec->en_data_reg, temp);
138 139
139 /* mask the gpio pins for software use */ 140 /* mask the gpio pins for software use */
140 temp = RREG32(rec->mask_clk_reg); 141 temp = RREG32(rec->mask_clk_reg) | rec->mask_clk_mask;
141 if (lock_state)
142 temp |= rec->mask_clk_mask;
143 else
144 temp &= ~rec->mask_clk_mask;
145 WREG32(rec->mask_clk_reg, temp); 142 WREG32(rec->mask_clk_reg, temp);
146 temp = RREG32(rec->mask_clk_reg); 143 temp = RREG32(rec->mask_clk_reg);
147 144
145 temp = RREG32(rec->mask_data_reg) | rec->mask_data_mask;
146 WREG32(rec->mask_data_reg, temp);
148 temp = RREG32(rec->mask_data_reg); 147 temp = RREG32(rec->mask_data_reg);
149 if (lock_state) 148
150 temp |= rec->mask_data_mask; 149 return 0;
151 else 150}
152 temp &= ~rec->mask_data_mask; 151
152static void post_xfer(struct i2c_adapter *i2c_adap)
153{
154 struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap);
155 struct radeon_device *rdev = i2c->dev->dev_private;
156 struct radeon_i2c_bus_rec *rec = &i2c->rec;
157 uint32_t temp;
158
159 /* unmask the gpio pins for software use */
160 temp = RREG32(rec->mask_clk_reg) & ~rec->mask_clk_mask;
161 WREG32(rec->mask_clk_reg, temp);
162 temp = RREG32(rec->mask_clk_reg);
163
164 temp = RREG32(rec->mask_data_reg) & ~rec->mask_data_mask;
153 WREG32(rec->mask_data_reg, temp); 165 WREG32(rec->mask_data_reg, temp);
154 temp = RREG32(rec->mask_data_reg); 166 temp = RREG32(rec->mask_data_reg);
155} 167}
@@ -209,22 +221,6 @@ static void set_data(void *i2c_priv, int data)
209 WREG32(rec->en_data_reg, val); 221 WREG32(rec->en_data_reg, val);
210} 222}
211 223
212static int pre_xfer(struct i2c_adapter *i2c_adap)
213{
214 struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap);
215
216 radeon_i2c_do_lock(i2c, 1);
217
218 return 0;
219}
220
221static void post_xfer(struct i2c_adapter *i2c_adap)
222{
223 struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap);
224
225 radeon_i2c_do_lock(i2c, 0);
226}
227
228/* hw i2c */ 224/* hw i2c */
229 225
230static u32 radeon_get_i2c_prescale(struct radeon_device *rdev) 226static u32 radeon_get_i2c_prescale(struct radeon_device *rdev)