Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b24a3144 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6

* 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6:
  i2c: Fix platform driver hotplug/coldplug
  i2c: New driver for the SuperH Mobile I2C bus controller
  i2c/scx200_acb: Don't use 0 as NULL pointer
  i2c-bfin-twi: Fix mismatch in add timer and delete timer
  i2c-bfin-twi: Just let i2c-bfin-twi driver depends on BLACKFIN
  i2c-bfin-twi: Use simpler comment headers and strip out information that is maintained in the scm's log
  i2c-bfin-twi: Cleanup driver descriptions, versions and some module useful information
  i2c-bfin-twi: Add missing pin mux operation
  i2c-bfin-twi: Add platform_resource interface to support multi-port TWI controllers
  i2c-bfin-twi: Add repeat start feature to avoid break of a bundle of i2c master xfer operation
  i2c: Remove trailing whitespaces in busses/Kconfig
  i2c: Replace remaining __FUNCTION__ occurrences
  i2c: Renesas SH7760 I2C master driver
  i2c-dev: Split i2cdev_ioctl
  i2c-ibm_iic: Support building as an of_platform driver
  i2c-ibm_iic: Change the log levels
  i2c: Add platform driver on top of the new pca-algorithm
  i2c-algo-pca: Extend for future drivers
  i2c-algo-pca: Remove trailing whitespaces and unnecessary UTF
  i2c: Remove the algorithm drivers from the config menu
parents 73486722 add8eda7
Loading
Loading
Loading
Loading
+5 −34
Original line number Diff line number Diff line
#
# Character device configuration
# I2C algorithm drivers configuration
#

menu "I2C Algorithms"

config I2C_ALGOBIT
	tristate "I2C bit-banging interfaces"
	help
	  This allows you to use a range of I2C adapters called bit-banging
	  adapters.  Say Y if you own an I2C adapter belonging to this class
	  and then say Y to the specific driver for you adapter below.

	  This support is also available as a module.  If so, the module 
	  will be called i2c-algo-bit.
	tristate

config I2C_ALGOPCF
	tristate "I2C PCF 8584 interfaces"
	help
	  This allows you to use a range of I2C adapters called PCF adapters.
	  Say Y if you own an I2C adapter belonging to this class and then say
	  Y to the specific driver for you adapter below.

	  This support is also available as a module.  If so, the module 
	  will be called i2c-algo-pcf.
	tristate

config I2C_ALGOPCA
	tristate "I2C PCA 9564 interfaces"
	help
	  This allows you to use a range of I2C adapters called PCA adapters.
	  Say Y if you own an I2C adapter belonging to this class and then say
	  Y to the specific driver for you adapter below.

	  This support is also available as a module.  If so, the module 
	  will be called i2c-algo-pca.
	tristate

config I2C_ALGO_SGI
	tristate "I2C SGI interfaces"
	tristate
	depends on SGI_IP22 || SGI_IP32 || X86_VISWS
	help
	  Supports the SGI interfaces like the ones found on SGI Indy VINO
	  or SGI O2 MACE.

endmenu
+63 −63
Original line number Diff line number Diff line
/*
 *  i2c-algo-pca.c i2c driver algorithms for PCA9564 adapters
 *    Copyright (C) 2004 Arcom Control Systems
 *    Copyright (C) 2008 Pengutronix
 *
 *  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
@@ -21,14 +22,10 @@
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/i2c.h>
#include <linux/i2c-algo-pca.h>
#include "i2c-algo-pca.h"

#define DRIVER "i2c-algo-pca"

#define DEB1(fmt, args...) do { if (i2c_debug>=1) printk(fmt, ## args); } while(0)
#define DEB2(fmt, args...) do { if (i2c_debug>=2) printk(fmt, ## args); } while(0)
@@ -36,15 +33,15 @@

static int i2c_debug;

#define pca_outw(adap, reg, val) adap->write_byte(adap, reg, val)
#define pca_inw(adap, reg) adap->read_byte(adap, reg)
#define pca_outw(adap, reg, val) adap->write_byte(adap->data, reg, val)
#define pca_inw(adap, reg) adap->read_byte(adap->data, reg)

#define pca_status(adap) pca_inw(adap, I2C_PCA_STA)
#define pca_clock(adap) adap->get_clock(adap)
#define pca_own(adap) adap->get_own(adap)
#define pca_clock(adap) adap->i2c_clock
#define pca_set_con(adap, val) pca_outw(adap, I2C_PCA_CON, val)
#define pca_get_con(adap) pca_inw(adap, I2C_PCA_CON)
#define pca_wait(adap) adap->wait_for_interrupt(adap)
#define pca_wait(adap) adap->wait_for_completion(adap->data)
#define pca_reset(adap) adap->reset_chip(adap->data)

/*
 * Generate a start condition on the i2c bus.
@@ -168,15 +165,6 @@ static void pca_rx_ack(struct i2c_algo_pca_data *adap,
	pca_wait(adap);
}

/* 
 * Reset the i2c bus / SIO 
 */
