2 * drivers/gpio/rt5025-gpio.c
3 * Driver foo Richtek RT5025 PMIC GPIO
5 * Copyright (C) 2013 Richtek Electronics
6 * cy_huang <cy_huang@richtek.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/err.h>
17 #include <linux/gpio.h>
18 #include <linux/i2c.h>
19 #include <linux/slab.h>
20 #include <linux/platform_device.h>
22 #include <linux/mfd/rt5025.h>
23 #include <linux/mfd/rt5025-gpio.h>
25 struct rt5025_gpio_info {
26 struct i2c_client *i2c;
29 struct gpio_chip gpio_chip;
32 static inline int find_rt5025_gpioreg(unsigned off, int *gpio_reg)
40 *gpio_reg = RT5025_REG_GPIO0 + off;
48 static int rt5025_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
50 struct rt5025_gpio_info *gi = dev_get_drvdata(chip->dev);
54 ret = find_rt5025_gpioreg(offset , &gpio_reg);
57 dev_err(chip->dev, "not a valid gpio index\n");
61 ret = rt5025_clr_bits(gi->i2c, gpio_reg, RT5025_GPIO_DIRMASK);
64 dev_err(chip->dev, "set gpio input fail\n");
71 static int rt5025_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value)
73 struct rt5025_gpio_info *gi = dev_get_drvdata(chip->dev);
77 ret = find_rt5025_gpioreg(offset, &gpio_reg);
80 dev_err(chip->dev, "not a valid gpio index\n");
84 ret = rt5025_clr_bits(gi->i2c, gpio_reg, RT5025_GPIO_DIRSHIFT);
87 dev_err(chip->dev, "clr gpio direction fail\n");
91 ret = rt5025_set_bits(gi->i2c, gpio_reg, RT5025_GPIO_OUTPUT<<RT5025_GPIO_DIRSHIFT);
94 dev_err(chip->dev, "set gpio output dir fail\n");
99 ret = rt5025_set_bits(gi->i2c, gpio_reg, RT5025_GPIO_OVALUEMASK);
101 ret = rt5025_clr_bits(gi->i2c, gpio_reg, RT5025_GPIO_OVALUEMASK);
105 dev_err(chip->dev, "set gpio output value fail\n");
112 static int rt5025_gpio_get_value(struct gpio_chip *chip, unsigned offset)
114 struct rt5025_gpio_info *gi = dev_get_drvdata(chip->dev);
118 ret = find_rt5025_gpioreg(offset, &gpio_reg);
121 dev_err(chip->dev, "not a valid gpio index\n");
125 ret = rt5025_reg_read(gi->i2c, gpio_reg);
128 dev_err(chip->dev, "read gpio register fail\n");
132 return (ret&RT5025_GPIO_IVALUEMASK)?1:0;
135 static void rt5025_gpio_set_value(struct gpio_chip *chip, unsigned offset, int value)
137 struct rt5025_gpio_info *gi = dev_get_drvdata(chip->dev);
141 ret = find_rt5025_gpioreg(offset, &gpio_reg);
144 dev_err(chip->dev, "not a valid gpio index\n");
149 ret = rt5025_set_bits(gi->i2c, gpio_reg, RT5025_GPIO_OVALUEMASK);
151 ret = rt5025_clr_bits(gi->i2c, gpio_reg, RT5025_GPIO_OVALUEMASK);
155 dev_err(chip->dev, "read gpio register fail\n");
159 static int __devinit rt5025_gpio_probe(struct platform_device *pdev)
161 struct rt5025_chip *chip = dev_get_drvdata(pdev->dev.parent);
162 struct rt5025_platform_data *pdata = chip->dev->platform_data;
163 struct rt5025_gpio_info *gi;
166 gi = kzalloc(sizeof(*gi), GFP_KERNEL);
171 gi->gpio_base = pdata->gpio_data->gpio_base;
172 gi->irq_base = pdata->gpio_data->irq_base;
174 gi->gpio_chip.direction_input = rt5025_gpio_direction_input;
175 gi->gpio_chip.direction_output = rt5025_gpio_direction_output;
176 gi->gpio_chip.get = rt5025_gpio_get_value;
177 gi->gpio_chip.set = rt5025_gpio_set_value;
178 gi->gpio_chip.can_sleep = 0;
180 gi->gpio_chip.base = gi->gpio_base;
181 gi->gpio_chip.ngpio = RT5025_GPIO_NR;
182 gi->gpio_chip.label = pdev->name;
183 gi->gpio_chip.dev = &pdev->dev;
184 gi->gpio_chip.owner = THIS_MODULE;
186 ret = gpiochip_add(&gi->gpio_chip);
190 platform_set_drvdata(pdev, gi);
197 static int __devexit rt5025_gpio_remove(struct platform_device *pdev)
200 struct rt5025_gpio_info *gi = platform_get_drvdata(pdev);
202 ret = gpiochip_remove(&gi->gpio_chip);
205 platform_set_drvdata(pdev, NULL);
209 static struct platform_driver rt5025_gpio_driver =
212 .name = RT5025_DEVICE_NAME "-gpio",
213 .owner = THIS_MODULE,
215 .probe = rt5025_gpio_probe,
216 .remove = __devexit_p(rt5025_gpio_remove),
219 static int __init rt5025_gpio_init(void)
221 return platform_driver_register(&rt5025_gpio_driver);
223 subsys_initcall_sync(rt5025_gpio_init);
225 static void __exit rt5025_gpio_exit(void)
227 platform_driver_unregister(&rt5025_gpio_driver);
229 module_exit(rt5025_gpio_exit);
231 MODULE_LICENSE("GPL v2");
232 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com");
233 MODULE_DESCRIPTION("GPIO driver for RT5025");
234 MODULE_ALIAS("platform:" RT5025_DEVICE_NAME "-gpio");
235 MODULE_VERSION(RT5025_DRV_VER);