Skip to content

Commit

Permalink
ARM: 6104/1: nomadik-gpio: use clk API
Browse files Browse the repository at this point in the history
Add clocks with appropriate names in platforms that use it, and use the
clk API in nomadik-gpio.

Acked-by: Alessandro Rubini <rubini@unipv.it>
Acked-by: Linus Walleij <linus.walleij@stericsson.com>
Acked-by: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Rabin Vincent authored and Russell King committed May 6, 2010
1 parent dc6048c commit af7dc22
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 6 deletions.
10 changes: 10 additions & 0 deletions arch/arm/mach-nomadik/clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ static struct clk clk_48 = {
.rate = 48 * 1000 * 1000,
};

/*
* Catch-all default clock to satisfy drivers using the clk API. We don't
* model the actual hardware clocks yet.
*/
static struct clk clk_default;

#define CLK(_clk, dev) \
{ \
.clk = _clk, \
Expand All @@ -46,6 +52,10 @@ static struct clk clk_48 = {
static struct clk_lookup lookups[] = {
CLK(&clk_48, "uart0"),
CLK(&clk_48, "uart1"),
CLK(&clk_default, "gpio.0"),
CLK(&clk_default, "gpio.1"),
CLK(&clk_default, "gpio.2"),
CLK(&clk_default, "gpio.3"),
};

static int __init clk_init(void)
Expand Down
16 changes: 11 additions & 5 deletions arch/arm/mach-ux500/clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,8 @@ static DEFINE_PRCC_CLK(7, cfgreg_ed, 0, -1, NULL);

static struct clk_lookup u8500_common_clks[] = {
/* Peripheral Cluster #1 */
CLK(gpio0, "gpioblock0", NULL),
CLK(gpio0, "gpio.0", NULL),
CLK(gpio0, "gpio.1", NULL),
CLK(slimbus0, "slimbus0", NULL),
CLK(i2c2, "nmk-i2c.2", NULL),
CLK(sdi0, "sdi0", NULL),
Expand All @@ -374,7 +375,10 @@ static struct clk_lookup u8500_common_clks[] = {
CLK(uart0, "uart0", NULL),

/* Peripheral Cluster #3 */
CLK(gpio2, "gpioblock2", NULL),
CLK(gpio2, "gpio.2", NULL),
CLK(gpio2, "gpio.3", NULL),
CLK(gpio2, "gpio.4", NULL),
CLK(gpio2, "gpio.5", NULL),
CLK(sdi5, "sdi5", NULL),
CLK(uart2, "uart2", NULL),
CLK(ske, "ske", NULL),
Expand All @@ -383,7 +387,7 @@ static struct clk_lookup u8500_common_clks[] = {
CLK(fsmc, "fsmc", NULL),

/* Peripheral Cluster #5 */
CLK(gpio3, "gpioblock3", NULL),
CLK(gpio3, "gpio.8", NULL),

/* Peripheral Cluster #6 */
CLK(hash1, "hash1", NULL),
Expand Down Expand Up @@ -418,7 +422,8 @@ static struct clk_lookup u8500_ed_clks[] = {
CLK(msp1_ed, "msp1", NULL),

/* Peripheral Cluster #2 */
CLK(gpio1_ed, "gpioblock1", NULL),
CLK(gpio1_ed, "gpio.6", NULL),
CLK(gpio1_ed, "gpio.7", NULL),
CLK(ssitx_ed, "ssitx", NULL),
CLK(ssirx_ed, "ssirx", NULL),
CLK(spi0_ed, "spi0", NULL),
Expand Down Expand Up @@ -458,7 +463,8 @@ static struct clk_lookup u8500_v1_clks[] = {
CLK(msp1_v1, "msp1", NULL),

/* Peripheral Cluster #2 */
CLK(gpio1_v1, "gpioblock1", NULL),
CLK(gpio1_v1, "gpio.6", NULL),
CLK(gpio1_v1, "gpio.7", NULL),
CLK(ssitx_v1, "ssitx", NULL),
CLK(ssirx_v1, "ssirx", NULL),
CLK(spi0_v1, "spi0", NULL),
Expand Down
20 changes: 19 additions & 1 deletion arch/arm/plat-nomadik/gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/gpio.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
Expand All @@ -35,6 +37,7 @@
struct nmk_gpio_chip {
struct gpio_chip chip;
void __iomem *addr;
struct clk *clk;
unsigned int parent_irq;
spinlock_t lock;
/* Keep track of configured edges */
Expand Down Expand Up @@ -310,6 +313,7 @@ static int __init nmk_gpio_probe(struct platform_device *dev)
struct nmk_gpio_chip *nmk_chip;
struct gpio_chip *chip;
struct resource *res;
struct clk *clk;
int irq;
int ret;

Expand All @@ -334,15 +338,24 @@ static int __init nmk_gpio_probe(struct platform_device *dev)
goto out;
}

clk = clk_get(&dev->dev, NULL);
if (IS_ERR(clk)) {
ret = PTR_ERR(clk);
goto out_release;
}

clk_enable(clk);

nmk_chip = kzalloc(sizeof(*nmk_chip), GFP_KERNEL);
if (!nmk_chip) {
ret = -ENOMEM;
goto out_release;
goto out_clk;
}
/*
* The virt address in nmk_chip->addr is in the nomadik register space,
* so we can simply convert the resource address, without remapping
*/
nmk_chip->clk = clk;
nmk_chip->addr = io_p2v(res->start);
nmk_chip->chip = nmk_gpio_template;
nmk_chip->parent_irq = irq;
Expand All @@ -368,6 +381,9 @@ static int __init nmk_gpio_probe(struct platform_device *dev)

out_free:
kfree(nmk_chip);
out_clk:
clk_disable(clk);
clk_put(clk);
out_release:
release_mem_region(res->start, resource_size(res));
out:
Expand All @@ -385,6 +401,8 @@ static int __exit nmk_gpio_remove(struct platform_device *dev)

nmk_chip = platform_get_drvdata(dev);
gpiochip_remove(&nmk_chip->chip);
clk_disable(nmk_chip->clk);
clk_put(nmk_chip->clk);
kfree(nmk_chip);
release_mem_region(res->start, resource_size(res));
return 0;
Expand Down

0 comments on commit af7dc22

Please sign in to comment.