2009-04-22 23:55:23 +01:00
/*
* 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
* 4 mA to 20 mA . 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.8 V or 3.3 V
*/
enum pin_voltage {
PIN_1_8V = 0 ,
PIN_3_3V ,
} ;
/*
* Structure to define a group of pins and their parameters
*/
struct pin_desc {
unsigned id ;
enum pin_fun fun ;
enum pin_strength strength ;
enum pin_voltage voltage ;
unsigned pullup : 1 ;
} ;
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 */
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 */
2009-05-31 13:32:11 +01:00
void __iomem * hw_gpio_in ,
* hw_gpio_out ,
* hw_gpio_doe ;
2009-04-22 23:55:23 +01:00
int irq , virq ;
} ;
int __init stmp3xxx_pinmux_init ( int virtual_irq_start ) ;
# endif /* __PINMUX_H */