2 * drivers/gpio/rt5025-gpio.c
3 * Driver foo Richtek RT5025 PMIC GPIO
5 * Copyright (C) 2014 Richtek Technologh Corp.
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; either version 2
11 * of the License, or (at your option) any later version.
14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/init.h>
17 #include <linux/err.h>
18 #include <linux/gpio.h>
19 #include <linux/i2c.h>
20 #include <linux/platform_device.h>
23 #include <linux/mfd/rt5025.h>
24 #include <linux/mfd/rt5025-gpio.h>
26 struct rt5025_gpio_info {
27 struct i2c_client *i2c;
31 struct gpio_chip gpio_chip;
34 static inline int find_rt5025_gpioreg(unsigned off, int *gpio_reg)
42 *gpio_reg = RT5025_REG_GPIO0 + off;
50 static int rt5025_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
52 struct rt5025_gpio_info *gi = dev_get_drvdata(chip->dev);
56 ret = find_rt5025_gpioreg(offset , &gpio_reg);
58 dev_err(chip->dev, "not a valid gpio index\n");
62 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,
72 unsigned offset, int value)
74 struct rt5025_gpio_info *gi = dev_get_drvdata(chip->dev);
78 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);
86 dev_err(chip->dev, "clr gpio direction fail\n");
90 ret = rt5025_set_bits(gi->i2c, gpio_reg,
91 RT5025_GPIO_OUTPUT<<RT5025_GPIO_DIRSHIFT);
93 dev_err(chip->dev, "set gpio output dir fail\n");
98 ret = rt5025_set_bits(gi->i2c, gpio_reg,
99 RT5025_GPIO_OVALUEMASK);
101 ret = rt5025_clr_bits(gi->i2c, gpio_reg,
102 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);
120 dev_err(chip->dev, "not a valid gpio index\n");
124 ret = rt5025_reg_read(gi->i2c, gpio_reg);
126 dev_err(chip->dev, "read gpio register fail\n");
130 return (ret&RT5025_GPIO_IVALUEMASK)?1 : 0;
133 static void rt5025_gpio_set_value(struct gpio_chip *chip,
134 unsigned offset, int value)
136 struct rt5025_gpio_info *gi = dev_get_drvdata(chip->dev);
140 ret = find_rt5025_gpioreg(offset, &gpio_reg);
142 dev_err(chip->dev, "not a valid gpio index\n");
147 ret = rt5025_set_bits(gi->i2c, gpio_reg,
148 RT5025_GPIO_OVALUEMASK);
150 ret = rt5025_clr_bits(gi->i2c, gpio_reg,
151 RT5025_GPIO_OVALUEMASK);
154 dev_err(chip->dev, "read gpio register fail\n");
157 static int rt_parse_dt(struct rt5025_gpio_info *gi, struct device *dev)
160 struct device_node *np = dev->of_node;
162 of_property_read_u32(np, "rt,ngpio", &gi->ngpio);
163 #endif /* #ifdef CONFIG_OF */
167 static int rt_parse_pdata(struct rt5025_gpio_info *gi, struct device *dev)
169 struct rt5025_gpio_data *gpio_pdata = dev->platform_data;
171 gi->ngpio = gpio_pdata->ngpio;
175 static int rt5025_gpio_probe(struct platform_device *pdev)
177 struct rt5025_chip *chip = dev_get_drvdata(pdev->dev.parent);
178 struct rt5025_platform_data *pdata = (pdev->dev.parent)->platform_data;
179 struct rt5025_gpio_info *gi;
180 bool use_dt = pdev->dev.of_node;
183 gi = devm_kzalloc(&pdev->dev, sizeof(*gi), GFP_KERNEL);
190 rt_parse_dt(gi, &pdev->dev);
196 pdev->dev.platform_data = pdata->gpio_pdata;
197 rt_parse_pdata(gi, &pdev->dev);
200 gi->gpio_chip.direction_input = rt5025_gpio_direction_input;
201 gi->gpio_chip.direction_output = rt5025_gpio_direction_output;
202 gi->gpio_chip.get = rt5025_gpio_get_value;
203 gi->gpio_chip.set = rt5025_gpio_set_value;
204 gi->gpio_chip.can_sleep = 0;
206 gi->gpio_chip.base = -1;
207 gi->gpio_chip.ngpio = gi->ngpio;
208 gi->gpio_chip.label = pdev->name;
209 gi->gpio_chip.dev = &pdev->dev;
210 gi->gpio_chip.owner = THIS_MODULE;
212 rc = gpiochip_add(&gi->gpio_chip);
216 platform_set_drvdata(pdev, gi);
217 dev_info(&pdev->dev, "driver successfully loaded\n");
223 static int rt5025_gpio_remove(struct platform_device *pdev)
226 struct rt5025_gpio_info *gi = platform_get_drvdata(pdev);
228 rc = gpiochip_remove(&gi->gpio_chip);
229 dev_info(&pdev->dev, "\n");
233 static struct of_device_id rt_match_table[] = {
234 { .compatible = "rt,rt5025-gpio",},
238 static struct platform_driver rt5025_gpio_driver = {
240 .name = RT5025_DEV_NAME "-gpio",
241 .owner = THIS_MODULE,
242 .of_match_table = rt_match_table,
244 .probe = rt5025_gpio_probe,
245 .remove = rt5025_gpio_remove,
248 static int rt5025_gpio_init(void)
250 return platform_driver_register(&rt5025_gpio_driver);
252 fs_initcall_sync(rt5025_gpio_init);
254 static void rt5025_gpio_exit(void)
256 platform_driver_unregister(&rt5025_gpio_driver);
258 module_exit(rt5025_gpio_exit);
260 MODULE_LICENSE("GPL");
261 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com>");
262 MODULE_DESCRIPTION("GPIO driver for RT5025");
263 MODULE_ALIAS("platform:" RT5025_DEV_NAME "-gpio");
264 MODULE_VERSION(RT5025_DRV_VER);