Logo Search packages:      
Sourcecode: linux version File versions  Download package

pinmux.h

/*
 * Freescale STMP37XX/STMP378X Pin Multiplexing
 *
 * Author: Vladislav Buzov <vbuzov@embeddedalley.com>
 *
 * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved.
 * Copyright 2008 Embedded Alley Solutions, Inc All Rights Reserved.
 */

/*
 * The code contained herein is licensed under the GNU General Public
 * License. You may obtain a copy of the GNU General Public License
 * Version 2 or later at the following locations:
 *
 * http://www.opensource.org/licenses/gpl-license.html
 * http://www.gnu.org/copyleft/gpl.html
 */
#ifndef __PINMUX_H
#define __PINMUX_H

#include <linux/spinlock.h>
#include <linux/types.h>
#include <linux/gpio.h>
#include <asm-generic/gpio.h>

/* Pin definitions */
#include "pins.h"
#include <mach/pins.h>

/*
 * Each pin may be routed up to four different HW interfaces
 * including GPIO
 */
enum pin_fun {
      PIN_FUN1 = 0,
      PIN_FUN2,
      PIN_FUN3,
      PIN_GPIO,
};

/*
 * Each pin may have different output drive strength in range from
 * 4mA to 20mA. The most common case is 4, 8 and 12 mA strengths.
 */
enum pin_strength {
      PIN_4MA = 0,
      PIN_8MA,
      PIN_12MA,
      PIN_16MA,
      PIN_20MA,
};

/*
 * Each pin can be programmed for 1.8V or 3.3V
 */
enum pin_voltage {
      PIN_1_8V = 0,
      PIN_3_3V,
};

/*
 * Structure to define a group of pins and their parameters
 */
00064 struct pin_desc {
      unsigned id;
      enum pin_fun fun;
      enum pin_strength strength;
      enum pin_voltage voltage;
      unsigned pullup:1;
};

00072 struct pin_group {
      struct pin_desc *pins;
      int nr_pins;
};

/* Set pin drive strength */
void stmp3xxx_pin_strength(unsigned id, enum pin_strength strength,
                     const char *label);

/* Set pin voltage */
void stmp3xxx_pin_voltage(unsigned id, enum pin_voltage voltage,
                     const char *label);

/* Enable pull-up resistor for a pin */
void stmp3xxx_pin_pullup(unsigned id, int enable, const char *label);

/*
 * Request a pin ownership, only one module (identified by @label)
 * may own a pin.
 */
int stmp3xxx_request_pin(unsigned id, enum pin_fun fun, const char *label);

/* Release pin */
void stmp3xxx_release_pin(unsigned id, const char *label);

void stmp3xxx_set_pin_type(unsigned id, enum pin_fun fun);

/*
 * Each bank is associated with a number of registers to control
 * pin function, drive strength, voltage and pull-up reigster. The
 * number of registers of a given type depends on the number of bits
 * describin particular pin.
 */
#define HW_MUXSEL_NUM         2     /* registers per bank */
#define HW_MUXSEL_PIN_LEN     2     /* bits per pin */
#define HW_MUXSEL_PIN_NUM     16    /* pins per register */
#define HW_MUXSEL_PINFUN_MASK 0x3   /* pin function mask */
#define HW_MUXSEL_PINFUN_NUM  4     /* four options for a pin */

#define HW_DRIVE_NUM          4     /* registers per bank */
#define HW_DRIVE_PIN_LEN      4     /* bits per pin */
#define HW_DRIVE_PIN_NUM      8     /* pins per register */
#define HW_DRIVE_PINDRV_MASK  0x3   /* pin strength mask - 2 bits */
#define HW_DRIVE_PINDRV_NUM   5     /* five possible strength values */
#define HW_DRIVE_PINV_MASK    0x4   /* pin voltage mask - 1 bit */


00119 struct stmp3xxx_pinmux_bank {
      struct gpio_chip chip;

      /* Pins allocation map */
      unsigned long pin_map;

      /* Pin owner names */
      const char *pin_labels[32];

      /* Bank registers */
      void __iomem *hw_muxsel[HW_MUXSEL_NUM];
      void __iomem *hw_drive[HW_DRIVE_NUM];
      void __iomem *hw_pull;

      void __iomem *pin2irq,
            *irqlevel,
            *irqpolarity,
            *irqen,
            *irqstat;

      /* HW MUXSEL register function bit values */
      u8 functions[HW_MUXSEL_PINFUN_NUM];

      /*
       * HW DRIVE register strength bit values:
       * 0xff - requested strength is not supported for this bank
       */
      u8 strengths[HW_DRIVE_PINDRV_NUM];

      /* GPIO things */
      void __iomem *hw_gpio_in,
                 *hw_gpio_out,
                 *hw_gpio_doe;
      int irq, virq;
};

int __init stmp3xxx_pinmux_init(int virtual_irq_start);

#endif /* __PINMUX_H */

Generated by  Doxygen 1.6.0   Back to index