pcf50633-gpio: Add gpiolib support.
[kernel.git] / drivers / mfd / pcf50633-gpio.c
1 /* NXP PCF50633 GPIO Driver
2  *
3  * (C) 2006-2008 by Openmoko, Inc.
4  * Author: Balaji Rao <balajirrao@openmoko.org>
5  * Copyright 2010, Lars-Peter Clausen <lars@metafoo.de>
6  * All rights reserved.
7  *
8  * Broken down from monstrous PCF50633 driver mainly by
9  * Harald Welte, Andy Green and Werner Almesberger
10  *
11  *  This program is free software; you can redistribute  it and/or modify it
12  *  under  the terms of  the GNU General  Public License as published by the
13  *  Free Software Foundation;  either version 2 of the  License, or (at your
14  *  option) any later version.
15  *
16  */
17
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/slab.h>
21 #include <linux/platform_device.h>
22
23 #include <linux/mfd/pcf50633/core.h>
24 #include <linux/mfd/pcf50633/gpio.h>
25 #include <linux/gpio.h>
26
27 #define PCF50633_REG_GPIOCTL    0x13
28 #define PCF50633_REG_GPIOCFG(x) (0x14 + (x))
29
30 enum pcf50633_regulator_id {
31         PCF50633_REGULATOR_AUTO,
32         PCF50633_REGULATOR_DOWN1,
33         PCF50633_REGULATOR_DOWN2,
34         PCF50633_REGULATOR_LDO1,
35         PCF50633_REGULATOR_LDO2,
36         PCF50633_REGULATOR_LDO3,
37         PCF50633_REGULATOR_LDO4,
38         PCF50633_REGULATOR_LDO5,
39         PCF50633_REGULATOR_LDO6,
40         PCF50633_REGULATOR_HCLDO,
41         PCF50633_REGULATOR_MEMLDO,
42 };
43
44 #define PCF50633_REG_AUTOOUT    0x1a
45 #define PCF50633_REG_DOWN1OUT   0x1e
46 #define PCF50633_REG_DOWN2OUT   0x22
47 #define PCF50633_REG_MEMLDOOUT  0x26
48 #define PCF50633_REG_LDO1OUT    0x2d
49 #define PCF50633_REG_LDO2OUT    0x2f
50 #define PCF50633_REG_LDO3OUT    0x31
51 #define PCF50633_REG_LDO4OUT    0x33
52 #define PCF50633_REG_LDO5OUT    0x35
53 #define PCF50633_REG_LDO6OUT    0x37
54 #define PCF50633_REG_HCLDOOUT   0x39
55
56 static const u8 pcf50633_regulator_registers[PCF50633_NUM_REGULATORS] = {
57         [PCF50633_REGULATOR_AUTO]       = PCF50633_REG_AUTOOUT,
58         [PCF50633_REGULATOR_DOWN1]      = PCF50633_REG_DOWN1OUT,
59         [PCF50633_REGULATOR_DOWN2]      = PCF50633_REG_DOWN2OUT,
60         [PCF50633_REGULATOR_MEMLDO]     = PCF50633_REG_MEMLDOOUT,
61         [PCF50633_REGULATOR_LDO1]       = PCF50633_REG_LDO1OUT,
62         [PCF50633_REGULATOR_LDO2]       = PCF50633_REG_LDO2OUT,
63         [PCF50633_REGULATOR_LDO3]       = PCF50633_REG_LDO3OUT,
64         [PCF50633_REGULATOR_LDO4]       = PCF50633_REG_LDO4OUT,
65         [PCF50633_REGULATOR_LDO5]       = PCF50633_REG_LDO5OUT,
66         [PCF50633_REGULATOR_LDO6]       = PCF50633_REG_LDO6OUT,
67         [PCF50633_REGULATOR_HCLDO]      = PCF50633_REG_HCLDOOUT,
68 };
69
70 struct pcf50633_gpio {
71         struct pcf50633 *pcf;
72         struct gpio_chip chip;
73 };
74
75 static inline struct pcf50633 *gpio_chip_to_pcf50633(struct gpio_chip *chip)
76 {
77         struct pcf50633 *pcf = dev_to_pcf50633(chip->dev->parent);
78         return pcf;
79 }
80
81 static void pcf50633_gpio_set_value(struct gpio_chip *chip, unsigned gpio, int value)
82 {
83         struct pcf50633 *pcf = gpio_chip_to_pcf50633(chip);
84         u8 reg;
85
86         reg = PCF50633_REG_GPIOCFG(gpio);
87
88         pcf50633_reg_set_bit_mask(pcf, reg, 0x07, value ? 0x7 : 0x0);
89 }
90
91 static int pcf50633_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
92 {
93         struct pcf50633 *pcf = gpio_chip_to_pcf50633(chip);
94         return pcf50633_reg_read(pcf, PCF50633_REG_GPIOCFG(gpio)) >> 3;
95 }
96
97
98 static int pcf50633_gpio_direction_output(struct gpio_chip *chip, unsigned gpio,
99                                           int value)
100 {
101         struct pcf50633 *pcf = gpio_chip_to_pcf50633(chip);
102         int ret;
103
104         ret = pcf50633_gpio_set_config(pcf, pcf->pdata->gpio_base + gpio,
105                                        PCF50633_GPIO_CONFIG_OUTPUT);
106         if (!ret)
107             pcf50633_gpio_set_value(chip, gpio, value);
108
109         return ret;
110 }
111
112 static int pcf50633_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
113 {
114         return -ENOSYS;
115 }
116
117 int pcf50633_gpio_set_config(struct pcf50633 *pcf, unsigned gpio,
118                               enum pcf50633_gpio_config config)
119 {
120         u8 reg;
121         u8 direction;
122         int ret;
123
124         gpio -= pcf->pdata->gpio_base;
125
126         if (gpio < 3) {
127             direction = (config == PCF50633_GPIO_CONFIG_INPUT) ? (1 << gpio) : 0;
128             ret = pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_GPIOCTL, (1 << gpio),
129                                             direction);
130             if (ret) {
131                         return ret;
132                 }
133         } else if (gpio > 3 || config == PCF50633_GPIO_CONFIG_INPUT) {
134             return -EINVAL;
135         }
136
137         if (config != PCF50633_GPIO_CONFIG_INPUT) {
138             reg = PCF50633_REG_GPIOCFG(gpio);
139             ret = pcf50633_reg_set_bit_mask(pcf, reg, 0x0f, config);
140         }
141
142         return ret;
143 }
144 EXPORT_SYMBOL_GPL(pcf50633_gpio_set_config);
145
146 int pcf50633_gpio_power_supply_set(struct pcf50633 *pcf,
147                                         int gpio, int regulator, int on)
148 {
149         u8 reg, val, mask;
150
151         gpio -= pcf->pdata->gpio_base;
152
153         /* the *ENA register is always one after the *OUT register */
154         reg = pcf50633_regulator_registers[regulator] + 1;
155
156         val = !!on << (gpio - PCF50633_GPIO1);
157         mask = 1 << (gpio - PCF50633_GPIO1);
158
159         return pcf50633_reg_set_bit_mask(pcf, reg, mask, val);
160 }
161 EXPORT_SYMBOL_GPL(pcf50633_gpio_power_supply_set);
162
163
164 static int __devinit pcf50633_gpio_probe(struct platform_device *pdev)
165 {
166         struct pcf50633 *pcf = dev_to_pcf50633(pdev->dev.parent);
167         struct pcf50633_gpio *pcf_gpio;
168
169         pcf_gpio = kzalloc(sizeof(*pcf_gpio), GFP_KERNEL);
170
171         if (!pcf_gpio)
172                 return -ENOMEM;
173
174         pcf_gpio->pcf = pcf;
175
176         pcf_gpio->chip.direction_input = pcf50633_gpio_direction_input;
177         pcf_gpio->chip.direction_output = pcf50633_gpio_direction_output;
178         pcf_gpio->chip.get = pcf50633_gpio_get_value;
179         pcf_gpio->chip.set = pcf50633_gpio_set_value;
180
181         pcf_gpio->chip.base = pcf->pdata->gpio_base;
182         pcf_gpio->chip.ngpio = 4;
183         pcf_gpio->chip.label = dev_name(pcf->dev);
184         pcf_gpio->chip.can_sleep = 1;
185         pcf_gpio->chip.owner = THIS_MODULE;
186         pcf_gpio->chip.dev = &pdev->dev;
187
188         platform_set_drvdata(pdev, pcf_gpio);
189
190         return gpiochip_add(&pcf_gpio->chip);
191 }
192
193 static int __devexit pcf50633_gpio_remove(struct platform_device *pdev)
194 {
195         struct pcf50633_gpio *pcf_gpio = platform_get_drvdata(pdev);
196
197         gpiochip_remove(&pcf_gpio->chip);
198
199         platform_set_drvdata(pdev, NULL);
200         kfree(pcf_gpio);
201
202         return 0;
203 }
204
205 static struct platform_driver pcf50633_gpio_driver = {
206         .probe = pcf50633_gpio_probe,
207         .remove = __devexit_p(pcf50633_gpio_remove),
208         .driver = {
209                 .name = "pcf50633-gpio",
210                 .owner = THIS_MODULE,
211         },
212 };
213
214 int __init pcf50633_gpio_init(void)
215 {
216         return platform_driver_register(&pcf50633_gpio_driver);
217 }
218 module_init(pcf50633_gpio_init);
219
220 void __exit pcf50633_gpio_exit(void)
221 {
222         platform_driver_unregister(&pcf50633_gpio_driver);
223 }
224 module_exit(pcf50633_gpio_exit);
225
226 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
227 MODULE_DESCRIPTION("GPIO driver for the PCF50633");
228 MODULE_LICENSE("GPL");