aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/sh
diff options
context:
space:
mode:
authorMagnus Damm <damm@opensource.se>2011-12-13 11:01:14 -0500
committerPaul Mundt <lethal@linux-sh.org>2012-01-08 19:33:57 -0500
commite499ada829cf769ac6f16627cd9f09b855a7fd6d (patch)
tree87064260c6ae7ab6d0548de8109b816dd2609e3e /drivers/sh
parentf78a26f55b2438c439609fc90b473f7f08f5b697 (diff)
sh: pfc: Unlock register support
Add PFC support for a 32-bit unlock register. Needed to drive the r8a7779 PFC that comes with a funky PMMR register. Signed-off-by: Magnus Damm <damm@opensource.se> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'drivers/sh')
-rw-r--r--drivers/sh/pfc.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/drivers/sh/pfc.c b/drivers/sh/pfc.c
index f975f4a33439..522c6c46d1be 100644
--- a/drivers/sh/pfc.c
+++ b/drivers/sh/pfc.c
@@ -210,7 +210,7 @@ static void write_config_reg(struct pinmux_info *gpioc,
210 unsigned long field, unsigned long value) 210 unsigned long field, unsigned long value)
211{ 211{
212 void __iomem *mapped_reg; 212 void __iomem *mapped_reg;
213 unsigned long mask, pos; 213 unsigned long mask, pos, data;
214 214
215 config_reg_helper(gpioc, crp, field, &mapped_reg, &mask, &pos); 215 config_reg_helper(gpioc, crp, field, &mapped_reg, &mask, &pos);
216 216
@@ -221,17 +221,15 @@ static void write_config_reg(struct pinmux_info *gpioc,
221 mask = ~(mask << pos); 221 mask = ~(mask << pos);
222 value = value << pos; 222 value = value << pos;
223 223
224 switch (crp->reg_width) { 224 data = gpio_read_raw_reg(mapped_reg, crp->reg_width);
225 case 8: 225 data &= mask;
226 iowrite8((ioread8(mapped_reg) & mask) | value, mapped_reg); 226 data |= value;
227 break; 227
228 case 16: 228 if (gpioc->unlock_reg)
229 iowrite16((ioread16(mapped_reg) & mask) | value, mapped_reg); 229 gpio_write_raw_reg(pfc_phys_to_virt(gpioc, gpioc->unlock_reg),
230 break; 230 32, ~data);
231 case 32: 231
232 iowrite32((ioread32(mapped_reg) & mask) | value, mapped_reg); 232 gpio_write_raw_reg(mapped_reg, crp->reg_width, data);
233 break;
234 }
235} 233}
236 234
237static int setup_data_reg(struct pinmux_info *gpioc, unsigned gpio) 235static int setup_data_reg(struct pinmux_info *gpioc, unsigned gpio)