• Home
  • Raw
  • Download

Lines Matching +full:lock +full:- +full:offset

4  * Copyright (C) 2007-2009  Andres Salomon <dilinger@collabora.co.uk>
20 #define DRV_NAME "cs5535-gpio"
24 * 31-29,23 : reserved (always mask out)
27 * 22-16 : LPC
47 * design pattern, see Documentation/driver-model/design-patterns.txt
54 spinlock_t lock; member
66 unsigned long addr = chip->base + 0x80 + reg; in errata_outl()
71 * non-selected bits; the recommended workaround is a in errata_outl()
72 * read-modify-write operation. in errata_outl()
86 static void __cs5535_gpio_set(struct cs5535_gpio_chip *chip, unsigned offset, in __cs5535_gpio_set() argument
89 if (offset < 16) in __cs5535_gpio_set()
91 outl(1 << offset, chip->base + reg); in __cs5535_gpio_set()
94 errata_outl(chip, 1 << (offset - 16), reg); in __cs5535_gpio_set()
97 void cs5535_gpio_set(unsigned offset, unsigned int reg) in cs5535_gpio_set() argument
102 spin_lock_irqsave(&chip->lock, flags); in cs5535_gpio_set()
103 __cs5535_gpio_set(chip, offset, reg); in cs5535_gpio_set()
104 spin_unlock_irqrestore(&chip->lock, flags); in cs5535_gpio_set()
108 static void __cs5535_gpio_clear(struct cs5535_gpio_chip *chip, unsigned offset, in __cs5535_gpio_clear() argument
111 if (offset < 16) in __cs5535_gpio_clear()
113 outl(1 << (offset + 16), chip->base + reg); in __cs5535_gpio_clear()
116 errata_outl(chip, 1 << offset, reg); in __cs5535_gpio_clear()
119 void cs5535_gpio_clear(unsigned offset, unsigned int reg) in cs5535_gpio_clear() argument
124 spin_lock_irqsave(&chip->lock, flags); in cs5535_gpio_clear()
125 __cs5535_gpio_clear(chip, offset, reg); in cs5535_gpio_clear()
126 spin_unlock_irqrestore(&chip->lock, flags); in cs5535_gpio_clear()
130 int cs5535_gpio_isset(unsigned offset, unsigned int reg) in cs5535_gpio_isset() argument
136 spin_lock_irqsave(&chip->lock, flags); in cs5535_gpio_isset()
137 if (offset < 16) in cs5535_gpio_isset()
139 val = inl(chip->base + reg); in cs5535_gpio_isset()
142 val = inl(chip->base + 0x80 + reg); in cs5535_gpio_isset()
143 offset -= 16; in cs5535_gpio_isset()
145 spin_unlock_irqrestore(&chip->lock, flags); in cs5535_gpio_isset()
147 return (val & (1 << offset)) ? 1 : 0; in cs5535_gpio_isset()
156 return -EINVAL; in cs5535_gpio_set_irq()
168 void cs5535_gpio_setup_event(unsigned offset, int pair, int pme) in cs5535_gpio_setup_event() argument
171 uint32_t shift = (offset % 8) * 4; in cs5535_gpio_setup_event()
175 if (offset >= 24) in cs5535_gpio_setup_event()
176 offset = GPIO_MAP_W; in cs5535_gpio_setup_event()
177 else if (offset >= 16) in cs5535_gpio_setup_event()
178 offset = GPIO_MAP_Z; in cs5535_gpio_setup_event()
179 else if (offset >= 8) in cs5535_gpio_setup_event()
180 offset = GPIO_MAP_Y; in cs5535_gpio_setup_event()
182 offset = GPIO_MAP_X; in cs5535_gpio_setup_event()
184 spin_lock_irqsave(&chip->lock, flags); in cs5535_gpio_setup_event()
185 val = inl(chip->base + offset); in cs5535_gpio_setup_event()
197 outl(val, chip->base + offset); in cs5535_gpio_setup_event()
198 spin_unlock_irqrestore(&chip->lock, flags); in cs5535_gpio_setup_event()
206 static int chip_gpio_request(struct gpio_chip *c, unsigned offset) in chip_gpio_request() argument
211 spin_lock_irqsave(&chip->lock, flags); in chip_gpio_request()
214 if ((mask & (1 << offset)) == 0) { in chip_gpio_request()
215 dev_info(&chip->pdev->dev, in chip_gpio_request()
216 "pin %u is not available (check mask)\n", offset); in chip_gpio_request()
217 spin_unlock_irqrestore(&chip->lock, flags); in chip_gpio_request()
218 return -EINVAL; in chip_gpio_request()
222 __cs5535_gpio_clear(chip, offset, GPIO_OUTPUT_AUX1); in chip_gpio_request()
223 __cs5535_gpio_clear(chip, offset, GPIO_OUTPUT_AUX2); in chip_gpio_request()
226 __cs5535_gpio_clear(chip, offset, GPIO_INPUT_AUX1); in chip_gpio_request()
228 spin_unlock_irqrestore(&chip->lock, flags); in chip_gpio_request()
233 static int chip_gpio_get(struct gpio_chip *chip, unsigned offset) in chip_gpio_get() argument
235 return cs5535_gpio_isset(offset, GPIO_READ_BACK); in chip_gpio_get()
238 static void chip_gpio_set(struct gpio_chip *chip, unsigned offset, int val) in chip_gpio_set() argument
241 cs5535_gpio_set(offset, GPIO_OUTPUT_VAL); in chip_gpio_set()
243 cs5535_gpio_clear(offset, GPIO_OUTPUT_VAL); in chip_gpio_set()
246 static int chip_direction_input(struct gpio_chip *c, unsigned offset) in chip_direction_input() argument
251 spin_lock_irqsave(&chip->lock, flags); in chip_direction_input()
252 __cs5535_gpio_set(chip, offset, GPIO_INPUT_ENABLE); in chip_direction_input()
253 __cs5535_gpio_clear(chip, offset, GPIO_OUTPUT_ENABLE); in chip_direction_input()
254 spin_unlock_irqrestore(&chip->lock, flags); in chip_direction_input()
259 static int chip_direction_output(struct gpio_chip *c, unsigned offset, int val) in chip_direction_output() argument
264 spin_lock_irqsave(&chip->lock, flags); in chip_direction_output()
266 __cs5535_gpio_set(chip, offset, GPIO_INPUT_ENABLE); in chip_direction_output()
267 __cs5535_gpio_set(chip, offset, GPIO_OUTPUT_ENABLE); in chip_direction_output()
269 __cs5535_gpio_set(chip, offset, GPIO_OUTPUT_VAL); in chip_direction_output()
271 __cs5535_gpio_clear(chip, offset, GPIO_OUTPUT_VAL); in chip_direction_output()
273 spin_unlock_irqrestore(&chip->lock, flags); in chip_direction_output()
310 int err = -EIO; in cs5535_gpio_probe()
322 dev_err(&pdev->dev, "can't fetch device resource info\n"); in cs5535_gpio_probe()
326 if (!devm_request_region(&pdev->dev, res->start, resource_size(res), in cs5535_gpio_probe()
327 pdev->name)) { in cs5535_gpio_probe()
328 dev_err(&pdev->dev, "can't request region\n"); in cs5535_gpio_probe()
332 /* set up the driver-specific struct */ in cs5535_gpio_probe()
333 cs5535_gpio_chip.base = res->start; in cs5535_gpio_probe()
335 spin_lock_init(&cs5535_gpio_chip.lock); in cs5535_gpio_probe()
337 dev_info(&pdev->dev, "reserved resource region %pR\n", res); in cs5535_gpio_probe()
347 dev_info(&pdev->dev, "mask changed from 0x%08lX to 0x%08lX\n", in cs5535_gpio_probe()
351 err = devm_gpiochip_add_data(&pdev->dev, &cs5535_gpio_chip.chip, in cs5535_gpio_probe()