[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