forked from Minki/linux
Merge branch 'nomadik' into devel
This commit is contained in:
commit
ae1cde8c50
@ -24,6 +24,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/platform_data/pinctrl-nomadik.h>
|
||||
#include <asm/hardware/vic.h>
|
||||
#include <asm/sizes.h>
|
||||
#include <asm/mach-types.h>
|
||||
@ -32,9 +33,7 @@
|
||||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include <plat/gpio-nomadik.h>
|
||||
#include <plat/mtu.h>
|
||||
#include <plat/pincfg.h>
|
||||
|
||||
#include <linux/platform_data/mtd-nomadik-nand.h>
|
||||
#include <mach/fsmc.h>
|
||||
|
@ -26,8 +26,8 @@
|
||||
#include <linux/irq.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_data/clk-nomadik.h>
|
||||
#include <linux/platform_data/pinctrl-nomadik.h>
|
||||
|
||||
#include <plat/gpio-nomadik.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
@ -4,8 +4,7 @@
|
||||
#include <linux/i2c-algo-bit.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <plat/gpio-nomadik.h>
|
||||
#include <plat/pincfg.h>
|
||||
#include <linux/platform_data/pinctrl-nomadik.h>
|
||||
|
||||
/*
|
||||
* There are two busses in the 8815NHK.
|
||||
|
@ -7,9 +7,8 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/platform_data/pinctrl-nomadik.h>
|
||||
|
||||
#include <plat/gpio-nomadik.h>
|
||||
#include <plat/pincfg.h>
|
||||
#include <plat/ste_dma40.h>
|
||||
|
||||
#include <mach/devices.h>
|
||||
|
@ -9,10 +9,9 @@
|
||||
#include <linux/bug.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/platform_data/pinctrl-nomadik.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <plat/pincfg.h>
|
||||
#include <plat/gpio-nomadik.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
|
@ -37,13 +37,13 @@
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
#include <linux/platform_data/pinctrl-nomadik.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/hardware/gic.h>
|
||||
|
||||
#include <plat/ste_dma40.h>
|
||||
#include <plat/gpio-nomadik.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/setup.h>
|
||||
|
@ -17,14 +17,14 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mfd/abx500/ab8500.h>
|
||||
#include <linux/platform_data/usb-musb-ux500.h>
|
||||
#include <linux/platform_data/pinctrl-nomadik.h>
|
||||
|
||||
#include <asm/pmu.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <plat/gpio-nomadik.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/setup.h>
|
||||
#include <mach/devices.h>
|
||||
#include <linux/platform_data/usb-musb-ux500.h>
|
||||
#include <mach/db8500-regs.h>
|
||||
|
||||
#include "devices-db8500.h"
|
||||
@ -158,7 +158,7 @@ static void __init db8500_add_gpios(struct device *parent)
|
||||
|
||||
dbx500_add_gpios(parent, ARRAY_AND_SIZE(db8500_gpio_base),
|
||||
IRQ_DB8500_GPIO0, &pdata);
|
||||
dbx500_add_pinctrl(parent, "pinctrl-db8500");
|
||||
dbx500_add_pinctrl(parent, "pinctrl-db8500", U8500_PRCMU_BASE);
|
||||
}
|
||||
|
||||
static int usb_db8500_rx_dma_cfg[] = {
|
||||
|
@ -11,8 +11,7 @@
|
||||
#include <linux/irq.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <plat/gpio-nomadik.h>
|
||||
#include <linux/platform_data/pinctrl-nomadik.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
|
@ -129,12 +129,18 @@ void dbx500_add_gpios(struct device *parent, resource_size_t *base, int num,
|
||||
int irq, struct nmk_gpio_platform_data *pdata);
|
||||
|
||||
static inline void
|
||||
dbx500_add_pinctrl(struct device *parent, const char *name)
|
||||
dbx500_add_pinctrl(struct device *parent, const char *name,
|
||||
resource_size_t base)
|
||||
{
|
||||
struct resource res[] = {
|
||||
DEFINE_RES_MEM(base, SZ_8K),
|
||||
};
|
||||
struct platform_device_info pdevinfo = {
|
||||
.parent = parent,
|
||||
.name = name,
|
||||
.id = -1,
|
||||
.res = res,
|
||||
.num_res = ARRAY_SIZE(res),
|
||||
};
|
||||
|
||||
platform_device_register_full(&pdevinfo);
|
||||
|
@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Structures and registers for GPIO access in the Nomadik SoC
|
||||
*
|
||||
* Copyright (C) 2008 STMicroelectronics
|
||||
* Author: Prafulla WADASKAR <prafulla.wadaskar@st.com>
|
||||
* Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __PLAT_NOMADIK_GPIO
|
||||
#define __PLAT_NOMADIK_GPIO
|
||||
|
||||
/*
|
||||
* "nmk_gpio" and "NMK_GPIO" stand for "Nomadik GPIO", leaving
|
||||
* the "gpio" namespace for generic and cross-machine functions
|
||||
*/
|
||||
|
||||
/* Register in the logic block */
|
||||
#define NMK_GPIO_DAT 0x00
|
||||
#define NMK_GPIO_DATS 0x04
|
||||
#define NMK_GPIO_DATC 0x08
|
||||
#define NMK_GPIO_PDIS 0x0c
|
||||
#define NMK_GPIO_DIR 0x10
|
||||
#define NMK_GPIO_DIRS 0x14
|
||||
#define NMK_GPIO_DIRC 0x18
|
||||
#define NMK_GPIO_SLPC 0x1c
|
||||
#define NMK_GPIO_AFSLA 0x20
|
||||
#define NMK_GPIO_AFSLB 0x24
|
||||
#define NMK_GPIO_LOWEMI 0x28
|
||||
|
||||
#define NMK_GPIO_RIMSC 0x40
|
||||
#define NMK_GPIO_FIMSC 0x44
|
||||
#define NMK_GPIO_IS 0x48
|
||||
#define NMK_GPIO_IC 0x4c
|
||||
#define NMK_GPIO_RWIMSC 0x50
|
||||
#define NMK_GPIO_FWIMSC 0x54
|
||||
#define NMK_GPIO_WKS 0x58
|
||||
|
||||
/* Alternate functions: function C is set in hw by setting both A and B */
|
||||
#define NMK_GPIO_ALT_GPIO 0
|
||||
#define NMK_GPIO_ALT_A 1
|
||||
#define NMK_GPIO_ALT_B 2
|
||||
#define NMK_GPIO_ALT_C (NMK_GPIO_ALT_A | NMK_GPIO_ALT_B)
|
||||
|
||||
#define NMK_GPIO_ALT_CX_SHIFT 2
|
||||
#define NMK_GPIO_ALT_C1 ((1<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
|
||||
#define NMK_GPIO_ALT_C2 ((2<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
|
||||
#define NMK_GPIO_ALT_C3 ((3<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
|
||||
#define NMK_GPIO_ALT_C4 ((4<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
|
||||
|
||||
/* Pull up/down values */
|
||||
enum nmk_gpio_pull {
|
||||
NMK_GPIO_PULL_NONE,
|
||||
NMK_GPIO_PULL_UP,
|
||||
NMK_GPIO_PULL_DOWN,
|
||||
};
|
||||
|
||||
/* Sleep mode */
|
||||
enum nmk_gpio_slpm {
|
||||
NMK_GPIO_SLPM_INPUT,
|
||||
NMK_GPIO_SLPM_WAKEUP_ENABLE = NMK_GPIO_SLPM_INPUT,
|
||||
NMK_GPIO_SLPM_NOCHANGE,
|
||||
NMK_GPIO_SLPM_WAKEUP_DISABLE = NMK_GPIO_SLPM_NOCHANGE,
|
||||
};
|
||||
|
||||
extern int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode);
|
||||
extern int nmk_gpio_set_pull(int gpio, enum nmk_gpio_pull pull);
|
||||
#ifdef CONFIG_PINCTRL_NOMADIK
|
||||
extern int nmk_gpio_set_mode(int gpio, int gpio_mode);
|
||||
#else
|
||||
static inline int nmk_gpio_set_mode(int gpio, int gpio_mode)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
extern int nmk_gpio_get_mode(int gpio);
|
||||
|
||||
extern void nmk_gpio_wakeups_suspend(void);
|
||||
extern void nmk_gpio_wakeups_resume(void);
|
||||
|
||||
extern void nmk_gpio_clocks_enable(void);
|
||||
extern void nmk_gpio_clocks_disable(void);
|
||||
|
||||
extern void nmk_gpio_read_pull(int gpio_bank, u32 *pull_up);
|
||||
|
||||
/*
|
||||
* Platform data to register a block: only the initial gpio/irq number.
|
||||
*/
|
||||
struct nmk_gpio_platform_data {
|
||||
char *name;
|
||||
int first_gpio;
|
||||
int first_irq;
|
||||
int num_gpio;
|
||||
u32 (*get_secondary_status)(unsigned int bank);
|
||||
void (*set_ioforce)(bool enable);
|
||||
bool supports_sleepmode;
|
||||
};
|
||||
|
||||
#endif /* __PLAT_NOMADIK_GPIO */
|
@ -600,14 +600,66 @@ static const unsigned usbsim_c_2_pins[] = { DB8500_PIN_AF8 };
|
||||
static const unsigned i2c3_c_2_pins[] = { DB8500_PIN_AG7, DB8500_PIN_AF7 };
|
||||
|
||||
/* Other C1 column */
|
||||
static const unsigned u2rx_oc1_1_pins[] = { DB8500_PIN_AB2 };
|
||||
static const unsigned stmape_oc1_1_pins[] = { DB8500_PIN_AA4, DB8500_PIN_Y4,
|
||||
DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
|
||||
static const unsigned remap0_oc1_1_pins[] = { DB8500_PIN_E1 };
|
||||
static const unsigned remap1_oc1_1_pins[] = { DB8500_PIN_E2 };
|
||||
static const unsigned ptma9_oc1_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
|
||||
DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H2,
|
||||
DB8500_PIN_J2, DB8500_PIN_H1 };
|
||||
static const unsigned kp_oc1_1_pins[] = { DB8500_PIN_C6, DB8500_PIN_B3,
|
||||
DB8500_PIN_C4, DB8500_PIN_E6, DB8500_PIN_A3, DB8500_PIN_B6,
|
||||
DB8500_PIN_D6, DB8500_PIN_B7 };
|
||||
static const unsigned rf_oc1_1_pins[] = { DB8500_PIN_D8, DB8500_PIN_D9 };
|
||||
static const unsigned hxclk_oc1_1_pins[] = { DB8500_PIN_D16 };
|
||||
static const unsigned uartmodrx_oc1_1_pins[] = { DB8500_PIN_B17 };
|
||||
static const unsigned uartmodtx_oc1_1_pins[] = { DB8500_PIN_C16 };
|
||||
static const unsigned stmmod_oc1_1_pins[] = { DB8500_PIN_C19, DB8500_PIN_C17,
|
||||
DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19 };
|
||||
static const unsigned hxgpio_oc1_1_pins[] = { DB8500_PIN_D21, DB8500_PIN_D20,
|
||||
DB8500_PIN_C20, DB8500_PIN_B21, DB8500_PIN_C21, DB8500_PIN_A22,
|
||||
DB8500_PIN_B24, DB8500_PIN_C22 };
|
||||
static const unsigned rf_oc1_2_pins[] = { DB8500_PIN_C23, DB8500_PIN_D23 };
|
||||
static const unsigned spi2_oc1_1_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AG12,
|
||||
DB8500_PIN_AH12, DB8500_PIN_AH11 };
|
||||
static const unsigned spi2_oc1_2_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AH12,
|
||||
DB8500_PIN_AH11 };
|
||||
|
||||
/* Other C2 column */
|
||||
static const unsigned sbag_oc2_1_pins[] = { DB8500_PIN_AA4, DB8500_PIN_AB2,
|
||||
DB8500_PIN_Y4, DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
|
||||
static const unsigned etmr4_oc2_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
|
||||
DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H2,
|
||||
DB8500_PIN_J2, DB8500_PIN_H1 };
|
||||
static const unsigned ptma9_oc2_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16,
|
||||
DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
|
||||
DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
|
||||
DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
|
||||
DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
|
||||
|
||||
/* Other C3 column */
|
||||
static const unsigned stmmod_oc3_1_pins[] = { DB8500_PIN_AB2, DB8500_PIN_W2,
|
||||
DB8500_PIN_W3, DB8500_PIN_V3, DB8500_PIN_V2 };
|
||||
static const unsigned stmmod_oc3_2_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
|
||||
DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3 };
|
||||
static const unsigned uartmodrx_oc3_1_pins[] = { DB8500_PIN_H2 };
|
||||
static const unsigned uartmodtx_oc3_1_pins[] = { DB8500_PIN_J2 };
|
||||
static const unsigned etmr4_oc3_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16,
|
||||
DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
|
||||
DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
|
||||
DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
|
||||
DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
|
||||
|
||||
/* Other C4 column */
|
||||
static const unsigned sbag_oc4_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
|
||||
DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H1 };
|
||||
static const unsigned hwobs_oc4_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16,
|
||||
DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
|
||||
DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
|
||||
DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
|
||||
DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
|
||||
|
||||
#define DB8500_PIN_GROUP(a,b) { .name = #a, .pins = a##_pins, \
|
||||
.npins = ARRAY_SIZE(a##_pins), .altsetting = b }
|
||||
|
||||
@ -639,6 +691,7 @@ static const struct nmk_pingroup nmk_db8500_groups[] = {
|
||||
DB8500_PIN_GROUP(i2c0_a_1, NMK_GPIO_ALT_A),
|
||||
DB8500_PIN_GROUP(ipgpio0_a_1, NMK_GPIO_ALT_A),
|
||||
DB8500_PIN_GROUP(ipgpio1_a_1, NMK_GPIO_ALT_A),
|
||||
DB8500_PIN_GROUP(kp_a_2, NMK_GPIO_ALT_A),
|
||||
DB8500_PIN_GROUP(msp2sck_a_1, NMK_GPIO_ALT_A),
|
||||
DB8500_PIN_GROUP(msp2_a_1, NMK_GPIO_ALT_A),
|
||||
DB8500_PIN_GROUP(mc4_a_1, NMK_GPIO_ALT_A),
|
||||
@ -726,9 +779,34 @@ static const struct nmk_pingroup nmk_db8500_groups[] = {
|
||||
DB8500_PIN_GROUP(usbsim_c_2, NMK_GPIO_ALT_C),
|
||||
DB8500_PIN_GROUP(i2c3_c_2, NMK_GPIO_ALT_C),
|
||||
/* Other alt C1 column */
|
||||
DB8500_PIN_GROUP(u2rx_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(stmape_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(remap0_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(remap1_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(ptma9_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(kp_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(rf_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(hxclk_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(uartmodrx_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(uartmodtx_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(stmmod_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(hxgpio_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(rf_oc1_2, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(spi2_oc1_1, NMK_GPIO_ALT_C1),
|
||||
DB8500_PIN_GROUP(spi2_oc1_2, NMK_GPIO_ALT_C1),
|
||||
/* Other alt C2 column */
|
||||
DB8500_PIN_GROUP(sbag_oc2_1, NMK_GPIO_ALT_C2),
|
||||
DB8500_PIN_GROUP(etmr4_oc2_1, NMK_GPIO_ALT_C2),
|
||||
DB8500_PIN_GROUP(ptma9_oc2_1, NMK_GPIO_ALT_C2),
|
||||
/* Other alt C3 column */
|
||||
DB8500_PIN_GROUP(stmmod_oc3_1, NMK_GPIO_ALT_C3),
|
||||
DB8500_PIN_GROUP(stmmod_oc3_2, NMK_GPIO_ALT_C3),
|
||||
DB8500_PIN_GROUP(uartmodrx_oc3_1, NMK_GPIO_ALT_C3),
|
||||
DB8500_PIN_GROUP(uartmodtx_oc3_1, NMK_GPIO_ALT_C3),
|
||||
DB8500_PIN_GROUP(etmr4_oc3_1, NMK_GPIO_ALT_C3),
|
||||
/* Other alt C4 column */
|
||||
DB8500_PIN_GROUP(sbag_oc4_1, NMK_GPIO_ALT_C4),
|
||||
DB8500_PIN_GROUP(hwobs_oc4_1, NMK_GPIO_ALT_C4),
|
||||
};
|
||||
|
||||
/* We use this macro to define the groups applicable to a function */
|
||||
@ -742,7 +820,7 @@ DB8500_FUNC_GROUPS(u1, "u1rxtx_a_1", "u1ctsrts_a_1");
|
||||
* only available on two pins in alternative function C
|
||||
*/
|
||||
DB8500_FUNC_GROUPS(u2, "u2rxtx_b_1", "u2rxtx_c_1", "u2ctsrts_c_1",
|
||||
"u2rxtx_c_2", "u2rxtx_c_3");
|
||||
"u2rxtx_c_2", "u2rxtx_c_3", "u2rx_oc1_1");
|
||||
DB8500_FUNC_GROUPS(ipi2c, "ipi2c_a_1", "ipi2c_a_2");
|
||||
/*
|
||||
* MSP0 can only be on a certain set of pins, but the TX/RX pins can be
|
||||
@ -757,7 +835,7 @@ DB8500_FUNC_GROUPS(msp1, "msp1txrx_a_1", "msp1_a_1", "msp1txrx_b_1");
|
||||
DB8500_FUNC_GROUPS(lcdb, "lcdb_a_1");
|
||||
DB8500_FUNC_GROUPS(lcd, "lcdvsi0_a_1", "lcdvsi1_a_1", "lcd_d0_d7_a_1",
|
||||
"lcd_d8_d11_a_1", "lcd_d12_d23_a_1", "lcd_b_1");
|
||||
DB8500_FUNC_GROUPS(kp, "kp_a_1", "kp_b_1", "kp_b_2", "kp_c_1", "kp_oc1_1");
|
||||
DB8500_FUNC_GROUPS(kp, "kp_a_1", "kp_a_2", "kp_b_1", "kp_b_2", "kp_c_1", "kp_oc1_1");
|
||||
DB8500_FUNC_GROUPS(mc2, "mc2_a_1", "mc2rstn_c_1");
|
||||
DB8500_FUNC_GROUPS(ssp1, "ssp1_a_1");
|
||||
DB8500_FUNC_GROUPS(ssp0, "ssp0_a_1");
|
||||
@ -784,8 +862,10 @@ DB8500_FUNC_GROUPS(i2c2, "i2c2_b_1", "i2c2_b_2");
|
||||
* so select one of each.
|
||||
*/
|
||||
DB8500_FUNC_GROUPS(uartmod, "uartmodtx_b_1", "uartmodrx_b_1", "uartmodrx_b_2",
|
||||
"uartmodrx_c_1", "uartmod_tx_c_1");
|
||||
DB8500_FUNC_GROUPS(stmmod, "stmmod_b_1", "stmmod_c_1");
|
||||
"uartmodrx_c_1", "uartmod_tx_c_1", "uartmodrx_oc1_1",
|
||||
"uartmodtx_oc1_1", "uartmodrx_oc3_1", "uartmodtx_oc3_1");
|
||||
DB8500_FUNC_GROUPS(stmmod, "stmmod_b_1", "stmmod_c_1", "stmmod_oc1_1",
|
||||
"stmmod_oc3_1", "stmmod_oc3_2");
|
||||
DB8500_FUNC_GROUPS(spi3, "spi3_b_1");
|
||||
/* Select between CS0 on alt B or PS1 on alt C */
|
||||
DB8500_FUNC_GROUPS(sm, "sm_b_1", "smcs0_b_1", "smcs1_b_1", "smcleale_c_1",
|
||||
@ -799,13 +879,19 @@ DB8500_FUNC_GROUPS(ipjtag, "ipjtag_c_1");
|
||||
DB8500_FUNC_GROUPS(slim0, "slim0_c_1");
|
||||
DB8500_FUNC_GROUPS(ms, "ms_c_1");
|
||||
DB8500_FUNC_GROUPS(iptrigout, "iptrigout_c_1");
|
||||
DB8500_FUNC_GROUPS(stmape, "stmape_c_1", "stmape_c_2");
|
||||
DB8500_FUNC_GROUPS(stmape, "stmape_c_1", "stmape_c_2", "stmape_oc1_1");
|
||||
DB8500_FUNC_GROUPS(mc5, "mc5_c_1");
|
||||
DB8500_FUNC_GROUPS(usbsim, "usbsim_c_1", "usbsim_c_2");
|
||||
DB8500_FUNC_GROUPS(i2c3, "i2c3_c_1", "i2c3_c_2");
|
||||
DB8500_FUNC_GROUPS(spi0, "spi0_c_1");
|
||||
DB8500_FUNC_GROUPS(spi2, "spi2_oc1_1", "spi2_oc1_2");
|
||||
|
||||
DB8500_FUNC_GROUPS(remap, "remap0_oc1_1", "remap1_oc1_1");
|
||||
DB8500_FUNC_GROUPS(sbag, "sbag_oc2_1", "sbag_oc4_1");
|
||||
DB8500_FUNC_GROUPS(ptm, "ptma9_oc1_1", "ptma9_oc2_1");
|
||||
DB8500_FUNC_GROUPS(rf, "rf_oc1_1", "rf_oc1_2");
|
||||
DB8500_FUNC_GROUPS(hx, "hxclk_oc1_1", "hxgpio_oc1_1");
|
||||
DB8500_FUNC_GROUPS(etm, "etmr4_oc2_1", "etmr4_oc3_1");
|
||||
DB8500_FUNC_GROUPS(hwobs, "hwobs_oc4_1");
|
||||
#define FUNCTION(fname) \
|
||||
{ \
|
||||
.name = #fname, \
|
||||
@ -858,6 +944,12 @@ static const struct nmk_function nmk_db8500_functions[] = {
|
||||
FUNCTION(i2c3),
|
||||
FUNCTION(spi0),
|
||||
FUNCTION(spi2),
|
||||
FUNCTION(remap),
|
||||
FUNCTION(ptm),
|
||||
FUNCTION(rf),
|
||||
FUNCTION(hx),
|
||||
FUNCTION(etm),
|
||||
FUNCTION(hwobs),
|
||||
};
|
||||
|
||||
static const struct prcm_gpiocr_altcx_pin_desc db8500_altcx_pins[] = {
|
||||
|
@ -822,6 +822,7 @@ static const struct nmk_pingroup nmk_db8540_groups[] = {
|
||||
DB8540_PIN_GROUP(modaccuarttxrx_oc4_1, NMK_GPIO_ALT_C4),
|
||||
DB8540_PIN_GROUP(modaccuartrtscts_oc4_1, NMK_GPIO_ALT_C4),
|
||||
DB8540_PIN_GROUP(stmmod_oc4_1, NMK_GPIO_ALT_C4),
|
||||
DB8540_PIN_GROUP(moduartstmmux_oc4_1, NMK_GPIO_ALT_C4),
|
||||
|
||||
};
|
||||
|
||||
|
@ -30,26 +30,10 @@
|
||||
#include <linux/pinctrl/pinconf.h>
|
||||
/* Since we request GPIOs from ourself */
|
||||
#include <linux/pinctrl/consumer.h>
|
||||
/*
|
||||
* For the U8500 archs, use the PRCMU register interface, for the older
|
||||
* Nomadik, provide some stubs. The functions using these will only be
|
||||
* called on the U8500 series.
|
||||
*/
|
||||
#ifdef CONFIG_ARCH_U8500
|
||||
#include <linux/mfd/dbx500-prcmu.h>
|
||||
#else
|
||||
static inline u32 prcmu_read(unsigned int reg) {
|
||||
return 0;
|
||||
}
|
||||
static inline void prcmu_write(unsigned int reg, u32 value) {}
|
||||
static inline void prcmu_write_masked(unsigned int reg, u32 mask, u32 value) {}
|
||||
#endif
|
||||
#include <linux/platform_data/pinctrl-nomadik.h>
|
||||
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <plat/pincfg.h>
|
||||
#include <plat/gpio-nomadik.h>
|
||||
|
||||
#include "pinctrl-nomadik.h"
|
||||
|
||||
/*
|
||||
@ -60,8 +44,6 @@ static inline void prcmu_write_masked(unsigned int reg, u32 mask, u32 value) {}
|
||||
* Symbols in this file are called "nmk_gpio" for "nomadik gpio"
|
||||
*/
|
||||
|
||||
#define NMK_GPIO_PER_CHIP 32
|
||||
|
||||
struct nmk_gpio_chip {
|
||||
struct gpio_chip chip;
|
||||
struct irq_domain *domain;
|
||||
@ -86,10 +68,18 @@ struct nmk_gpio_chip {
|
||||
u32 lowemi;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nmk_pinctrl - state container for the Nomadik pin controller
|
||||
* @dev: containing device pointer
|
||||
* @pctl: corresponding pin controller device
|
||||
* @soc: SoC data for this specific chip
|
||||
* @prcm_base: PRCM register range virtual base
|
||||
*/
|
||||
struct nmk_pinctrl {
|
||||
struct device *dev;
|
||||
struct pinctrl_dev *pctl;
|
||||
const struct nmk_pinctrl_soc_data *soc;
|
||||
void __iomem *prcm_base;
|
||||
};
|
||||
|
||||
static struct nmk_gpio_chip *
|
||||
@ -251,6 +241,15 @@ nmk_gpio_disable_lazy_irq(struct nmk_gpio_chip *nmk_chip, unsigned offset)
|
||||
dev_dbg(nmk_chip->chip.dev, "%d: clearing interrupt mask\n", gpio);
|
||||
}
|
||||
|
||||
static void nmk_write_masked(void __iomem *reg, u32 mask, u32 value)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = readl(reg);
|
||||
val = ((val & ~mask) | (value & mask));
|
||||
writel(val, reg);
|
||||
}
|
||||
|
||||
static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct,
|
||||
unsigned offset, unsigned alt_num)
|
||||
{
|
||||
@ -289,8 +288,8 @@ static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct,
|
||||
if (pin_desc->altcx[i].used == true) {
|
||||
reg = gpiocr_regs[pin_desc->altcx[i].reg_index];
|
||||
bit = pin_desc->altcx[i].control_bit;
|
||||
if (prcmu_read(reg) & BIT(bit)) {
|
||||
prcmu_write_masked(reg, BIT(bit), 0);
|
||||
if (readl(npct->prcm_base + reg) & BIT(bit)) {
|
||||
nmk_write_masked(npct->prcm_base + reg, BIT(bit), 0);
|
||||
dev_dbg(npct->dev,
|
||||
"PRCM GPIOCR: pin %i: alternate-C%i has been disabled\n",
|
||||
offset, i+1);
|
||||
@ -318,8 +317,8 @@ static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct,
|
||||
if (pin_desc->altcx[i].used == true) {
|
||||
reg = gpiocr_regs[pin_desc->altcx[i].reg_index];
|
||||
bit = pin_desc->altcx[i].control_bit;
|
||||
if (prcmu_read(reg) & BIT(bit)) {
|
||||
prcmu_write_masked(reg, BIT(bit), 0);
|
||||
if (readl(npct->prcm_base + reg) & BIT(bit)) {
|
||||
nmk_write_masked(npct->prcm_base + reg, BIT(bit), 0);
|
||||
dev_dbg(npct->dev,
|
||||
"PRCM GPIOCR: pin %i: alternate-C%i has been disabled\n",
|
||||
offset, i+1);
|
||||
@ -331,7 +330,7 @@ static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct,
|
||||
bit = pin_desc->altcx[alt_index].control_bit;
|
||||
dev_dbg(npct->dev, "PRCM GPIOCR: pin %i: alternate-C%i has been selected\n",
|
||||
offset, alt_index+1);
|
||||
prcmu_write_masked(reg, BIT(bit), BIT(bit));
|
||||
nmk_write_masked(npct->prcm_base + reg, BIT(bit), BIT(bit));
|
||||
}
|
||||
|
||||
static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset,
|
||||
@ -536,7 +535,7 @@ static int __nmk_config_pins(pin_cfg_t *cfgs, int num, bool sleep)
|
||||
* and its sleep mode based on the specified configuration. The @cfg is
|
||||
* usually one of the SoC specific macros defined in mach/<soc>-pins.h. These
|
||||
* are constructed using, and can be further enhanced with, the macros in
|
||||
* plat/pincfg.h.
|
||||
* <linux/platform_data/pinctrl-nomadik.h>
|
||||
*
|
||||
* If a pin's mode is set to GPIO, it is configured as an input to avoid
|
||||
* side-effects. The gpio can be manipulated later using standard GPIO API
|
||||
@ -675,6 +674,35 @@ int nmk_gpio_set_mode(int gpio, int gpio_mode)
|
||||
}
|
||||
EXPORT_SYMBOL(nmk_gpio_set_mode);
|
||||
|
||||
static int nmk_prcm_gpiocr_get_mode(struct pinctrl_dev *pctldev, int gpio)
|
||||
{
|
||||
int i;
|
||||
u16 reg;
|
||||
u8 bit;
|
||||
struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
|
||||
const struct prcm_gpiocr_altcx_pin_desc *pin_desc;
|
||||
const u16 *gpiocr_regs;
|
||||
|
||||
for (i = 0; i < npct->soc->npins_altcx; i++) {
|
||||
if (npct->soc->altcx_pins[i].pin == gpio)
|
||||
break;
|
||||
}
|
||||
if (i == npct->soc->npins_altcx)
|
||||
return NMK_GPIO_ALT_C;
|
||||
|
||||
pin_desc = npct->soc->altcx_pins + i;
|
||||
gpiocr_regs = npct->soc->prcm_gpiocr_registers;
|
||||
for (i = 0; i < PRCM_IDX_GPIOCR_ALTC_MAX; i++) {
|
||||
if (pin_desc->altcx[i].used == true) {
|
||||
reg = gpiocr_regs[pin_desc->altcx[i].reg_index];
|
||||
bit = pin_desc->altcx[i].control_bit;
|
||||
if (readl(npct->prcm_base + reg) & BIT(bit))
|
||||
return NMK_GPIO_ALT_C+i+1;
|
||||
}
|
||||
}
|
||||
return NMK_GPIO_ALT_C;
|
||||
}
|
||||
|
||||
int nmk_gpio_get_mode(int gpio)
|
||||
{
|
||||
struct nmk_gpio_chip *nmk_chip;
|
||||
@ -1063,8 +1091,9 @@ static int nmk_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
|
||||
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
static void nmk_gpio_dbg_show_one(struct seq_file *s, struct gpio_chip *chip,
|
||||
unsigned offset, unsigned gpio)
|
||||
static void nmk_gpio_dbg_show_one(struct seq_file *s,
|
||||
struct pinctrl_dev *pctldev, struct gpio_chip *chip,
|
||||
unsigned offset, unsigned gpio)
|
||||
{
|
||||
const char *label = gpiochip_is_requested(chip, offset);
|
||||
struct nmk_gpio_chip *nmk_chip =
|
||||
@ -1078,12 +1107,18 @@ static void nmk_gpio_dbg_show_one(struct seq_file *s, struct gpio_chip *chip,
|
||||
[NMK_GPIO_ALT_A] = "altA",
|
||||
[NMK_GPIO_ALT_B] = "altB",
|
||||
[NMK_GPIO_ALT_C] = "altC",
|
||||
[NMK_GPIO_ALT_C+1] = "altC1",
|
||||
[NMK_GPIO_ALT_C+2] = "altC2",
|
||||
[NMK_GPIO_ALT_C+3] = "altC3",
|
||||
[NMK_GPIO_ALT_C+4] = "altC4",
|
||||
};
|
||||
|
||||
clk_enable(nmk_chip->clk);
|
||||
is_out = !!(readl(nmk_chip->addr + NMK_GPIO_DIR) & bit);
|
||||
pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & bit);
|
||||
mode = nmk_gpio_get_mode(gpio);
|
||||
if ((mode == NMK_GPIO_ALT_C) && pctldev)
|
||||
mode = nmk_prcm_gpiocr_get_mode(pctldev, gpio);
|
||||
|
||||
seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s %s",
|
||||
gpio, label ?: "(none)",
|
||||
@ -1127,13 +1162,14 @@ static void nmk_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
|
||||
unsigned gpio = chip->base;
|
||||
|
||||
for (i = 0; i < chip->ngpio; i++, gpio++) {
|
||||
nmk_gpio_dbg_show_one(s, chip, i, gpio);
|
||||
nmk_gpio_dbg_show_one(s, NULL, chip, i, gpio);
|
||||
seq_printf(s, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
static inline void nmk_gpio_dbg_show_one(struct seq_file *s,
|
||||
struct pinctrl_dev *pctldev,
|
||||
struct gpio_chip *chip,
|
||||
unsigned offset, unsigned gpio)
|
||||
{
|
||||
@ -1464,7 +1500,7 @@ static void nmk_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
|
||||
return;
|
||||
}
|
||||
chip = range->gc;
|
||||
nmk_gpio_dbg_show_one(s, chip, offset - chip->base, offset);
|
||||
nmk_gpio_dbg_show_one(s, pctldev, chip, offset - chip->base, offset);
|
||||
}
|
||||
|
||||
static struct pinctrl_ops nmk_pinctrl_ops = {
|
||||
@ -1818,6 +1854,7 @@ static int __devinit nmk_pinctrl_probe(struct platform_device *pdev)
|
||||
const struct platform_device_id *platid = platform_get_device_id(pdev);
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct nmk_pinctrl *npct;
|
||||
struct resource *res;
|
||||
unsigned int version = 0;
|
||||
int i;
|
||||
|
||||
@ -1839,22 +1876,37 @@ static int __devinit nmk_pinctrl_probe(struct platform_device *pdev)
|
||||
if (version == PINCTRL_NMK_DB8540)
|
||||
nmk_pinctrl_db8540_init(&npct->soc);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (res) {
|
||||
npct->prcm_base = devm_ioremap(&pdev->dev, res->start,
|
||||
resource_size(res));
|
||||
if (!npct->prcm_base) {
|
||||
dev_err(&pdev->dev,
|
||||
"failed to ioremap PRCM registers\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
} else {
|
||||
dev_info(&pdev->dev,
|
||||
"No PRCM base, assume no ALT-Cx control is available\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* We need all the GPIO drivers to probe FIRST, or we will not be able
|
||||
* to obtain references to the struct gpio_chip * for them, and we
|
||||
* need this to proceed.
|
||||
*/
|
||||
for (i = 0; i < npct->soc->gpio_num_ranges; i++) {
|
||||
if (!nmk_gpio_chips[i]) {
|
||||
if (!nmk_gpio_chips[npct->soc->gpio_ranges[i].id]) {
|
||||
dev_warn(&pdev->dev, "GPIO chip %d not registered yet\n", i);
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
npct->soc->gpio_ranges[i].gc = &nmk_gpio_chips[i]->chip;
|
||||
npct->soc->gpio_ranges[i].gc = &nmk_gpio_chips[npct->soc->gpio_ranges[i].id]->chip;
|
||||
}
|
||||
|
||||
nmk_pinctrl_desc.pins = npct->soc->pins;
|
||||
nmk_pinctrl_desc.npins = npct->soc->npins;
|
||||
npct->dev = &pdev->dev;
|
||||
|
||||
npct->pctl = pinctrl_register(&nmk_pinctrl_desc, &pdev->dev, npct);
|
||||
if (!npct->pctl) {
|
||||
dev_err(&pdev->dev, "could not register Nomadik pinctrl driver\n");
|
||||
@ -1889,6 +1941,7 @@ static const struct platform_device_id nmk_pinctrl_id[] = {
|
||||
{ "pinctrl-stn8815", PINCTRL_NMK_STN8815 },
|
||||
{ "pinctrl-db8500", PINCTRL_NMK_DB8500 },
|
||||
{ "pinctrl-db8540", PINCTRL_NMK_DB8540 },
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct platform_driver nmk_pinctrl_driver = {
|
||||
|
@ -1,7 +1,7 @@
|
||||
#ifndef PINCTRL_PINCTRL_NOMADIK_H
|
||||
#define PINCTRL_PINCTRL_NOMADIK_H
|
||||
|
||||
#include <plat/gpio-nomadik.h>
|
||||
#include <linux/platform_data/pinctrl-nomadik.h>
|
||||
|
||||
/* Package definitions */
|
||||
#define PINCTRL_NMK_STN8815 0
|
||||
|
@ -1,16 +1,17 @@
|
||||
/*
|
||||
* Copyright (C) ST-Ericsson SA 2010
|
||||
* Structures and registers for GPIO access in the Nomadik SoC
|
||||
*
|
||||
* License terms: GNU General Public License, version 2
|
||||
* Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
|
||||
* Copyright (C) 2008 STMicroelectronics
|
||||
* Author: Prafulla WADASKAR <prafulla.wadaskar@st.com>
|
||||
* Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it>
|
||||
*
|
||||
* Based on arch/arm/mach-pxa/include/mach/mfp.h:
|
||||
* Copyright (C) 2007 Marvell International Ltd.
|
||||
* eric miao <eric.miao@marvell.com>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __PLAT_PINCFG_H
|
||||
#define __PLAT_PINCFG_H
|
||||
#ifndef __PLAT_NOMADIK_GPIO
|
||||
#define __PLAT_NOMADIK_GPIO
|
||||
|
||||
/*
|
||||
* pin configurations are represented by 32-bit integers:
|
||||
@ -166,8 +167,100 @@ typedef unsigned long pin_cfg_t;
|
||||
(PIN_CFG_DEFAULT |\
|
||||
(PIN_NUM(num) | PIN_##alt | PIN_OUTPUT_##val))
|
||||
|
||||
/*
|
||||
* "nmk_gpio" and "NMK_GPIO" stand for "Nomadik GPIO", leaving
|
||||
* the "gpio" namespace for generic and cross-machine functions
|
||||
*/
|
||||
|
||||
#define GPIO_BLOCK_SHIFT 5
|
||||
#define NMK_GPIO_PER_CHIP (1 << GPIO_BLOCK_SHIFT)
|
||||
|
||||
/* Register in the logic block */
|
||||
#define NMK_GPIO_DAT 0x00
|
||||
#define NMK_GPIO_DATS 0x04
|
||||
#define NMK_GPIO_DATC 0x08
|
||||
#define NMK_GPIO_PDIS 0x0c
|
||||
#define NMK_GPIO_DIR 0x10
|
||||
#define NMK_GPIO_DIRS 0x14
|
||||
#define NMK_GPIO_DIRC 0x18
|
||||
#define NMK_GPIO_SLPC 0x1c
|
||||
#define NMK_GPIO_AFSLA 0x20
|
||||
#define NMK_GPIO_AFSLB 0x24
|
||||
#define NMK_GPIO_LOWEMI 0x28
|
||||
|
||||
#define NMK_GPIO_RIMSC 0x40
|
||||
#define NMK_GPIO_FIMSC 0x44
|
||||
#define NMK_GPIO_IS 0x48
|
||||
#define NMK_GPIO_IC 0x4c
|
||||
#define NMK_GPIO_RWIMSC 0x50
|
||||
#define NMK_GPIO_FWIMSC 0x54
|
||||
#define NMK_GPIO_WKS 0x58
|
||||
/* These appear in DB8540 and later ASICs */
|
||||
#define NMK_GPIO_EDGELEVEL 0x5C
|
||||
#define NMK_GPIO_LEVEL 0x60
|
||||
|
||||
/* Alternate functions: function C is set in hw by setting both A and B */
|
||||
#define NMK_GPIO_ALT_GPIO 0
|
||||
#define NMK_GPIO_ALT_A 1
|
||||
#define NMK_GPIO_ALT_B 2
|
||||
#define NMK_GPIO_ALT_C (NMK_GPIO_ALT_A | NMK_GPIO_ALT_B)
|
||||
|
||||
#define NMK_GPIO_ALT_CX_SHIFT 2
|
||||
#define NMK_GPIO_ALT_C1 ((1<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
|
||||
#define NMK_GPIO_ALT_C2 ((2<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
|
||||
#define NMK_GPIO_ALT_C3 ((3<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
|
||||
#define NMK_GPIO_ALT_C4 ((4<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
|
||||
|
||||
/* Pull up/down values */
|
||||
enum nmk_gpio_pull {
|
||||
NMK_GPIO_PULL_NONE,
|
||||
NMK_GPIO_PULL_UP,
|
||||
NMK_GPIO_PULL_DOWN,
|
||||
};
|
||||
|
||||
/* Sleep mode */
|
||||
enum nmk_gpio_slpm {
|
||||
NMK_GPIO_SLPM_INPUT,
|
||||
NMK_GPIO_SLPM_WAKEUP_ENABLE = NMK_GPIO_SLPM_INPUT,
|
||||
NMK_GPIO_SLPM_NOCHANGE,
|
||||
NMK_GPIO_SLPM_WAKEUP_DISABLE = NMK_GPIO_SLPM_NOCHANGE,
|
||||
};
|
||||
|
||||
/* Older deprecated pin config API that should go away soon */
|
||||
extern int nmk_config_pin(pin_cfg_t cfg, bool sleep);
|
||||
extern int nmk_config_pins(pin_cfg_t *cfgs, int num);
|
||||
extern int nmk_config_pins_sleep(pin_cfg_t *cfgs, int num);
|
||||
|
||||
extern int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode);
|
||||
extern int nmk_gpio_set_pull(int gpio, enum nmk_gpio_pull pull);
|
||||
#ifdef CONFIG_PINCTRL_NOMADIK
|
||||
extern int nmk_gpio_set_mode(int gpio, int gpio_mode);
|
||||
#else
|
||||
static inline int nmk_gpio_set_mode(int gpio, int gpio_mode)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
extern int nmk_gpio_get_mode(int gpio);
|
||||
|
||||
extern void nmk_gpio_wakeups_suspend(void);
|
||||
extern void nmk_gpio_wakeups_resume(void);
|
||||
|
||||
extern void nmk_gpio_clocks_enable(void);
|
||||
extern void nmk_gpio_clocks_disable(void);
|
||||
|
||||
extern void nmk_gpio_read_pull(int gpio_bank, u32 *pull_up);
|
||||
|
||||
/*
|
||||
* Platform data to register a block: only the initial gpio/irq number.
|
||||
*/
|
||||
struct nmk_gpio_platform_data {
|
||||
char *name;
|
||||
int first_gpio;
|
||||
int first_irq;
|
||||
int num_gpio;
|
||||
u32 (*get_secondary_status)(unsigned int bank);
|
||||
void (*set_ioforce)(bool enable);
|
||||
bool supports_sleepmode;
|
||||
};
|
||||
|
||||
#endif /* __PLAT_NOMADIK_GPIO */
|
Loading…
Reference in New Issue
Block a user