diff options
Diffstat (limited to 'cvmx-gpio.h')
| -rw-r--r-- | cvmx-gpio.h | 71 | 
1 files changed, 66 insertions, 5 deletions
| diff --git a/cvmx-gpio.h b/cvmx-gpio.h index f728933861b21..c10c70247195b 100644 --- a/cvmx-gpio.h +++ b/cvmx-gpio.h @@ -1,5 +1,5 @@  /***********************license start*************** - * Copyright (c) 2003-2010  Cavium Networks (support@cavium.com). All rights + * Copyright (c) 2003-2010  Cavium Inc. (support@cavium.com). All rights   * reserved.   *   * @@ -15,7 +15,7 @@   *     disclaimer in the documentation and/or other materials provided   *     with the distribution. - *   * Neither the name of Cavium Networks nor the names of + *   * Neither the name of Cavium Inc. nor the names of   *     its contributors may be used to endorse or promote products   *     derived from this software without specific prior written   *     permission. @@ -26,7 +26,7 @@   * countries.   * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" - * AND WITH ALL FAULTS AND CAVIUM  NETWORKS MAKES NO PROMISES, REPRESENTATIONS OR + * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR   * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO   * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR   * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM @@ -48,7 +48,7 @@   *   * General Purpose IO interface.   * - * <hr>$Revision: 49448 $<hr> + * <hr>$Revision: 70030 $<hr>   */  #ifndef __CVMX_GPIO_H__ @@ -64,17 +64,78 @@ extern "C" {   * Clear the interrupt rising edge detector for the supplied   * pins in the mask. Chips which have more than 16 GPIO pins   * can't use them for interrupts. - * + e   * @param clear_mask Mask of pins to clear   */  static inline void cvmx_gpio_interrupt_clear(uint16_t clear_mask)  { +    if (OCTEON_IS_MODEL(OCTEON_CN61XX)) +    { +        cvmx_gpio_multi_cast_t multi_cast; +        cvmx_gpio_bit_cfgx_t gpio_bit; +        int core = cvmx_get_core_num(); +         +        multi_cast.u64 = cvmx_read_csr(CVMX_GPIO_MULTI_CAST); +        gpio_bit.u64 = cvmx_read_csr(CVMX_GPIO_BIT_CFGX(core)); + +        /* If Multicast mode is enabled, and GPIO interrupt is enabled for +           edge detection, then GPIO<4..7> interrupts are per core */ +        if (multi_cast.s.en && gpio_bit.s.int_en && gpio_bit.s.int_type) +        { +            /* Clear GPIO<4..7> per core */ +            cvmx_ciu_intx_sum0_t ciu_sum0; +            ciu_sum0.u64 = cvmx_read_csr(CVMX_CIU_INTX_SUM0(core * 2)); +            ciu_sum0.s.gpio = clear_mask & 0xf0; +            cvmx_write_csr(CVMX_CIU_INTX_SUM0(core * 2), ciu_sum0.u64); + +            /* Clear other GPIO pins for all cores. */ +            cvmx_write_csr(CVMX_GPIO_INT_CLR, (clear_mask & ~0xf0)); +            return; +        } +    } +    /* Clear GPIO pins state across all cores and common interrupt states. */       cvmx_gpio_int_clr_t gpio_int_clr;      gpio_int_clr.u64 = 0;      gpio_int_clr.s.type = clear_mask;      cvmx_write_csr(CVMX_GPIO_INT_CLR, gpio_int_clr.u64);  } +/** + * GPIO Output Pin + * + * @param bit   The GPIO to use + * @param mode  Drive GPIO as output pin or not. + * + */ +static inline void cvmx_gpio_cfg(int bit, int mode) +{ +    if (bit > 15 && bit < 20) +    { +        /* CN61XX/CN66XX has 20 GPIO pins and only 16 are interruptable. */ +        if (OCTEON_IS_MODEL(OCTEON_CN61XX) || OCTEON_IS_MODEL(OCTEON_CN66XX)) +        { +            cvmx_gpio_xbit_cfgx_t gpio_xbit; +            gpio_xbit.u64 = cvmx_read_csr(CVMX_GPIO_XBIT_CFGX(bit)); +            if (mode) +                gpio_xbit.s.tx_oe = 1; +            else +                gpio_xbit.s.tx_oe = 0; +            cvmx_write_csr(CVMX_GPIO_XBIT_CFGX(bit), gpio_xbit.u64); +        } +        else +            cvmx_dprintf("cvmx_gpio_cfg: Invalid GPIO bit(%d)\n", bit); +    } +    else +    { +        cvmx_gpio_bit_cfgx_t gpio_bit; +        gpio_bit.u64 = cvmx_read_csr(CVMX_GPIO_BIT_CFGX(bit)); +        if (mode) +            gpio_bit.s.tx_oe = 1; +        else +            gpio_bit.s.tx_oe = 0; +        cvmx_write_csr(CVMX_GPIO_BIT_CFGX(bit), gpio_bit.u64); +    } +}  /**   * GPIO Read Data | 
