~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to drivers/gpio/tps65910-gpio.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * tps65910-gpio.c  --  TI TPS6591x
 
3
 *
 
4
 * Copyright 2010 Texas Instruments Inc.
 
5
 *
 
6
 * Author: Graeme Gregory <gg@slimlogic.co.uk>
 
7
 * Author: Jorge Eduardo Candelaria jedu@slimlogic.co.uk>
 
8
 *
 
9
 *  This program is free software; you can redistribute it and/or modify it
 
10
 *  under  the terms of the GNU General  Public License as published by the
 
11
 *  Free Software Foundation;  either version 2 of the License, or (at your
 
12
 *  option) any later version.
 
13
 *
 
14
 */
 
15
 
 
16
#include <linux/kernel.h>
 
17
#include <linux/module.h>
 
18
#include <linux/errno.h>
 
19
#include <linux/gpio.h>
 
20
#include <linux/i2c.h>
 
21
#include <linux/mfd/tps65910.h>
 
22
 
 
23
static int tps65910_gpio_get(struct gpio_chip *gc, unsigned offset)
 
24
{
 
25
        struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio);
 
26
        uint8_t val;
 
27
 
 
28
        tps65910->read(tps65910, TPS65910_GPIO0 + offset, 1, &val);
 
29
 
 
30
        if (val & GPIO_STS_MASK)
 
31
                return 1;
 
32
 
 
33
        return 0;
 
34
}
 
35
 
 
36
static void tps65910_gpio_set(struct gpio_chip *gc, unsigned offset,
 
37
                              int value)
 
38
{
 
39
        struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio);
 
40
 
 
41
        if (value)
 
42
                tps65910_set_bits(tps65910, TPS65910_GPIO0 + offset,
 
43
                                                GPIO_SET_MASK);
 
44
        else
 
45
                tps65910_clear_bits(tps65910, TPS65910_GPIO0 + offset,
 
46
                                                GPIO_SET_MASK);
 
47
}
 
48
 
 
49
static int tps65910_gpio_output(struct gpio_chip *gc, unsigned offset,
 
50
                                int value)
 
51
{
 
52
        struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio);
 
53
 
 
54
        /* Set the initial value */
 
55
        tps65910_gpio_set(gc, 0, value);
 
56
 
 
57
        return tps65910_set_bits(tps65910, TPS65910_GPIO0 + offset,
 
58
                                                GPIO_CFG_MASK);
 
59
}
 
60
 
 
61
static int tps65910_gpio_input(struct gpio_chip *gc, unsigned offset)
 
62
{
 
63
        struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio);
 
64
 
 
65
        return tps65910_clear_bits(tps65910, TPS65910_GPIO0 + offset,
 
66
                                                GPIO_CFG_MASK);
 
67
}
 
68
 
 
69
void tps65910_gpio_init(struct tps65910 *tps65910, int gpio_base)
 
70
{
 
71
        int ret;
 
72
 
 
73
        if (!gpio_base)
 
74
                return;
 
75
 
 
76
        tps65910->gpio.owner            = THIS_MODULE;
 
77
        tps65910->gpio.label            = tps65910->i2c_client->name;
 
78
        tps65910->gpio.dev              = tps65910->dev;
 
79
        tps65910->gpio.base             = gpio_base;
 
80
 
 
81
        switch(tps65910_chip_id(tps65910)) {
 
82
        case TPS65910:
 
83
                tps65910->gpio.ngpio    = 6;
 
84
                break;
 
85
        case TPS65911:
 
86
                tps65910->gpio.ngpio    = 9;
 
87
                break;
 
88
        default:
 
89
                return;
 
90
        }
 
91
        tps65910->gpio.can_sleep        = 1;
 
92
 
 
93
        tps65910->gpio.direction_input  = tps65910_gpio_input;
 
94
        tps65910->gpio.direction_output = tps65910_gpio_output;
 
95
        tps65910->gpio.set              = tps65910_gpio_set;
 
96
        tps65910->gpio.get              = tps65910_gpio_get;
 
97
 
 
98
        ret = gpiochip_add(&tps65910->gpio);
 
99
 
 
100
        if (ret)
 
101
                dev_warn(tps65910->dev, "GPIO registration failed: %d\n", ret);
 
102
}