Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 303294
b: refs/heads/master
c: 339bcf3
h: refs/heads/master
v: v3
  • Loading branch information
Rabin Vincent authored and Linus Walleij committed Apr 24, 2012
1 parent 92d62da commit 70e8413
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 68293b3ad2e407f8d6b407f3e60811e068e5fe40
refs/heads/master: 339bcf3b49832b6c6826f3549355fc8dcb6f5810
2 changes: 1 addition & 1 deletion trunk/arch/arm/mach-ux500/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#

obj-y := clock.o cpu.o devices.o devices-common.o \
id.o usb.o timer.o
id.o pins.o usb.o timer.o
obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o
obj-$(CONFIG_UX500_SOC_DB5500) += cpu-db5500.o dma-db5500.o
obj-$(CONFIG_UX500_SOC_DB8500) += cpu-db8500.o devices-db8500.o
Expand Down
1 change: 1 addition & 0 deletions trunk/arch/arm/mach-ux500/board-mop500-pins.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <mach/hardware.h>

#include "pins-db8500.h"
#include "pins.h"

static pin_cfg_t mop500_pins_common[] = {
/* I2C */
Expand Down
88 changes: 88 additions & 0 deletions trunk/arch/arm/mach-ux500/pins.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* Copyright (C) ST-Ericsson SA 2010
*
* Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
* License terms: GNU General Public License (GPL), version 2
*/

#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/device.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
#include <linux/err.h>
#include <plat/pincfg.h>

#include "pins.h"

static LIST_HEAD(pin_lookups);
static DEFINE_MUTEX(pin_lookups_mutex);
static DEFINE_SPINLOCK(pins_lock);

void __init ux500_pins_add(struct ux500_pin_lookup *pl, size_t num)
{
mutex_lock(&pin_lookups_mutex);

while (num--) {
list_add_tail(&pl->node, &pin_lookups);
pl++;
}

mutex_unlock(&pin_lookups_mutex);
}

struct ux500_pins *ux500_pins_get(const char *name)
{
struct ux500_pins *pins = NULL;
struct ux500_pin_lookup *pl;

mutex_lock(&pin_lookups_mutex);

list_for_each_entry(pl, &pin_lookups, node) {
if (!strcmp(pl->name, name)) {
pins = pl->pins;
goto out;
}
}

out:
mutex_unlock(&pin_lookups_mutex);
return pins;
}

int ux500_pins_enable(struct ux500_pins *pins)
{
unsigned long flags;
int ret = 0;

spin_lock_irqsave(&pins_lock, flags);

if (pins->usage++ == 0)
ret = nmk_config_pins(pins->cfg, pins->num);

spin_unlock_irqrestore(&pins_lock, flags);
return ret;
}

int ux500_pins_disable(struct ux500_pins *pins)
{
unsigned long flags;
int ret = 0;

spin_lock_irqsave(&pins_lock, flags);

if (WARN_ON(pins->usage == 0))
goto out;

if (--pins->usage == 0)
ret = nmk_config_pins_sleep(pins->cfg, pins->num);

out:
spin_unlock_irqrestore(&pins_lock, flags);
return ret;
}

void ux500_pins_put(struct ux500_pins *pins)
{
WARN_ON(!pins);
}
46 changes: 46 additions & 0 deletions trunk/arch/arm/mach-ux500/pins.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright (C) ST-Ericsson SA 2010
*
* Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
* License terms: GNU General Public License (GPL), version 2
*/

#ifndef __MACH_UX500_PINS_H
#define __MACH_UX500_PINS_H

#include <linux/list.h>
#include <plat/pincfg.h>

#define PIN_LOOKUP(_name, _pins) \
{ \
.name = _name, \
.pins = _pins, \
}

#define UX500_PINS(name, pins...) \
struct ux500_pins name = { \
.cfg = (pin_cfg_t[]) {pins}, \
.num = ARRAY_SIZE(((pin_cfg_t[]) {pins})), \
}

struct ux500_pins {
int usage;
int num;
pin_cfg_t *cfg;
};

struct ux500_pin_lookup {
struct list_head node;
const char *name;
struct ux500_pins *pins;
};

void __init ux500_pins_add(struct ux500_pin_lookup *pl, size_t num);
void __init ux500_offchip_gpio_init(struct ux500_pins *pins);
struct ux500_pins *ux500_pins_get(const char *name);
int ux500_pins_enable(struct ux500_pins *pins);
int ux500_pins_disable(struct ux500_pins *pins);
void ux500_pins_put(struct ux500_pins *pins);
int pins_for_u9500(void);

#endif

0 comments on commit 70e8413

Please sign in to comment.