linux/drivers/media/pci/cx25821/cx25821-gpio.c
<<
>>
Prefs
   1/*
   2 *  Driver for the Conexant CX25821 PCIe bridge
   3 *
   4 *  Copyright (C) 2009 Conexant Systems Inc.
   5 *  Authors  <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
   6 *
   7 *  This program is free software; you can redistribute it and/or modify
   8 *  it under the terms of the GNU General Public License as published by
   9 *  the Free Software Foundation; either version 2 of the License, or
  10 *  (at your option) any later version.
  11 *
  12 *  This program is distributed in the hope that it will be useful,
  13 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 *
  16 *  GNU General Public License for more details.
  17 */
  18
  19#include <linux/module.h>
  20#include "cx25821.h"
  21
  22/********************* GPIO stuffs *********************/
  23void cx25821_set_gpiopin_direction(struct cx25821_dev *dev,
  24                                   int pin_number, int pin_logic_value)
  25{
  26        int bit = pin_number;
  27        u32 gpio_oe_reg = GPIO_LO_OE;
  28        u32 gpio_register = 0;
  29        u32 value = 0;
  30
  31        /* Check for valid pinNumber */
  32        if (pin_number >= 47)
  33                return;
  34
  35        if (pin_number > 31) {
  36                bit = pin_number - 31;
  37                gpio_oe_reg = GPIO_HI_OE;
  38        }
  39        /* Here we will make sure that the GPIOs 0 and 1 are output. keep the
  40         * rest as is */
  41        gpio_register = cx_read(gpio_oe_reg);
  42
  43        if (pin_logic_value == 1)
  44                value = gpio_register | Set_GPIO_Bit(bit);
  45        else
  46                value = gpio_register & Clear_GPIO_Bit(bit);
  47
  48        cx_write(gpio_oe_reg, value);
  49}
  50EXPORT_SYMBOL(cx25821_set_gpiopin_direction);
  51
  52static void cx25821_set_gpiopin_logicvalue(struct cx25821_dev *dev,
  53                                           int pin_number, int pin_logic_value)
  54{
  55        int bit = pin_number;
  56        u32 gpio_reg = GPIO_LO;
  57        u32 value = 0;
  58
  59        /* Check for valid pinNumber */
  60        if (pin_number >= 47)
  61                return;
  62
  63        /* change to output direction */
  64        cx25821_set_gpiopin_direction(dev, pin_number, 0);
  65
  66        if (pin_number > 31) {
  67                bit = pin_number - 31;
  68                gpio_reg = GPIO_HI;
  69        }
  70
  71        value = cx_read(gpio_reg);
  72
  73        if (pin_logic_value == 0)
  74                value &= Clear_GPIO_Bit(bit);
  75        else
  76                value |= Set_GPIO_Bit(bit);
  77
  78        cx_write(gpio_reg, value);
  79}
  80
  81void cx25821_gpio_init(struct cx25821_dev *dev)
  82{
  83        if (dev == NULL)
  84                return;
  85
  86        switch (dev->board) {
  87        case CX25821_BOARD_CONEXANT_ATHENA10:
  88        default:
  89                /* set GPIO 5 to select the path for Medusa/Athena */
  90                cx25821_set_gpiopin_logicvalue(dev, 5, 1);
  91                mdelay(20);
  92                break;
  93        }
  94
  95}
  96