diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_i2c.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_i2c.c | 48 |
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 | ||
84 | static void radeon_i2c_do_lock(struct radeon_i2c_chan *i2c, int lock_state) | 84 | static 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 | |
152 | static 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 | ||
212 | static 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 | |||
221 | static 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 | ||
230 | static u32 radeon_get_i2c_prescale(struct radeon_device *rdev) | 226 | static u32 radeon_get_i2c_prescale(struct radeon_device *rdev) |