Merge v3.6-rc3 into 'char-misc-next'
This resolves a conflict in: drivers/misc/mei/interrupt.c Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -60,7 +60,6 @@ config W1_MASTER_GPIO
|
||||
|
||||
config HDQ_MASTER_OMAP
|
||||
tristate "OMAP HDQ driver"
|
||||
depends on ARCH_OMAP2PLUS
|
||||
help
|
||||
Say Y here if you want support for the 1-wire or HDQ Interface
|
||||
on an OMAP processor.
|
||||
|
@@ -18,9 +18,6 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#include "../w1.h"
|
||||
#include "../w1_int.h"
|
||||
|
||||
@@ -73,11 +70,11 @@ struct hdq_data {
|
||||
};
|
||||
|
||||
static int __devinit omap_hdq_probe(struct platform_device *pdev);
|
||||
static int omap_hdq_remove(struct platform_device *pdev);
|
||||
static int __devexit omap_hdq_remove(struct platform_device *pdev);
|
||||
|
||||
static struct platform_driver omap_hdq_driver = {
|
||||
.probe = omap_hdq_probe,
|
||||
.remove = omap_hdq_remove,
|
||||
.remove = __devexit_p(omap_hdq_remove),
|
||||
.driver = {
|
||||
.name = "omap_hdq",
|
||||
},
|
||||
@@ -538,39 +535,35 @@ static void omap_w1_write_byte(void *_hdq, u8 byte)
|
||||
hdq_data->init_trans = 0;
|
||||
mutex_unlock(&hdq_data->hdq_mutex);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static int __devinit omap_hdq_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct hdq_data *hdq_data;
|
||||
struct resource *res;
|
||||
int ret, irq;
|
||||
u8 rev;
|
||||
|
||||
hdq_data = kmalloc(sizeof(*hdq_data), GFP_KERNEL);
|
||||
hdq_data = devm_kzalloc(dev, sizeof(*hdq_data), GFP_KERNEL);
|
||||
if (!hdq_data) {
|
||||
dev_dbg(&pdev->dev, "unable to allocate memory\n");
|
||||
ret = -ENOMEM;
|
||||
goto err_kmalloc;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
hdq_data->dev = &pdev->dev;
|
||||
hdq_data->dev = dev;
|
||||
platform_set_drvdata(pdev, hdq_data);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
dev_dbg(&pdev->dev, "unable to get resource\n");
|
||||
ret = -ENXIO;
|
||||
goto err_resource;
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
hdq_data->hdq_base = ioremap(res->start, SZ_4K);
|
||||
hdq_data->hdq_base = devm_request_and_ioremap(dev, res);
|
||||
if (!hdq_data->hdq_base) {
|
||||
dev_dbg(&pdev->dev, "ioremap failed\n");
|
||||
ret = -EINVAL;
|
||||
goto err_ioremap;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
hdq_data->hdq_usecount = 0;
|
||||
@@ -591,7 +584,8 @@ static int __devinit omap_hdq_probe(struct platform_device *pdev)
|
||||
goto err_irq;
|
||||
}
|
||||
|
||||
ret = request_irq(irq, hdq_isr, IRQF_DISABLED, "omap_hdq", hdq_data);
|
||||
ret = devm_request_irq(dev, irq, hdq_isr, IRQF_DISABLED,
|
||||
"omap_hdq", hdq_data);
|
||||
if (ret < 0) {
|
||||
dev_dbg(&pdev->dev, "could not request irq\n");
|
||||
goto err_irq;
|
||||
@@ -616,19 +610,10 @@ err_irq:
|
||||
err_w1:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
iounmap(hdq_data->hdq_base);
|
||||
|
||||
err_ioremap:
|
||||
err_resource:
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
kfree(hdq_data);
|
||||
|
||||
err_kmalloc:
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static int omap_hdq_remove(struct platform_device *pdev)
|
||||
static int __devexit omap_hdq_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct hdq_data *hdq_data = platform_get_drvdata(pdev);
|
||||
|
||||
@@ -644,27 +629,11 @@ static int omap_hdq_remove(struct platform_device *pdev)
|
||||
|
||||
/* remove module dependency */
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
free_irq(INT_24XX_HDQ_IRQ, hdq_data);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
iounmap(hdq_data->hdq_base);
|
||||
kfree(hdq_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init
|
||||
omap_hdq_init(void)
|
||||
{
|
||||
return platform_driver_register(&omap_hdq_driver);
|
||||
}
|
||||
module_init(omap_hdq_init);
|
||||
|
||||
static void __exit
|
||||
omap_hdq_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&omap_hdq_driver);
|
||||
}
|
||||
module_exit(omap_hdq_exit);
|
||||
module_platform_driver(omap_hdq_driver);
|
||||
|
||||
module_param(w1_id, int, S_IRUSR);
|
||||
MODULE_PARM_DESC(w1_id, "1-wire id for the slave detection");
|
||||
|
@@ -14,6 +14,8 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/w1-gpio.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/of_gpio.h>
|
||||
|
||||
#include "../w1.h"
|
||||
#include "../w1_int.h"
|
||||
@@ -42,12 +44,55 @@ static u8 w1_gpio_read_bit(void *data)
|
||||
return gpio_get_value(pdata->pin) ? 1 : 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct of_device_id w1_gpio_dt_ids[] = {
|
||||
{ .compatible = "w1-gpio" },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, w1_gpio_dt_ids);
|
||||
|
||||
static int w1_gpio_probe_dt(struct platform_device *pdev)
|
||||
{
|
||||
struct w1_gpio_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const struct of_device_id *of_id =
|
||||
of_match_device(w1_gpio_dt_ids, &pdev->dev);
|
||||
|
||||
if (!of_id)
|
||||
return 0;
|
||||
|
||||
pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata)
|
||||
return -ENOMEM;
|
||||
|
||||
if (of_get_property(np, "linux,open-drain", NULL))
|
||||
pdata->is_open_drain = 1;
|
||||
|
||||
pdata->pin = of_get_gpio(np, 0);
|
||||
pdata->ext_pullup_enable_pin = of_get_gpio(np, 1);
|
||||
pdev->dev.platform_data = pdata;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int w1_gpio_probe_dt(struct platform_device *pdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __init w1_gpio_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct w1_bus_master *master;
|
||||
struct w1_gpio_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct w1_gpio_platform_data *pdata;
|
||||
int err;
|
||||
|
||||
err = w1_gpio_probe_dt(pdev);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
pdata = pdev->dev.platform_data;
|
||||
|
||||
if (!pdata)
|
||||
return -ENXIO;
|
||||
|
||||
@@ -59,6 +104,13 @@ static int __init w1_gpio_probe(struct platform_device *pdev)
|
||||
if (err)
|
||||
goto free_master;
|
||||
|
||||
if (gpio_is_valid(pdata->ext_pullup_enable_pin)) {
|
||||
err = gpio_request_one(pdata->ext_pullup_enable_pin,
|
||||
GPIOF_INIT_LOW, "w1 pullup");
|
||||
if (err < 0)
|
||||
goto free_gpio;
|
||||
}
|
||||
|
||||
master->data = pdata;
|
||||
master->read_bit = w1_gpio_read_bit;
|
||||
|
||||
@@ -72,15 +124,21 @@ static int __init w1_gpio_probe(struct platform_device *pdev)
|
||||
|
||||
err = w1_add_master_device(master);
|
||||
if (err)
|
||||
goto free_gpio;
|
||||
goto free_gpio_ext_pu;
|
||||
|
||||
if (pdata->enable_external_pullup)
|
||||
pdata->enable_external_pullup(1);
|
||||
|
||||
if (gpio_is_valid(pdata->ext_pullup_enable_pin))
|
||||
gpio_set_value(pdata->ext_pullup_enable_pin, 1);
|
||||
|
||||
platform_set_drvdata(pdev, master);
|
||||
|
||||
return 0;
|
||||
|
||||
free_gpio_ext_pu:
|
||||
if (gpio_is_valid(pdata->ext_pullup_enable_pin))
|
||||
gpio_free(pdata->ext_pullup_enable_pin);
|
||||
free_gpio:
|
||||
gpio_free(pdata->pin);
|
||||
free_master:
|
||||
@@ -97,6 +155,9 @@ static int __exit w1_gpio_remove(struct platform_device *pdev)
|
||||
if (pdata->enable_external_pullup)
|
||||
pdata->enable_external_pullup(0);
|
||||
|
||||
if (gpio_is_valid(pdata->ext_pullup_enable_pin))
|
||||
gpio_set_value(pdata->ext_pullup_enable_pin, 0);
|
||||
|
||||
w1_remove_master_device(master);
|
||||
gpio_free(pdata->pin);
|
||||
kfree(master);
|
||||
@@ -135,6 +196,7 @@ static struct platform_driver w1_gpio_driver = {
|
||||
.driver = {
|
||||
.name = "w1-gpio",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(w1_gpio_dt_ids),
|
||||
},
|
||||
.remove = __exit_p(w1_gpio_remove),
|
||||
.suspend = w1_gpio_suspend,
|
||||
|
Reference in New Issue
Block a user