aboutsummaryrefslogblamecommitdiffstats
path: root/arch/arm/mach-tegra/p852/board-p852-gpio.c
blob: 71f568087c5da6890acbbfc9d598eb08e7ebac29 (plain) (tree)





























































































































































                                                                       
/*
 * arch/arm/mach-tegra/board-p852-gpio.c
 *
 * Copyright (C) 2010-2011 NVIDIA Corporation.
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/gpio.h>
#include <linux/irq.h>

#include "board-p852.h"

static struct gpio p852_sku23_gpios[] = {
	{TEGRA_GPIO_PW1, GPIOF_OUT_INIT_LOW, "usbpwr0_ena"},
	{TEGRA_GPIO_PB2, GPIOF_OUT_INIT_LOW, "usbpwr1_ena"},
	{TEGRA_GPIO_PA0, GPIOF_OUT_INIT_LOW, "a0"},
	{TEGRA_GPIO_PV2, GPIOF_OUT_INIT_HIGH, "v2"},
	{TEGRA_GPIO_PT4, GPIOF_OUT_INIT_LOW, "t4"},
	{TEGRA_GPIO_PD6, GPIOF_OUT_INIT_HIGH, "d6"},
	{TEGRA_GPIO_PI3, GPIOF_OUT_INIT_LOW, "i3"},
	{TEGRA_GPIO_PV3, GPIOF_OUT_INIT_HIGH, "v3"},
	{TEGRA_GPIO_PW4, GPIOF_IN, "w4"},
	{TEGRA_GPIO_PW5, GPIOF_IN, "w5"},
	{TEGRA_GPIO_PT1, GPIOF_OUT_INIT_LOW, "t1"},
	{TEGRA_GPIO_PW3, GPIOF_OUT_INIT_HIGH, "w3"},
	{TEGRA_GPIO_PD5, GPIOF_IN, "d5"},
	{TEGRA_GPIO_PBB1, GPIOF_OUT_INIT_LOW, "bb1"},
};

static struct gpio p852_sku23_b00_gpios[] = {
	{TEGRA_GPIO_PW1, GPIOF_OUT_INIT_HIGH, "usbpwr0_ena"},
	{TEGRA_GPIO_PB2, GPIOF_OUT_INIT_HIGH, "usbpwr1_ena"},
	{TEGRA_GPIO_PA0, GPIOF_OUT_INIT_LOW, "a0"},
	{TEGRA_GPIO_PV2, GPIOF_OUT_INIT_HIGH, "v2"},
	{TEGRA_GPIO_PT4, GPIOF_OUT_INIT_LOW, "t4"},
	{TEGRA_GPIO_PD6, GPIOF_OUT_INIT_HIGH, "d6"},
	{TEGRA_GPIO_PI3, GPIOF_OUT_INIT_LOW, "i3"},
	{TEGRA_GPIO_PV3, GPIOF_OUT_INIT_HIGH, "v3"},
	{TEGRA_GPIO_PW4, GPIOF_IN, "w4"},
	{TEGRA_GPIO_PW5, GPIOF_IN, "w5"},
	{TEGRA_GPIO_PT1, GPIOF_OUT_INIT_LOW, "t1"},
	{TEGRA_GPIO_PW3, GPIOF_OUT_INIT_HIGH, "w3"},
	{TEGRA_GPIO_PD5, GPIOF_IN, "d5"},
	{TEGRA_GPIO_PBB1, GPIOF_OUT_INIT_LOW, "bb1"},
};

static struct gpio p852_sku5_gpios[] = {
	{TEGRA_GPIO_PW1, GPIOF_OUT_INIT_HIGH, "usbpwr0_ena"},
	{TEGRA_GPIO_PB2, GPIOF_OUT_INIT_HIGH, "usbpwr1_ena"},
	{TEGRA_GPIO_PA0, GPIOF_OUT_INIT_LOW, "a0"},
	{TEGRA_GPIO_PV2, GPIOF_OUT_INIT_HIGH, "v2"},
	{TEGRA_GPIO_PT4, GPIOF_OUT_INIT_LOW, "t4"},
	{TEGRA_GPIO_PD6, GPIOF_OUT_INIT_HIGH, "d6"},
	{TEGRA_GPIO_PI3, GPIOF_OUT_INIT_LOW, "i3"},
	{TEGRA_GPIO_PV3, GPIOF_OUT_INIT_HIGH, "v3"},
	{TEGRA_GPIO_PW4, GPIOF_IN, "w4"},
	{TEGRA_GPIO_PW5, GPIOF_IN, "w5"},
	{TEGRA_GPIO_PT1, GPIOF_OUT_INIT_LOW, "t1"},
	{TEGRA_GPIO_PW3, GPIOF_OUT_INIT_HIGH, "w3"},
	{TEGRA_GPIO_PD5, GPIOF_IN, "d5"},
	{TEGRA_GPIO_PBB1, GPIOF_OUT_INIT_LOW, "bb1"},
	{TEGRA_GPIO_PS3, GPIOF_IN, "s3"},
};

static struct gpio p852_sku8_gpios[] = {
	{TEGRA_GPIO_PW1, GPIOF_OUT_INIT_HIGH, "w1"},
	{TEGRA_GPIO_PB2, GPIOF_OUT_INIT_HIGH, "b2"},
};

static struct gpio p852_sku13_b00_gpios[] = {
	{TEGRA_GPIO_PW1, GPIOF_OUT_INIT_HIGH, "w1"},
	{TEGRA_GPIO_PB2, GPIOF_OUT_INIT_HIGH, "b2"},
	{TEGRA_GPIO_PW2, GPIOF_IN, "w2"},
	{TEGRA_GPIO_PW3, GPIOF_IN, "w3"},
	{TEGRA_GPIO_PD5, GPIOF_OUT_INIT_LOW, "d5"},
	{TEGRA_GPIO_PBB1, GPIOF_OUT_INIT_LOW, "bb1"},
	{TEGRA_GPIO_PN7, GPIOF_OUT_INIT_LOW, "n7"},
	{TEGRA_GPIO_PA6, GPIOF_OUT_INIT_HIGH, "a6"},
	{TEGRA_GPIO_PA7, GPIOF_OUT_INIT_HIGH, "a7"},
};

static struct gpio p852_gpios[] = {
	{TEGRA_GPIO_PW1, GPIOF_OUT_INIT_LOW, "w1"},
	{TEGRA_GPIO_PB2, GPIOF_OUT_INIT_LOW, "b2"},
	{TEGRA_GPIO_PW2, GPIOF_IN, "w2"},
	{TEGRA_GPIO_PW3, GPIOF_IN, "w3"},
	{TEGRA_GPIO_PD5, GPIOF_OUT_INIT_LOW, "d5"},
	{TEGRA_GPIO_PBB1, GPIOF_OUT_INIT_LOW, "bb1"},
	{TEGRA_GPIO_PN7, GPIOF_OUT_INIT_LOW, "n7"},
	{TEGRA_GPIO_PA6, GPIOF_OUT_INIT_HIGH, "a6"},
	{TEGRA_GPIO_PA7, GPIOF_OUT_INIT_HIGH, "a7"},
};

void __init p852_gpio_init(void)
{
	int pin_count = 0;
	int i;
	struct gpio *gpios_info = NULL;

	switch (system_rev) {
	case P852_SKU23:
		{
			gpios_info = p852_sku23_gpios;
			pin_count = ARRAY_SIZE(p852_sku23_gpios);
		}
		break;
	case P852_SKU23_B00:
	case P852_SKU23_C01:
		{
			gpios_info = p852_sku23_b00_gpios;
			pin_count = ARRAY_SIZE(p852_sku23_b00_gpios);
		}
		break;
	case P852_SKU5_B00:
	case P852_SKU5_C01:
		{
			gpios_info = p852_sku5_gpios;
			pin_count = ARRAY_SIZE(p852_sku5_gpios);
		}
		break;
	case P852_SKU8_B00:
	case P852_SKU8_C01:
	case P852_SKU9_B00:
	case P852_SKU9_C01:
		{
			gpios_info = p852_sku8_gpios;
			pin_count = ARRAY_SIZE(p852_sku8_gpios);
		}
		break;
	case P852_SKU13_B00:
		{
			gpios_info = p852_sku13_b00_gpios;
			pin_count = ARRAY_SIZE(p852_sku13_b00_gpios);
		}
		break;
	default:
		{
			gpios_info = p852_gpios;
			pin_count = ARRAY_SIZE(p852_gpios);
		}
	}

	gpio_request_array(gpios_info, pin_count);
	for (i = 0; i < pin_count; i++) {
		tegra_gpio_enable(gpios_info[i].gpio);
		gpio_export(gpios_info[i].gpio, true);
	}
}