aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/busses/i2c-mv64xxx.c
diff options
context:
space:
mode:
authorTzachi Perelstein <tzachi@marvell.com>2007-11-12 12:38:51 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2008-01-26 10:03:59 -0500
commita0832798c05241f15e793805b6024919c07b8292 (patch)
tree32651dbe7acda8a17efe4f44e75547e6266bb49b /drivers/i2c/busses/i2c-mv64xxx.c
parent60ce1c20068ec2c138cdf9e5cbe583cc60883c62 (diff)
[I2C] Split mv643xx I2C platform support
The motivation for this change is to allow other chips, like the Marvell Orion ARM SoC family, to use the existing i2c-mv64xxx driver. Signed-off-by: Tzachi Perelstein <tzachi@marvell.com> Acked-by: Nicolas Pitre <nico@marvell.com> Acked-by: Dale Farnsworth <dale@farnsworth.org> Acked-by: Mark A. Greer <mgreer@mvista.com> Acked-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/i2c/busses/i2c-mv64xxx.c')
-rw-r--r--drivers/i2c/busses/i2c-mv64xxx.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c
index bb7bf68a7fb6..cdd1ef99fcff 100644
--- a/drivers/i2c/busses/i2c-mv64xxx.c
+++ b/drivers/i2c/busses/i2c-mv64xxx.c
@@ -1,6 +1,6 @@
1/* 1/*
2 * Driver for the i2c controller on the Marvell line of host bridges for MIPS 2 * Driver for the i2c controller on the Marvell line of host bridges
3 * and PPC (e.g, gt642[46]0, mv643[46]0, mv644[46]0). 3 * (e.g, gt642[46]0, mv643[46]0, mv644[46]0, and Orion SoC family).
4 * 4 *
5 * Author: Mark A. Greer <mgreer@mvista.com> 5 * Author: Mark A. Greer <mgreer@mvista.com>
6 * 6 *
@@ -14,7 +14,7 @@
14#include <linux/spinlock.h> 14#include <linux/spinlock.h>
15#include <linux/i2c.h> 15#include <linux/i2c.h>
16#include <linux/interrupt.h> 16#include <linux/interrupt.h>
17#include <linux/mv643xx.h> 17#include <linux/mv643xx_i2c.h>
18#include <linux/platform_device.h> 18#include <linux/platform_device.h>
19 19
20#include <asm/io.h> 20#include <asm/io.h>
@@ -86,6 +86,7 @@ struct mv64xxx_i2c_data {
86 u32 cntl_bits; 86 u32 cntl_bits;
87 void __iomem *reg_base; 87 void __iomem *reg_base;
88 u32 reg_base_p; 88 u32 reg_base_p;
89 u32 reg_size;
89 u32 addr1; 90 u32 addr1;
90 u32 addr2; 91 u32 addr2;
91 u32 bytes_left; 92 u32 bytes_left;
@@ -463,17 +464,20 @@ static int __devinit
463mv64xxx_i2c_map_regs(struct platform_device *pd, 464mv64xxx_i2c_map_regs(struct platform_device *pd,
464 struct mv64xxx_i2c_data *drv_data) 465 struct mv64xxx_i2c_data *drv_data)
465{ 466{
466 struct resource *r; 467 int size;
468 struct resource *r = platform_get_resource(pd, IORESOURCE_MEM, 0);
467 469
468 if ((r = platform_get_resource(pd, IORESOURCE_MEM, 0)) && 470 if (!r)
469 request_mem_region(r->start, MV64XXX_I2C_REG_BLOCK_SIZE, 471 return -ENODEV;
470 drv_data->adapter.name)) {
471 472
472 drv_data->reg_base = ioremap(r->start, 473 size = r->end - r->start + 1;
473 MV64XXX_I2C_REG_BLOCK_SIZE); 474
474 drv_data->reg_base_p = r->start; 475 if (!request_mem_region(r->start, size, drv_data->adapter.name))
475 } else 476 return -EBUSY;
476 return -ENOMEM; 477
478 drv_data->reg_base = ioremap(r->start, size);
479 drv_data->reg_base_p = r->start;
480 drv_data->reg_size = size;
477 481
478 return 0; 482 return 0;
479} 483}
@@ -483,8 +487,7 @@ mv64xxx_i2c_unmap_regs(struct mv64xxx_i2c_data *drv_data)
483{ 487{
484 if (drv_data->reg_base) { 488 if (drv_data->reg_base) {
485 iounmap(drv_data->reg_base); 489 iounmap(drv_data->reg_base);
486 release_mem_region(drv_data->reg_base_p, 490 release_mem_region(drv_data->reg_base_p, drv_data->reg_size);
487 MV64XXX_I2C_REG_BLOCK_SIZE);
488 } 491 }
489 492
490 drv_data->reg_base = NULL; 493 drv_data->reg_base = NULL;