static void pca_reset(struct i2c_algo_pca_data *adap)
{
	/* apparently only an external reset will do it. not a lot can be done */
	printk(KERN_ERR DRIVER ": Haven't figured out how to do a reset yet\n");
}

static int pca_xfer(struct i2c_adapter *i2c_adap,
                    struct i2c_msg *msgs,
                    int num)
@@ -187,7 +175,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
	int numbytes = 0;
	int state;
	int ret;
	int timeout = 100;
	int timeout = i2c_adap->timeout;

	while ((state = pca_status(adap)) != 0xf8 && timeout--) {
		msleep(10);
@@ -317,7 +305,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
			pca_reset(adap);
			goto out;
		default:
			printk(KERN_ERR DRIVER ": unhandled SIO state 0x%02x\n", state);
			dev_err(&i2c_adap->dev, "unhandled SIO state 0x%02x\n", state);
			break;
		}

@@ -337,53 +325,65 @@ static u32 pca_func(struct i2c_adapter *adap)
        return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
}

static int pca_init(struct i2c_algo_pca_data *adap)
static const struct i2c_algorithm pca_algo = {
	.master_xfer	= pca_xfer,
	.functionality	= pca_func,
};

static int pca_init(struct i2c_adapter *adap)
{
	static int freqs[] = {330,288,217,146,88,59,44,36};
	int own, clock;
	int clock;
	struct i2c_algo_pca_data *pca_data = adap->algo_data;

	if (pca_data->i2c_clock > 7) {
		printk(KERN_WARNING "%s: Invalid I2C clock speed selected. Trying default.\n",
			adap->name);
		pca_data->i2c_clock = I2C_PCA_CON_59kHz;
	}

	adap->algo = &pca_algo;

	own = pca_own(adap);
	clock = pca_clock(adap);
	DEB1(KERN_INFO DRIVER ": own address is %#04x\n", own);
	DEB1(KERN_INFO DRIVER ": clock freqeuncy is %dkHz\n", freqs[clock]);
	pca_reset(pca_data);

	pca_outw(adap, I2C_PCA_ADR, own << 1);
	clock = pca_clock(pca_data);
	DEB1(KERN_INFO "%s: Clock frequency is %dkHz\n", adap->name, freqs[clock]);

	pca_set_con(adap, I2C_PCA_CON_ENSIO | clock);
	udelay(500); /* 500 µs for oscilator to stabilise */
	pca_set_con(pca_data, I2C_PCA_CON_ENSIO | clock);
	udelay(500); /* 500 us for oscilator to stabilise */

	return 0;
}

static const struct i2c_algorithm pca_algo = {
	.master_xfer	= pca_xfer,
	.functionality	= pca_func,
};

/*
 * registering functions to load algorithms at runtime
 */
int i2c_pca_add_bus(struct i2c_adapter *adap)
{
	struct i2c_algo_pca_data *pca_adap = adap->algo_data;
	int rval;

	/* register new adapter to i2c module... */
	adap->algo = &pca_algo;

	adap->timeout = 100;		/* default values, should	*/
	adap->retries = 3;		/* be replaced by defines	*/

	if ((rval = pca_init(pca_adap)))
	rval = pca_init(adap);
	if (rval)
		return rval;

	rval = i2c_add_adapter(adap);
	return i2c_add_adapter(adap);
}
EXPORT_SYMBOL(i2c_pca_add_bus);

int i2c_pca_add_numbered_bus(struct i2c_adapter *adap)
{
	int rval;

	rval = pca_init(adap);
	if (rval)
		return rval;

	return i2c_add_numbered_adapter(adap);
}
EXPORT_SYMBOL(i2c_pca_add_bus);
EXPORT_SYMBOL(i2c_pca_add_numbered_bus);

MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>");
MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>, "
	"Wolfram Sang <w.sang@pengutronix.de>");
MODULE_DESCRIPTION("I2C-Bus PCA9564 algorithm");
MODULE_LICENSE("GPL");

drivers/i2c/algos/i2c-algo-pca.h

deleted100644 → 0
+0 −26
Original line number Diff line number Diff line
#ifndef I2C_PCA9564_H
#define I2C_PCA9564_H 1

#define I2C_PCA_STA		0x00 /* STATUS  Read Only  */
#define I2C_PCA_TO		0x00 /* TIMEOUT Write Only */
#define I2C_PCA_DAT		0x01 /* DATA    Read/Write */
#define I2C_PCA_ADR		0x02 /* OWN ADR Read/Write */
#define I2C_PCA_CON		0x03 /* CONTROL Read/Write */

#define I2C_PCA_CON_AA		0x80 /* Assert Acknowledge */
#define I2C_PCA_CON_ENSIO	0x40 /* Enable */
#define I2C_PCA_CON_STA		0x20 /* Start */
#define I2C_PCA_CON_STO		0x10 /* Stop */
#define I2C_PCA_CON_SI		0x08 /* Serial Interrupt */
#define I2C_PCA_CON_CR		0x07 /* Clock Rate (MASK) */

