#include <linux/gpio/driver.h>
#include <linux/interrupt.h>
#include <linux/irqdomain.h>
#include <linux/export.h>
#include <linux/ssb/ssb.h>
#if IS_ENABLED(CONFIG_SSB_EMBEDDED)
static int ssb_gpio_to_irq(struct gpio_chip *chip, unsigned int gpio)
struct ssb_bus *bus = gpiochip_get_data(chip);
if (bus->bustype == SSB_BUSTYPE_SSB)
return irq_find_mapping(bus->irq_domain, gpio);
static int ssb_gpio_chipco_get_value(struct gpio_chip *chip, unsigned int gpio)
struct ssb_bus *bus = gpiochip_get_data(chip);
return !!ssb_chipco_gpio_in(&bus->chipco, 1 << gpio);
static void ssb_gpio_chipco_set_value(struct gpio_chip *chip, unsigned int gpio,
struct ssb_bus *bus = gpiochip_get_data(chip);
ssb_chipco_gpio_out(&bus->chipco, 1 << gpio, value ? 1 << gpio : 0);
static int ssb_gpio_chipco_direction_input(struct gpio_chip *chip,
struct ssb_bus *bus = gpiochip_get_data(chip);
ssb_chipco_gpio_outen(&bus->chipco, 1 << gpio, 0);
static int ssb_gpio_chipco_direction_output(struct gpio_chip *chip,
unsigned int gpio, int value)
struct ssb_bus *bus = gpiochip_get_data(chip);
ssb_chipco_gpio_outen(&bus->chipco, 1 << gpio, 1 << gpio);
ssb_chipco_gpio_out(&bus->chipco, 1 << gpio, value ? 1 << gpio : 0);
static int ssb_gpio_chipco_request(struct gpio_chip *chip, unsigned int gpio)
struct ssb_bus *bus = gpiochip_get_data(chip);
ssb_chipco_gpio_control(&bus->chipco, 1 << gpio, 0);
ssb_chipco_gpio_pulldown(&bus->chipco, 1 << gpio, 0);
ssb_chipco_gpio_pullup(&bus->chipco, 1 << gpio, 1 << gpio);
static void ssb_gpio_chipco_free(struct gpio_chip *chip, unsigned int gpio)
struct ssb_bus *bus = gpiochip_get_data(chip);