• Home
  • Raw
  • Download

Lines Matching +full:line +full:- +full:name

2  * Digital I/O driver for Technologic Systems TS-5500
4 * Copyright (c) 2012 Savoir-faire Linux Inc.
9 * In that sense, the support is not limited to the TS-5500 blocks.
12 * TS-5500:
13 * Documentation: http://wiki.embeddedarm.com/wiki/TS-5500
16 * TS-5600:
17 * Documentation: http://wiki.embeddedarm.com/wiki/TS-5600
18 * Blocks: LCD port (identical to TS-5500 LCD).
29 #include <linux/platform_data/gpio-ts5500.h>
106 * TS-5500 DIO1 block
109 * addr bit addr bit in out irq name pin offset
135 * TS-5500 DIO2 block
138 * addr bit addr bit in out irq name pin offset
162 * TS-5500 LCD port used as DIO block
163 * TS-5600 LCD port is identical
166 * addr bit addr bit in out irq name pin offset
205 const struct ts5500_dio line = priv->pinout[offset]; in ts5500_gpio_input() local
208 if (line.no_input) in ts5500_gpio_input()
209 return -ENXIO; in ts5500_gpio_input()
211 if (line.no_output) in ts5500_gpio_input()
214 spin_lock_irqsave(&priv->lock, flags); in ts5500_gpio_input()
215 ts5500_clear_mask(line.control_mask, line.control_addr); in ts5500_gpio_input()
216 spin_unlock_irqrestore(&priv->lock, flags); in ts5500_gpio_input()
224 const struct ts5500_dio line = priv->pinout[offset]; in ts5500_gpio_get() local
226 return !!(inb(line.value_addr) & line.value_mask); in ts5500_gpio_get()
232 const struct ts5500_dio line = priv->pinout[offset]; in ts5500_gpio_output() local
235 if (line.no_output) in ts5500_gpio_output()
236 return -ENXIO; in ts5500_gpio_output()
238 spin_lock_irqsave(&priv->lock, flags); in ts5500_gpio_output()
239 if (!line.no_input) in ts5500_gpio_output()
240 ts5500_set_mask(line.control_mask, line.control_addr); in ts5500_gpio_output()
243 ts5500_set_mask(line.value_mask, line.value_addr); in ts5500_gpio_output()
245 ts5500_clear_mask(line.value_mask, line.value_addr); in ts5500_gpio_output()
246 spin_unlock_irqrestore(&priv->lock, flags); in ts5500_gpio_output()
254 const struct ts5500_dio line = priv->pinout[offset]; in ts5500_gpio_set() local
257 spin_lock_irqsave(&priv->lock, flags); in ts5500_gpio_set()
259 ts5500_set_mask(line.value_mask, line.value_addr); in ts5500_gpio_set()
261 ts5500_clear_mask(line.value_mask, line.value_addr); in ts5500_gpio_set()
262 spin_unlock_irqrestore(&priv->lock, flags); in ts5500_gpio_set()
268 const struct ts5500_dio *block = priv->pinout; in ts5500_gpio_to_irq()
269 const struct ts5500_dio line = block[offset]; in ts5500_gpio_to_irq() local
272 if (line.irq) in ts5500_gpio_to_irq()
273 return line.irq; in ts5500_gpio_to_irq()
275 /* As this pin is input-only, we may strap it to another in/out pin */ in ts5500_gpio_to_irq()
276 if (priv->strap) in ts5500_gpio_to_irq()
277 return priv->hwirq; in ts5500_gpio_to_irq()
279 return -ENXIO; in ts5500_gpio_to_irq()
287 spin_lock_irqsave(&priv->lock, flags); in ts5500_enable_irq()
288 if (priv->hwirq == 7) in ts5500_enable_irq()
290 else if (priv->hwirq == 6) in ts5500_enable_irq()
292 else if (priv->hwirq == 1) in ts5500_enable_irq()
295 ret = -EINVAL; in ts5500_enable_irq()
296 spin_unlock_irqrestore(&priv->lock, flags); in ts5500_enable_irq()
305 spin_lock_irqsave(&priv->lock, flags); in ts5500_disable_irq()
306 if (priv->hwirq == 7) in ts5500_disable_irq()
308 else if (priv->hwirq == 6) in ts5500_disable_irq()
310 else if (priv->hwirq == 1) in ts5500_disable_irq()
313 dev_err(priv->gpio_chip.parent, "invalid hwirq %d\n", in ts5500_disable_irq()
314 priv->hwirq); in ts5500_disable_irq()
315 spin_unlock_irqrestore(&priv->lock, flags); in ts5500_disable_irq()
320 enum ts5500_blocks block = platform_get_device_id(pdev)->driver_data; in ts5500_dio_probe()
321 struct ts5500_dio_platform_data *pdata = dev_get_platdata(&pdev->dev); in ts5500_dio_probe()
322 struct device *dev = &pdev->dev; in ts5500_dio_probe()
323 const char *name = dev_name(dev); in ts5500_dio_probe() local
332 return -EINVAL; in ts5500_dio_probe()
337 return -ENOMEM; in ts5500_dio_probe()
340 priv->hwirq = res->start; in ts5500_dio_probe()
341 spin_lock_init(&priv->lock); in ts5500_dio_probe()
343 priv->gpio_chip.owner = THIS_MODULE; in ts5500_dio_probe()
344 priv->gpio_chip.label = name; in ts5500_dio_probe()
345 priv->gpio_chip.parent = dev; in ts5500_dio_probe()
346 priv->gpio_chip.direction_input = ts5500_gpio_input; in ts5500_dio_probe()
347 priv->gpio_chip.direction_output = ts5500_gpio_output; in ts5500_dio_probe()
348 priv->gpio_chip.get = ts5500_gpio_get; in ts5500_dio_probe()
349 priv->gpio_chip.set = ts5500_gpio_set; in ts5500_dio_probe()
350 priv->gpio_chip.to_irq = ts5500_gpio_to_irq; in ts5500_dio_probe()
351 priv->gpio_chip.base = -1; in ts5500_dio_probe()
353 priv->gpio_chip.base = pdata->base; in ts5500_dio_probe()
354 priv->strap = pdata->strap; in ts5500_dio_probe()
359 priv->pinout = ts5500_dio1; in ts5500_dio_probe()
360 priv->gpio_chip.ngpio = ARRAY_SIZE(ts5500_dio1); in ts5500_dio_probe()
362 if (!devm_request_region(dev, 0x7a, 3, name)) { in ts5500_dio_probe()
363 dev_err(dev, "failed to request %s ports\n", name); in ts5500_dio_probe()
364 return -EBUSY; in ts5500_dio_probe()
368 priv->pinout = ts5500_dio2; in ts5500_dio_probe()
369 priv->gpio_chip.ngpio = ARRAY_SIZE(ts5500_dio2); in ts5500_dio_probe()
371 if (!devm_request_region(dev, 0x7e, 2, name)) { in ts5500_dio_probe()
372 dev_err(dev, "failed to request %s ports\n", name); in ts5500_dio_probe()
373 return -EBUSY; in ts5500_dio_probe()
379 if (!devm_request_region(dev, 0x7d, 1, name)) { in ts5500_dio_probe()
380 dev_err(dev, "failed to request %s 7D\n", name); in ts5500_dio_probe()
381 return -EBUSY; in ts5500_dio_probe()
388 priv->pinout = ts5500_lcd; in ts5500_dio_probe()
389 priv->gpio_chip.ngpio = ARRAY_SIZE(ts5500_lcd); in ts5500_dio_probe()
391 if (!devm_request_region(dev, 0x72, 2, name)) { in ts5500_dio_probe()
392 dev_err(dev, "failed to request %s ports\n", name); in ts5500_dio_probe()
393 return -EBUSY; in ts5500_dio_probe()
397 if (!devm_request_region(dev, 0x7d, 1, name)) { in ts5500_dio_probe()
398 dev_err(dev, "failed to request %s 7D\n", name); in ts5500_dio_probe()
399 return -EBUSY; in ts5500_dio_probe()
406 spin_lock_irqsave(&priv->lock, flags); in ts5500_dio_probe()
408 spin_unlock_irqrestore(&priv->lock, flags); in ts5500_dio_probe()
412 ret = devm_gpiochip_add_data(dev, &priv->gpio_chip, priv); in ts5500_dio_probe()
420 dev_err(dev, "invalid interrupt %d\n", priv->hwirq); in ts5500_dio_probe()
437 { "ts5500-dio1", TS5500_DIO1 },
438 { "ts5500-dio2", TS5500_DIO2 },
439 { "ts5500-dio-lcd", TS5500_LCD },
440 { "ts5600-dio-lcd", TS5600_LCD },
447 .name = "ts5500-dio",
457 MODULE_AUTHOR("Savoir-faire Linux Inc. <kernel@savoirfairelinux.com>");
458 MODULE_DESCRIPTION("Technologic Systems TS-5500 Digital I/O driver");