#define I2C_PCA_CON_330kHz	0x00
#define I2C_PCA_CON_288kHz	0x01
#define I2C_PCA_CON_217kHz	0x02
#define I2C_PCA_CON_146kHz	0x03
#define I2C_PCA_CON_88kHz	0x04
#define I2C_PCA_CON_59kHz	0x05
#define I2C_PCA_CON_44kHz	0x06
#define I2C_PCA_CON_36kHz	0x07

#endif /* I2C_PCA9564_H */
+53 −20
Original line number Diff line number Diff line
@@ -100,9 +100,12 @@ config I2C_AU1550

config I2C_BLACKFIN_TWI
	tristate "Blackfin TWI I2C support"
	depends on BF534 || BF536 || BF537
	depends on BLACKFIN
	help
	  This is the TWI I2C device driver for Blackfin 534/536/537/54x.
	  This is the TWI I2C device driver for Blackfin BF522, BF525,
	  BF527, BF534, BF536, BF537 and BF54x. For other Blackfin processors,
	  please don't use this driver.

	  This driver can also be built as a module.  If so, the module
	  will be called i2c-bfin-twi.

@@ -246,7 +249,7 @@ config I2C_PIIX4

config I2C_IBM_IIC
	tristate "IBM PPC 4xx on-chip I2C interface"
	depends on IBM_OCP
	depends on 4xx
	help
	  Say Y here if you want to use IIC peripheral found on
	  embedded IBM PPC 4xx based systems.
@@ -633,7 +636,7 @@ config I2C_PCA_ISA
	default n
	help
	  This driver supports ISA boards using the Philips PCA9564
	  Parallel bus to I2C bus controller
	  parallel bus to I2C bus controller.

	  This driver can also be built as a module.  If so, the module
	  will be called i2c-pca-isa.
@@ -643,6 +646,17 @@ config I2C_PCA_ISA
	  delays when I2C/SMBus chip drivers are loaded (e.g. at boot
	  time).  If unsure, say N.

config I2C_PCA_PLATFORM
	tristate "PCA9564 as platform device"
	select I2C_ALGOPCA
	default n
	help
	  This driver supports a memory mapped Philips PCA9564
	  parallel bus to I2C bus controller.

	  This driver can also be built as a module.  If so, the module
	  will be called i2c-pca-platform.

config I2C_MV64XXX
	tristate "Marvell mv64xxx I2C Controller"
	depends on (MV64X60 || PLAT_ORION) && EXPERIMENTAL
@@ -672,4 +686,23 @@ config I2C_PMCMSP
	  This driver can also be built as module. If so, the module
	  will be called i2c-pmcmsp.

config I2C_SH7760
	tristate "Renesas SH7760 I2C Controller"
	depends on CPU_SUBTYPE_SH7760
	help
	  This driver supports the 2 I2C interfaces on the Renesas SH7760.

	  This driver can also be built as a module.  If so, the module
	  will be called i2c-sh7760.

config I2C_SH_MOBILE
	tristate "SuperH Mobile I2C Controller"
	depends on SUPERH
	help
	  If you say yes to this option, support will be included for the
	  built-in I2C interface on the Renesas SH-Mobile processor.

	  This driver can also be built as a module.  If so, the module
	  will be called i2c-sh_mobile.

endmenu
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ obj-$(CONFIG_I2C_PARPORT) += i2c-parport.o
obj-$(CONFIG_I2C_PARPORT_LIGHT)	+= i2c-parport-light.o
obj-$(CONFIG_I2C_PASEMI)	+= i2c-pasemi.o
obj-$(CONFIG_I2C_PCA_ISA)	+= i2c-pca-isa.o
obj-$(CONFIG_I2C_PCA_PLATFORM)	+= i2c-pca-platform.o
obj-$(CONFIG_I2C_PIIX4)		+= i2c-piix4.o
obj-$(CONFIG_I2C_PMCMSP)	+= i2c-pmcmsp.o
obj-$(CONFIG_I2C_PNX)		+= i2c-pnx.o
@@ -37,6 +38,8 @@ obj-$(CONFIG_I2C_PROSAVAGE) += i2c-prosavage.o
obj-$(CONFIG_I2C_PXA)		+= i2c-pxa.o
obj-$(CONFIG_I2C_S3C2410)	+= i2c-s3c2410.o
obj-$(CONFIG_I2C_SAVAGE4)	+= i2c-savage4.o
obj-$(CONFIG_I2C_SH7760)	+= i2c-sh7760.o
obj-$(CONFIG_I2C_SH_MOBILE)	+= i2c-sh_mobile.o
obj-$(CONFIG_I2C_SIBYTE)	+= i2c-sibyte.o
obj-$(CONFIG_I2C_SIMTEC)	+= i2c-simtec.o
obj-$(CONFIG_I2C_SIS5595)	+= i2c-sis5595.o
Loading