cregit-Linux how code gets into the kernel

Release 4.11 drivers/bcma/driver_gpio.c

Directory: drivers/bcma
/*
 * Broadcom specific AMBA
 * GPIO driver
 *
 * Copyright 2011, Broadcom Corporation
 * Copyright 2012, Hauke Mehrtens <hauke@hauke-m.de>
 *
 * Licensed under the GNU/GPL. See COPYING for details.
 */

#include <linux/gpio/driver.h>
#include <linux/interrupt.h>
#include <linux/export.h>
#include <linux/bcma/bcma.h>

#include "bcma_private.h"


#define BCMA_GPIO_MAX_PINS	32


static int bcma_gpio_get_value(struct gpio_chip *chip, unsigned gpio) { struct bcma_drv_cc *cc = gpiochip_get_data(chip); return !!bcma_chipco_gpio_in(cc, 1 << gpio); }

Contributors

PersonTokensPropCommitsCommitProp
Hauke Mehrtens3597.22%150.00%
Linus Walleij12.78%150.00%
Total36100.00%2100.00%


static void bcma_gpio_set_value(struct gpio_chip *chip, unsigned gpio, int value) { struct bcma_drv_cc *cc = gpiochip_get_data(chip); bcma_chipco_gpio_out(cc, 1 << gpio, value ? 1 << gpio : 0); }

Contributors

PersonTokensPropCommitsCommitProp
Hauke Mehrtens4397.73%150.00%
Linus Walleij12.27%150.00%
Total44100.00%2100.00%


static int bcma_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) { struct bcma_drv_cc *cc = gpiochip_get_data(chip); bcma_chipco_gpio_outen(cc, 1 << gpio, 0); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Hauke Mehrtens3797.37%150.00%
Linus Walleij12.63%150.00%
Total38100.00%2100.00%


static int bcma_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, int value) { struct bcma_drv_cc *cc = gpiochip_get_data(chip); bcma_chipco_gpio_outen(cc, 1 << gpio, 1 << gpio); bcma_chipco_gpio_out(cc, 1 << gpio, value ? 1 << gpio : 0); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Hauke Mehrtens5998.33%150.00%
Linus Walleij11.67%150.00%
Total60100.00%2100.00%


static int bcma_gpio_request(struct gpio_chip *chip, unsigned gpio) { struct bcma_drv_cc *cc = gpiochip_get_data(chip); bcma_chipco_gpio_control(cc, 1 << gpio, 0); /* clear pulldown */ bcma_chipco_gpio_pulldown(cc, 1 << gpio, 0); /* Set pullup */ bcma_chipco_gpio_pullup(cc, 1 << gpio, 1 << gpio); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Hauke Mehrtens6398.44%150.00%
Linus Walleij11.56%150.00%
Total64100.00%2100.00%


static void bcma_gpio_free(struct gpio_chip *chip, unsigned gpio) { struct bcma_drv_cc *cc = gpiochip_get_data(chip); /* clear pullup */ bcma_chipco_gpio_pullup(cc, 1 << gpio, 0); }

Contributors

PersonTokensPropCommitsCommitProp
Hauke Mehrtens3597.22%150.00%
Linus Walleij12.78%150.00%
Total36100.00%2100.00%

#if IS_BUILTIN(CONFIG_BCM47XX) || IS_BUILTIN(CONFIG_ARCH_BCM_5301X)
static void bcma_gpio_irq_unmask(struct irq_data *d) { struct gpio_chip *gc = irq_data_get_irq_chip_data(d); struct bcma_drv_cc *cc = gpiochip_get_data(gc); int gpio = irqd_to_hwirq(d); u32 val = bcma_chipco_gpio_in(cc, BIT(gpio)); bcma_chipco_gpio_polarity(cc, BIT(gpio), val); bcma_chipco_gpio_intmask(cc, BIT(gpio), BIT(gpio)); }

Contributors

PersonTokensPropCommitsCommitProp
Hauke Mehrtens3746.84%240.00%
Rafał Miłecki3240.51%120.00%
Linus Walleij1012.66%240.00%
Total79100.00%5100.00%


static void bcma_gpio_irq_mask(struct irq_data *d) { struct gpio_chip *gc = irq_data_get_irq_chip_data(d); struct bcma_drv_cc *cc = gpiochip_get_data(gc); int gpio = irqd_to_hwirq(d); bcma_chipco_gpio_intmask(cc, BIT(gpio), 0); }

Contributors

PersonTokensPropCommitsCommitProp
Rafał Miłecki3976.47%133.33%
Linus Walleij1223.53%266.67%
Total51100.00%3100.00%

static struct irq_chip bcma_gpio_irq_chip = { .name = "BCMA-GPIO", .irq_mask = bcma_gpio_irq_mask, .irq_unmask = bcma_gpio_irq_unmask, };
static irqreturn_t bcma_gpio_irq_handler(int irq, void *dev_id) { struct bcma_drv_cc *cc = dev_id; struct gpio_chip *gc = &cc->gpio; u32 val = bcma_cc_read32(cc, BCMA_CC_GPIOIN); u32 mask = bcma_cc_read32(cc, BCMA_CC_GPIOIRQ); u32 pol = bcma_cc_read32(cc, BCMA_CC_GPIOPOL); unsigned long irqs = (val ^ pol) & mask; int gpio; if (!irqs) return IRQ_NONE; for_each_set_bit(gpio, &irqs, gc->ngpio) generic_handle_irq(irq_find_mapping(gc->irqdomain, gpio)); bcma_chipco_gpio_polarity(cc, irqs, val & irqs); return IRQ_HANDLED; }

Contributors

PersonTokensPropCommitsCommitProp
Rafał Miłecki10388.03%266.67%
Linus Walleij1411.97%133.33%
Total117100.00%3100.00%


static int bcma_gpio_irq_init(struct bcma_drv_cc *cc) { struct gpio_chip *chip = &cc->gpio; int hwirq, err; if (cc->core->bus->hosttype != BCMA_HOSTTYPE_SOC) return 0; hwirq = bcma_core_irq(cc->core, 0); err = request_irq(hwirq, bcma_gpio_irq_handler, IRQF_SHARED, "gpio", cc); if (err) return err; bcma_chipco_gpio_intmask(cc, ~0, 0); bcma_cc_set32(cc, BCMA_CC_IRQMASK, BCMA_CC_IRQ_GPIO); err = gpiochip_irqchip_add(chip, &bcma_gpio_irq_chip, 0, handle_simple_irq, IRQ_TYPE_NONE); if (err) { free_irq(hwirq, cc); return err; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Rafał Miłecki8969.53%125.00%
Linus Walleij2721.09%125.00%
Hauke Mehrtens129.38%250.00%
Total128100.00%4100.00%


static void bcma_gpio_irq_exit(struct bcma_drv_cc *cc) { if (cc->core->bus->hosttype != BCMA_HOSTTYPE_SOC) return; bcma_cc_mask32(cc, BCMA_CC_IRQMASK, ~BCMA_CC_IRQ_GPIO); free_irq(bcma_core_irq(cc->core, 0), cc); }

Contributors

PersonTokensPropCommitsCommitProp
Rafał Miłecki4593.75%133.33%
Hauke Mehrtens24.17%133.33%
Linus Walleij12.08%133.33%
Total48100.00%3100.00%

#else
static int bcma_gpio_irq_init(struct bcma_drv_cc *cc) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Rafał Miłecki1392.86%150.00%
Linus Walleij17.14%150.00%
Total14100.00%2100.00%


static void bcma_gpio_irq_exit(struct bcma_drv_cc *cc) { }

Contributors

PersonTokensPropCommitsCommitProp
Rafał Miłecki990.00%150.00%
Linus Walleij110.00%150.00%
Total10100.00%2100.00%

#endif
int bcma_gpio_init(struct bcma_drv_cc *cc) { struct bcma_bus *bus = cc->core->bus; struct gpio_chip *chip = &cc->gpio; int err; chip->label = "bcma_gpio"; chip->owner = THIS_MODULE; chip->request = bcma_gpio_request; chip->free = bcma_gpio_free; chip->get = bcma_gpio_get_value; chip->set = bcma_gpio_set_value; chip->direction_input = bcma_gpio_direction_input; chip->direction_output = bcma_gpio_direction_output; chip->owner = THIS_MODULE; chip->parent = bcma_bus_get_host_dev(bus); #if IS_BUILTIN(CONFIG_OF) if (cc->core->bus->hosttype == BCMA_HOSTTYPE_SOC) chip->of_node = cc->core->dev.of_node; #endif switch (bus->chipinfo.id) { case BCMA_CHIP_ID_BCM4707: case BCMA_CHIP_ID_BCM5357: case BCMA_CHIP_ID_BCM53572: case BCMA_CHIP_ID_BCM47094: chip->ngpio = 32; break; default: chip->ngpio = 16; } /* * Register SoC GPIO devices with absolute GPIO pin base. * On MIPS, we don't have Device Tree and we can't use relative (per chip) * GPIO numbers. * On some ARM devices, user space may want to access some system GPIO * pins directly, which is easier to do with a predictable GPIO base. */ if (IS_BUILTIN(CONFIG_BCM47XX) || cc->core->bus->hosttype == BCMA_HOSTTYPE_SOC) chip->base = bus->num * BCMA_GPIO_MAX_PINS; else chip->base = -1; err = gpiochip_add_data(chip, cc); if (err) return err; err = bcma_gpio_irq_init(cc); if (err) { gpiochip_remove(chip); return err; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Rafał Miłecki11045.64%646.15%
Hauke Mehrtens9439.00%215.38%
Linus Walleij197.88%323.08%
Felix Fietkau187.47%215.38%
Total241100.00%13100.00%


int bcma_gpio_unregister(struct bcma_drv_cc *cc) { bcma_gpio_irq_exit(cc); gpiochip_remove(&cc->gpio); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Hauke Mehrtens1869.23%125.00%
Rafał Miłecki415.38%125.00%
abdoulaye berthe311.54%125.00%
Linus Walleij13.85%125.00%
Total26100.00%4100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Rafał Miłecki49046.71%945.00%
Hauke Mehrtens44542.42%525.00%
Linus Walleij938.87%315.00%
Felix Fietkau181.72%210.00%
abdoulaye berthe30.29%15.00%
Total1049100.00%20100.00%
Directory: drivers/bcma
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.