diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2009-11-10 15:59:44 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-12-01 20:36:39 -0500 |
commit | 9b9fe72488a3a637e0550cc888e3f7a8f70e521e (patch) | |
tree | 5739a07ba9a57c58174f79a065e547e92aafe3df /drivers/gpu/drm/radeon/radeon_i2c.c | |
parent | ab1e9ea08f1e94639b2d21a6bde5b55d31b1deee (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.c | 43 |
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 | ||
146 | static void set_data(void *i2c_priv, int data) | 150 | static 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 | ||
158 | struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev, | 163 | struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev, |