2 * GPIO driver for RICOH583 power management chip.
4 * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
5 * Author: Laxman dewangan <ldewangan@nvidia.com>
8 * Copyright (C) 2011 RICOH COMPANY,LTD
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms and conditions of the GNU General Public License,
12 * version 2, as published by the Free Software Foundation.
14 * This program is distributed in the hope it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include <linux/init.h>
24 #include <linux/kernel.h>
25 #include <linux/slab.h>
26 #include <linux/module.h>
27 #include <linux/platform_device.h>
28 #include <linux/device.h>
29 #include <linux/gpio.h>
30 #include <linux/mfd/rc5t583.h>
33 struct gpio_chip gpio_chip
;
34 struct rc5t583
*rc5t583
;
37 static int rc5t583_gpio_get(struct gpio_chip
*gc
, unsigned int offset
)
39 struct rc5t583_gpio
*rc5t583_gpio
= gpiochip_get_data(gc
);
40 struct device
*parent
= rc5t583_gpio
->rc5t583
->dev
;
44 ret
= rc5t583_read(parent
, RC5T583_GPIO_MON_IOIN
, &val
);
48 return !!(val
& BIT(offset
));
51 static void rc5t583_gpio_set(struct gpio_chip
*gc
, unsigned int offset
, int val
)
53 struct rc5t583_gpio
*rc5t583_gpio
= gpiochip_get_data(gc
);
54 struct device
*parent
= rc5t583_gpio
->rc5t583
->dev
;
56 rc5t583_set_bits(parent
, RC5T583_GPIO_IOOUT
, BIT(offset
));
58 rc5t583_clear_bits(parent
, RC5T583_GPIO_IOOUT
, BIT(offset
));
61 static int rc5t583_gpio_dir_input(struct gpio_chip
*gc
, unsigned int offset
)
63 struct rc5t583_gpio
*rc5t583_gpio
= gpiochip_get_data(gc
);
64 struct device
*parent
= rc5t583_gpio
->rc5t583
->dev
;
67 ret
= rc5t583_clear_bits(parent
, RC5T583_GPIO_IOSEL
, BIT(offset
));
71 /* Set pin to gpio mode */
72 return rc5t583_clear_bits(parent
, RC5T583_GPIO_PGSEL
, BIT(offset
));
75 static int rc5t583_gpio_dir_output(struct gpio_chip
*gc
, unsigned offset
,
78 struct rc5t583_gpio
*rc5t583_gpio
= gpiochip_get_data(gc
);
79 struct device
*parent
= rc5t583_gpio
->rc5t583
->dev
;
82 rc5t583_gpio_set(gc
, offset
, value
);
83 ret
= rc5t583_set_bits(parent
, RC5T583_GPIO_IOSEL
, BIT(offset
));
87 /* Set pin to gpio mode */
88 return rc5t583_clear_bits(parent
, RC5T583_GPIO_PGSEL
, BIT(offset
));
91 static int rc5t583_gpio_to_irq(struct gpio_chip
*gc
, unsigned offset
)
93 struct rc5t583_gpio
*rc5t583_gpio
= gpiochip_get_data(gc
);
95 if (offset
< RC5T583_MAX_GPIO
)
96 return rc5t583_gpio
->rc5t583
->irq_base
+
97 RC5T583_IRQ_GPIO0
+ offset
;
101 static void rc5t583_gpio_free(struct gpio_chip
*gc
, unsigned offset
)
103 struct rc5t583_gpio
*rc5t583_gpio
= gpiochip_get_data(gc
);
104 struct device
*parent
= rc5t583_gpio
->rc5t583
->dev
;
106 rc5t583_set_bits(parent
, RC5T583_GPIO_PGSEL
, BIT(offset
));
109 static int rc5t583_gpio_probe(struct platform_device
*pdev
)
111 struct rc5t583
*rc5t583
= dev_get_drvdata(pdev
->dev
.parent
);
112 struct rc5t583_platform_data
*pdata
= dev_get_platdata(rc5t583
->dev
);
113 struct rc5t583_gpio
*rc5t583_gpio
;
115 rc5t583_gpio
= devm_kzalloc(&pdev
->dev
, sizeof(*rc5t583_gpio
),
120 rc5t583_gpio
->gpio_chip
.label
= "gpio-rc5t583",
121 rc5t583_gpio
->gpio_chip
.owner
= THIS_MODULE
,
122 rc5t583_gpio
->gpio_chip
.free
= rc5t583_gpio_free
,
123 rc5t583_gpio
->gpio_chip
.direction_input
= rc5t583_gpio_dir_input
,
124 rc5t583_gpio
->gpio_chip
.direction_output
= rc5t583_gpio_dir_output
,
125 rc5t583_gpio
->gpio_chip
.set
= rc5t583_gpio_set
,
126 rc5t583_gpio
->gpio_chip
.get
= rc5t583_gpio_get
,
127 rc5t583_gpio
->gpio_chip
.to_irq
= rc5t583_gpio_to_irq
,
128 rc5t583_gpio
->gpio_chip
.ngpio
= RC5T583_MAX_GPIO
,
129 rc5t583_gpio
->gpio_chip
.can_sleep
= true,
130 rc5t583_gpio
->gpio_chip
.parent
= &pdev
->dev
;
131 rc5t583_gpio
->gpio_chip
.base
= -1;
132 rc5t583_gpio
->rc5t583
= rc5t583
;
134 if (pdata
&& pdata
->gpio_base
)
135 rc5t583_gpio
->gpio_chip
.base
= pdata
->gpio_base
;
137 platform_set_drvdata(pdev
, rc5t583_gpio
);
139 return devm_gpiochip_add_data(&pdev
->dev
, &rc5t583_gpio
->gpio_chip
,
143 static struct platform_driver rc5t583_gpio_driver
= {
145 .name
= "rc5t583-gpio",
147 .probe
= rc5t583_gpio_probe
,
150 static int __init
rc5t583_gpio_init(void)
152 return platform_driver_register(&rc5t583_gpio_driver
);
154 subsys_initcall(rc5t583_gpio_init
);
156 static void __exit
rc5t583_gpio_exit(void)
158 platform_driver_unregister(&rc5t583_gpio_driver
);
160 module_exit(rc5t583_gpio_exit
);
162 MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
163 MODULE_DESCRIPTION("GPIO interface for RC5T583");
164 MODULE_LICENSE("GPL v2");
165 MODULE_ALIAS("platform:rc5t583-gpio");