Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
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()
This commit is contained in:
commit
06d2e7812e
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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",
|
||||||
|
@ -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 "
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user