[i2c] [PATCH] Split mv643xx I2C platform support
Jean Delvare
khali at linux-fr.org
Wed Nov 21 12:23:51 CET 2007
On Wed, 21 Nov 2007 09:05:34 +0200, Tzachi Perelstein wrote:
> 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 at marvell.com>
> Acked-by: Nicolas Pitre <nico at marvell.com>
> Acked-by: Dale Farnsworth <dale at farnsworth.org>
> CC: Mark A. Greer <mgreer at mvista.com>
>
> ---
> diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
> index c466c6c..b148bf0 100644
> --- a/drivers/i2c/busses/Kconfig
> +++ b/drivers/i2c/busses/Kconfig
> @@ -648,7 +648,7 @@ config I2C_PCA_ISA
>
> config I2C_MV64XXX
> tristate "Marvell mv64xxx I2C Controller"
> - depends on MV64X60 && EXPERIMENTAL
> + depends on (MV64X60 || ARCH_ORION) && EXPERIMENTAL
> help
> If you say yes to this option, support will be included for the
> built-in I2C interface on the Marvell 64xxx line of host bridges.
> diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c
> index bb7bf68..cdd1ef9 100644
> --- a/drivers/i2c/busses/i2c-mv64xxx.c
> +++ b/drivers/i2c/busses/i2c-mv64xxx.c
> @@ -1,6 +1,6 @@
> /*
> - * Driver for the i2c controller on the Marvell line of host bridges for MIPS
> - * and PPC (e.g, gt642[46]0, mv643[46]0, mv644[46]0).
> + * Driver for the i2c controller on the Marvell line of host bridges
> + * (e.g, gt642[46]0, mv643[46]0, mv644[46]0, and Orion SoC family).
> *
> * Author: Mark A. Greer <mgreer at mvista.com>
> *
> @@ -14,7 +14,7 @@
> #include <linux/spinlock.h>
> #include <linux/i2c.h>
> #include <linux/interrupt.h>
> -#include <linux/mv643xx.h>
> +#include <linux/mv643xx_i2c.h>
> #include <linux/platform_device.h>
>
> #include <asm/io.h>
> @@ -86,6 +86,7 @@ struct mv64xxx_i2c_data {
> u32 cntl_bits;
> void __iomem *reg_base;
> u32 reg_base_p;
> + u32 reg_size;
> u32 addr1;
> u32 addr2;
> u32 bytes_left;
> @@ -463,17 +464,20 @@ static int __devinit
> mv64xxx_i2c_map_regs(struct platform_device *pd,
> struct mv64xxx_i2c_data *drv_data)
> {
> - struct resource *r;
> + int size;
> + struct resource *r = platform_get_resource(pd, IORESOURCE_MEM, 0);
>
> - if ((r = platform_get_resource(pd, IORESOURCE_MEM, 0)) &&
> - request_mem_region(r->start, MV64XXX_I2C_REG_BLOCK_SIZE,
> - drv_data->adapter.name)) {
> + if (!r)
> + return -ENODEV;
>
> - drv_data->reg_base = ioremap(r->start,
> - MV64XXX_I2C_REG_BLOCK_SIZE);
> - drv_data->reg_base_p = r->start;
> - } else
> - return -ENOMEM;
> + size = r->end - r->start + 1;
> +
> + if (!request_mem_region(r->start, size, drv_data->adapter.name))
> + return -EBUSY;
> +
> + drv_data->reg_base = ioremap(r->start, size);
> + drv_data->reg_base_p = r->start;
> + drv_data->reg_size = size;
>
> return 0;
> }
> @@ -483,8 +487,7 @@ mv64xxx_i2c_unmap_regs(struct mv64xxx_i2c_data *drv_data)
> {
> if (drv_data->reg_base) {
> iounmap(drv_data->reg_base);
> - release_mem_region(drv_data->reg_base_p,
> - MV64XXX_I2C_REG_BLOCK_SIZE);
> + release_mem_region(drv_data->reg_base_p, drv_data->reg_size);
> }
>
> drv_data->reg_base = NULL;
> diff --git a/include/linux/mv643xx.h b/include/linux/mv643xx.h
> index d2ae618..69327b7 100644
> --- a/include/linux/mv643xx.h
> +++ b/include/linux/mv643xx.h
> @@ -15,6 +15,7 @@
>
> #include <asm/types.h>
> #include <linux/mv643xx_eth.h>
> +#include <linux/mv643xx_i2c.h>
>
> /****************************************/
> /* Processor Address Space */
> @@ -863,7 +864,6 @@
> /* I2C Registers */
> /****************************************/
>
> -#define MV64XXX_I2C_CTLR_NAME "mv64xxx_i2c"
> #define MV64XXX_I2C_OFFSET 0xc000
> #define MV64XXX_I2C_REG_BLOCK_SIZE 0x0020
>
> @@ -968,14 +968,6 @@ struct mpsc_pdata {
> u32 brg_clk_freq;
> };
>
> -/* i2c Platform Device, Driver Data */
> -struct mv64xxx_i2c_pdata {
> - u32 freq_m;
> - u32 freq_n;
> - u32 timeout; /* In milliseconds */
> - u32 retries;
> -};
> -
> /* Watchdog Platform Device, Driver Data */
> #define MV64x60_WDT_NAME "mv64x60_wdt"
>
> diff --git a/include/linux/mv643xx_i2c.h b/include/linux/mv643xx_i2c.h
> new file mode 100644
> index 0000000..adb629b
> --- /dev/null
> +++ b/include/linux/mv643xx_i2c.h
> @@ -0,0 +1,23 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
> + */
> +
> +#ifndef _MV64XXX_I2C_H_
> +#define _MV64XXX_I2C_H_
> +
> +#include <linux/types.h>
> +
> +#define MV64XXX_I2C_CTLR_NAME "mv64xxx_i2c"
> +
> +/* i2c Platform Device, Driver Data */
> +struct mv64xxx_i2c_pdata {
> + u32 freq_m;
> + u32 freq_n;
> + u32 timeout; /* In milliseconds */
> + u32 retries;
> +};
> +
> +#endif /*_MV64XXX_I2C_H_*/
Patch looks alright to me this time:
Acked-by: Jean Delvare <khali at linux-fr.org>
I'll take it in my i2c tree, unless it's more convenient for you to
push it through the arm tree.
--
Jean Delvare
More information about the i2c
mailing list