Commit f7a9a4d7 authored by Linus Walleij's avatar Linus Walleij Committed by Russell King

[ARM] 5510/1: U300 GPIO debug and init fixes

This moves the GPIO driver away from using __devinit and __devexit
It also removes all printk() in favor of using dev_* print macros
on pdev->dev struct instead. Surplus prints are removed, and the
platform_device_probe() function is used instead of putting a
.probe function in the platform driver struct.
Signed-off-by: default avatarLinus Walleij <linus.walleij@stericsson.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent d98aac75
...@@ -36,6 +36,7 @@ static struct clk *clk; ...@@ -36,6 +36,7 @@ static struct clk *clk;
/* Memory resource */ /* Memory resource */
static struct resource *memres; static struct resource *memres;
static void __iomem *virtbase; static void __iomem *virtbase;
static struct device *gpiodev;
struct u300_gpio_port { struct u300_gpio_port {
const char *name; const char *name;
...@@ -264,8 +265,8 @@ static struct gpio_struct gpio_pin[U300_GPIO_MAX]; ...@@ -264,8 +265,8 @@ static struct gpio_struct gpio_pin[U300_GPIO_MAX];
int gpio_register_callback(unsigned gpio, int (*func)(void *arg), void *data) int gpio_register_callback(unsigned gpio, int (*func)(void *arg), void *data)
{ {
if (gpio_pin[gpio].callback) if (gpio_pin[gpio].callback)
printk(KERN_WARNING "GPIO: %s: WARNING: callback already " \ dev_warn(gpiodev, "%s: WARNING: callback already "
"registered for gpio pin#%d\n", __func__, gpio); "registered for gpio pin#%d\n", __func__, gpio);
gpio_pin[gpio].callback = func; gpio_pin[gpio].callback = func;
gpio_pin[gpio].data = data; gpio_pin[gpio].data = data;
...@@ -276,8 +277,8 @@ EXPORT_SYMBOL(gpio_register_callback); ...@@ -276,8 +277,8 @@ EXPORT_SYMBOL(gpio_register_callback);
int gpio_unregister_callback(unsigned gpio) int gpio_unregister_callback(unsigned gpio)
{ {
if (!gpio_pin[gpio].callback) if (!gpio_pin[gpio].callback)
printk(KERN_WARNING "GPIO: %s: WARNING: callback already " \ dev_warn(gpiodev, "%s: WARNING: callback already "
"unregistered for gpio pin#%d\n", __func__, gpio); "unregistered for gpio pin#%d\n", __func__, gpio);
gpio_pin[gpio].callback = NULL; gpio_pin[gpio].callback = NULL;
gpio_pin[gpio].data = NULL; gpio_pin[gpio].data = NULL;
...@@ -303,8 +304,8 @@ void gpio_free(unsigned gpio) ...@@ -303,8 +304,8 @@ void gpio_free(unsigned gpio)
gpio_users--; gpio_users--;
gpio_pin[gpio].users--; gpio_pin[gpio].users--;
if (unlikely(gpio_pin[gpio].users < 0)) { if (unlikely(gpio_pin[gpio].users < 0)) {
printk(KERN_WARNING "GPIO: Warning: gpio#%d release mismatch\n", dev_warn(gpiodev, "warning: gpio#%d release mismatch\n",
gpio); gpio);
gpio_pin[gpio].users = 0; gpio_pin[gpio].users = 0;
} }
...@@ -492,7 +493,7 @@ static irqreturn_t gpio_irq_handler(int irq, void *dev_id) ...@@ -492,7 +493,7 @@ static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
if (gpio_pin[gpio].callback) if (gpio_pin[gpio].callback)
(void)gpio_pin[gpio].callback(gpio_pin[gpio].data); (void)gpio_pin[gpio].callback(gpio_pin[gpio].data);
else else
printk(KERN_DEBUG "GPIO: Stray GPIO IRQ on line %d\n", dev_dbg(gpiodev, "stray GPIO IRQ on line %d\n",
gpio); gpio);
} }
return IRQ_HANDLED; return IRQ_HANDLED;
...@@ -548,25 +549,26 @@ static void gpio_set_initial_values(void) ...@@ -548,25 +549,26 @@ static void gpio_set_initial_values(void)
#endif #endif
} }
static int __devinit gpio_probe(struct platform_device *pdev) static int __init gpio_probe(struct platform_device *pdev)
{ {
u32 val; u32 val;
int err = 0; int err = 0;
int i; int i;
int num_irqs; int num_irqs;
gpiodev = &pdev->dev;
memset(gpio_pin, 0, sizeof(gpio_pin)); memset(gpio_pin, 0, sizeof(gpio_pin));
/* Get GPIO clock */ /* Get GPIO clock */
clk = clk_get(&pdev->dev, NULL); clk = clk_get(&pdev->dev, NULL);
if (IS_ERR(clk)) { if (IS_ERR(clk)) {
err = PTR_ERR(clk); err = PTR_ERR(clk);
printk(KERN_ERR "GPIO: could not get GPIO clock\n"); dev_err(gpiodev, "could not get GPIO clock\n");
goto err_no_clk; goto err_no_clk;
} }
err = clk_enable(clk); err = clk_enable(clk);
if (err) { if (err) {
printk(KERN_ERR "GPIO: could not enable GPIO clock\n"); dev_err(gpiodev, "could not enable GPIO clock\n");
goto err_no_clk_enable; goto err_no_clk_enable;
} }
...@@ -580,22 +582,24 @@ static int __devinit gpio_probe(struct platform_device *pdev) ...@@ -580,22 +582,24 @@ static int __devinit gpio_probe(struct platform_device *pdev)
goto err_no_ioregion; goto err_no_ioregion;
} }
virtbase = ioremap(memres->start, memres->end - memres->start + 1); virtbase = ioremap(memres->start, resource_size(memres));
if (!virtbase) { if (!virtbase) {
err = -ENOMEM; err = -ENOMEM;
goto err_no_ioremap; goto err_no_ioremap;
} }
dev_info(gpiodev, "remapped 0x%08x to %p\n",
memres->start, virtbase);
#ifdef U300_COH901335 #ifdef U300_COH901335
printk(KERN_INFO "GPIO: Initializing GPIO Controller COH 901 335\n"); dev_info(gpiodev, "initializing GPIO Controller COH 901 335\n");
/* Turn on the GPIO block */ /* Turn on the GPIO block */
writel(U300_GPIO_CR_BLOCK_CLOCK_ENABLE, virtbase + U300_GPIO_CR); writel(U300_GPIO_CR_BLOCK_CLOCK_ENABLE, virtbase + U300_GPIO_CR);
#endif #endif
#ifdef U300_COH901571_3 #ifdef U300_COH901571_3
printk(KERN_INFO "GPIO: Initializing GPIO Controller COH 901 571/3\n"); dev_info(gpiodev, "initializing GPIO Controller COH 901 571/3\n");
val = readl(virtbase + U300_GPIO_CR); val = readl(virtbase + U300_GPIO_CR);
printk(KERN_INFO "GPIO: COH901571/3 block version: %d, " \ dev_info(gpiodev, "COH901571/3 block version: %d, " \
"number of cores: %d\n", "number of cores: %d\n",
((val & 0x0000FE00) >> 9), ((val & 0x0000FE00) >> 9),
((val & 0x000001FC) >> 2)); ((val & 0x000001FC) >> 2));
...@@ -623,15 +627,14 @@ static int __devinit gpio_probe(struct platform_device *pdev) ...@@ -623,15 +627,14 @@ static int __devinit gpio_probe(struct platform_device *pdev)
gpio_ports[num_irqs].name, gpio_ports[num_irqs].name,
&gpio_ports[num_irqs]); &gpio_ports[num_irqs]);
if (err) { if (err) {
printk(KERN_CRIT "GPIO: Cannot allocate IRQ for %s!\n", dev_err(gpiodev, "cannot allocate IRQ for %s!\n",
gpio_ports[num_irqs].name); gpio_ports[num_irqs].name);
goto err_no_irq; goto err_no_irq;
} }
/* Turns off PortX_irq_force */ /* Turns off PortX_irq_force */
writel(0x0, virtbase + U300_GPIO_PXIFR + writel(0x0, virtbase + U300_GPIO_PXIFR +
num_irqs * U300_GPIO_PORTX_SPACING); num_irqs * U300_GPIO_PORTX_SPACING);
} }
printk(KERN_INFO "GPIO: U300 gpio module loaded\n");
return 0; return 0;
...@@ -647,11 +650,11 @@ static int __devinit gpio_probe(struct platform_device *pdev) ...@@ -647,11 +650,11 @@ static int __devinit gpio_probe(struct platform_device *pdev)
err_no_clk_enable: err_no_clk_enable:
clk_put(clk); clk_put(clk);
err_no_clk: err_no_clk:
printk(KERN_INFO "GPIO: module ERROR:%d\n", err); dev_info(gpiodev, "module ERROR:%d\n", err);
return err; return err;
} }
static int __devexit gpio_remove(struct platform_device *pdev) static int __exit gpio_remove(struct platform_device *pdev)
{ {
int i; int i;
...@@ -670,14 +673,13 @@ static struct platform_driver gpio_driver = { ...@@ -670,14 +673,13 @@ static struct platform_driver gpio_driver = {
.driver = { .driver = {
.name = "u300-gpio", .name = "u300-gpio",
}, },
.probe = gpio_probe, .remove = __exit_p(gpio_remove),
.remove = __devexit_p(gpio_remove),
}; };
static int __init u300_gpio_init(void) static int __init u300_gpio_init(void)
{ {
return platform_driver_register(&gpio_driver); return platform_driver_probe(&gpio_driver, gpio_probe);
} }
static void __exit u300_gpio_exit(void) static void __exit u300_gpio_exit(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment