2 * SuperH Pin Function Controller GPIO driver.
4 * Copyright (C) 2008 Magnus Damm
5 * Copyright (C) 2009 - 2012 Paul Mundt
7 * This file is subject to the terms and conditions of the GNU General Public
8 * License. See the file "COPYING" in the main directory of this archive
12 #define pr_fmt(fmt) KBUILD_MODNAME " gpio: " fmt
14 #include <linux/device.h>
15 #include <linux/gpio.h>
16 #include <linux/init.h>
17 #include <linux/module.h>
18 #include <linux/pinctrl/consumer.h>
19 #include <linux/slab.h>
20 #include <linux/spinlock.h>
26 struct gpio_chip gpio_chip
;
29 static struct sh_pfc_chip
*gpio_to_pfc_chip(struct gpio_chip
*gc
)
31 return container_of(gc
, struct sh_pfc_chip
, gpio_chip
);
34 static struct sh_pfc
*gpio_to_pfc(struct gpio_chip
*gc
)
36 return gpio_to_pfc_chip(gc
)->pfc
;
39 static int sh_gpio_request(struct gpio_chip
*gc
, unsigned offset
)
41 struct sh_pfc
*pfc
= gpio_to_pfc(gc
);
45 if (offset
< pfc
->info
->nr_pins
)
46 return pinctrl_request_gpio(offset
);
48 pr_notice_once("Use of GPIO API for function requests is deprecated, convert to pinctrl\n");
50 spin_lock_irqsave(&pfc
->lock
, flags
);
52 if (!sh_pfc_gpio_is_function(pfc
, offset
))
55 if (sh_pfc_config_gpio(pfc
, offset
, PINMUX_TYPE_FUNCTION
,
59 if (sh_pfc_config_gpio(pfc
, offset
, PINMUX_TYPE_FUNCTION
,
66 spin_unlock_irqrestore(&pfc
->lock
, flags
);
70 static void sh_gpio_free(struct gpio_chip
*gc
, unsigned offset
)
72 struct sh_pfc
*pfc
= gpio_to_pfc(gc
);
75 if (offset
< pfc
->info
->nr_pins
)
76 return pinctrl_free_gpio(offset
);
78 spin_lock_irqsave(&pfc
->lock
, flags
);
80 sh_pfc_config_gpio(pfc
, offset
, PINMUX_TYPE_FUNCTION
, GPIO_CFG_FREE
);
82 spin_unlock_irqrestore(&pfc
->lock
, flags
);
85 static void sh_gpio_set_value(struct sh_pfc
*pfc
, unsigned gpio
, int value
)
87 struct pinmux_data_reg
*dr
= NULL
;
90 if (sh_pfc_get_data_reg(pfc
, gpio
, &dr
, &bit
) != 0)
93 sh_pfc_write_bit(dr
, bit
, value
);
96 static int sh_gpio_get_value(struct sh_pfc
*pfc
, unsigned gpio
)
98 struct pinmux_data_reg
*dr
= NULL
;
101 if (sh_pfc_get_data_reg(pfc
, gpio
, &dr
, &bit
) != 0)
104 return sh_pfc_read_bit(dr
, bit
);
107 static int sh_gpio_direction_input(struct gpio_chip
*gc
, unsigned offset
)
109 struct sh_pfc
*pfc
= gpio_to_pfc(gc
);
111 if (offset
>= pfc
->info
->nr_pins
) {
112 /* Function GPIOs can only be requested, never configured. */
116 return pinctrl_gpio_direction_input(offset
);
119 static int sh_gpio_direction_output(struct gpio_chip
*gc
, unsigned offset
,
122 struct sh_pfc
*pfc
= gpio_to_pfc(gc
);
124 if (offset
>= pfc
->info
->nr_pins
) {
125 /* Function GPIOs can only be requested, never configured. */
129 sh_gpio_set_value(gpio_to_pfc(gc
), offset
, value
);
131 return pinctrl_gpio_direction_output(offset
);
134 static int sh_gpio_get(struct gpio_chip
*gc
, unsigned offset
)
136 return sh_gpio_get_value(gpio_to_pfc(gc
), offset
);
139 static void sh_gpio_set(struct gpio_chip
*gc
, unsigned offset
, int value
)
141 sh_gpio_set_value(gpio_to_pfc(gc
), offset
, value
);
144 static int sh_gpio_to_irq(struct gpio_chip
*gc
, unsigned offset
)
146 struct sh_pfc
*pfc
= gpio_to_pfc(gc
);
147 pinmux_enum_t enum_id
;
148 pinmux_enum_t
*enum_ids
;
154 pos
= sh_pfc_gpio_to_enum(pfc
, offset
, pos
, &enum_id
);
155 if (pos
<= 0 || !enum_id
)
158 for (i
= 0; i
< pfc
->info
->gpio_irq_size
; i
++) {
159 enum_ids
= pfc
->info
->gpio_irq
[i
].enum_ids
;
160 for (k
= 0; enum_ids
[k
]; k
++) {
161 if (enum_ids
[k
] == enum_id
)
162 return pfc
->info
->gpio_irq
[i
].irq
;
170 static void sh_pfc_gpio_setup(struct sh_pfc_chip
*chip
)
172 struct sh_pfc
*pfc
= chip
->pfc
;
173 struct gpio_chip
*gc
= &chip
->gpio_chip
;
175 gc
->request
= sh_gpio_request
;
176 gc
->free
= sh_gpio_free
;
177 gc
->direction_input
= sh_gpio_direction_input
;
178 gc
->get
= sh_gpio_get
;
179 gc
->direction_output
= sh_gpio_direction_output
;
180 gc
->set
= sh_gpio_set
;
181 gc
->to_irq
= sh_gpio_to_irq
;
183 gc
->label
= pfc
->info
->name
;
184 gc
->owner
= THIS_MODULE
;
186 gc
->ngpio
= pfc
->info
->nr_pins
+ pfc
->info
->nr_func_gpios
;
189 int sh_pfc_register_gpiochip(struct sh_pfc
*pfc
)
191 struct sh_pfc_chip
*chip
;
194 chip
= devm_kzalloc(pfc
->dev
, sizeof(*chip
), GFP_KERNEL
);
200 sh_pfc_gpio_setup(chip
);
202 ret
= gpiochip_add(&chip
->gpio_chip
);
203 if (unlikely(ret
< 0))
208 pr_info("%s handling gpio 0 -> %u\n",
210 pfc
->info
->nr_pins
+ pfc
->info
->nr_func_gpios
- 1);
215 int sh_pfc_unregister_gpiochip(struct sh_pfc
*pfc
)
217 struct sh_pfc_chip
*chip
= pfc
->gpio
;
220 ret
= gpiochip_remove(&chip
->gpio_chip
);
221 if (unlikely(ret
< 0))
This page took 0.066678 seconds and 6 git commands to generate.