Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  1/*
  2 * Coldfire generic GPIO support
  3 *
  4 * (C) Copyright 2009, Steven King <sfking@fdwdc.com>
  5 *
  6 * This program is free software; you can redistribute it and/or modify
  7 * it under the terms of the GNU General Public License as published by
  8 * the Free Software Foundation; version 2 of the License.
  9 *
 10 * This program is distributed in the hope that it will be useful,
 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 13 * GNU General Public License for more details.
 14*/
 15
 16#ifndef coldfire_gpio_h
 17#define coldfire_gpio_h
 18
 19#include <linux/io.h>
 20#include <asm/coldfire.h>
 21#include <asm/mcfsim.h>
 22#include <asm/mcfgpio.h>
 23/*
 24 * The Generic GPIO functions
 25 *
 26 * If the gpio is a compile time constant and is one of the Coldfire gpios,
 27 * use the inline version, otherwise dispatch thru gpiolib.
 28 */
 29
 30static inline int gpio_get_value(unsigned gpio)
 31{
 32	if (__builtin_constant_p(gpio) && gpio < MCFGPIO_PIN_MAX)
 33		return mcfgpio_read(__mcfgpio_ppdr(gpio)) & mcfgpio_bit(gpio);
 34	else
 35		return __gpio_get_value(gpio);
 36}
 37
 38static inline void gpio_set_value(unsigned gpio, int value)
 39{
 40	if (__builtin_constant_p(gpio) && gpio < MCFGPIO_PIN_MAX) {
 41		if (gpio < MCFGPIO_SCR_START) {
 42			unsigned long flags;
 43			MCFGPIO_PORTTYPE data;
 44
 45			local_irq_save(flags);
 46			data = mcfgpio_read(__mcfgpio_podr(gpio));
 47			if (value)
 48				data |= mcfgpio_bit(gpio);
 49			else
 50				data &= ~mcfgpio_bit(gpio);
 51			mcfgpio_write(data, __mcfgpio_podr(gpio));
 52			local_irq_restore(flags);
 53		} else {
 54			if (value)
 55				mcfgpio_write(mcfgpio_bit(gpio),
 56						MCFGPIO_SETR_PORT(gpio));
 57			else
 58				mcfgpio_write(~mcfgpio_bit(gpio),
 59						MCFGPIO_CLRR_PORT(gpio));
 60		}
 61	} else
 62		__gpio_set_value(gpio, value);
 63}
 64
 65static inline int gpio_to_irq(unsigned gpio)
 66{
 67#if defined(MCFGPIO_IRQ_MIN)
 68	if ((gpio >= MCFGPIO_IRQ_MIN) && (gpio < MCFGPIO_IRQ_MAX))
 69#else
 70	if (gpio < MCFGPIO_IRQ_MAX)
 71#endif
 72		return gpio + MCFGPIO_IRQ_VECBASE;
 73	else
 74		return __gpio_to_irq(gpio);
 75}
 76
 77static inline int irq_to_gpio(unsigned irq)
 78{
 79	return (irq >= MCFGPIO_IRQ_VECBASE &&
 80		irq < (MCFGPIO_IRQ_VECBASE + MCFGPIO_IRQ_MAX)) ?
 81		irq - MCFGPIO_IRQ_VECBASE : -ENXIO;
 82}
 83
 84static inline int gpio_cansleep(unsigned gpio)
 85{
 86	return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio);
 87}
 88
 89#ifndef CONFIG_GPIOLIB
 90static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
 91{
 92	int err;
 93
 94	err = gpio_request(gpio, label);
 95	if (err)
 96		return err;
 97
 98	if (flags & GPIOF_DIR_IN)
 99		err = gpio_direction_input(gpio);
100	else
101		err = gpio_direction_output(gpio,
102			(flags & GPIOF_INIT_HIGH) ? 1 : 0);
103
104	if (err)
105		gpio_free(gpio);
106
107	return err;
108}
109#endif /* !CONFIG_GPIOLIB */
110#endif