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

Commit 06d2e781 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull more i2c updates from Wolfram Sang:
 "Here is the second pull request from I2C for this merge window:

   - one new feature (which nearly fell through the cracks): i2c-dev
     does now use the cdev API so it can handle >256 minors.  Seems
     people do need that.

   - two fixes for the just added DMA feature for i2c-rcar

   - some typo fixes"

* 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
  i2c: dev: don't start function name with 'return'
  i2c: dev: switch from register_chrdev to cdev API
  i2c: xlr: rename ARCH_TANGOX to ARCH_TANGO
  i2c: at91: change log when dma configuration fails
  misc: at24: Fix typo in at24 header file
  i2c: rcar: should depend on HAS_DMA
  i2c: rcar: use dma_request_chan()
parents 7d8eb502 72a71f86
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -965,7 +965,7 @@ config I2C_XILINX


config I2C_XLR
config I2C_XLR
	tristate "Netlogic XLR and Sigma Designs I2C support"
	tristate "Netlogic XLR and Sigma Designs I2C support"
	depends on CPU_XLR || ARCH_TANGOX
	depends on CPU_XLR || ARCH_TANGO
	help
	help
	  This driver enables support for the on-chip I2C interface of
	  This driver enables support for the on-chip I2C interface of
	  the Netlogic XLR/XLS MIPS processors and Sigma Designs SOCs.
	  the Netlogic XLR/XLS MIPS processors and Sigma Designs SOCs.
@@ -985,6 +985,7 @@ config I2C_XLP9XX


config I2C_RCAR
config I2C_RCAR
	tristate "Renesas R-Car I2C Controller"
	tristate "Renesas R-Car I2C Controller"
	depends on HAS_DMA
	depends on ARCH_RENESAS || COMPILE_TEST
	depends on ARCH_RENESAS || COMPILE_TEST
	select I2C_SLAVE
	select I2C_SLAVE
	help
	help
+1 −1
Original line number Original line Diff line number Diff line
@@ -1013,7 +1013,7 @@ static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr)


error:
error:
	if (ret != -EPROBE_DEFER)
	if (ret != -EPROBE_DEFER)
		dev_info(dev->dev, "can't use DMA, error %d\n", ret);
		dev_info(dev->dev, "can't get DMA channel, continue without DMA support\n");
	if (dma->chan_rx)
	if (dma->chan_rx)
		dma_release_channel(dma->chan_rx);
		dma_release_channel(dma->chan_rx);
	if (dma->chan_tx)
	if (dma->chan_tx)
+1 −1
Original line number Original line Diff line number Diff line
@@ -623,7 +623,7 @@ static struct dma_chan *rcar_i2c_request_dma_chan(struct device *dev,
	char *chan_name = dir == DMA_MEM_TO_DEV ? "tx" : "rx";
	char *chan_name = dir == DMA_MEM_TO_DEV ? "tx" : "rx";
	int ret;
	int ret;


	chan = dma_request_slave_channel_reason(dev, chan_name);
	chan = dma_request_chan(dev, chan_name);
	if (IS_ERR(chan)) {
	if (IS_ERR(chan)) {
		ret = PTR_ERR(chan);
		ret = PTR_ERR(chan);
		dev_dbg(dev, "request_channel failed for %s (%d)\n",
		dev_dbg(dev, "request_channel failed for %s (%d)\n",
+18 −7
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@


/* The I2C_RDWR ioctl code is written by Kolja Waschk <waschk@telos.de> */
/* The I2C_RDWR ioctl code is written by Kolja Waschk <waschk@telos.de> */


#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/fs.h>
#include <linux/i2c-dev.h>
#include <linux/i2c-dev.h>
@@ -47,9 +48,10 @@ struct i2c_dev {
	struct list_head list;
	struct list_head list;
	struct i2c_adapter *adap;
	struct i2c_adapter *adap;
	struct device *dev;
	struct device *dev;
	struct cdev cdev;
};
};


#define I2C_MINORS	256
#define I2C_MINORS	MINORMASK
static LIST_HEAD(i2c_dev_list);
static LIST_HEAD(i2c_dev_list);
static DEFINE_SPINLOCK(i2c_dev_list_lock);
static DEFINE_SPINLOCK(i2c_dev_list_lock);


@@ -89,7 +91,7 @@ static struct i2c_dev *get_free_i2c_dev(struct i2c_adapter *adap)
	return i2c_dev;
	return i2c_dev;
}
}


static void return_i2c_dev(struct i2c_dev *i2c_dev)
static void put_i2c_dev(struct i2c_dev *i2c_dev)
{
{
	spin_lock(&i2c_dev_list_lock);
	spin_lock(&i2c_dev_list_lock);
	list_del(&i2c_dev->list);
	list_del(&i2c_dev->list);
@@ -552,6 +554,12 @@ static int i2cdev_attach_adapter(struct device *dev, void *dummy)
	if (IS_ERR(i2c_dev))
	if (IS_ERR(i2c_dev))
		return PTR_ERR(i2c_dev);
		return PTR_ERR(i2c_dev);


	cdev_init(&i2c_dev->cdev, &i2cdev_fops);
	i2c_dev->cdev.owner = THIS_MODULE;
	res = cdev_add(&i2c_dev->cdev, MKDEV(I2C_MAJOR, adap->nr), 1);
	if (res)
		goto error_cdev;

	/* register this i2c device with the driver core */
	/* register this i2c device with the driver core */
	i2c_dev->dev = device_create(i2c_dev_class, &adap->dev,
	i2c_dev->dev = device_create(i2c_dev_class, &adap->dev,
				     MKDEV(I2C_MAJOR, adap->nr), NULL,
				     MKDEV(I2C_MAJOR, adap->nr), NULL,
@@ -565,7 +573,9 @@ static int i2cdev_attach_adapter(struct device *dev, void *dummy)
		 adap->name, adap->nr);
		 adap->name, adap->nr);
	return 0;
	return 0;
error:
error:
	return_i2c_dev(i2c_dev);
	cdev_del(&i2c_dev->cdev);
error_cdev:
	put_i2c_dev(i2c_dev);
	return res;
	return res;
}
}


@@ -582,8 +592,9 @@ static int i2cdev_detach_adapter(struct device *dev, void *dummy)
	if (!i2c_dev) /* attach_adapter must have failed */
	if (!i2c_dev) /* attach_adapter must have failed */
		return 0;
		return 0;


	return_i2c_dev(i2c_dev);
	put_i2c_dev(i2c_dev);
	device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr));
	device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr));
	cdev_del(&i2c_dev->cdev);


	pr_debug("i2c-dev: adapter [%s] unregistered\n", adap->name);
	pr_debug("i2c-dev: adapter [%s] unregistered\n", adap->name);
	return 0;
	return 0;
@@ -620,7 +631,7 @@ static int __init i2c_dev_init(void)


	printk(KERN_INFO "i2c /dev entries driver\n");
	printk(KERN_INFO "i2c /dev entries driver\n");


	res = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops);
	res = register_chrdev_region(MKDEV(I2C_MAJOR, 0), I2C_MINORS, "i2c");
	if (res)
	if (res)
		goto out;
		goto out;


@@ -644,7 +655,7 @@ static int __init i2c_dev_init(void)
out_unreg_class:
out_unreg_class:
	class_destroy(i2c_dev_class);
	class_destroy(i2c_dev_class);
out_unreg_chrdev:
out_unreg_chrdev:
	unregister_chrdev(I2C_MAJOR, "i2c");
	unregister_chrdev_region(MKDEV(I2C_MAJOR, 0), I2C_MINORS);
out:
out:
	printk(KERN_ERR "%s: Driver Initialisation failed\n", __FILE__);
	printk(KERN_ERR "%s: Driver Initialisation failed\n", __FILE__);
	return res;
	return res;
@@ -655,7 +666,7 @@ static void __exit i2c_dev_exit(void)
	bus_unregister_notifier(&i2c_bus_type, &i2cdev_notifier);
	bus_unregister_notifier(&i2c_bus_type, &i2cdev_notifier);
	i2c_for_each_dev(NULL, i2cdev_detach_adapter);
	i2c_for_each_dev(NULL, i2cdev_detach_adapter);
	class_destroy(i2c_dev_class);
	class_destroy(i2c_dev_class);
	unregister_chrdev(I2C_MAJOR, "i2c");
	unregister_chrdev_region(MKDEV(I2C_MAJOR, 0), I2C_MINORS);
}
}


MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl> and "
MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl> and "
+1 −1
Original line number Original line Diff line number Diff line
@@ -26,7 +26,7 @@
 *
 *
 * An example in pseudo code for a setup() callback:
 * An example in pseudo code for a setup() callback:
 *
 *
 * void get_mac_addr(struct mvmem_device *nvmem, void *context)
 * void get_mac_addr(struct nvmem_device *nvmem, void *context)
 * {
 * {
 *	u8 *mac_addr = ethernet_pdata->mac_addr;
 *	u8 *mac_addr = ethernet_pdata->mac_addr;
 *	off_t offset = context;
 *	off_t offset = context;