aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_i2c.c
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2009-11-10 15:59:44 -0500
committerDave Airlie <airlied@redhat.com>2009-12-01 20:36:39 -0500
commit9b9fe72488a3a637e0550cc888e3f7a8f70e521e (patch)
tree5739a07ba9a57c58174f79a065e547e92aafe3df /drivers/gpu/drm/radeon/radeon_i2c.c
parentab1e9ea08f1e94639b2d21a6bde5b55d31b1deee (diff)
drm/radeon/kms: clean up i2c
- Change reg/mask names to match what we use internally and in the bios - Clarify how i2c over gpio on radeon actually works Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_i2c.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_i2c.c43
1 files changed, 24 insertions, 19 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c
index d8296acb082f..e97a3912d99f 100644
--- a/drivers/gpu/drm/radeon/radeon_i2c.c
+++ b/drivers/gpu/drm/radeon/radeon_i2c.c
@@ -78,16 +78,16 @@ void radeon_i2c_do_lock(struct radeon_i2c_chan *i2c, int lock_state)
78 R200_DVI_I2C_PIN_SEL(R200_SEL_DDC3))); 78 R200_DVI_I2C_PIN_SEL(R200_SEL_DDC3)));
79 } 79 }
80 } 80 }
81 if (lock_state) {
82 temp = RREG32(rec->a_clk_reg);
83 temp &= ~(rec->a_clk_mask);
84 WREG32(rec->a_clk_reg, temp);
85
86 temp = RREG32(rec->a_data_reg);
87 temp &= ~(rec->a_data_mask);
88 WREG32(rec->a_data_reg, temp);
89 }
90 81
82 /* clear the output pin values */
83 temp = RREG32(rec->a_clk_reg) & ~rec->a_clk_mask;
84 WREG32(rec->a_clk_reg, temp);
85
86 temp = RREG32(rec->a_data_reg) & ~rec->a_data_mask;
87 WREG32(rec->a_data_reg, temp);
88
89
90 /* mask the gpio pins for software use */
91 temp = RREG32(rec->mask_clk_reg); 91 temp = RREG32(rec->mask_clk_reg);
92 if (lock_state) 92 if (lock_state)
93 temp |= rec->mask_clk_mask; 93 temp |= rec->mask_clk_mask;
@@ -112,8 +112,9 @@ static int get_clock(void *i2c_priv)
112 struct radeon_i2c_bus_rec *rec = &i2c->rec; 112 struct radeon_i2c_bus_rec *rec = &i2c->rec;
113 uint32_t val; 113 uint32_t val;
114 114
115 val = RREG32(rec->get_clk_reg); 115 /* read the value off the pin */
116 val &= rec->get_clk_mask; 116 val = RREG32(rec->y_clk_reg);
117 val &= rec->y_clk_mask;
117 118
118 return (val != 0); 119 return (val != 0);
119} 120}
@@ -126,8 +127,10 @@ static int get_data(void *i2c_priv)
126 struct radeon_i2c_bus_rec *rec = &i2c->rec; 127 struct radeon_i2c_bus_rec *rec = &i2c->rec;
127 uint32_t val; 128 uint32_t val;
128 129
129 val = RREG32(rec->get_data_reg); 130 /* read the value off the pin */
130 val &= rec->get_data_mask; 131 val = RREG32(rec->y_data_reg);
132 val &= rec->y_data_mask;
133
131 return (val != 0); 134 return (val != 0);
132} 135}
133 136
@@ -138,9 +141,10 @@ static void set_clock(void *i2c_priv, int clock)
138 struct radeon_i2c_bus_rec *rec = &i2c->rec; 141 struct radeon_i2c_bus_rec *rec = &i2c->rec;
139 uint32_t val; 142 uint32_t val;
140 143
141 val = RREG32(rec->put_clk_reg) & (uint32_t)~(rec->put_clk_mask); 144 /* set pin direction */
142 val |= clock ? 0 : rec->put_clk_mask; 145 val = RREG32(rec->en_clk_reg) & ~rec->en_clk_mask;
143 WREG32(rec->put_clk_reg, val); 146 val |= clock ? 0 : rec->en_clk_mask;
147 WREG32(rec->en_clk_reg, val);
144} 148}
145 149
146static void set_data(void *i2c_priv, int data) 150static void set_data(void *i2c_priv, int data)
@@ -150,9 +154,10 @@ static void set_data(void *i2c_priv, int data)
150 struct radeon_i2c_bus_rec *rec = &i2c->rec; 154 struct radeon_i2c_bus_rec *rec = &i2c->rec;
151 uint32_t val; 155 uint32_t val;
152 156
153 val = RREG32(rec->put_data_reg) & (uint32_t)~(rec->put_data_mask); 157 /* set pin direction */
154 val |= data ? 0 : rec->put_data_mask; 158 val = RREG32(rec->en_data_reg) & ~rec->en_data_mask;
155 WREG32(rec->put_data_reg, val); 159 val |= data ? 0 : rec->en_data_mask;
160 WREG32(rec->en_data_reg, val);
156} 161}
157 162
158struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev, 163struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev,