blob: cfccd27fc0e18953ff6ea0c5062c7ee6cf41cdb1 [file] [log] [blame]
/*
* Google LWIS GPIO Interface
*
* Copyright (c) 2018 Google, LLC
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef LWIS_GPIO_H_
#define LWIS_GPIO_H_
#include <linux/gpio/consumer.h>
#include "lwis_commands.h"
#include "lwis_interrupt.h"
/*
* struct lwis_gpios_info
* This structure is to store the gpios information
*/
struct lwis_gpios_info {
char name[LWIS_MAX_NAME_STRING_LEN];
bool is_shared;
bool is_pulse;
struct gpio_descs *gpios;
struct lwis_interrupt_list *irq_list;
};
/*
* struct lwis_gpios_list
* This structure is to store the gpios that have been acquired
*/
struct lwis_gpios_list {
struct lwis_gpios_info *gpios_info;
/* Count of gpios info */
int count;
};
/*
* LWIS GPIO Interface Functions
*/
/* debug function */
void lwis_gpio_list_print(char *name, struct gpio_descs *gpios);
/*
* Acquire GPIO descriptors.
*/
struct gpio_descs *lwis_gpio_list_get(struct device *dev, const char *name);
/*
* Release GPIO descriptors.
*/
void lwis_gpio_list_put(struct gpio_descs *gpios, struct device *dev);
/*
* Set output value for all the GPIOs in the list. This function takes active
* high/low into consideration already, i.e. 0 = deasserted, 1 = asserted.
*/
int lwis_gpio_list_set_output_value(struct gpio_descs *gpios, int value);
/*
* Set output value for all the GPIOs in the list. This function ignores the
* active-low or open drain property of a GPIO and work on the raw line value,
* i.e. 0 = physical line low, 1 = physical line high.
*/
int lwis_gpio_list_set_output_value_raw(struct gpio_descs *gpios, int value);
/*
* Set all the GPIO pins in the list to input.
*/
int lwis_gpio_list_set_input(struct gpio_descs *gpios);
/*
* Get the IRQ list corresponding to the GPIO list
*/
int lwis_gpio_list_to_irqs(struct lwis_device *lwis_dev, struct lwis_gpios_info *gpios_info,
char *irq_gpios_names);
/*
* Allocate an instance of the lwis_gpios_info and initialize
* the data structures according to the number of lwis_gpios_info
* specified.
*/
struct lwis_gpios_list *lwis_gpios_list_alloc(int count);
/*
* Deallocate the lwis_gpios_list structure.
*/
void lwis_gpios_list_free(struct lwis_gpios_list *list);
/*
* Search the lwis_device_gpios_list and return the lwis_gpios_info
* if the name is matched
*/
struct lwis_gpios_info *lwis_gpios_get_info_by_name(struct lwis_gpios_list *list, char *name);
#endif /* LWIS_GPIO_H_ */