This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Linux/AM5708: KEYBOARD Controller in a custom AM5708 board

Part Number: AM5708
Other Parts Discussed in Thread: DRA72, DRA718, AM5728, TMDXIDK5718, , DRA71XEVM, DRA71, AM5718

Tool/software: Linux

Hi:

I have a custom AM5708 based board and want to use keyboard controller to handle a key pad.

I am working with SDK Linux RT 5.00.00.15.

Attached are the dts and config file for Linux

During Linux startup I get the following message:

[    1.926557] omap4-keypad 4ae1c00000000080.keypad: no base address specified
[    1.933577] omap4-keypad: probe of 4ae1c00000000080.keypad failed with error2

Billa 0576.bridge_linux.dts.txt

CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_PERF_EVENTS=y
CONFIG_PARTITION_ADVANCED=y
CONFIG_CMDLINE_PARTITION=y
# CONFIG_ARCH_MULTI_V5 is not set
# CONFIG_ARCH_MULTI_V4 is not set
CONFIG_MACH_ARTPEC6=y
CONFIG_MACH_ARMADA_370=y
CONFIG_MACH_ARMADA_375=y
CONFIG_MACH_ARMADA_38X=y
CONFIG_MACH_ARMADA_39X=y
CONFIG_MACH_ARMADA_XP=y
CONFIG_MACH_DOVE=y
CONFIG_SOC_SAMA5D2=y
CONFIG_SOC_SAMA5D3=y
CONFIG_SOC_SAMA5D4=y
CONFIG_ARCH_BCM2835=y
CONFIG_ARCH_BCM_63XX=y
CONFIG_MACH_BERLIN_BG2=y
CONFIG_MACH_BERLIN_BG2CD=y
CONFIG_MACH_BERLIN_BG2Q=y
CONFIG_SOC_IMX50=y
CONFIG_SOC_IMX51=y
CONFIG_SOC_IMX53=y
CONFIG_SOC_IMX6Q=y
CONFIG_SOC_IMX6SL=y
CONFIG_SOC_IMX6SX=y
CONFIG_SOC_IMX6UL=y
CONFIG_SOC_IMX7D=y
CONFIG_SOC_VF610=y
CONFIG_SOC_LS1021A=y
CONFIG_MACH_SPEAR1310=y
CONFIG_MACH_SPEAR1340=y
CONFIG_EXYNOS5420_MCPM=y
CONFIG_ARCH_R8A7743=y
CONFIG_ARCH_R8A7745=y
CONFIG_ARCH_R8A7792=y
CONFIG_MACH_HREFV60=y
CONFIG_MACH_SNOWBALL=y
CONFIG_TRUSTED_FOUNDATIONS=y
CONFIG_PCI_HOST_GENERIC=y
CONFIG_PCI_KEYSTONE=y
CONFIG_PCI_MSI=y
CONFIG_PCI_MVEBU=y
CONFIG_PCI_TEGRA=y
CONFIG_PCI_RCAR_GEN2=y
CONFIG_PCIE_RCAR=y
CONFIG_PCIEPORTBUS=y
CONFIG_HIGHPTE=y
CONFIG_CMA=y
CONFIG_EFI=y
CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
CONFIG_ARM_IMX6Q_CPUFREQ=y
CONFIG_ARM_ZYNQ_CPUIDLE=y
CONFIG_ARM_EXYNOS_CPUIDLE=y
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_OPTIMISTIC_DAD=y
CONFIG_INET6_ESP=m
CONFIG_IPV6_MIP6=m
CONFIG_IPV6_MULTIPLE_TABLES=y
CONFIG_NET_DSA=m
CONFIG_NET_SWITCHDEV=y
CONFIG_CAN_RAW=y
CONFIG_CAN_BCM=y
CONFIG_CAN_DEV=y
CONFIG_CAN_AT91=m
CONFIG_CAN_RCAR=m
CONFIG_CAN_XILINXCAN=y
CONFIG_CAN_MCP251X=y
CONFIG_B53_SPI_DRIVER=m
CONFIG_B53_MDIO_DRIVER=m
CONFIG_B53_MMAP_DRIVER=m
CONFIG_B53_SRAB_DRIVER=m
CONFIG_CAN_SUN4I=y
CONFIG_BT=m
CONFIG_BT_MRVL=m
CONFIG_BT_MRVL_SDIO=m
CONFIG_CFG80211=m
CONFIG_MAC80211=m
CONFIG_RFKILL=y
CONFIG_RFKILL_INPUT=y
CONFIG_RFKILL_GPIO=y
CONFIG_DMA_CMA=y
CONFIG_OMAP_OCP2SCP=y
CONFIG_SIMPLE_PM_BUS=y
CONFIG_SUNXI_RSB=y
CONFIG_MTD=y
CONFIG_MTD_BLOCK=y
CONFIG_MTD_M25P80=y
CONFIG_MTD_NAND=y
CONFIG_MTD_NAND_DENALI_DT=y
CONFIG_MTD_NAND_ATMEL=y
CONFIG_MTD_NAND_BRCMNAND=y
CONFIG_MTD_NAND_VF610_NFC=y
CONFIG_MTD_NAND_DAVINCI=y
CONFIG_MTD_SPI_NOR=y
CONFIG_SPI_FSL_QUADSPI=m
CONFIG_MTD_UBI=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=65536
CONFIG_VIRTIO_BLK=y
CONFIG_AD525X_DPOT=y
CONFIG_AD525X_DPOT_I2C=y
CONFIG_ATMEL_TCLIB=y
CONFIG_ICS932S401=y
CONFIG_ATMEL_SSC=m
CONFIG_QCOM_COINCELL=m
CONFIG_APDS9802ALS=y
CONFIG_ISL29003=y
CONFIG_EEPROM_AT24=y
CONFIG_BLK_DEV_SD=y
CONFIG_BLK_DEV_SR=y
CONFIG_SCSI_MULTI_LUN=y
CONFIG_AHCI_BRCM=y
CONFIG_AHCI_DM816=y
CONFIG_AHCI_ST=y
CONFIG_AHCI_IMX=y
CONFIG_AHCI_SUNXI=y
CONFIG_AHCI_TEGRA=y
CONFIG_SATA_HIGHBANK=y
CONFIG_SATA_MV=y
CONFIG_SATA_RCAR=y
CONFIG_NETDEVICES=y
CONFIG_VIRTIO_NET=y
CONFIG_HIX5HD2_GMAC=y
CONFIG_SUN4I_EMAC=y
CONFIG_MACB=y
CONFIG_BGMAC_BCMA=y
CONFIG_NET_CALXEDA_XGMAC=y
CONFIG_GIANFAR=y
CONFIG_MV643XX_ETH=y
CONFIG_MVNETA=y
CONFIG_PXA168_ETH=m
CONFIG_KS8851=y
CONFIG_R8169=y
CONFIG_SH_ETH=y
CONFIG_SMSC911X=y
CONFIG_STMMAC_ETH=y
CONFIG_STMMAC_PLATFORM=y
CONFIG_DWMAC_DWC_QOS_ETH=y
CONFIG_XILINX_EMACLITE=y
CONFIG_AT803X_PHY=y
CONFIG_SMSC_PHY=y
CONFIG_REALTEK_PHY=y
CONFIG_FIXED_PHY=y
CONFIG_ROCKCHIP_PHY=y

CONFIG_USB_SUPPORT=y
CONFIG_USB=m

CONFIG_USB_PEGASUS=y
CONFIG_USB_RTL8152=m
CONFIG_USB_NET_SMSC75XX=y
CONFIG_BRCMFMAC=m
CONFIG_RT2X00=m
CONFIG_RT2800USB=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_SDIO=m
CONFIG_INPUT_JOYDEV=y
CONFIG_INPUT_EVDEV=y
CONFIG_KEYBOARD_QT1070=m
CONFIG_KEYBOARD_GPIO=y
CONFIG_KEYBOARD_TEGRA=y
CONFIG_KEYBOARD_SPEAR=y
CONFIG_KEYBOARD_ST_KEYSCAN=y
CONFIG_KEYBOARD_CROS_EC=m
CONFIG_KEYBOARD_SAMSUNG=m
CONFIG_KEYBOARD_OMAP4=y
CONFIG_MOUSE_PS2_ELANTECH=y
CONFIG_MOUSE_CYAPA=m
CONFIG_MOUSE_ELAN_I2C=y
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_ATMEL_MXT=m
CONFIG_TOUCHSCREEN_MMS114=m
CONFIG_TOUCHSCREEN_ST1232=m
CONFIG_TOUCHSCREEN_STMPE=y
CONFIG_TOUCHSCREEN_SUN4I=y
CONFIG_TOUCHSCREEN_WM97XX=m
CONFIG_INPUT_MISC=y
CONFIG_INPUT_MAX77693_HAPTIC=m
CONFIG_INPUT_MAX8997_HAPTIC=m
CONFIG_INPUT_AXP20X_PEK=m
CONFIG_INPUT_ADXL34X=m
CONFIG_SERIO_AMBAKMI=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_MT6577=y
CONFIG_SERIAL_8250_UNIPHIER=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_SERIAL_ATMEL=y
CONFIG_SERIAL_ATMEL_CONSOLE=y
CONFIG_SERIAL_ATMEL_TTYAT=y
CONFIG_SERIAL_BCM63XX=y
CONFIG_SERIAL_BCM63XX_CONSOLE=y
CONFIG_SERIAL_MESON=y
CONFIG_SERIAL_MESON_CONSOLE=y
CONFIG_SERIAL_SAMSUNG=y
CONFIG_SERIAL_SAMSUNG_CONSOLE=y
CONFIG_SERIAL_SIRFSOC=y
CONFIG_SERIAL_SIRFSOC_CONSOLE=y
CONFIG_SERIAL_TEGRA=y
CONFIG_SERIAL_IMX=y
CONFIG_SERIAL_IMX_CONSOLE=y
CONFIG_SERIAL_SH_SCI=y
CONFIG_SERIAL_SH_SCI_NR_UARTS=20
CONFIG_SERIAL_SH_SCI_CONSOLE=y
CONFIG_SERIAL_SH_SCI_DMA=y
CONFIG_SERIAL_MSM=y
CONFIG_SERIAL_MSM_CONSOLE=y
CONFIG_SERIAL_VT8500=y
CONFIG_SERIAL_VT8500_CONSOLE=y
CONFIG_SERIAL_OF_PLATFORM=y
CONFIG_SERIAL_OMAP_CONSOLE=y
CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
CONFIG_SERIAL_FSL_LPUART_CONSOLE=y
CONFIG_SERIAL_CONEXANT_DIGICOLOR_CONSOLE=y
CONFIG_SERIAL_ST_ASC_CONSOLE=y
CONFIG_HVC_DRIVER=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_DAVINCI=y
CONFIG_I2C_ARB_GPIO_CHALLENGE=m
CONFIG_I2C_MUX_PCA954x=y
CONFIG_I2C_MUX_PINCTRL=y
CONFIG_I2C_DEMUX_PINCTRL=y
CONFIG_I2C_AT91=m
CONFIG_I2C_BCM2835=y
CONFIG_I2C_CADENCE=y
CONFIG_I2C_DIGICOLOR=m
CONFIG_I2C_EMEV2=m
CONFIG_I2C_EXYNOS5=y
CONFIG_I2C_IMX=m
CONFIG_I2C_MV64XXX=y
CONFIG_I2C_RIIC=y
CONFIG_I2C_S3C2410=y
CONFIG_I2C_SH_MOBILE=y
CONFIG_I2C_SIRF=y
CONFIG_I2C_ST=y
CONFIG_I2C_SUN6I_P2WI=y
CONFIG_I2C_TEGRA=y
CONFIG_I2C_UNIPHIER=y
CONFIG_I2C_UNIPHIER_F=y
CONFIG_I2C_RCAR=y
CONFIG_I2C_CROS_EC_TUNNEL=m
CONFIG_I2C_SLAVE_EEPROM=y
CONFIG_SPI=y
CONFIG_SPI_ATMEL=m
CONFIG_SPI_BCM2835=y
CONFIG_SPI_BCM2835AUX=y
CONFIG_SPI_DAVINCI=y
CONFIG_SPI_GPIO=m
CONFIG_SPI_FSL_DSPI=m
CONFIG_SPI_OMAP24XX=y
CONFIG_SPI_ORION=y
CONFIG_SPI_PL022=y
CONFIG_SPI_RSPI=y
CONFIG_SPI_S3C64XX=m
CONFIG_SPI_SH_MSIOF=m
CONFIG_SPI_SH_HSPI=y
CONFIG_SPI_SIRF=y
CONFIG_SPI_SUN4I=y
CONFIG_SPI_SUN6I=y
CONFIG_SPI_TEGRA114=y
CONFIG_SPI_TEGRA20_SFLASH=y
CONFIG_SPI_TEGRA20_SLINK=y
CONFIG_SPMI=y
CONFIG_PINCTRL_AS3722=y
CONFIG_PINCTRL_PALMAS=y
CONFIG_PINCTRL_BCM2835=y
CONFIG_PINCTRL_APQ8064=y
CONFIG_PINCTRL_APQ8084=y
CONFIG_PINCTRL_IPQ8064=y
CONFIG_PINCTRL_MSM8660=y
CONFIG_PINCTRL_MSM8960=y
CONFIG_PINCTRL_MSM8X74=y
CONFIG_PINCTRL_MSM8916=y
CONFIG_PINCTRL_QCOM_SPMI_PMIC=y
CONFIG_PINCTRL_QCOM_SSBI_PMIC=y
CONFIG_GPIO_DAVINCI=y
CONFIG_GPIO_RCAR=y
CONFIG_GPIO_ZYNQ=y
CONFIG_GPIO_PCA953X_IRQ=y
CONFIG_GPIO_TWL4030=y
CONFIG_GPIO_PALMAS=y
CONFIG_GPIO_SYSCON=y
CONFIG_GPIO_TPS65910=y
CONFIG_BATTERY_ACT8945A=y
CONFIG_BATTERY_SBS=y
CONFIG_BATTERY_MAX17040=m
CONFIG_BATTERY_MAX17042=m
CONFIG_CHARGER_MAX14577=m
CONFIG_CHARGER_MAX77693=m
CONFIG_CHARGER_MAX8997=m
CONFIG_CHARGER_MAX8998=m
CONFIG_CHARGER_TPS65090=y
CONFIG_AXP20X_POWER=m
CONFIG_POWER_RESET_AS3722=y
CONFIG_POWER_RESET_GPIO=y
CONFIG_POWER_RESET_GPIO_RESTART=y
CONFIG_POWER_RESET_KEYSTONE=y
CONFIG_POWER_RESET_RMOBILE=y
CONFIG_POWER_RESET_ST=y
CONFIG_POWER_AVS=y
CONFIG_ROCKCHIP_IODOMAIN=y
CONFIG_SENSORS_IIO_HWMON=y
CONFIG_SENSORS_LM90=y
CONFIG_SENSORS_LM95245=y
CONFIG_SENSORS_NTC_THERMISTOR=m
CONFIG_SENSORS_PWM_FAN=m
CONFIG_SENSORS_INA2XX=m
CONFIG_BRCMSTB_THERMAL=m
CONFIG_ROCKCHIP_THERMAL=y
CONFIG_RCAR_THERMAL=y
CONFIG_ARMADA_THERMAL=y
CONFIG_DAVINCI_WATCHDOG=m
CONFIG_EXYNOS_THERMAL=m
CONFIG_ST_THERMAL_MEMMAP=y
CONFIG_DA9063_WATCHDOG=m
CONFIG_ARM_SP805_WATCHDOG=y
CONFIG_AT91SAM9X_WATCHDOG=y
CONFIG_SAMA5D4_WATCHDOG=y
CONFIG_ORION_WATCHDOG=y
CONFIG_ST_LPC_WATCHDOG=y
CONFIG_SUNXI_WATCHDOG=y
CONFIG_IMX2_WDT=y
CONFIG_TEGRA_WATCHDOG=m
CONFIG_MESON_WATCHDOG=y
CONFIG_DIGICOLOR_WATCHDOG=y
CONFIG_BCM2835_WDT=y
CONFIG_BCM47XX_WDT=y
CONFIG_BCM_KONA_WDT=y
CONFIG_MFD_ACT8945A=y
CONFIG_MFD_AC100=y
CONFIG_MFD_AXP20X_RSB=y
CONFIG_MFD_QCOM_RPM=y
CONFIG_MFD_SPMI_PMIC=y
CONFIG_REGULATOR_ACT8945A=y
CONFIG_REGULATOR_AB8500=y
CONFIG_POWER_RESET_SYSCON=y
CONFIG_REGULATOR_MAX8997=m
CONFIG_REGULATOR_MAX8998=m
CONFIG_REGULATOR_QCOM_RPM=y
CONFIG_REGULATOR_QCOM_SMD_RPM=y
CONFIG_REGULATOR_WM8994=m
CONFIG_USB_GSPCA=y
CONFIG_SOC_CAMERA=m
CONFIG_SOC_CAMERA_PLATFORM=m
CONFIG_VIDEO_RCAR_VIN=m
CONFIG_VIDEO_ATMEL_ISI=m
CONFIG_VIDEO_SAMSUNG_EXYNOS4_IS=m
CONFIG_VIDEO_S5P_FIMC=m
CONFIG_VIDEO_S5P_MIPI_CSIS=m
CONFIG_VIDEO_EXYNOS_FIMC_LITE=m
CONFIG_VIDEO_EXYNOS4_FIMC_IS=m
CONFIG_VIDEO_SAMSUNG_S5P_JPEG=m
CONFIG_VIDEO_SAMSUNG_S5P_MFC=m
CONFIG_VIDEO_SAMSUNG_EXYNOS_GSC=m
CONFIG_VIDEO_STI_BDISP=m
CONFIG_VIDEO_STI_HVA=m
CONFIG_VIDEO_STI_DELTA=m
CONFIG_VIDEO_RENESAS_JPU=m
CONFIG_VIDEO_RENESAS_VSP1=m
CONFIG_V4L_TEST_DRIVERS=y
CONFIG_VIDEO_ADV7180=m
CONFIG_VIDEO_ML86V7667=m
CONFIG_DRM_I2C_ADV7511_AUDIO=y
# CONFIG_DRM_I2C_CH7006 is not set
# CONFIG_DRM_I2C_SIL164 is not set
CONFIG_DRM_DUMB_VGA_DAC=m
CONFIG_DRM_EXYNOS_FIMD=y
CONFIG_DRM_EXYNOS_MIXER=y
CONFIG_DRM_EXYNOS_DPI=y
CONFIG_DRM_EXYNOS_DSI=y
CONFIG_DRM_EXYNOS_HDMI=y
CONFIG_DRM_ROCKCHIP=m
CONFIG_ROCKCHIP_ANALOGIX_DP=y
CONFIG_ROCKCHIP_DW_HDMI=y
CONFIG_ROCKCHIP_DW_MIPI_DSI=y
CONFIG_ROCKCHIP_INNO_HDMI=y
CONFIG_DRM_ATMEL_HLCDC=m
CONFIG_DRM_RCAR_DU=m
CONFIG_DRM_RCAR_LVDS=y
CONFIG_DRM_SUN4I=m
CONFIG_DRM_TEGRA=y
CONFIG_DRM_PANEL_SAMSUNG_LD9040=m
CONFIG_DRM_VC4=y
CONFIG_FB_ARMCLCD=y
CONFIG_FB_EFI=y
CONFIG_FB_WM8505=y
CONFIG_FB_SH_MOBILE_LCDC=y
CONFIG_FB_SIMPLE=y
CONFIG_FB_SH_MOBILE_MERAM=y
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_LCD_PLATFORM=m
CONFIG_BACKLIGHT_AS3711=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
CONFIG_SND_DYNAMIC_MINORS=y
CONFIG_SND_HDA_TEGRA=m
CONFIG_SND_HDA_INPUT_BEEP=y
CONFIG_SND_HDA_PATCH_LOADER=y
CONFIG_SND_HDA_CODEC_REALTEK=m
CONFIG_SND_HDA_CODEC_HDMI=m
CONFIG_SND_USB_AUDIO=m
CONFIG_SND_ATMEL_SOC_WM8904=m
CONFIG_SND_ATMEL_SOC_PDMIC=m
CONFIG_SND_BCM2835_SOC_I2S=m
CONFIG_SND_SOC_ROCKCHIP=m
CONFIG_SND_SOC_ROCKCHIP_SPDIF=m
CONFIG_SND_SOC_ROCKCHIP_MAX98090=m
CONFIG_SND_SOC_ROCKCHIP_RT5645=m
CONFIG_SND_SOC_SAMSUNG=m
CONFIG_SND_SOC_SAMSUNG_SMDK_WM8994=m
CONFIG_SND_SOC_SMDK_WM8994_PCM=m
CONFIG_SND_SOC_SNOW=m
CONFIG_SND_SOC_SH4_FSI=m
CONFIG_SND_SOC_RCAR=m
CONFIG_SND_SIMPLE_SCU_CARD=m
CONFIG_SND_SUN4I_CODEC=m
CONFIG_SND_SOC_TEGRA=m
CONFIG_SND_SOC_TEGRA20_I2S=m
CONFIG_SND_SOC_TEGRA30_I2S=m
CONFIG_SND_SOC_TEGRA_RT5640=m
CONFIG_SND_SOC_TEGRA_WM8753=m
CONFIG_SND_SOC_TEGRA_WM8903=m
CONFIG_SND_SOC_TEGRA_WM9712=m
CONFIG_SND_SOC_TEGRA_TRIMSLICE=m
CONFIG_SND_SOC_TEGRA_ALC5632=m
CONFIG_SND_SOC_TEGRA_MAX98090=m
CONFIG_SND_SOC_SPDIF=m
CONFIG_SND_SOC_STI=m
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_MVEBU=y
CONFIG_USB_XHCI_RCAR=m
CONFIG_USB_XHCI_TEGRA=m

CONFIG_USB_XHCI_PLATFORM=m

CONFIG_USB_EHCI_MSM=m
CONFIG_USB_EHCI_EXYNOS=y
CONFIG_USB_EHCI_TEGRA=y
CONFIG_USB_EHCI_HCD_STI=y
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_ISP1760=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_STI=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
CONFIG_USB_OHCI_EXYNOS=m
CONFIG_USB_R8A66597_HCD=m
CONFIG_USB_RENESAS_USBHS=m
CONFIG_USB_STORAGE=y
CONFIG_USB_MUSB_SUNXI=m
CONFIG_USB_CHIPIDEA_UDC=y
CONFIG_USB_CHIPIDEA_HOST=y
CONFIG_AB8500_USB=y
CONFIG_KEYSTONE_USB_PHY=y
CONFIG_USB_GPIO_VBUS=y
CONFIG_USB_ISP1301=y
CONFIG_USB_MSM_OTG=m
CONFIG_USB_MXS_PHY=y
CONFIG_USB_FSL_USB2=y
CONFIG_USB_RENESAS_USBHS_UDC=m
CONFIG_MMC_BLOCK_MINORS=16
CONFIG_MMC_ARMMMCI=y
CONFIG_MMC_SDHCI_OF_ARASAN=y
CONFIG_MMC_SDHCI_OF_AT91=y
CONFIG_MMC_SDHCI_OF_ESDHC=y
CONFIG_MMC_SDHCI_ESDHC_IMX=y
CONFIG_MMC_SDHCI_DOVE=y
CONFIG_MMC_SDHCI_TEGRA=y
CONFIG_MMC_SDHCI_PXAV3=y
CONFIG_MMC_SDHCI_SPEAR=y
CONFIG_MMC_SDHCI_S3C=y
CONFIG_MMC_SDHCI_S3C_DMA=y
CONFIG_MMC_SDHCI_BCM_KONA=y
CONFIG_MMC_SDHCI_ST=y
CONFIG_MMC_OMAP=y
CONFIG_MMC_ATMELMCI=y
CONFIG_MMC_SDHCI_MSM=y
CONFIG_MMC_MVSDIO=y
CONFIG_MMC_SDHI=y
CONFIG_MMC_DW_PLTFM=y
CONFIG_MMC_DW_EXYNOS=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_MMC_SH_MMCIF=y
CONFIG_MMC_SUNXI=y
CONFIG_MMC_BCM2835=y
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS_FLASH=m
CONFIG_LEDS_GPIO=y
CONFIG_LEDS_PWM=y
CONFIG_LEDS_MAX77693=m
CONFIG_LEDS_MAX8997=m
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_ONESHOT=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_BACKLIGHT=y
CONFIG_LEDS_TRIGGER_CPU=y
CONFIG_LEDS_TRIGGER_GPIO=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_LEDS_TRIGGER_TRANSIENT=y
CONFIG_LEDS_TRIGGER_CAMERA=y
CONFIG_EDAC_HIGHBANK_MC=y
CONFIG_EDAC_HIGHBANK_L2=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_AC100=y
CONFIG_RTC_DRV_AS3722=y
CONFIG_RTC_DRV_MAX8907=y
CONFIG_RTC_DRV_MAX8998=m
CONFIG_RTC_DRV_MAX8997=m
CONFIG_RTC_DRV_MAX77686=y
CONFIG_RTC_DRV_RK808=m
CONFIG_RTC_DRV_ST_LPC=y
CONFIG_RTC_DRV_DA9063=m
CONFIG_RTC_DRV_EFI=m
CONFIG_RTC_DRV_DIGICOLOR=m
CONFIG_RTC_DRV_S5M=m
CONFIG_RTC_DRV_S3C=m
CONFIG_RTC_DRV_PL031=y
CONFIG_RTC_DRV_AT91RM9200=m
CONFIG_RTC_DRV_AT91SAM9=m
CONFIG_RTC_DRV_VT8500=y
CONFIG_RTC_DRV_SUN6I=y
CONFIG_RTC_DRV_SUNXI=y
CONFIG_RTC_DRV_MV=y
CONFIG_RTC_DRV_TEGRA=y
CONFIG_DMADEVICES=y
CONFIG_DW_DMAC=y
CONFIG_AT_HDMAC=y
CONFIG_AT_XDMAC=y
CONFIG_FSL_EDMA=y
CONFIG_MV_XOR=y
CONFIG_TEGRA20_APB_DMA=y
CONFIG_SH_DMAE=y
CONFIG_RCAR_DMAC=y
CONFIG_RENESAS_USB_DMAC=m
CONFIG_STE_DMA40=y
CONFIG_SIRF_DMA=y
CONFIG_TI_EDMA=y
CONFIG_PL330_DMA=y
CONFIG_IMX_SDMA=y
CONFIG_IMX_DMA=y
CONFIG_MXS_DMA=y
CONFIG_DMA_BCM2835=y
CONFIG_DMA_OMAP=y
CONFIG_QCOM_BAM_DMA=y
CONFIG_XILINX_DMA=y
CONFIG_DMA_SUN6I=y
CONFIG_ST_FDMA=m
CONFIG_SENSORS_ISL29018=y
CONFIG_SENSORS_ISL29028=y
CONFIG_MFD_NVEC=y
CONFIG_KEYBOARD_NVEC=y
CONFIG_SERIO_NVEC_PS2=y
CONFIG_NVEC_POWER=y
CONFIG_NVEC_PAZ00=y
CONFIG_BCMA=y
CONFIG_BCMA_HOST_SOC=y
CONFIG_BCMA_DRIVER_GMAC_CMN=y
CONFIG_BCMA_DRIVER_GPIO=y
CONFIG_QCOM_GSBI=y
CONFIG_QCOM_PM=y
CONFIG_QCOM_SMEM=y
CONFIG_QCOM_SMD_RPM=y
CONFIG_QCOM_SMP2P=y
CONFIG_QCOM_SMSM=y
CONFIG_QCOM_WCNSS_CTRL=m
CONFIG_ROCKCHIP_PM_DOMAINS=y
CONFIG_COMMON_CLK_QCOM=y
CONFIG_QCOM_CLK_RPM=y
CONFIG_STAGING_BOARD=y
CONFIG_CROS_EC_CHARDEV=m
CONFIG_COMMON_CLK_MAX77686=y
CONFIG_COMMON_CLK_RK808=m
CONFIG_COMMON_CLK_S2MPS11=m
CONFIG_APQ_MMCC_8084=y
CONFIG_MSM_GCC_8660=y
CONFIG_MSM_MMCC_8960=y
CONFIG_MSM_MMCC_8974=y
CONFIG_HWSPINLOCK_QCOM=y
CONFIG_ROCKCHIP_IOMMU=y
CONFIG_TEGRA_IOMMU_GART=y
CONFIG_TEGRA_IOMMU_SMMU=y
CONFIG_ST_REMOTEPROC=m
CONFIG_ARM_TEGRA_DEVFREQ=m
CONFIG_MEMORY=y
CONFIG_TI_AEMIF=y
CONFIG_IIO=y
CONFIG_IIO_SW_TRIGGER=y
CONFIG_AT91_ADC=m
CONFIG_AT91_SAMA5D2_ADC=m
CONFIG_BERLIN2_ADC=m
CONFIG_EXYNOS_ADC=m
CONFIG_VF610_ADC=m
CONFIG_XILINX_XADC=y
CONFIG_MPU3050_I2C=y
CONFIG_CM36651=m
CONFIG_AK8975=y
CONFIG_RASPBERRYPI_POWER=y
CONFIG_IIO_HRTIMER_TRIGGER=y
CONFIG_PWM=y
CONFIG_PWM_ATMEL=m
CONFIG_PWM_ATMEL_HLCDC_PWM=m
CONFIG_PWM_ATMEL_TCB=m
CONFIG_PWM_FSL_FTM=m
CONFIG_PWM_RENESAS_TPU=y
CONFIG_PWM_ROCKCHIP=m
CONFIG_PWM_SAMSUNG=m
CONFIG_PWM_SUN4I=y
CONFIG_PWM_TEGRA=y
CONFIG_PWM_VT8500=y
CONFIG_PHY_HIX5HD2_SATA=y
CONFIG_PWM_STI=y
CONFIG_PWM_BCM2835=y
CONFIG_PWM_BRCMSTB=m

CONFIG_GENERIC_PHY=y

CONFIG_OMAP_USB2=y
CONFIG_TI_PIPE3=y
CONFIG_PHY_BERLIN_USB=y
CONFIG_PHY_BERLIN_SATA=y
CONFIG_PHY_ROCKCHIP_DP=m
CONFIG_PHY_ROCKCHIP_USB=y
CONFIG_PHY_QCOM_APQ8064_SATA=m
CONFIG_PHY_MIPHY28LP=y
CONFIG_PHY_RCAR_GEN2=m
CONFIG_PHY_STIH407_USB=y
CONFIG_PHY_SUN4I_USB=y
CONFIG_PHY_SUN9I_USB=y
CONFIG_PHY_SAMSUNG_USB2=m
CONFIG_PHY_TEGRA_XUSB=y
CONFIG_PHY_BRCM_SATA=y
CONFIG_NVMEM=y
CONFIG_NVMEM_SUNXI_SID=y
CONFIG_BCM2835_MBOX=y
CONFIG_RASPBERRYPI_FIRMWARE=y
CONFIG_EFI_VARS=m
CONFIG_EFI_CAPSULE_LOADER=m
CONFIG_BCM47XX_NVRAM=y
CONFIG_BCM47XX_SPROM=y
CONFIG_EXT4_FS=y
CONFIG_AUTOFS4_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_NTFS_FS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_UBIFS_FS=y
CONFIG_TMPFS=y
CONFIG_SQUASHFS=y
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
CONFIG_PSTORE_PMSG=y
CONFIG_PSTORE_RAM=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=y
CONFIG_ROOT_NFS=y
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_UTF8=y
CONFIG_PRINTK_TIME=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_KEYSTONE_IRQ=y
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_ST=y
CONFIG_CRYPTO_USER=m
CONFIG_CRYPTO_USER_API_RNG=m
CONFIG_CRYPTO_USER_API_AEAD=m
CONFIG_CRYPTO_DEV_MARVELL_CESA=m
CONFIG_CRYPTO_DEV_EXYNOS_RNG=m
CONFIG_CRYPTO_DEV_S5P=m
CONFIG_CRYPTO_DEV_SUN4I_SS=m
CONFIG_CRYPTO_DEV_ROCKCHIP=m
CONFIG_ARM_CRYPTO=y
CONFIG_CRYPTO_SHA1_ARM=m
CONFIG_CRYPTO_SHA1_ARM_CE=m
CONFIG_CRYPTO_SHA2_ARM_CE=m
CONFIG_CRYPTO_AES_ARM=m
CONFIG_CRYPTO_AES_ARM_CE=m
CONFIG_CRYPTO_CHACHA20_NEON=m
CONFIG_CRYPTO_CRC32_ARM_CE=m
CONFIG_CRYPTO_CRCT10DIF_ARM_CE=m
CONFIG_CRYPTO_GHASH_ARM_CE=m
CONFIG_CRYPTO_DEV_ATMEL_AES=m
CONFIG_CRYPTO_DEV_ATMEL_TDES=m
CONFIG_CRYPTO_DEV_ATMEL_SHA=m
CONFIG_VIDEO_VIVID=m
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_VIRTIO_MMIO=y
# Add config flags here that only appear in the multi_v7_defconfig
CONFIG_ARCH_ALPINE=n
CONFIG_ARCH_ARTPEC=n
CONFIG_ARCH_AT91=n
CONFIG_ARCH_BCM=n
CONFIG_ARCH_BCM_CYGNUS=n
CONFIG_ARCH_BCM_NSP=n
CONFIG_ARCH_BCM_5301X=n
CONFIG_ARCH_BCM_281XX=n
CONFIG_ARCH_BCM_21664=n
CONFIG_ARCH_BRCMSTB=n
CONFIG_ARCH_BERLIN=n
CONFIG_ARCH_DIGICOLOR=n
CONFIG_ARCH_HIGHBANK=n
CONFIG_ARCH_HISI=n
CONFIG_ARCH_HI3xxx=n
CONFIG_ARCH_HIP01=n
CONFIG_ARCH_HIP04=n
CONFIG_ARCH_HIX5HD2=n
CONFIG_ARCH_MESON=n
CONFIG_ARCH_MXC=n
CONFIG_ARCH_MEDIATEK=n
CONFIG_ARCH_QCOM=n
CONFIG_ARCH_MSM8X60=n
CONFIG_ARCH_MSM8960=n
CONFIG_ARCH_MSM8974=n
CONFIG_ARCH_ROCKCHIP=n
CONFIG_ARCH_SOCFPGA=n
CONFIG_ARCH_SPEAR13XX=n
CONFIG_ARCH_STI=n
CONFIG_ARCH_EXYNOS=n
CONFIG_ARCH_SHMOBILE_MULTI=n
CONFIG_ARCH_EMEV2=n
CONFIG_ARCH_R7S72100=n
CONFIG_ARCH_R8A73A4=n
CONFIG_ARCH_R8A7740=n
CONFIG_ARCH_R8A7778=n
CONFIG_ARCH_R8A7779=n
CONFIG_ARCH_R8A7790=n
CONFIG_ARCH_R8A7791=n
CONFIG_ARCH_R8A7793=n
CONFIG_ARCH_R8A7794=n
CONFIG_ARCH_RENESAS=n
CONFIG_ARCH_SH73A0=n
CONFIG_ARCH_SUNXI=n
CONFIG_ARCH_SIRF=n
CONFIG_ARCH_TEGRA=n
CONFIG_ARCH_TEGRA_2x_SOC=n
CONFIG_ARCH_TEGRA_3x_SOC=n
CONFIG_ARCH_TEGRA_114_SOC=n
CONFIG_ARCH_TEGRA_124_SOC=n
CONFIG_ARCH_UNIPHIER=n
CONFIG_ARCH_U8500=n
CONFIG_ARCH_VEXPRESS=n
CONFIG_ARCH_VEXPRESS_TC2_PM=n
CONFIG_ARCH_WM8850=n
CONFIG_ARCH_ZYNQ=n
CONFIG_ARCH_VIRT=n
CONFIG_ARCH_MVEBU=n
CONFIG_PLAT_SPEAR=n
CONFIG_CHROME_PLATFORMS=n
##################################################
# TI Baseport Config Options
##################################################

# Kernel compression
CONFIG_KERNEL_GZIP=n
CONFIG_KERNEL_LZMA=y
CONFIG_KERNEL_LZ4=n
CONFIG_KERNEL_XZ=n
CONFIG_KERNEL_LZO=n

# Enable process accounting
CONFIG_BSD_PROCESS_ACCT=y

# Have some way to pick up kernel config later on
# Always useful to look at /proc/config.gz
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y

# Add Bin2c
CONFIG_BUILD_BIN2C=y

# Add base Cgroups functions
CONFIG_CGROUP_DEBUG=n
CONFIG_CPUSETS=y
CONFIG_PROC_PID_CPUSET=y
CONFIG_PAGE_COUNTER=y
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_MEMCG_SWAP_ENABLED=y
CONFIG_DEBUG_BLK_CGROUP=n
CONFIG_CGROUP_WRITEBACK=y

# Choose CONFIG_EMBEDDED
CONFIG_EMBEDDED=y
CONFIG_EXPERT=y
CONFIG_ARM_PATCH_PHYS_VIRT=y

# Enable all kernel symbols please
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y

# Enable AEABI
CONFIG_AEABI=y

# How do we want kernel Modules to work?
CONFIG_BASE_FULL=y
CONFIG_BASE_SMALL=0
CONFIG_MODULES=y
CONFIG_MODULE_FORCE_LOAD=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y
CONFIG_MODULE_SIG=n
CONFIG_MODULE_COMPRESS=n
CONFIG_MODULES_TREE_LOOKUP=y

# Boot options
CONFIG_USE_OF=y
CONFIG_ATAGS=y
CONFIG_DEPRECATED_PARAM_STRUCT=n
CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_ARM_APPENDED_DTB=y
CONFIG_ARM_ATAG_DTB_COMPAT=y
CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y
CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND=n
CONFIG_CMDLINE=""
CONFIG_CMDLINE_FROM_BOOTLOADER=y
CONFIG_CMDLINE_EXTEND=n
CONFIG_CMDLINE_FORCE=n
CONFIG_ATAGS_PROC=y
CONFIG_CRASH_DUMP=n
CONFIG_AUTO_ZRELADDR=y

# Mem allocator
CONFIG_SLAB=n
CONFIG_SLUB=y

# Enable NEON
CONFIG_VFP=y
CONFIG_NEON=y
CONFIG_KERNEL_MODE_NEON=y

# POSIX Message queue
CONFIG_POSIX_MQUEUE=y

# No Multi Cluster systems in TI yet..
CONFIG_MCPM=n

# Serial
CONFIG_SERIAL_8250_OMAP=y
CONFIG_SERIAL_8250_OMAP_TTYO_FIXUP=y
CONFIG_SERIAL_8250_NR_UARTS=10
CONFIG_SERIAL_8250_RUNTIME_UARTS=10
CONFIG_SERIAL_8250_DMA=y
CONFIG_SERIAL_OMAP=n
CONFIG_SERIAL_8250_DW=n
CONFIG_SERIAL_8250_EM=n
CONFIG_SERIAL_AMBA_PL011=n
CONFIG_SERIAL_XILINX_PS_UART=n
CONFIG_SERIAL_FSL_LPUART=n
CONFIG_SERIAL_CONEXANT_DIGICOLOR=n
CONFIG_SERIAL_ST_ASC=n

CONFIG_JUMP_LABEL=y

# Disable Extra debug options
CONFIG_TIMER_STATS=n
CONFIG_DEBUG_SPINLOCK=n
CONFIG_DEBUG_MUTEXES=n
CONFIG_DEBUG_LOCK_ALLOC=n
CONFIG_PROVE_LOCKING=n
CONFIG_LOCKDEP=n
CONFIG_STACKTRACE=n
CONFIG_FTRACE=n
CONFIG_ARM_UNWIND=n
CONFIG_DEBUG_PREEMPT=n
CONFIG_SLUB_DEBUG=n
CONFIG_LOCKUP_DETECTOR=n
CONFIG_DETECT_HUNG_TASK=n
CONFIG_IRQ_DOMAIN_DEBUG=n
CONFIG_DEBUG_BUGVERBOSE=n

CONFIG_DEBUG_FS=y

# Enable System V IPC
CONFIG_SYSVIPC=y

# Power management options
CONFIG_SUSPEND_FREEZER=y
CONFIG_SUSPEND_SKIP_SYNC=n
CONFIG_HIBERNATION=n
CONFIG_PM_SLEEP=y
CONFIG_PM_SLEEP_SMP=y
CONFIG_PM_AUTOSLEEP=n
CONFIG_PM_WAKELOCKS=n
CONFIG_PM=y
CONFIG_PM_DEBUG=y
CONFIG_APM_EMULATION=n
CONFIG_PM_OPP=y
CONFIG_PM_CLK=y
CONFIG_PM_GENERIC_DOMAINS=y
CONFIG_WQ_POWER_EFFICIENT_DEFAULT=n
CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
CONFIG_PM_GENERIC_DOMAINS_OF=y
CONFIG_CPU_PM=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ARM_CPU_SUSPEND=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y

# Clock framework stuff we need
CONFIG_CLKDEV_LOOKUP=y
CONFIG_HAVE_CLK_PREPARE=y
CONFIG_COMMON_CLK=y
CONFIG_COMMON_CLK_SI5351=n
CONFIG_COMMON_CLK_SI514=n
CONFIG_COMMON_CLK_SI570=n
CONFIG_COMMON_CLK_CDCE925=n
CONFIG_CLK_TWL6040=n
CONFIG_CLK_QORIQ=n
CONFIG_COMMON_CLK_PALMAS=y
CONFIG_COMMON_CLK_PWM=n
CONFIG_COMMON_CLK_PXA=n
CONFIG_COMMON_CLK_CDCE706=n
CONFIG_CLKSRC_OF=y
CONFIG_CLKSRC_PROBE=y
CONFIG_CLKSRC_MMIO=y
CONFIG_CLKSRC_TI_32K=y
CONFIG_ARM_ARCH_TIMER=y
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
CONFIG_ARM_GLOBAL_TIMER=n
CONFIG_ARM_TIMER_SP804=n
# Clock cleanup please
CONFIG_OMAP_RESET_CLOCKS=y

# CPU Idle
CONFIG_CPU_IDLE_GOV_LADDER=y
CONFIG_CPU_IDLE_GOV_MENU=y
CONFIG_DT_IDLE_STATES=y

# ARM CPU Idle Drivers
CONFIG_ARM_CPUIDLE=y
CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED=n

# CPU Frequency scaling
CONFIG_CPU_FREQ_GOV_COMMON=y
CONFIG_CPU_FREQ_STAT=y
CONFIG_CPU_FREQ_STAT_DETAILS=y
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y

# CPUFreq Driver Options
CONFIG_CPUFREQ_DT=y
CONFIG_ARM_BIG_LITTLE_CPUFREQ=n
CONFIG_ARM_KIRKWOOD_CPUFREQ=n
CONFIG_ARM_OMAP2PLUS_CPUFREQ=n
CONFIG_ARM_TI_CPUFREQ=y
CONFIG_QORIQ_CPUFREQ=n

# AMx3 Power Config Options
CONFIG_MAILBOX=y
CONFIG_WKUP_M3_RPROC=m
CONFIG_SOC_TI=y
CONFIG_SOC_BRCMSTB=n
CONFIG_WKUP_M3_IPC=m
CONFIG_AMX3_PM=m
CONFIG_SRAM=y
CONFIG_TI_EMIF_SRAM=m
CONFIG_SUNXI_SRAM=n

CONFIG_PM_DEVFREQ=n

# K2G Power config options
# CONFIG_MAILBOX is enabled in AMx3
CONFIG_TI_MESSAGE_MANAGER=y
CONFIG_TI_SCI_PROTOCOL=y
CONFIG_TI_SCI_PM_DOMAINS=y
CONFIG_TI_SCI_CLK=y

# Enable Reset Controllers
CONFIG_RESET_CONTROLLER=y
CONFIG_RESET_TI_SYSCON=y
CONFIG_RESET_TI_SCI=y

# CPUFreq and OPP drivers
CONFIG_OPP_DOMAIN_TI=y

# Thermal
CONFIG_THERMAL=y
CONFIG_THERMAL_OF=y
CONFIG_THERMAL_WRITABLE_TRIPS=y
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
CONFIG_THERMAL_GOV_FAIR_SHARE=y
CONFIG_THERMAL_GOV_STEP_WISE=y
CONFIG_THERMAL_GOV_BANG_BANG=y
CONFIG_THERMAL_GOV_USER_SPACE=y
CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y
CONFIG_CPU_THERMAL=y
CONFIG_TI_SOC_THERMAL=y
CONFIG_TI_THERMAL=y
CONFIG_OMAP4_THERMAL=y
CONFIG_OMAP5_THERMAL=y
CONFIG_DRA752_THERMAL=y

# Since HWMON is needed by Sensors..
CONFIG_HWMON=y
CONFIG_SENSORS_TMP102=y
CONFIG_SENSORS_GPIO_FAN=y

# Enable the reset framework
CONFIG_POWER_RESET=y
CONFIG_POWER_SUPPLY=y

# Pinctrl
CONFIG_PINCTRL_TI_IODELAY=y
CONFIG_PINCTRL_SINGLE=y

#
# Multifunction device drivers
CONFIG_MFD_CORE=y
CONFIG_MFD_AS3711=n
CONFIG_MFD_AS3722=n
CONFIG_PMIC_ADP5520=n
CONFIG_MFD_AAT2870_CORE=n
CONFIG_MFD_ATMEL_FLEXCOM=n
CONFIG_MFD_ATMEL_HLCDC=n
CONFIG_MFD_BCM590XX=n
CONFIG_MFD_AXP20X=n
CONFIG_MFD_AXP20X_I2C=n
CONFIG_MFD_CROS_EC=n
CONFIG_MFD_CROS_EC_I2C=n
CONFIG_MFD_CROS_EC_SPI=n
CONFIG_MFD_ASIC3=n
CONFIG_PMIC_DA903X=n
CONFIG_MFD_DA9052_SPI=n
CONFIG_MFD_DA9052_I2C=n
CONFIG_MFD_DA9055=n
CONFIG_MFD_DA9062=n
CONFIG_MFD_DA9063=n
CONFIG_MFD_DA9150=n
CONFIG_MFD_DLN2=n
CONFIG_MFD_MC13XXX_SPI=n
CONFIG_MFD_MC13XXX_I2C=n
CONFIG_MFD_HI6421_PMIC=n
CONFIG_HTC_EGPIO=n
CONFIG_HTC_PASIC3=n
CONFIG_HTC_I2CPLD=n
CONFIG_LPC_ICH=n
CONFIG_LPC_SCH=n
CONFIG_INTEL_SOC_PMIC=n
CONFIG_MFD_JANZ_CMODIO=n
CONFIG_MFD_KEMPLD=n
CONFIG_MFD_88PM800=n
CONFIG_MFD_88PM805=n
CONFIG_MFD_88PM860X=n
CONFIG_MFD_MAX14577=n
CONFIG_MFD_MAX77686=n
CONFIG_MFD_MAX77693=n
CONFIG_MFD_MAX77843=n
CONFIG_MFD_MAX8907=n
CONFIG_MFD_MAX8925=n
CONFIG_MFD_MAX8997=n
CONFIG_MFD_MAX8998=n
CONFIG_MFD_MT6397=n
CONFIG_MFD_MENF21BMC=n
CONFIG_EZX_PCAP=n
CONFIG_MFD_VIPERBOARD=n
CONFIG_MFD_RETU=n
CONFIG_MFD_PCF50633=n
CONFIG_MFD_PM8XXX=n
CONFIG_MFD_PM8921_CORE=n
CONFIG_MFD_RDC321X=n
CONFIG_MFD_RTSX_PCI=n
CONFIG_MFD_RT5033=n
CONFIG_MFD_RTSX_USB=n
CONFIG_MFD_RC5T583=n
CONFIG_MFD_RK808=n
CONFIG_MFD_RN5T618=n
CONFIG_MFD_SEC_CORE=n
CONFIG_MFD_SI476X_CORE=n
CONFIG_MFD_SM501=n
CONFIG_MFD_SKY81452=n
CONFIG_MFD_SMSC=n
CONFIG_ABX500_CORE=n
CONFIG_AB3100_CORE=n
CONFIG_MFD_STMPE=n
CONFIG_STMPE_I2C=n
CONFIG_STMPE_SPI=n
CONFIG_MFD_SYSCON=y
CONFIG_MFD_TI_AM335X_TSCADC=m
CONFIG_MFD_LP3943=n
CONFIG_MFD_LP8788=n
CONFIG_MFD_OMAP_USB_HOST=y
CONFIG_MFD_PALMAS=y
CONFIG_TPS6105X=n
CONFIG_TPS65010=n
CONFIG_TPS6507X=n
CONFIG_MFD_TPS65086=n
CONFIG_MFD_TPS65090=y
CONFIG_MFD_TPS65217=y
CONFIG_MFD_TPS65218=y
CONFIG_MFD_TPS6586X=y
CONFIG_MFD_TPS65910=y
CONFIG_MFD_TPS65912_I2C=n
CONFIG_MFD_TPS65912_SPI=n
CONFIG_MFD_TPS80031=n
CONFIG_TWL4030_CORE=n
CONFIG_TWL4030_POWER=n
CONFIG_MFD_TWL4030_AUDIO=n
CONFIG_TWL6040_CORE=y
CONFIG_MFD_WL1273_CORE=n
CONFIG_MFD_LM3533=n
CONFIG_MFD_TI_LP873X=y
CONFIG_MFD_TI_LP87565=y
CONFIG_MFD_TC3589X=n
CONFIG_MFD_TMIO=n
CONFIG_MFD_T7L66XB=n
CONFIG_MFD_TC6387XB=n
CONFIG_MFD_TC6393XB=n
CONFIG_MFD_VX855=n
CONFIG_MFD_ARIZONA_I2C=n
CONFIG_MFD_ARIZONA_SPI=n
CONFIG_MFD_WM8400=n
CONFIG_MFD_WM831X_I2C=n
CONFIG_MFD_WM831X_SPI=n
CONFIG_MFD_WM8350_I2C=n
CONFIG_MFD_WM8994=n
CONFIG_MFD_VEXPRESS_SYSREG=n

# Regulators
CONFIG_REGULATOR=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_REGULATOR_DEBUG=n
CONFIG_REGULATOR_VIRTUAL_CONSUMER=n
CONFIG_REGULATOR_USERSPACE_CONSUMER=n
CONFIG_REGULATOR_ACT8865=n
CONFIG_REGULATOR_AD5398=n
CONFIG_REGULATOR_ANATOP=n
CONFIG_REGULATOR_AS3711=n
CONFIG_REGULATOR_AS3722=n
CONFIG_REGULATOR_AXP20X=n
CONFIG_REGULATOR_BCM590XX=n
CONFIG_REGULATOR_DA9210=n
CONFIG_REGULATOR_DA9211=n
CONFIG_REGULATOR_FAN53555=n
CONFIG_REGULATOR_GPIO=y
CONFIG_REGULATOR_ISL9305=n
CONFIG_REGULATOR_ISL6271A=n
CONFIG_REGULATOR_LP3971=n
CONFIG_REGULATOR_LP3972=n
CONFIG_REGULATOR_LP872X=n
CONFIG_REGULATOR_LP8755=n
CONFIG_REGULATOR_LP873X=y
CONFIG_REGULATOR_LP87565=y
CONFIG_REGULATOR_LTC3589=n
CONFIG_REGULATOR_MAX14577=n
CONFIG_REGULATOR_MAX1586=n
CONFIG_REGULATOR_MAX8649=n
CONFIG_REGULATOR_MAX8660=n
CONFIG_REGULATOR_MAX8907=n
CONFIG_REGULATOR_MAX8952=n
CONFIG_REGULATOR_MAX8973=n
CONFIG_REGULATOR_MAX77686=n
CONFIG_REGULATOR_MAX77693=n
CONFIG_REGULATOR_MAX77802=n
CONFIG_REGULATOR_MT6311=n
CONFIG_REGULATOR_PALMAS=y
CONFIG_REGULATOR_PBIAS=y
CONFIG_REGULATOR_PFUZE100=n
CONFIG_REGULATOR_PWM=n
CONFIG_REGULATOR_RK808=n
CONFIG_REGULATOR_S2MPA01=n
CONFIG_REGULATOR_S2MPS11=n
CONFIG_REGULATOR_S5M8767=n
CONFIG_REGULATOR_TI_ABB=y
CONFIG_REGULATOR_TPS51632=n
CONFIG_REGULATOR_TPS62360=y
CONFIG_REGULATOR_TPS65023=y
CONFIG_REGULATOR_TPS6507X=y
CONFIG_REGULATOR_TPS65090=y
CONFIG_REGULATOR_TPS65217=y
CONFIG_REGULATOR_TPS65218=y
CONFIG_REGULATOR_TPS6524X=y
CONFIG_REGULATOR_TPS6586X=y
CONFIG_REGULATOR_TPS65910=y
CONFIG_REGULATOR_TWL4030=n
CONFIG_REGULATOR_VEXPRESS=n

# Crypto Modules
CONFIG_CRYPTO_DEV_OMAP=m
CONFIG_CRYPTO_DEV_OMAP_SHAM=m
CONFIG_CRYPTO_DEV_OMAP_AES=m
CONFIG_CRYPTO_DEV_OMAP_DES=m
CONFIG_CRYPTO_USER_API_HASH=m
CONFIG_CRYPTO_USER_API_SKCIPHER=m
CONFIG_CRYPTO_SHA1_ARM_NEON=m
CONFIG_CRYPTO_SHA256_ARM=m
CONFIG_CRYPTO_SHA512_ARM=m
CONFIG_CRYPTO_AES_ARM_BS=m

#
# RTC drivers
#
CONFIG_RTC_DRV_ABB5ZES3=n
CONFIG_RTC_DRV_ABX80X=n
CONFIG_RTC_DRV_DS1307=m
CONFIG_RTC_DRV_DS1374=n
CONFIG_RTC_DRV_DS1672=n
CONFIG_RTC_DRV_DS3232=n
CONFIG_RTC_DRV_HYM8563=n
CONFIG_RTC_DRV_MAX6900=n
CONFIG_RTC_DRV_RS5C372=n
CONFIG_RTC_DRV_ISL1208=n
CONFIG_RTC_DRV_ISL12022=n
CONFIG_RTC_DRV_ISL12057=n
CONFIG_RTC_DRV_X1205=n
CONFIG_RTC_DRV_PALMAS=m
CONFIG_RTC_DRV_PCF2127=n
CONFIG_RTC_DRV_PCF8523=n
CONFIG_RTC_DRV_PCF8563=n
CONFIG_RTC_DRV_PCF85063=n
CONFIG_RTC_DRV_PCF8583=n
CONFIG_RTC_DRV_M41T80=n
CONFIG_RTC_DRV_BQ32K=n
CONFIG_RTC_DRV_TPS6586X=m
CONFIG_RTC_DRV_TPS65910=m
CONFIG_RTC_DRV_TWL92330=y
CONFIG_RTC_DRV_TWL4030=n
CONFIG_RTC_DRV_S35390A=n
CONFIG_RTC_DRV_FM3130=n
CONFIG_RTC_DRV_RX8581=n
CONFIG_RTC_DRV_RX8025=n
CONFIG_RTC_DRV_EM3027=n
CONFIG_RTC_DRV_RV3029C2=n
CONFIG_RTC_DRV_RV8803=n

CONFIG_RTC_DRV_M41T93=n
CONFIG_RTC_DRV_M41T94=n
CONFIG_RTC_DRV_DS1305=n
CONFIG_RTC_DRV_DS1343=n
CONFIG_RTC_DRV_DS1347=n
CONFIG_RTC_DRV_DS1390=n
CONFIG_RTC_DRV_MAX6902=n
CONFIG_RTC_DRV_R9701=n
CONFIG_RTC_DRV_RS5C348=n
CONFIG_RTC_DRV_DS3234=n
CONFIG_RTC_DRV_PCF2123=n
CONFIG_RTC_DRV_RX4581=n
CONFIG_RTC_DRV_MCP795=n

CONFIG_RTC_DRV_CMOS=n
CONFIG_RTC_DRV_DS1286=n
CONFIG_RTC_DRV_DS1511=n
CONFIG_RTC_DRV_DS1553=n
CONFIG_RTC_DRV_DS1685_FAMILY=n
CONFIG_RTC_DRV_DS1742=n
CONFIG_RTC_DRV_DS2404=n
CONFIG_RTC_DRV_STK17TA8=n
CONFIG_RTC_DRV_M48T86=n
CONFIG_RTC_DRV_M48T35=n
CONFIG_RTC_DRV_M48T59=n
CONFIG_RTC_DRV_MSM6242=n
CONFIG_RTC_DRV_BQ4802=n
CONFIG_RTC_DRV_RP5C01=n
CONFIG_RTC_DRV_V3020=n
CONFIG_RTC_DRV_ZYNQMP=n

CONFIG_RTC_DRV_OMAP=m
CONFIG_RTC_DRV_SNVS=n

CONFIG_RTC_DRV_HID_SENSOR_TIME=n

# WatchDog
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y
CONFIG_WATCHDOG_NOWAYOUT=n

# Watchdog Device Drivers
CONFIG_SOFT_WATCHDOG=n
CONFIG_GPIO_WATCHDOG=n
CONFIG_XILINX_WATCHDOG=n
CONFIG_CADENCE_WATCHDOG=n
CONFIG_DW_WATCHDOG=n
CONFIG_OMAP_WATCHDOG=m
CONFIG_TWL4030_WATCHDOG=m
CONFIG_MAX63XX_WATCHDOG=n
CONFIG_ALIM7101_WDT=n
CONFIG_I6300ESB_WDT=n
CONFIG_BCM7038_WDT=n
CONFIG_MEN_A21_WDT=n

# No Staging drivers please
CONFIG_STAGING=n

# GPIO
CONFIG_GPIOLIB=y
CONFIG_GPIO_SYSFS=y
CONFIG_DEBUG_GPIO=y

# GPIO disable unused options
CONFIG_GPIO_DWAPB=n
CONFIG_GPIO_EM=n
CONFIG_GPIO_GENERIC_PLATFORM=n
CONFIG_GPIO_XILINX=n
CONFIG_GPIO_TPS6586X=n

# Enable options to facilitate testing
CONFIG_CRYPTO_TEST=m
CONFIG_RTC_DEBUG=y
CONFIG_THERMAL_EMULATION=y

# OPTEE Driver
CONFIG_TEE=y
CONFIG_OPTEE=y
##################################################
# TI RPMsg/IPC Config Options
##################################################
# HwSpinLock
CONFIG_HWSPINLOCK=y
CONFIG_HWSPINLOCK_OMAP=y

# Mailbox
CONFIG_OMAP2PLUS_MBOX=y

# IOMMU
CONFIG_IOMMU_SUPPORT=y
CONFIG_OMAP_IOMMU=y
CONFIG_OMAP_IOMMU_DEBUG=y

# Remoteproc
CONFIG_REMOTEPROC=m
CONFIG_OMAP_REMOTEPROC=m
CONFIG_KEYSTONE_REMOTEPROC=m
CONFIG_DA8XX_REMOTEPROC=m
CONFIG_PRUSS_REMOTEPROC=m

# RPMsg
CONFIG_RPMSG_VIRTIO=y
CONFIG_RPMSG_PROTO=y
CONFIG_RPMSG_RPC=y
CONFIG_RPMSG_PRU=y

# DSP Memory Mapper for Keystone MPM
CONFIG_KEYSTONE_DSP_MEM=m

# UIO Module
CONFIG_UIO=m
##################################################
# TI Connectivity Configs
##################################################

# Disable unused I2C options
CONFIG_I2C_MUX=n
CONFIG_I2C_DESIGNWARE_PLATFORM=n
CONFIG_I2C_GPIO=n
CONFIG_I2C_RK3X=n
CONFIG_I2C_XILINX=n

# I2C GPIO expanders
CONFIG_GPIO_PCF857X=y
CONFIG_GPIO_TPIC2810=m

#Networking drivers
CONFIG_NET_VENDOR_TI=y
CONFIG_KEYSTONE_NAVIGATOR_QMSS=y
CONFIG_KEYSTONE_NAVIGATOR_DMA=y
CONFIG_TI_KEYSTONE_NETCP=y
CONFIG_TI_KEYSTONE_NETCP_ETHSS=y
CONFIG_TI_DAVINCI_EMAC=y
CONFIG_TI_DAVINCI_MDIO=y
CONFIG_TI_DAVINCI_CPDMA=y
CONFIG_TI_CPSW_PHY_SEL=y
CONFIG_TI_CPSW_ALE=y
CONFIG_TI_CPSW=y
CONFIG_TI_CPTS=y
# non-TI Net vendors
CONFIG_NET_DSA_BCM_SF2=n
CONFIG_B53=n
CONFIG_SYSTEMPORT=n
CONFIG_NET_VENDOR_3COM=n
CONFIG_NET_VENDOR_ADAPTEC=n
CONFIG_NET_VENDOR_AGERE=n
CONFIG_NET_VENDOR_ALTEON=n
CONFIG_NET_VENDOR_AMAZON=n
CONFIG_NET_VENDOR_AMD=n
CONFIG_NET_VENDOR_ARC=n
CONFIG_NET_VENDOR_ATHEROS=n
CONFIG_NET_VENDOR_BROCADE=n
CONFIG_NET_VENDOR_CAVIUM=n
CONFIG_NET_VENDOR_CHELSIO=n
CONFIG_NET_CADENCE=n
CONFIG_BCMGENET=n
CONFIG_NET_VENDOR_CIRRUS=n
CONFIG_NET_VENDOR_CISCO=n
CONFIG_NET_VENDOR_DEC=n
CONFIG_NET_VENDOR_DLINK=n
CONFIG_NET_VENDOR_EMULEX=n
CONFIG_NET_VENDOR_EZCHIP=n
CONFIG_NET_VENDOR_EXAR=n
CONFIG_NET_VENDOR_FARADAY=n
CONFIG_NET_VENDOR_HISILICON=n
CONFIG_NET_VENDOR_HP=n
CONFIG_IGB=n
CONFIG_NET_VENDOR_I825XX=n
CONFIG_NET_VENDOR_MELLANOX=n
CONFIG_NET_VENDOR_MICROCHIP=n
CONFIG_NET_VENDOR_MYRI=n
CONFIG_NET_VENDOR_NATSEMI=n
CONFIG_NET_VENDOR_NETRONOME=n
CONFIG_NET_VENDOR_NVIDIA=n
CONFIG_NET_VENDOR_OKI=n
CONFIG_NET_VENDOR_8390=n
CONFIG_NET_VENDOR_QLOGIC=n
CONFIG_NET_VENDOR_QUALCOMM=n
CONFIG_NET_VENDOR_REALTEK=n
CONFIG_NET_VENDOR_RENESAS=n
CONFIG_NET_VENDOR_RDC=n
CONFIG_NET_VENDOR_ROCKER=n
CONFIG_NET_VENDOR_SAMSUNG=n
CONFIG_NET_VENDOR_SILAN=n
CONFIG_NET_VENDOR_SIS=n
CONFIG_NET_VENDOR_SEEQ=n
CONFIG_NET_VENDOR_STMICRO=n
CONFIG_NET_VENDOR_SUN=n
CONFIG_NET_VENDOR_SYNOPSYS=n
CONFIG_NET_VENDOR_TEHUTI=n
CONFIG_NET_VENDOR_VIA=n
CONFIG_NET_VENDOR_WIZNET=n
#Wireless LAN
CONFIG_WLCORE=m
CONFIG_WLCORE_SDIO=m
CONFIG_WL18XX=m

#MDIO phys
CONFIG_MARVELL_PHY=y
CONFIG_MICREL_PHY=y
# unused PHY drivers
CONFIG_BROADCOM_PHY=n
CONFIG_ICPLUS_PHY=n
#PRU MII PHYs for Industrial Boards
CONFIG_DP83848_PHY=y
# Enable phy for DRA72 evm
CONFIG_DP83867_PHY=y

#MTD
CONFIG_OMAP_GPMC=y
CONFIG_MTD_NAND_OMAP2=y
CONFIG_MTD_NAND_OMAP_BCH=y
CONFIG_MTD_NAND_OMAP_BCH_BUILD=y
CONFIG_MTD_TESTS=m
CONFIG_MTD_CMDLINE_PARTS=y

#PCIE
CONFIG_PCI=y
CONFIG_PCI_ENDPOINT=y
CONFIG_PCI_ENDPOINT_CONFIGFS=y
CONFIG_PCI_EPF_TEST=y
CONFIG_PCI_ENDPOINT_TEST=m
CONFIG_PCI_DRA7XX=y
CONFIG_PCI_DRA7XX_HOST=y
CONFIG_PCI_DRA7XX_EP=y
CONFIG_PCI_KEYSTONE_EP=y
#These drivers have been used with DRA7x/AM57x PCIe RC with some success
CONFIG_NET_VENDOR_BROADCOM=y
CONFIG_NET_VENDOR_MARVELL=y
CONFIG_NET_VENDOR_INTEL=y
CONFIG_TIGON3=m
CONFIG_SKGE=m
CONFIG_E1000=m
CONFIG_E1000E=m
CONFIG_IWLWIFI=m
CONFIG_IWLDVM=m
CONFIG_IWLMVM=m
#Generic Phys
CONFIG_PHY_TI_KEYSTONE_SERDES=y

# Networking
CONFIG_HSR_PRP=y
CONFIG_NF_CONNTRACK=m
CONFIG_NF_CONNTRACK_IPV4=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_NAT=m
CONFIG_NF_NAT_IPV4=m
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_BRIDGE=m
CONFIG_XFRM_USER=m
CONFIG_NET_KEY=m
CONFIG_INET=y
CONFIG_INET_AH=m
CONFIG_INET6_AH=m
CONFIG_INET6_IPCOMP=m
CONFIG_INET6_XFRM_TUNNEL=m
CONFIG_INET6_TUNNEL=m
CONFIG_INET_ESP=m
CONFIG_INET_IPCOMP=m
CONFIG_INET_XFRM_MODE_TRANSPORT=m
CONFIG_INET_XFRM_MODE_TUNNEL=m
CONFIG_INET_XFRM_MODE_BEET=m
CONFIG_IPV6_TUNNEL=m
CONFIG_NETFILTER=y
CONFIG_NETFILTER_XTABLES=m
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
CONFIG_NETFILTER_XT_TARGET_MARK=m
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
CONFIG_NETFILTER_XT_MATCH_CPU=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_SCTP=m
CONFIG_BRIDGE_NF_EBTABLES=m
CONFIG_BRIDGE_EBT_BROUTE=m
CONFIG_BRIDGE_EBT_T_FILTER=m
CONFIG_BRIDGE_EBT_T_NAT=m
CONFIG_BRIDGE_EBT_802_3=m
CONFIG_BRIDGE_EBT_AMONG=m
CONFIG_BRIDGE_EBT_ARP=m
CONFIG_BRIDGE_EBT_IP=m
CONFIG_BRIDGE_EBT_IP6=m
CONFIG_BRIDGE_EBT_LIMIT=m
CONFIG_BRIDGE_EBT_MARK=m
CONFIG_BRIDGE_EBT_PKTTYPE=m
CONFIG_BRIDGE_EBT_STP=m
CONFIG_BRIDGE_EBT_VLAN=m
CONFIG_BRIDGE_EBT_ARPREPLY=m
CONFIG_BRIDGE_EBT_DNAT=m
CONFIG_BRIDGE_EBT_MARK_T=m
CONFIG_BRIDGE_EBT_REDIRECT=m
CONFIG_BRIDGE_EBT_SNAT=m
CONFIG_BRIDGE_EBT_LOG=m
CONFIG_BRIDGE_EBT_NFLOG=m
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_HFSC=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_MULTIQ=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFB=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_NETEM=m
CONFIG_NET_SCH_DRR=m
CONFIG_NET_SCH_MQPRIO=m
CONFIG_NET_SCH_CHOKE=m
CONFIG_NET_SCH_QFQ=m
CONFIG_NET_SCH_CODEL=m
CONFIG_NET_SCH_FQ_CODEL=m
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_CLS=y
CONFIG_NET_CLS_BASIC=m
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_FLOW=m
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_STACK=32
CONFIG_NET_EMATCH_CMP=m
CONFIG_NET_EMATCH_NBYTE=m
CONFIG_NET_EMATCH_U32=m
CONFIG_NET_EMATCH_META=m
CONFIG_NET_EMATCH_TEXT=m
CONFIG_NET_CLS_ACT=y
CONFIG_NET_ACT_POLICE=m
CONFIG_NET_ACT_GACT=m
CONFIG_GACT_PROB=y
CONFIG_NET_ACT_MIRRED=m
CONFIG_NET_ACT_IPT=m
CONFIG_NET_ACT_NAT=m
CONFIG_NET_ACT_PEDIT=m
CONFIG_NET_ACT_SIMP=m
CONFIG_NET_ACT_SKBEDIT=m
CONFIG_NET_ACT_CSUM=m
CONFIG_NET_CLS_IND=y
CONFIG_NET_SCH_FIFO=y
CONFIG_IP_SCTP=m
CONFIG_VLAN_8021Q=m
CONFIG_IP_MULTICAST=y

#PRUSS Ethernet driver
CONFIG_TI_PRUETH=m

#MMC/SD support
CONFIG_MMC=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PLTFM=y
CONFIG_MMC_OMAP_HS=y
CONFIG_MMC_SDHCI_OMAP=y
CONFIG_MMC_DW=n

#SPI
CONFIG_SPI_CADENCE_QUADSPI=y
CONFIG_SPI_TI_QSPI=y
#Disable unused SPI controllers
CONFIG_SPI_BITBANG=n
CONFIG_SPI_CADENCE=n
CONFIG_SPI_ROCKCHIP=n
CONFIG_SPI_XILINX=n
CONFIG_SPI_SPIDEV=n

#Disable SPI NOR 4K SECTORS
CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=n

#SPI GPIO expanders
CONFIG_GPIO_PISOSR=m

#SATA
CONFIG_SATA_AHCI_PLATFORM=m
CONFIG_SATA_AHCI=m
CONFIG_ATA=m

#USB gadgets
CONFIG_USB_GADGET=m
CONFIG_USB_AUDIO=m
CONFIG_USB_ETH=m
CONFIG_USB_G_NCM=m
CONFIG_USB_GADGETFS=m
CONFIG_USB_FUNCTIONFS=m
CONFIG_USB_FUNCTIONFS_ETH=y
CONFIG_USB_FUNCTIONFS_RNDIS=y
CONFIG_USB_FUNCTIONFS_GENERIC=y
CONFIG_USB_MASS_STORAGE=m
CONFIG_USB_G_SERIAL=m
CONFIG_USB_MIDI_GADGET=m
CONFIG_USB_G_PRINTER=m
CONFIG_USB_CDC_COMPOSITE=m
CONFIG_USB_G_ACM_MS=m
CONFIG_USB_G_MULTI=m
CONFIG_USB_G_MULTI_CDC=y
CONFIG_USB_G_HID=m
CONFIG_USB_G_DBGP=m
CONFIG_USB_G_WEBCAM=m
CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=32
CONFIG_USB_ZERO=m
CONFIG_USB_CONFIGFS=m
CONFIG_USB_CONFIGFS_SERIAL=y
CONFIG_USB_CONFIGFS_ACM=y
CONFIG_USB_CONFIGFS_OBEX=y
CONFIG_USB_CONFIGFS_NCM=y
CONFIG_USB_CONFIGFS_ECM=y
CONFIG_USB_CONFIGFS_ECM_SUBSET=y
CONFIG_USB_CONFIGFS_RNDIS=y
CONFIG_USB_CONFIGFS_EEM=y
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
CONFIG_USB_CONFIGFS_F_LB_SS=y
CONFIG_USB_CONFIGFS_F_FS=y
CONFIG_USB_CONFIGFS_F_UAC1=y
CONFIG_USB_CONFIGFS_F_UAC2=y
CONFIG_USB_CONFIGFS_F_MIDI=y
CONFIG_USB_CONFIGFS_F_HID=y
CONFIG_USB_CONFIGFS_F_UVC=y
CONFIG_USB_CONFIGFS_F_PRINTER=y

# USB DWC3
CONFIG_USB_DWC3=m
CONFIG_USB_DWC3_DUAL_ROLE=y
CONFIG_USB_DWC3_OMAP=m
CONFIG_USB_DWC3_PCI=n
CONFIG_USB_DWC2=n
CONFIG_USB_CHIPIDEA=n

#USB PHY
CONFIG_NOP_USB_XCEIV=m

#USB MUSB
CONFIG_USB_MUSB_HDRC=m
CONFIG_USB_MUSB_DUAL_ROLE=y
CONFIG_USB_MUSB_OMAP2PLUS=m
CONFIG_USB_MUSB_AM35X=m
CONFIG_USB_MUSB_DSPS=m
CONFIG_USB_MUSB_AM335X_CHILD=m
CONFIG_TI_CPPI41=y
CONFIG_USB_TI_CPPI41_DMA=y
CONFIG_AM335X_CONTROL_USB=y
CONFIG_AM335X_PHY_USB=y

#USB EHCI
CONFIG_USB=m
CONFIG_USB_EHCI_HCD=m
CONFIG_USB_EHCI_PCI=m
CONFIG_USB_EHCI_HCD_OMAP=m

#USB Networking
CONFIG_USB_USBNET=m
CONFIG_USB_NET_DRIVERS=m
CONFIG_USB_NET_SMSC95XX=m

#USB testing
CONFIG_USB_TEST=m

#USB Serial
CONFIG_USB_ACM=m
CONFIG_USB_SERIAL=m

# Extcon drivers
CONFIG_EXTCON=m
CONFIG_EXTCON_PALMAS=m
CONFIG_EXTCON_USB_GPIO=m

# PWM
CONFIG_PWM_TIECAP=y
CONFIG_PWM_TIEHRPWM=y
CONFIG_PWM_TIPWMSS=y

# 1-wire Bus Masters
CONFIG_W1=m
CONFIG_HDQ_MASTER_OMAP=m

# Matrix keypad
CONFIG_KEYBOARD_MATRIX=m

#Touchscreen/ADC
CONFIG_TOUCHSCREEN_TI_AM335X_TSC=m
CONFIG_TI_AM335X_ADC=m

#CAN
CONFIG_CAN=m
CONFIG_CAN_C_CAN=m
CONFIG_CAN_C_CAN_PLATFORM=m
CONFIG_CAN_M_CAN=m

# Rotary Encoder
CONFIG_INPUT_GPIO_DECODER=m

# Filesystem extra options
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_CIFS=m
CONFIG_CIFS_STATS=y
CONFIG_CIFS_XATTR=y
CONFIG_CIFS_POSIX=y
CONFIG_CIFS_ACL=y
##################################################
# TI Audio/Display config options
##################################################

CONFIG_CMA_SIZE_MBYTES=24

# backlight

CONFIG_LEDS_CLASS=y
CONFIG_LEDS_TLC591XX=y

CONFIG_BACKLIGHT_PWM=y
CONFIG_BACKLIGHT_GPIO=y
CONFIG_BACKLIGHT_LED=y

# fbdev

CONFIG_FB_SSD1307=y

# drm

CONFIG_DRM=y

# SGX driver needs legacy support
CONFIG_DRM_LEGACY=y
CONFIG_DRM_VM=y

# Disable unneeded features

CONFIG_VGA_ARB=n
CONFIG_DRM_I2C_ADV7511=n
CONFIG_DRM_NOUVEAU=n
CONFIG_DRM_EXYNOS=n
CONFIG_DRM_PANEL_SIMPLE=n
CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0=n
CONFIG_DRM_NXP_PTN3460=n
CONFIG_DRM_PARADE_PS8622=n
CONFIG_DRM_STI=n
CONFIG_LCD_CLASS_DEVICE=n

# tilcdc

CONFIG_DRM_I2C_NXP_TDA998X=y
CONFIG_DRM_TILCDC=y

# omapdrm

CONFIG_DRM_OMAP=y
CONFIG_DRM_OMAP_WB=y

CONFIG_OMAP2_DSS=y
CONFIG_OMAP2_DSS_DEBUGFS=y
CONFIG_OMAP2_DSS_DPI=y
CONFIG_OMAP2_DSS_VENC=n
CONFIG_OMAP4_DSS_HDMI=y
CONFIG_OMAP5_DSS_HDMI=y
CONFIG_OMAP2_DSS_SDI=n
CONFIG_OMAP2_DSS_DSI=n

CONFIG_TI_DSS6=y

CONFIG_DRM_OMAP_PANEL_DPI=y
CONFIG_DRM_OMAP_CONNECTOR_HDMI=y
CONFIG_DRM_OMAP_CONNECTOR_DVI=y
CONFIG_DRM_OMAP_DRA7EVM_ENCODER_TPD12S015=y
CONFIG_DRM_OMAP_ENCODER_TPD12S015=y
CONFIG_DRM_OMAP_ENCODER_SII9022=y
CONFIG_DRM_OMAP_ENCODER_TC358768=y
CONFIG_DRM_OMAP_ENCODER_TFP410=y

# sound

CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_SND_SOC=y
CONFIG_SND_OMAP_SOC=y
CONFIG_SND_EDMA_SOC=y
CONFIG_SND_DAVINCI_SOC_MCASP=y
CONFIG_SND_AM33XX_SOC_EVM=m
CONFIG_SND_SIMPLE_CARD=m
CONFIG_SND_SOC_TLV320AIC31XX=m
CONFIG_SND_SOC_TLV320AIC3X=m
CONFIG_SND_SOC_HDMI_CODEC=m
CONFIG_SND_OMAP_SOC_HDMI_AUDIO=m
# Disable what we don't want in our config
CONFIG_SND_ARM=n
CONFIG_SND_SPI=n
CONFIG_SND_PCI=n
CONFIG_SND_ATMEL_SOC=n
CONFIG_SND_SOC_FSL_SAI=n
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=n
CONFIG_SND_SOC_AK4642=n
CONFIG_SND_SOC_SGTL5000=n
CONFIG_SND_SOC_STI_SAS=n
CONFIG_SND_SOC_WM8978=n

# v4l2

CONFIG_MEDIA_SUPPORT=y
CONFIG_MEDIA_CAMERA_SUPPORT=y
CONFIG_MEDIA_CONTROLLER=y
CONFIG_VIDEO_V4L2_SUBDEV_API=y

CONFIG_V4L_PLATFORM_DRIVERS=y
CONFIG_VIDEO_AM437X_VPFE=m
CONFIG_VIDEO_TI_CAL=m
CONFIG_VIDEO_TI_VIP=m

CONFIG_V4L_MEM2MEM_DRIVERS=y
CONFIG_VIDEO_TI_VPE=m

CONFIG_MEDIA_SUBDRV_AUTOSELECT=n
CONFIG_VIDEO_OV2659=m
CONFIG_VIDEO_OV1063X=m
CONFIG_VIDEO_MT9T11X=m
CONFIG_GPIO_PCA953X=m
CONFIG_VIDEO_OV490=m

CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_USB_VIDEO_CLASS=m
CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y

# Touchscreen

CONFIG_TOUCHSCREEN_EDT_FT5X06=m
CONFIG_TOUCHSCREEN_PIXCIR=m
CONFIG_TOUCHSCREEN_GOODIX=m

CONFIG_HID_MULTITOUCH=m
##################################################
# TI Base OMAP generation SoCs generic default
##################################################

CONFIG_KEYSTONE2_DMA_COHERENT=n
CONFIG_ARCH_OMAP=y

CONFIG_ARCH_OMAP2PLUS=y
CONFIG_OMAP_INTERCONNECT_BARRIER=y
CONFIG_ARM_PSCI=n

# Maximum Number of processors
CONFIG_NR_CPUS=2

# Kexec
CONFIG_KEXEC=y

# EDAC
CONFIG_EDAC=y
CONFIG_EDAC_TI=m
##################################################
# TI DRA7 specific config options
##################################################

# Supported ARM CPUs
CONFIG_ARCH_MULTI_V6=n
CONFIG_ARCH_MULTI_V7=y
CONFIG_ARCH_MULTI_V6_V7=n
CONFIG_CPU_V6=n

# Enable CONFIG_SMP
CONFIG_SMP=y

# Disable Socs other than DRA7
CONFIG_ARCH_OMAP2=n
CONFIG_ARCH_OMAP3=n
CONFIG_ARCH_OMAP4=n
CONFIG_SOC_OMAP5=n
CONFIG_SOC_AM33XX=n
CONFIG_SOC_AM43XX=n
CONFIG_SOC_DRA7XX=y

CONFIG_ARCH_KEYSTONE=n

CONFIG_ARM_LPAE=y

CONFIG_TI_PTP_BC=y
CONFIG_TI_1PPS_DM_TIMER=y
##################################################
# Real Time Linux Configs
##################################################

CONFIG_PREEMPT=y
CONFIG_PREEMPT_RT_BASE=y
CONFIG_PREEMPT_RT_FULL=y 

#Disable PM features
CONFIG_CPU_IDLE=n
CONFIG_CPU_FREQ=n
CONFIG_SUSPEND=n
CONFIG_HOTPLUG_CPU=y

# SCHED_DEBUG provides a lot of additional options for scheduler
# tuning in /proc/sys/kernel/ and allows to see scheduler statistic in
# /proc/sched_debug
# CONFIG_SCHED_DEBUG

# --- RCU optimization options to reduce OS jitter
# RCU_BOOST : This option boosts the priority of preempted RCU readers that
# block the current preemptible RCU grace period for too long.
# This option also prevents heavy loads from blocking RCU
# callback invocation for all flavors of RCU
# CONFIG_RCU_BOOST=n

# RCU_NOCB_CPU : Use this option to reduce OS jitter for aggressive HPC or
# real-time workloads.	It can also be used to offload RCU
# callback invocation to energy-efficient CPUs in battery-powered
# asymmetric multiprocessors.
# CONFIG_RCU_NOCB_CPU=y

# RCU_NOCB_CPU_ALL: his option forces all CPUs to be no-CBs CPUs.
# The rcu_nocbs= boot parameter will be ignored.  All CPUs' RCU callbacks will
# be executed in the context of per-CPU rcuo kthreads created for
# this purpose.
# CONFIG_RCU_NOCB_CPU_ALL=y
##############################################
#
# Kernel options needed for systemd enabled TI SDKs
# See https://cgit.freedesktop.org/systemd/systemd/tree/README#n38 for details
#
##############################################
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_CGROUPS=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_BLK_CGROUP=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_PERF=y

CONFIG_INOTIFY_USER=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EPOLL=y
CONFIG_NET=y
CONFIG_SYSFS=y
CONFIG_PROC_FS=y
CONFIG_FHANDLE=y

# udev will fail to work with the legacy sysfs layout:
CONFIG_SYSFS_DEPRECATED=n

# Legacy hotplug slows down the system and confuses udev:
CONFIG_UEVENT_HELPER_PATH=""

# Userspace firmware loading is not supported and should
# be disabled in the kernel:
CONFIG_FW_LOADER_USER_HELPER=n

# Some udev rules and virtualization detection relies on it:
# Only for UEFI based systems
# http://cateee.net/lkddb/web-lkddb/DMI.html
CONFIG_DMIID=n

# Support for some SCSI devices serial number retrieval, to
# create additional symlinks in /dev/disk/ and /dev/tape:
CONFIG_BLK_DEV_BSG=y

# Required for PrivateNetwork and PrivateDevices in service units:
# Note that systemd-localed.service and other systemd units use
# PrivateNetwork and PrivateDevices so this is effectively required.
CONFIG_NAMESPACES=y
CONFIG_NET_NS=y
CONFIG_DEVPTS_MULTIPLE_INSTANCES=y

# Optional but strongly recommended options: those are nice to have and
# indeed recommended, but not necessarily systemd required. These to be
# enabled in corresponding domain fragments since they are not specific
# to supporting systemd.

CONFIG_SECCOMP=y
# for kcmp syscall
CONFIG_CHECKPOINT_RESTORE=y

# Required for CPUShares= in resource control unit settings
CONFIG_CGROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y

# Required for CPUQuota= in resource control unit settings
CONFIG_CFS_BANDWIDTH=y

# For systemd-bootchart, several proc debug interfaces are required:
# Systemd-debug.cfg?
CONFIG_SCHEDSTATS=y
CONFIG_SCHED_DEBUG=y

# We recommend to turn off Real-Time group scheduling in the
# kernel when using systemd. RT group scheduling effectively
# makes RT scheduling unavailable for most userspace, since it
# requires explicit assignment of RT budgets to each unit whose
# processes making use of RT. As there's no sensible way to
# assign these budgets automatically this cannot really be
# fixed, and it's best to disable group scheduling hence.
CONFIG_RT_GROUP_SCHED=n

# Note that kernel auditing is broken when used with systemd's
# container code. When using systemd in conjunction with
# containers, please make sure to either turn off auditing at
# runtime using the kernel command line option "audit=0", or
# turn it off at kernel compile time using:
CONFIG_AUDIT=n

  • OMAPCONF (rev v1.73 built Sun Jul 22 05:21:55 UTC 2018)
    
    HW Platform:
      Generic DRA72X (Flattened Device Tree)
      DRA72X ES1.1 GP Device (STANDARD performance (1.0GHz))
      UNKNOWN POWER IC
    
    SW Build Details:
      Build:
        Version:  _____                    _____           _         _   
      Kernel:
        Version: 4.14.40-rt29-gd5443cbd3b
        Author: bridge@PC932
        Toolchain: gcc version 7.2.1 20171011 (Linaro GCC 7.2-2017.11
        Type: #69 SMP PREEMPT RT
        Date: Mon Nov 26 15:47:14 CET 2018
    
    |----------------------------------------------------------------------------------------------------------------------------------------------|
    | mpu IRQ Crossbar Dump                                                                                                                        |
    |----------------------------------------------------------------------------------------------------------------------------------------------|
    | Index | Addr       | Val | Name                               | Source        | Description                                                  |
    |----------------------------------------------------------------------------------------------------------------------------------------------|
    | 0     |        N/A | N/A | MPU_CLUSTER_IRQ_INTERR             | MPU_CLUSTER   | Illegal writes to interrupt controller memory map region     |
    | 1     |        N/A | N/A | CS_CTI_MPU_C0_IRQ                  | MPU_C0_CS_CTI | TRIGOUT[6] of Cross Trigger Interface 0 (CTI0)               |
    | 2     |        N/A | N/A | CS_CTI_MPU_C1_IRQ                  | MPU_C1_CS_CTI | TRIGOUT[6] of Cross Trigger Interface 1 (CTI1)               |
    | 3     |        N/A | N/A | MPU_CLUSTER_IRQ_AXIERR             | MPU_CLUSTER   | Error indication for AXI write transactions with a BRESP err |
    | 4     | 0x4A002A48 |   0 | reserved                           | reserved      | N/A                                                          |
    | 5     |        N/A | N/A | WD_TIMER_MPU_C0_IRQ_WARN           | MPU_WD_TIMER  | MPU_WD_TIMER channel 0 warning interrupt                     |
    | 6     |        N/A | N/A | WD_TIMER_MPU_C1_IRQ_WARN           | MPU_WD_TIMER  | MPU_WD_TIMER channel 1 warning interrupt                     |
    | 7     | 0x4A002A4A |   0 | reserved                           | reserved      | N/A                                                          |
    | 8     | 0x4A002A4C |   0 | reserved                           | reserved      | N/A                                                          |
    | 9     | 0x4A002A4E |   0 | reserved                           | reserved      | N/A                                                          |
    | 10    | 0x4A002A50 |   5 | L3_MAIN_IRQ_APP_ERR                | L3_MAIN       | L3_MAIN application or non-attributable error                |
    | 11    | 0x4A002A52 |   0 | reserved                           | reserved      | N/A                                                          |
    | 12    | 0x4A002A54 |   0 | reserved                           | reserved      | N/A                                                          |
    | 13    | 0x4A002A56 |   0 | reserved                           | reserved      | N/A                                                          |
    | 14    | 0x4A002A58 |   0 | reserved                           | reserved      | N/A                                                          |
    | 15    | 0x4A002A5A |   0 | reserved                           | reserved      | N/A                                                          |
    | 16    | 0x4A002A5C |   0 | reserved                           | reserved      | N/A                                                          |
    | 17    | 0x4A002A5E |   0 | reserved                           | reserved      | N/A                                                          |
    | 18    | 0x4A002A60 |   0 | reserved                           | reserved      | N/A                                                          |
    | 19    | 0x4A002A62 |   0 | reserved                           | reserved      | N/A                                                          |
    | 20    | 0x4A002A64 |   0 | reserved                           | reserved      | N/A                                                          |
    | 21    | 0x4A002A66 |   0 | reserved                           | reserved      | N/A                                                          |
    | 22    | 0x4A002A68 |   0 | reserved                           | reserved      | N/A                                                          |
    | 23    | 0x4A002A6A |   0 | reserved                           | reserved      | N/A                                                          |
    | 24    | 0x4A002A6C |   0 | reserved                           | reserved      | N/A                                                          |
    | 25    | 0x4A002A6E |   0 | reserved                           | reserved      | N/A                                                          |
    | 26    | 0x4A002A70 |   0 | reserved                           | reserved      | N/A                                                          |
    | 27    | 0x4A002A72 |   0 | reserved                           | reserved      | N/A                                                          |
    | 28    | 0x4A002A74 |   0 | reserved                           | reserved      | N/A                                                          |
    | 29    | 0x4A002A76 |   0 | reserved                           | reserved      | N/A                                                          |
    | 30    | 0x4A002A78 |   0 | reserved                           | reserved      | N/A                                                          |
    | 31    | 0x4A002A7A |   0 | reserved                           | reserved      | N/A                                                          |
    | 32    | 0x4A002A7C |   0 | reserved                           | reserved      | N/A                                                          |
    | 33    | 0x4A002A7E |   0 | reserved                           | reserved      | N/A                                                          |
    | 34    | 0x4A002A80 |   0 | reserved                           | reserved      | N/A                                                          |
    | 35    | 0x4A002A82 |   0 | reserved                           | reserved      | N/A                                                          |
    | 36    | 0x4A002A84 |   0 | reserved                           | reserved      | N/A                                                          |
    | 37    | 0x4A002A86 |   0 | reserved                           | reserved      | N/A                                                          |
    | 38    | 0x4A002A88 |   0 | reserved                           | reserved      | N/A                                                          |
    | 39    | 0x4A002A8A |   0 | reserved                           | reserved      | N/A                                                          |
    | 40    | 0x4A002A8C |   0 | reserved                           | reserved      | N/A                                                          |
    | 41    | 0x4A002A8E |   0 | reserved                           | reserved      | N/A                                                          |
    | 42    | 0x4A002A90 |   0 | reserved                           | reserved      | N/A                                                          |
    | 43    | 0x4A002A92 |   0 | reserved                           | reserved      | N/A                                                          |
    | 44    | 0x4A002A94 |   0 | reserved                           | reserved      | N/A                                                          |
    | 45    | 0x4A002A96 |   0 | reserved                           | reserved      | N/A                                                          |
    | 46    | 0x4A002A98 |   0 | reserved                           | reserved      | N/A                                                          |
    | 47    | 0x4A002A9A |   0 | reserved                           | reserved      | N/A                                                          |
    | 48    | 0x4A002A9C |   0 | reserved                           | reserved      | N/A                                                          |
    | 49    | 0x4A002A9E |   0 | reserved                           | reserved      | N/A                                                          |
    | 50    | 0x4A002AA0 |   0 | reserved                           | reserved      | N/A                                                          |
    | 51    | 0x4A002AA2 |   0 | reserved                           | reserved      | N/A                                                          |
    | 52    | 0x4A002AA4 |   0 | reserved                           | reserved      | N/A                                                          |
    | 53    | 0x4A002AA6 |   0 | reserved                           | reserved      | N/A                                                          |
    | 54    | 0x4A002AA8 |   0 | reserved                           | reserved      | N/A                                                          |
    | 55    | 0x4A002AAA |   0 | reserved                           | reserved      | N/A                                                          |
    | 56    | 0x4A002AAC |   0 | reserved                           | reserved      | N/A                                                          |
    | 57    | 0x4A002AAE |   0 | reserved                           | reserved      | N/A                                                          |
    | 58    | 0x4A002AB0 |   0 | reserved                           | reserved      | N/A                                                          |
    | 59    | 0x4A002AB2 |   0 | reserved                           | reserved      | N/A                                                          |
    | 60    | 0x4A002AB4 |   0 | reserved                           | reserved      | N/A                                                          |
    | 61    | 0x4A002AB6 |   0 | reserved                           | reserved      | N/A                                                          |
    | 62    | 0x4A002AB8 |   0 | reserved                           | reserved      | N/A                                                          |
    | 63    | 0x4A002ABA |   0 | reserved                           | reserved      | N/A                                                          |
    | 64    | 0x4A002ABC |   0 | reserved                           | reserved      | N/A                                                          |
    | 65    | 0x4A002ABE |   0 | reserved                           | reserved      | N/A                                                          |
    | 66    | 0x4A002AC0 |   0 | reserved                           | reserved      | N/A                                                          |
    | 67    | 0x4A002AC2 |   0 | reserved                           | reserved      | N/A                                                          |
    | 68    | 0x4A002AC4 |   0 | reserved                           | reserved      | N/A                                                          |
    | 69    | 0x4A002AC6 |   0 | reserved                           | reserved      | N/A                                                          |
    | 70    | 0x4A002AC8 |   0 | reserved                           | reserved      | N/A                                                          |
    | 71    | 0x4A002ACA |   0 | reserved                           | reserved      | N/A                                                          |
    | 72    | 0x4A002ACC |   0 | reserved                           | reserved      | N/A                                                          |
    | 73    | 0x4A002ACE |   0 | reserved                           | reserved      | N/A                                                          |
    | 74    | 0x4A002AD0 |   0 | reserved                           | reserved      | N/A                                                          |
    | 75    | 0x4A002AD2 |   0 | reserved                           | reserved      | N/A                                                          |
    | 76    | 0x4A002AD4 |   0 | reserved                           | reserved      | N/A                                                          |
    | 77    | 0x4A002AD6 |   0 | reserved                           | reserved      | N/A                                                          |
    | 78    | 0x4A002AD8 |   0 | reserved                           | reserved      | N/A                                                          |
    | 79    | 0x4A002ADA |   0 | reserved                           | reserved      | N/A                                                          |
    | 80    | 0x4A002ADC |   0 | reserved                           | reserved      | N/A                                                          |
    | 81    | 0x4A002ADE |   0 | reserved                           | reserved      | N/A                                                          |
    | 82    | 0x4A002AE0 |   0 | reserved                           | reserved      | N/A                                                          |
    | 83    | 0x4A002AE2 |   0 | reserved                           | reserved      | N/A                                                          |
    | 84    | 0x4A002AE4 |  73 | USB2_IRQ_INTR0                     | USB2          | USB2 interrupt 0                                             |
    | 85    | 0x4A002AE6 | 354 | VPE_IRQ                            | VPE           | VPE interrupt                                                |
    | 86    | 0x4A002AE8 |  47 | RNG_IRQ                            | RNG           | RNG interrupt                                                |
    | 87    | 0x4A002AEA |  46 | SHA2MD5_1_IRQ_P                    | SHA2MD5_1     | SHA2MD5_1 interrupt on HIB2                                  |
    | 88    | 0x4A002AEC |  77 | DES3DES_IRQ_P                      | DES3DES       | DES3DES public interrupt                                     |
    | 89    | 0x4A002AEE |  59 | reserved                           | reserved      | N/A                                                          |
    | 90    | 0x4A002AF0 |  80 | AES1_IRQ_P                         | AES1          | AES1 public interrupt                                        |
    | 91    | 0x4A002AF2 | 225 | DCAN2_IRQ_INT0                     | DCAN2         | DCAN2 interrupt 0                                            |
    | 92    | 0x4A002AF4 | 337 | GMAC_SW_IRQ_MISC_PULSE             | GMAC_SW       | GMAC_SW miscellaneous interrupt                              |
    | 93    | 0x4A002AF6 | 336 | GMAC_SW_IRQ_TX_PULSE               | GMAC_SW       | GMAC_SW transmit interrupt                                   |
    | 94    | 0x4A002AF8 | 335 | GMAC_SW_IRQ_RX_PULSE               | GMAC_SW       | GMAC_SW receive interrupt                                    |
    | 95    | 0x4A002AFA | 334 | GMAC_SW_IRQ_RX_THRESH_PULSE        | GMAC_SW       | GMAC_SW receive threshold interrupt                          |
    | 96    | 0x4A002AFC |  87 | USB2_IRQ_INTR1                     | USB2          | USB2 interrupt 1                                             |
    | 97    | 0x4A002AFE |  72 | USB1_IRQ_INTR1                     | USB1          | USB1 interrupt 1                                             |
    | 98    | 0x4A002B00 | 343 | QSPI_IRQ                           | QSPI          | QSPI interrupt                                               |
    | 99    | 0x4A002B02 |  43 | MCSPI4_IRQ                         | MCSPI4        | McSPI4 interrupt                                             |
    | 100   | 0x4A002B04 | 115 | KBD_IRQ                            | KBD           | Keyboard controller interrupt                                |
    | 101   | 0x4A002B06 | 396 | IPU2_IRQ_MMU                       | IPU2          | IPU2 MMU interrupt                                           |
    | 102   | 0x4A002B08 | 395 | IPU1_IRQ_MMU                       | IPU1          | IPU1 MMU interrupt                                           |
    | 103   | 0x4A002B0A | 145 | DSP1_IRQ_MMU1                      | DSP1          | DSP1 MMU1 interrupt                                          |
    | 104   | 0x4A002B0C |  23 | DSP1_IRQ_MMU0                      | DSP1          | DSP1 MMU0 interrupt                                          |
    | 105   | 0x4A002B0E |  81 | MMC2_IRQ                           | MMC2          | MMC2 interrupt                                               |
    | 106   | 0x4A002B10 | 108 | DMM_IRQ                            | DMM           | DMM interrupt                                                |
    | 107   | 0x4A002B12 |  75 | WD_TIMER2_IRQ                      | WD_TIMER2     | WD_TIMER2 interrupt                                          |
    | 108   | 0x4A002B14 | 342 | TIMER16_IRQ                        | TIMER16       | TIMER16 interrupt                                            |
    | 109   | 0x4A002B16 | 341 | TIMER15_IRQ                        | TIMER15       | TIMER15 interrupt                                            |
    | 110   | 0x4A002B18 | 340 | TIMER14_IRQ                        | TIMER14       | TIMER14 interrupt                                            |
    | 111   | 0x4A002B1A | 339 | TIMER13_IRQ                        | TIMER13       | TIMER13 interrupt                                            |
    | 112   | 0x4A002B1C |  90 | TIMER12_IRQ                        | TIMER12       | TIMER12 interrupt                                            |
    | 113   | 0x4A002B1E |  42 | TIMER11_IRQ                        | TIMER11       | TIMER11 interrupt                                            |
    | 114   | 0x4A002B20 |  41 | TIMER10_IRQ                        | TIMER10       | TIMER10 interrupt                                            |
    | 115   | 0x4A002B22 |  40 | TIMER9_IRQ                         | TIMER9        | TIMER9 interrupt                                             |
    | 116   | 0x4A002B24 |  39 | TIMER8_IRQ                         | TIMER8        | TIMER8 interrupt                                             |
    | 117   | 0x4A002B26 |  38 | TIMER7_IRQ                         | TIMER7        | TIMER7 interrupt                                             |
    | 118   | 0x4A002B28 |  37 | TIMER6_IRQ                         | TIMER6        | TIMER6 interrupt                                             |
    | 119   | 0x4A002B2A |  36 | TIMER5_IRQ                         | TIMER5        | TIMER5 interrupt                                             |
    | 120   | 0x4A002B2C |  35 | TIMER4_IRQ                         | TIMER4        | TIMER4 interrupt                                             |
    | 121   | 0x4A002B2E |  34 | TIMER3_IRQ                         | TIMER3        | TIMER3 interrupt                                             |
    | 122   | 0x4A002B30 |  33 | TIMER2_IRQ                         | TIMER2        | TIMER2 interrupt                                             |
    | 123   | 0x4A002B32 | 256 | MAILBOX6_IRQ_USER3                 | MAILBOX6      | Mailbox 6 user 3 interrupt                                   |
    | 124   | 0x4A002B34 | 255 | MAILBOX6_IRQ_USER2                 | MAILBOX6      | Mailbox 6 user 2 interrupt                                   |
    | 125   | 0x4A002B36 | 254 | MAILBOX6_IRQ_USER1                 | MAILBOX6      | Mailbox 6 user 1 interrupt                                   |
    | 126   | 0x4A002B38 | 253 | MAILBOX6_IRQ_USER0                 | MAILBOX6      | Mailbox 6 user 0 interrupt                                   |
    | 127   | 0x4A002B3A | 252 | MAILBOX5_IRQ_USER3                 | MAILBOX5      | Mailbox 5 user 3 interrupt                                   |
    | 128   | 0x4A002B3C | 251 | MAILBOX5_IRQ_USER2                 | MAILBOX5      | Mailbox 5 user 2 interrupt                                   |
    | 129   | 0x4A002B3E | 250 | MAILBOX5_IRQ_USER1                 | MAILBOX5      | Mailbox 5 user 1 interrupt                                   |
    | 130   | 0x4A002B40 | 249 | MAILBOX5_IRQ_USER0                 | MAILBOX5      | Mailbox 5 user 0 interrupt                                   |
    | 131   |        N/A | N/A | MPU_CLUSTER_IRQ_PMU_C0             | MPU_CLUSTER   | MPU core 0 PMU interrupt                                     |
    | 132   |        N/A | N/A | MPU_CLUSTER_IRQ_PMU_C1             | MPU_CLUSTER   | MPU core 1 PMU interrupt                                     |
    | 133   | 0x4A002B42 |   0 | reserved                           | reserved      | N/A                                                          |
    | 134   | 0x4A002B44 | 101 | UART6_IRQ                          | UART6         | UART6 interrupt                                              |
    | 135   | 0x4A002B46 |  69 | UART3_IRQ                          | UART3         | UART3 interrupt                                              |
    | 136   | 0x4A002B48 |  67 | UART1_IRQ                          | UART1         | UART1 interrupt                                              |
    | 137   | 0x4A002B4A | 116 | GPIO8_IRQ_1                        | GPIO8         | GPIO8 interrupt 1                                            |
    | 138   | 0x4A002B4C |  30 | GPIO7_IRQ_1                        | GPIO7         | GPIO7 interrupt 1                                            |
    | 139   | 0x4A002B4E |   0 | reserved                           | reserved      | N/A                                                          |
    | 140   | 0x4A002B50 |   0 | reserved                           | reserved      | N/A                                                          |
    | 141   | 0x4A002B52 |  29 | GPIO6_IRQ_1                        | GPIO6         | GPIO6 interrupt 1                                            |
    | 142   | 0x4A002B54 |  28 | GPIO5_IRQ_1                        | GPIO5         | GPIO5 interrupt 1                                            |
    | 143   | 0x4A002B56 |  27 | GPIO4_IRQ_1                        | GPIO4         | GPIO4 interrupt 1                                            |
    | 144   | 0x4A002B58 |  26 | GPIO3_IRQ_1                        | GPIO3         | GPIO3 interrupt 1                                            |
    | 145   | 0x4A002B5A |  25 | GPIO2_IRQ_1                        | GPIO2         | GPIO2 interrupt 1                                            |
    | 146   | 0x4A002B5C |  24 | GPIO1_IRQ_1                        | GPIO1         | GPIO1 interrupt 1                                            |
    | 147   | 0x4A002B5E | 371 | EDMA_TC1_IRQ_ERR                   | EDMA          | TC1 EDMA TPTC1 error interrupt                               |
    | 148   | 0x4A002B60 | 370 | EDMA_TC0_IRQ_ERR                   | EDMA          | TC0 EDMA TPTC0 error interrupt                               |
    | 149   | 0x4A002B62 | 359 | EDMA_TPCC_IRQ_ERR                  | EDMA          | TPCC EDMA TPCC error interrupt                               |
    | 150   | 0x4A002B64 | 360 | EDMA_TPCC_IRQ_MP                   | EDMA          | TPCC EDMA TPCC memory protection interrupt                   |
    | 151   | 0x4A002B66 | 361 | EDMA_TPCC_IRQ_REGION0              | EDMA          | TPCC EDMA TPCC region 0 interrupt                            |
    | 152   | 0x4A002B68 |  10 | DMA_SYSTEM_IRQ_3                   | DMA_SYSTEM    | System DMA interrupt 3                                       |
    | 153   | 0x4A002B6A |   9 | DMA_SYSTEM_IRQ_2                   | DMA_SYSTEM    | System DMA interrupt 2                                       |
    | 154   | 0x4A002B6C |   8 | DMA_SYSTEM_IRQ_1                   | DMA_SYSTEM    | System DMA interrupt 1                                       |
    | 155   | 0x4A002B6E |   7 | DMA_SYSTEM_IRQ_0                   | DMA_SYSTEM    | System DMA interrupt 0                                       |
    | 156   | 0x4A002B70 | 121 | CTRL_MODULE_CORE_IRQ_THERMAL_ALERT | CTRL_MODULE   | CTRL_MODULE thermal alert interrupt                          |
    | 157   | 0x4A002B72 |   6 | PRM_IRQ_MPU                        | PRM           | PRCM interrupt to MPU                                        |
    | 158   | 0x4A002B74 |   4 | L3_MAIN_IRQ_DBG_ERR                | L3_MAIN       | L3_MAIN debug error                                          |
    | 159   | 0x4A002B76 |  32 | TIMER1_IRQ                         | TIMER1        | TIMER1 interrupt                                             |
    |----------------------------------------------------------------------------------------------------------------------------------------------|
    
    
    Brad,

    Here it is

    Billa

  • Thanks, Billa. Can you also attach a dump of "cat /proc/interrupts"? (Sorry to do this piece by piece. It is hard to remember all the pieces!)
  •            CPU0       
     17:          0      CBAR  32 Level     gp_timer
     18:          0     GICv2  29 Level     arch_timer
     19:     254726     GICv2  30 Level     arch_timer
     22:          0      CBAR   4 Level     l3-dbg-irq
     23:          0     WUGEN  10 Level     l3-app-irq
     25:          6      CBAR 121 Level     talert
     27:         22      CBAR   8 Level     omap-dma-engine
     30:          0      CBAR 361 Level     43300000.edma_ccint
     32:          0      CBAR 359 Level     43300000.edma_ccerrint
     35:          0      CBAR  24 Level     4ae10000.gpio
     36:          0      CBAR  25 Level     48055000.gpio
     37:          0      CBAR  26 Level     48057000.gpio
     38:          0      CBAR  27 Level     48059000.gpio
     39:          0      CBAR  28 Level     4805b000.gpio
     40:          0      CBAR  29 Level     4805d000.gpio
     41:          0      CBAR  30 Level     48051000.gpio
     42:          0      CBAR 116 Level     48053000.gpio
     44:        829      CBAR  69 Level     48020000.serial
     48:          2      CBAR 251 Level     mbox_dsp1_ipc3x
     52:         36      CBAR 255 Level     mbox_ipu2_ipc3x
     70:          2      CBAR 108 Level     omap_dmm_irq_handler
     71:       1071      CBAR  81 Level     mmc0
     72:          0      CBAR  23 Level     40d01000.mmu
     73:          0      CBAR 145 Level     40d02000.mmu
     74:          0      CBAR 395 Level     58882000.mmu
     75:          0      CBAR 396 Level     55082000.mmu
     76:     100001      CBAR 115 Level     omap4-keypad
     80:          1      CBAR  87 Level     dwc3-omap
     82:     115856      CBAR 335 Level     48484000.ethernet
     83:      32860      CBAR 336 Level     48484000.ethernet
     89:          0      CBAR  46 Level     4b101000.sham
     90:          0      CBAR  47 Level     48090000.rng
     91:          0      CBAR 354 Level     vpe
     92:          0     WUGEN 131 Level     arm-pmu
    157:          0  48057000.gpio  30 Edge      extcon_usb2
    IPI0:          0  CPU wakeup interrupts
    IPI1:          0  Timer broadcast interrupts
    IPI2:          0  Rescheduling interrupts
    IPI3:          0  Function call interrupts
    IPI4:          0  CPU stop interrupts
    IPI5:          0  IRQ work interrupts
    IPI6:          0  completion interrupts
    Err:          0
    
    Here it is.

  • Ok, so I think we're at least starting to get the complete picture now. Here's a line from your interrupts.txt:

    76: 100001 CBAR 115 Level omap4-keypad

    So this is ARM/Linux interrupt 76, which is configured to leverage crossbar input 115. It looks like there are a huge number of interrupts logged (100001). It seems like you're getting a flood of interrupts from the keyboard for some reason.
  • So you think that MPU IRQ 76 is ok for CBAR 115, right? What is happening is that there are a lot of KBD interrupts and the kernel decides to disable 76 irq, right?
    What can cause son many irqs? A floating pin? I unplug the keyboad cable and the effect is the same. Could there be something wrong in the hw?
    Should be configure ros/columns with pullup/downs?
  • I think the mapping is ok. The underlying issue (in my opinion) is an interrupt flood which then causes the kernel to respond by disabling the interrupt altogether. I'm wondering if there is configuration related to the keys that is perhaps not setup correctly. For example could the keypad be seeing a clock input from somewhere and registering constant pushes? I'll keep digging.
  • Do you have an actual keyboard of some sort hooked up? Another thought that comes to mind is that a floating input pin might look like it is toggling (e.g. due to thermal noise, etc). What is the pin mux configuration for these pads?
  • Yes we have a keyoard attached. I am going to check the row inputs that may cause an interrupt flooding. My undersating of the keyboard is that the controller is setting a high level in each column pin and checking the row pins.
  • Brad,
    I have been testing with the ocillo the row inputs to detect glitches that can cause multiple irqs but it looks like the signals are very stable at high level all the time.
    Billa
  • Can you check the pin muxing at run-time with devmem2? I believe these are the pertinent registers and their addresses.
    * ROW0: CTRL_CORE_PAD_VIN2A_CLK0, 0x4A00 3554
    * ROW1: CTRL_CORE_PAD_VIN2A_DE0, 0x4A00 3558
    * ROW2: CTRL_CORE_PAD_VIN2A_HSYNC0, 0x4A00 3560
    * COL0: CTRL_CORE_PAD_VIN2A_D3, 0x4A00 3574
    * COL1: CTRL_CORE_PAD_VIN2A_D4, 0x4A00 3578
    * COL2: CTRL_CORE_PAD_VIN2A_D5, 0x4A00 357C
    * COL3: CTRL_CORE_PAD_VIN2A_D6, 0x4A00 3580
  • Brad, Billa,

    I have made a test on the AM572x EVM, I see that Keyboard IRQ is not mapped to its default MPU_IRQ_120, but to MPU_IRQ_94. I have:

    1. kernel boot log:

    keypad irq = 82

    2. omapconf dump crossbar irq mpu

    94    | 0x4A002AF8 | 115 | KBD_IRQ                            | KBD           | Keyboard controller interrupt

    3. cat /proc/interrupts

    82:         16          0      CBAR 115 Level     omap4-keypad

    I have only 16 interrupts to CPU0 (and 0 to CPU1).

    So seems that in Billa's board, Keyboard irq is mapped correctly to 76, but he observe irq flood.

    Regards,
    Pavel

  • .. but it is strange because we don´t see any activity in the row inpputs. They are high all the time.

    If we assume that hw is ok, who else can trigger the irqs?

  • Billa,

    I'm admittedly not very familiar with this keypad controller.  I didn't want you to take my comments as being gospel.  I'm just trying to figure out what's happening in your system.

    I was looking at the TRM and it occurred to me that you're using a subset of the overall keypad pins.  However, it doesn't look to me like there is a way within the peripheral itself to disable a given pin, i.e. the peripheral will be reading all 9 rows all the time.  So that got me thinking about what that will look like to the keypad controller in the case that you're not using all the pins.

    The data manual Pin Attributes table contains a column labeled DSIS that means "de-selected input state".  In other words, if a peripheral is not selected, what will the peirpheral see?  Here's a snippet:

    So for example this shows that for Ball A7 (vin2a_d2), if you have selected some other mode, like Driver Off, the keypad peripheral will see kbd_row6 = 0.

    Could that be our issue?  Do the unused row pins look like they're being held low all the time?  Maybe that's the interrupt flood?

    I'm going to ask some co-workers what they think.  Can you check your design to see what pins kbd_row3-8 are connected to?  Is it possible to try an experiment where you configure all those pins as kbd_row pins (INPUT enabled and pullup on)?

    Best regards,
    Brad

  • Brad,

       I tried what you propose but still fails. It looks like there is something internal causing the irqs. I debugged the irq code and when the function is scanning what row-column has been pressed the result is that no key has been pressed.

    Billa

  • Let's look at some of the registers from the keyboard controller:

    * 0x4AE1 C020, KBD_IRQSTATUS_RAW
    * 0x4AE1 C024, KBD_IRQSTATUS
    * 0x4AE1 C028, KBD_IRQENABLE_SET
    * 0x4AE1 C034, KBD_PENDING
    * 0x4AE1 C038, KBD_CTRL
    * 0x4AE1 C048, KBD_STATEMACHINE
    * 0x4AE1 C04C, KBD_ROWINPUTS
    * 0x4AE1 C050, KBD_COLUMNOUTPUTS
  • * 0x4AE1 C020, KBD_IRQSTATUS_RAW ---------------> 0x0000_0000
    * 0x4AE1 C024, KBD_IRQSTATUS ----------------------> 0x0000_0000
    * 0x4AE1 C028, KBD_IRQENABLE_SET ---------------> 0x0000_0003
    * 0x4AE1 C034, KBD_PENDING -------------------------> 0x0000_0000
    * 0x4AE1 C038, KBD_CTRL -------------------------------> 0x0000_001E
    * 0x4AE1 C048, KBD_STATEMACHINE -----------------> 0x0000_0001
    * 0x4AE1 C04C, KBD_ROWINPUTS ---------------------> 0x0000_0007
    * 0x4AE1 C050, KBD_COLUMNOUTPUTS -------------> 0x0000_0000
  • Jose,

    I have several debug hints:

    - make sure you are doing the pinmux in u-boot MLO, as we have errata related to pinmux done in u-boot.img or kernel:

    i869: IO Glitches Can Occur When Changing IO Settings

    - make sure your custom board is detected as KBD_REVISION_OMAP5 revision, see omap4-keypad.c

    - From what I understand, you are using the default omap4-keypad.c driver, correct? Can you try to disable (or not enable at all) the interrupts that are enabled by default in OMAP4_KBD_IRQENABLE (KBD_IRQENABLE_SET). Will you have that irq flood in that case?

    - I have KBD_ROWINPUTS = 0x0 on the EVM, per mine understanding the value of 0x7 means that you have something coming on the raw input pins


    Regards,
    Pavel
  • Billa,

    If you have no more questions related to the subject, please close/verify/resolve this thread.

    Regards,
    Pavel
  • Pavel:

    I put a printk to make sure that it was KBD_REVISION_OMAP5.

    I commented the line where it enable interrupts in function "omap4_keypad_irq_thread_fn()"

    #if 0

            /^enable interrupts */

            kbd_write_irq(keypad_data, OMAP_KBD_IRQENABLE,

                     OMAP4_DEF_IRQENABLE_EVENTEN |

                                        OMAP4_DEF_IRQENABLE_LONGKEY);

    #endif

    .. but still fails.

    Regards

    Billa

  • Pavel:
    I also tried commenting out the "kbd_write_irq()" and "enable_irq()" in "omap4_keypad_open()" function and it does not complain when linux is starting up.
    Regards
    Billa
  • After debugging the irq handler, it seems that it only happens once.
  • It seems that the irq is not triggered by pressing any key. I tried keeping pressed one key during linux startup and it is not recognized.
  • Jose,

    From what I understand, when you change the omap4-keypad.c file to not enable IRQ at all (at omap4_keypad_irq_thread_fn and omap4_keypad_open), in this case you do not observe the irq flood, is this correct?

    Regarding pinmux, make sure you configure your rows as inputs with internal pull ups enabled, and your columns as outputs and internal pulls disabled. Please attach also your u-boot mux_data.h for review. You can also make register dump (with devmem2 tool) at user space for your KBD pinmux registers thus verify that these has not been overwritten by u-boot or kernel code.

    Note also that unused row pins must be tied high to prevent disturbing the scanning process, this is stated in TRM section 28.2.3 Protocols and Data Formats. You can also check with scope the level of the unused row pins and verify you have stable high level there.

    Also I see in omap4-keypad.c driver, to disable interrupt, a 0 is written in KBD_IRQENABLE_SET/OMAP4_KBD_IRQENABLE bits, but according to TRM this is not correct.

    #define OMAP4_KBD_IRQENABLE 0x1C
    #define OMAP4_VAL_IRQDISABLE 0x0

    case KBD_REVISION_OMAP5:
    keypad_data->reg_offset = 0x10;
    keypad_data->irqreg_offset = 0x0c;

    /* Disable interrupts */
    kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
    OMAP4_VAL_IRQDISABLE);

    According to TRM, to disable interrupt, you need to write 1 in KBD_IRQENABLE_CLR register. You can try to modify the omap4-keypad.c file, to use register KBD_IRQENABLE_CLR to disable the interrupts.

    Regards,
    Pavel

  • Hi Pavel:

    I rearranged the source code "omap4-keypad.c" driver because keyboard registers defines were wrong.

    I also added a instruction to clear interrupts because otherwise linus hung during startup.

    I also added a printk in a thread associated with the key pressing irq.

    Right now Linux starts up fine and when I press/release a key the thead function runs but

    I don´t see anything in the device "/dev/input/event0" file.

    Take a look at the message in the console when I press/release a key (labelled with "Billa")

    static irqreturn_t omap4_keypad_irq_thread_fn(int irq, void *dev_id)
    {
     struct omap4_keypad *keypad_data = dev_id;
     struct input_dev *input_dev = keypad_data->input;
     unsigned char key_state[ARRAY_SIZE(keypad_data->key_state)];
     unsigned int col, row, code, changed;
     u32 *new_state = (u32 *) key_state;

     *new_state = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE31_0);
     *(new_state + 1) = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE63_32);

     for (row = 0; row < keypad_data->rows; row++) {
      changed = key_state[row] ^ keypad_data->key_state[row];
      if (!changed)
       continue;

      for (col = 0; col < keypad_data->cols; col++) {
       if (changed & (1 << col)) {
    printk("Billa 2 changed=%08x row=%d  col=%d\n", changed, row, col);
        code = MATRIX_SCAN_CODE(row, col,
          keypad_data->row_shift);
        input_event(input_dev, EV_MSC, MSC_SCAN, code);
        input_report_key(input_dev,
           keypad_data->keymap[code],
           key_state[row] & (1 << col));
       }
      }
     }

    and see that the key value returned by register associated to a key is FF.

    I don´t know if it has to do with the columms pinmux.

    ---------------------- U-boot Pinmux ----------------------------
    
    => md 0x4a003554
    4a003554: 00060009 00060009 0004000e 00060009    ................
    4a003564: 0005000e 0005000e 0005000e 0001000a    ................
    4a003574: 00010009 00010009 00010009 00010009    ................
    4a003584: 0005010c 0005010c 0005000e 00010003    ................
    4a003594: 00050003 0001000a 0001010d 0001010d    ................
    4a0035a4: 0001010d 0001010d 0001010d 0005000e    ................
    4a0035b4: 0005000e 0001000a 0005000e 0005000e    ................
    4a0035c4: 0005000e 0004000f 0004000f 0004000f    ................
    4a0035d4: 0004000f 0004000f 0004000f 0004000f    ................
    4a0035e4: 0004000f 0004000f 0004000f 0004000f    ................
    4a0035f4: 0004000f 0004000f 0004000f 0004000f    ................
    4a003604: 0004000f 0004000f 0004000f 0004000f    ................
    4a003614: 0004000f 0004000f 0004000f 0004000f    ................
    4a003624: 0004000f 0004000f 0004000f 0004000f    ................
    4a003634: 0004000f 0004000f 000d0003 00090003    ................
    4a003644: 0004000f 000d0003 000d0003 00050003    ................
    =>    
    => 
    => 
    => 
    => md 0x4a003574
    4a003574: 00010009 00010009 00010009 00010009    ................
    4a003584: 0005010c 0005010c 0005000e 00010003    ................
    4a003594: 00050003 0001000a 0001010d 0001010d    ................
    4a0035a4: 0001010d 0001010d 0001010d 0005000e    ................
    4a0035b4: 0005000e 0001000a 0005000e 0005000e    ................
    4a0035c4: 0005000e 0004000f 0004000f 0004000f    ................
    4a0035d4: 0004000f 0004000f 0004000f 0004000f    ................
    4a0035e4: 0004000f 0004000f 0004000f 0004000f    ................
    4a0035f4: 0004000f 0004000f 0004000f 0004000f    ................
    4a003604: 0004000f 0004000f 0004000f 0004000f    ................
    4a003614: 0004000f 0004000f 0004000f 0004000f    ................
    4a003624: 0004000f 0004000f 0004000f 0004000f    ................
    4a003634: 0004000f 0004000f 000d0003 00090003    ................
    4a003644: 0004000f 000d0003 000d0003 00050003    ................
    4a003654: 00050003 00050003 00050003 00050003    ................
    4a003664:
    
    
    
    ---------------------- Linux Pinmux -----------------------------
    
    
    root@am57xx-evm:~# 
    root@am57xx-evm:~# devmem2 0x4a003554
    /dev/mem opened.
    Memory mapped at address 0xb6fa1000.
    Read at address  0x4A003554 (0xb6fa1554): 0x00060009
    root@am57xx-evm:~# devmem2 0x4a003558
    /dev/mem opened.
    Memory mapped at address 0xb6f83000.
    Read at address  0x4A003558 (0xb6f83558): 0x00060009
    root@am57xx-evm:~# devmem2 0x4a003560
    /dev/mem opened.
    Memory mapped at address 0xb6f78000.
    Read at address  0x4A003560 (0xb6f78560): 0x00060009
    root@am57xx-evm:~# devmem2 0x4a003574
    /dev/mem opened.
    Memory mapped at address 0xb6f3c000.
    Read at address  0x4A003574 (0xb6f3c574): 0x00010009
    root@am57xx-evm:~# devmem2 0x4a003578
    /dev/mem opened.
    Memory mapped at address 0xb6f5e000.
    Read at address  0x4A003578 (0xb6f5e578): 0x00010009
    root@am57xx-evm:~# devmem2 0x4a00357c
    /dev/mem opened.
    Memory mapped at address 0xb6f8d000.
    Read at address  0x4A00357C (0xb6f8d57c): 0x00010009
    root@am57xx-evm:~# devmem2 0x4a003580
    /dev/mem opened.
    Memory mapped at address 0xb6f65000.
    Read at address  0x4A003580 (0xb6f65580): 0x00010009
    root@am57xx-evm:~# 
    root@am57xx-evm:~# 
    
    
    ----------------- Linux printks from omap4-keypad.c -----------------------------
    
    
    root@am57xx-evm:~# 															<---- PRESSING KEY
    root@am57xx-evm:~# [   59.680964] Billa 2 changed=000000ff row=1  col=0
    [   59.685710] Billa 2 changed=000000ff row=1  col=1
    [   59.690442] Billa 2 changed=000000ff row=1  col=2
    [   59.695174] Billa 2 changed=000000ff row=1  col=3
    
    root@am57xx-evm:~#  														<---- RELEASING KEY
    root@am57xx-evm:~# [   62.800993] Billa 2 changed=000000ff row=1  col=0
    [   62.805734] Billa 2 changed=000000ff row=1  col=1
    [   62.810466] Billa 2 changed=000000ff row=1  col=2
    [   62.815198] Billa 2 changed=000000ff row=1  col=3
    root@am57xx-evm:~#  
    root@am57xx-evm:~#  
    
    
    static irqreturn_t omap4_keypad_irq_thread_fn(int irq, void *dev_id)
    {
    	struct omap4_keypad *keypad_data = dev_id;
    	struct input_dev *input_dev = keypad_data->input;
    	unsigned char key_state[ARRAY_SIZE(keypad_data->key_state)];
    	unsigned int col, row, code, changed;
    	u32 *new_state = (u32 *) key_state;
    
    	*new_state = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE31_0);
    	*(new_state + 1) = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE63_32);
    
    	for (row = 0; row < keypad_data->rows; row++) {
    		changed = key_state[row] ^ keypad_data->key_state[row];
    		if (!changed)
    			continue;
    
    		for (col = 0; col < keypad_data->cols; col++) {
    			if (changed & (1 << col)) {
    printk("Billa 2 changed=%08x row=%d  col=%d\n", changed, row, col);
    				code = MATRIX_SCAN_CODE(row, col,
    						keypad_data->row_shift);
    				input_event(input_dev, EV_MSC, MSC_SCAN, code);
    				input_report_key(input_dev,
    						 keypad_data->keymap[code],
    						 key_state[row] & (1 << col));
    			}
    		}
    	}
    
    	input_sync(input_dev);
    
    	memcpy(keypad_data->key_state, key_state,
    		sizeof(keypad_data->key_state));
    
    	/* clear pending interrupts */
    	kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
    			 kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
    
    	/* enable interrupts */
    	kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE_SET,
    		OMAP4_DEF_IRQENABLE_EVENTEN |
    				OMAP4_DEF_IRQENABLE_LONGKEY);
    
    	return IRQ_HANDLED;
    }
    
    
    /*
     * OMAP4 Keypad Driver
     *
     * Copyright (C) 2010 Texas Instruments
     *
     * Author: Abraham Arce <x0066660@ti.com>
     * Initial Code: Syed Rafiuddin <rafiuddin.syed@ti.com>
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 2 of the License, or
     * (at your option) any later version.
     *
     * 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.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program; if not, write to the Free Software
     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
     */
    
    #include <linux/module.h>
    #include <linux/interrupt.h>
    #include <linux/platform_device.h>
    #include <linux/errno.h>
    #include <linux/io.h>
    #include <linux/of.h>
    #include <linux/input.h>
    #include <linux/input/matrix_keypad.h>
    #include <linux/slab.h>
    #include <linux/pm_runtime.h>
    
    // Fluke customization.
    #define CM_WKUPAON_KBD_CLKCTRL 0x4ae07878
    
    /* OMAP4 registers */
    #define OMAP4_KBD_REVISION			0x00
    #define OMAP4_KBD_IRQSTATUS			0x14
    #define OMAP4_KBD_IRQENABLE_SET		0x18
    #define OMAP4_KBD_IRQENABLE_CLR		0x1C
    #define OMAP4_KBD_WAKEUPENABLE		0x20
    #define OMAP4_KBD_CTRL				0x28
    #define OMAP4_KBD_DEBOUNCINGTIME	0x2C
    #define OMAP4_KBD_FULLCODE31_0		0x44
    #define OMAP4_KBD_FULLCODE63_32		0x48
    
    /* OMAP4 bit definitions */
    #define OMAP4_DEF_IRQENABLE_EVENTEN	BIT(0)
    #define OMAP4_DEF_IRQENABLE_LONGKEY	BIT(1)
    #define OMAP4_DEF_WUP_EVENT_ENA		BIT(0)
    #define OMAP4_DEF_WUP_LONG_KEY_ENA	BIT(1)
    #define OMAP4_DEF_CTRL_NOSOFTMODE	BIT(1)
    #define OMAP4_DEF_CTRL_PTV_SHIFT	2
    
    /* OMAP4 values */
    #define OMAP4_VAL_IRQDISABLE		0x7
    #define OMAP4_VAL_DEBOUNCINGTIME	0x7
    #define OMAP4_VAL_PVT				0x7
    
    enum {
    	KBD_REVISION_OMAP4 = 0,
    	KBD_REVISION_OMAP5,
    };
    
    // Fluke customization. Base address of keypad clock enable register.
    static void __iomem *kbd_clock_register;
    
    struct omap4_keypad {
    	struct input_dev *input;
    
    	void __iomem *base;
    	bool irq_wake_enabled;
    	unsigned int irq;
    
    	unsigned int rows;
    	unsigned int cols;
    	u32 reg_offset;
    	u32 irqreg_offset;
    	unsigned int row_shift;
    	bool no_autorepeat;
    	unsigned char key_state[8];
    	unsigned short *keymap;
    };
    
    static int kbd_readl(struct omap4_keypad *keypad_data, u32 offset)
    {
    	return __raw_readl(keypad_data->base +
    				keypad_data->reg_offset + offset);
    }
    
    static void kbd_writel(struct omap4_keypad *keypad_data, u32 offset, u32 value)
    {
    	__raw_writel(value,
    		     keypad_data->base + keypad_data->reg_offset + offset);
    }
    
    static int kbd_read_irqreg(struct omap4_keypad *keypad_data, u32 offset)
    {
    	return __raw_readl(keypad_data->base +
    				keypad_data->irqreg_offset + offset);
    }
    
    static void kbd_write_irqreg(struct omap4_keypad *keypad_data,
    			     u32 offset, u32 value)
    {
    	__raw_writel(value,
    		     keypad_data->base + keypad_data->irqreg_offset + offset);
    }
    
    
    /* Interrupt handlers */
    static irqreturn_t omap4_keypad_irq_handler(int irq, void *dev_id)
    {
    	struct omap4_keypad *keypad_data = dev_id;
    
    	if (kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS)) {
    		/* clear pending interrupts */
    		kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
    			 kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
    
    		/* Disable interrupts */
    		kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE_CLR,
    				 OMAP4_VAL_IRQDISABLE);
    		return IRQ_WAKE_THREAD;
    	}
    
    	return IRQ_NONE;
    }
    
    static irqreturn_t omap4_keypad_irq_thread_fn(int irq, void *dev_id)
    {
    	struct omap4_keypad *keypad_data = dev_id;
    	struct input_dev *input_dev = keypad_data->input;
    	unsigned char key_state[ARRAY_SIZE(keypad_data->key_state)];
    	unsigned int col, row, code, changed;
    	u32 *new_state = (u32 *) key_state;
    
    	*new_state = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE31_0);
    	*(new_state + 1) = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE63_32);
    
    	for (row = 0; row < keypad_data->rows; row++) {
    		changed = key_state[row] ^ keypad_data->key_state[row];
    		if (!changed)
    			continue;
    
    		for (col = 0; col < keypad_data->cols; col++) {
    			if (changed & (1 << col)) {
    printk("Billa 2 changed=%08x row=%d  col=%d\n", changed, row, col);
    				code = MATRIX_SCAN_CODE(row, col,
    						keypad_data->row_shift);
    				input_event(input_dev, EV_MSC, MSC_SCAN, code);
    				input_report_key(input_dev,
    						 keypad_data->keymap[code],
    						 key_state[row] & (1 << col));
    			}
    		}
    	}
    
    	input_sync(input_dev);
    
    	memcpy(keypad_data->key_state, key_state,
    		sizeof(keypad_data->key_state));
    
    	/* clear pending interrupts */
    	kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
    			 kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
    
    	/* enable interrupts */
    	kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE_SET,
    		OMAP4_DEF_IRQENABLE_EVENTEN |
    				OMAP4_DEF_IRQENABLE_LONGKEY);
    
    	return IRQ_HANDLED;
    }
    
    static int omap4_keypad_open(struct input_dev *input)
    {
    	struct omap4_keypad *keypad_data = input_get_drvdata(input);
    
    	pm_runtime_get_sync(input->dev.parent);
    
    	disable_irq(keypad_data->irq);
    
    	kbd_writel(keypad_data, OMAP4_KBD_CTRL,
    			OMAP4_DEF_CTRL_NOSOFTMODE |
    			(OMAP4_VAL_PVT << OMAP4_DEF_CTRL_PTV_SHIFT));
    	kbd_writel(keypad_data, OMAP4_KBD_DEBOUNCINGTIME,
    			OMAP4_VAL_DEBOUNCINGTIME);
    	/* clear pending interrupts */
    	kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
    			 kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
    	kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE_SET,
    			OMAP4_DEF_IRQENABLE_EVENTEN |
    				OMAP4_DEF_IRQENABLE_LONGKEY);
    	kbd_writel(keypad_data, OMAP4_KBD_WAKEUPENABLE,
    			OMAP4_DEF_WUP_EVENT_ENA | OMAP4_DEF_WUP_LONG_KEY_ENA);
    
    	enable_irq(keypad_data->irq);
    
    	return 0;
    }
    
    static void omap4_keypad_close(struct input_dev *input)
    {
    	struct omap4_keypad *keypad_data = input_get_drvdata(input);
    
    	disable_irq(keypad_data->irq);
    
    	/* Disable interrupts */
    	kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE_CLR,
    			 OMAP4_VAL_IRQDISABLE);
    
    	/* clear pending interrupts */
    	kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
    			 kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
    
    	enable_irq(keypad_data->irq);
    
    	pm_runtime_put_sync(input->dev.parent);
    }
    
    static int omap4_keypad_parse_dt(struct device *dev,
    				 struct omap4_keypad *keypad_data)
    {
    	struct device_node *np = dev->of_node;
    	int err;
    
    	err = matrix_keypad_parse_properties(dev, &keypad_data->rows,
    					     &keypad_data->cols);
    	if (err)
    		return err;
    
    	if (of_get_property(np, "linux,input-no-autorepeat", NULL))
    		keypad_data->no_autorepeat = true;
    
    	return 0;
    }
    
    static int omap4_keypad_probe(struct platform_device *pdev)
    {
    	struct omap4_keypad *keypad_data;
    	struct input_dev *input_dev;
    	struct resource *res;
    	unsigned int max_keys;
    	int rev;
    	int irq;
    	int error;
    
    	// Fluke customization - turn on clock to keyboard controller.
    	// Map the control register.
    	kbd_clock_register = ioremap(CM_WKUPAON_KBD_CLKCTRL,4);
    	writel(0x2, kbd_clock_register);
    	iounmap(kbd_clock_register);
    
    	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    	if (!res) {
    		dev_err(&pdev->dev, "no base address specified\n");
    		return -EINVAL;
    	}
    
    	irq = platform_get_irq(pdev, 0);
    	if (!irq) {
    		dev_err(&pdev->dev, "no keyboard irq assigned\n");
    		return -EINVAL;
    	}
    
    	keypad_data = kzalloc(sizeof(struct omap4_keypad), GFP_KERNEL);
    	if (!keypad_data) {
    		dev_err(&pdev->dev, "keypad_data memory allocation failed\n");
    		return -ENOMEM;
    	}
    
    	keypad_data->irq = irq;
    
    	error = omap4_keypad_parse_dt(&pdev->dev, keypad_data);
    	if (error)
    		goto err_free_keypad;
    
    	res = request_mem_region(res->start, resource_size(res), pdev->name);
    	if (!res) {
    		dev_err(&pdev->dev, "can't request mem region\n");
    		error = -EBUSY;
    		goto err_free_keypad;
    	}
    
    	keypad_data->base = ioremap(res->start, resource_size(res));
    	if (!keypad_data->base) {
    		dev_err(&pdev->dev, "can't ioremap mem resource\n");
    		error = -ENOMEM;
    		goto err_release_mem;
    	}
    
    
    	/*
    	 * Enable clocks for the keypad module so that we can read
    	 * revision register.
    	 */
    	pm_runtime_enable(&pdev->dev);
    	error = pm_runtime_get_sync(&pdev->dev);
    	if (error) {
    		dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
    		goto err_unmap;
    	}
    	rev = __raw_readl(keypad_data->base + OMAP4_KBD_REVISION);
    	rev &= 0x03 << 30;
    	rev >>= 30;
    	switch (rev) {
    	case KBD_REVISION_OMAP4:
    		keypad_data->reg_offset = 0x00;
    		keypad_data->irqreg_offset = 0x00;
    		break;
    	case KBD_REVISION_OMAP5:
    		keypad_data->reg_offset = 0x10;
    		keypad_data->irqreg_offset = 0x10;
    		break;
    	default:
    		dev_err(&pdev->dev,
    			"Keypad reports unsupported revision %d", rev);
    		error = -EINVAL;
    		goto err_pm_put_sync;
    	}
    
    	/* input device allocation */
    	keypad_data->input = input_dev = input_allocate_device();
    	if (!input_dev) {
    		error = -ENOMEM;
    		goto err_pm_put_sync;
    	}
    
    	input_dev->name = pdev->name;
    	input_dev->dev.parent = &pdev->dev;
    	input_dev->id.bustype = BUS_HOST;
    	input_dev->id.vendor = 0x0001;
    	input_dev->id.product = 0x0001;
    	input_dev->id.version = 0x0001;
    
    	input_dev->open = omap4_keypad_open;
    	input_dev->close = omap4_keypad_close;
    
    	input_set_capability(input_dev, EV_MSC, MSC_SCAN);
    	if (!keypad_data->no_autorepeat)
    		__set_bit(EV_REP, input_dev->evbit);
    
    	input_set_drvdata(input_dev, keypad_data);
    
    	keypad_data->row_shift = get_count_order(keypad_data->cols);
    	max_keys = keypad_data->rows << keypad_data->row_shift;
    	keypad_data->keymap = kzalloc(max_keys * sizeof(keypad_data->keymap[0]),
    				      GFP_KERNEL);
    	if (!keypad_data->keymap) {
    		dev_err(&pdev->dev, "Not enough memory for keymap\n");
    		error = -ENOMEM;
    		goto err_free_input;
    	}
    
    	error = matrix_keypad_build_keymap(NULL, NULL,
    					   keypad_data->rows, keypad_data->cols,
    					   keypad_data->keymap, input_dev);
    	if (error) {
    		dev_err(&pdev->dev, "failed to build keymap\n");
    		goto err_free_keymap;
    	}
    
    	error = request_threaded_irq(keypad_data->irq, omap4_keypad_irq_handler,
    				     omap4_keypad_irq_thread_fn, 0,
    				     "omap4-keypad", keypad_data);
    	if (error) {
    		dev_err(&pdev->dev, "failed to register interrupt\n");
    		goto err_free_keymap;
    	}
    
    	device_init_wakeup(&pdev->dev, true);
    	pm_runtime_put_sync(&pdev->dev);
    
    	error = input_register_device(keypad_data->input);
    	if (error < 0) {
    		dev_err(&pdev->dev, "failed to register input device\n");
    		goto err_pm_disable;
    	}
    
    	platform_set_drvdata(pdev, keypad_data);
    	return 0;
    
    err_pm_disable:
    	pm_runtime_disable(&pdev->dev);
    	free_irq(keypad_data->irq, keypad_data);
    err_free_keymap:
    	kfree(keypad_data->keymap);
    err_free_input:
    	input_free_device(input_dev);
    err_pm_put_sync:
    	pm_runtime_put_sync(&pdev->dev);
    err_unmap:
    	iounmap(keypad_data->base);
    err_release_mem:
    	release_mem_region(res->start, resource_size(res));
    err_free_keypad:
    	kfree(keypad_data);
    	return error;
    }
    
    static int omap4_keypad_remove(struct platform_device *pdev)
    {
    	struct omap4_keypad *keypad_data = platform_get_drvdata(pdev);
    	struct resource *res;
    
    	free_irq(keypad_data->irq, keypad_data);
    
    	pm_runtime_disable(&pdev->dev);
    
    	input_unregister_device(keypad_data->input);
    
    	iounmap(keypad_data->base);
    
    	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    	release_mem_region(res->start, resource_size(res));
    
    	kfree(keypad_data->keymap);
    	kfree(keypad_data);
    
    	return 0;
    }
    
    static const struct of_device_id omap_keypad_dt_match[] = {
    	{ .compatible = "ti,omap4-keypad" },
    	{},
    };
    MODULE_DEVICE_TABLE(of, omap_keypad_dt_match);
    
    #ifdef CONFIG_PM_SLEEP
    static int omap4_keypad_suspend(struct device *dev)
    {
    	struct platform_device *pdev = to_platform_device(dev);
    	struct omap4_keypad *keypad_data = platform_get_drvdata(pdev);
    	int error;
    
    	if (device_may_wakeup(&pdev->dev)) {
    		error = enable_irq_wake(keypad_data->irq);
    		if (!error)
    			keypad_data->irq_wake_enabled = true;
    	}
    
    	return 0;
    }
    
    static int omap4_keypad_resume(struct device *dev)
    {
    	struct platform_device *pdev = to_platform_device(dev);
    	struct omap4_keypad *keypad_data = platform_get_drvdata(pdev);
    
    	if (device_may_wakeup(&pdev->dev) && keypad_data->irq_wake_enabled) {
    		disable_irq_wake(keypad_data->irq);
    		keypad_data->irq_wake_enabled = false;
    	}
    
    	return 0;
    }
    #endif
    
    static SIMPLE_DEV_PM_OPS(omap4_keypad_pm_ops,
    			 omap4_keypad_suspend, omap4_keypad_resume);
    
    static struct platform_driver omap4_keypad_driver = {
    	.probe		= omap4_keypad_probe,
    	.remove		= omap4_keypad_remove,
    	.driver		= {
    		.name	= "omap4-keypad",
    		.pm	= &omap4_keypad_pm_ops,
    		.of_match_table = omap_keypad_dt_match,
    	},
    };
    module_platform_driver(omap4_keypad_driver);
    
    MODULE_AUTHOR("Texas Instruments");
    MODULE_DESCRIPTION("OMAP4 Keypad Driver");
    MODULE_LICENSE("GPL");
    MODULE_ALIAS("platform:omap4-keypad");
    

    Attached are the "omap4-keypad.c" driver modified and some log information.

    Regards

    Billa

  • Billa,

    Is your irq flood issue fixed?

    Now you are facing new issue?

    Regards,
    Pavel
  • Pavel,
    In fact there was not a irq flood, because only one irq was triggered before the "crash".
    It seems that the irq issue is solved, and when I press/release a key the driver responds to it, but the linux device /dev/input/event0 does not see that key.

    Regards
    Billa
  • Billa,

    As this thread is moving away from your initial issue (*), and I think this initial issue is fixed now, I would suggest you to close/verify that thread and open new one for your new issue.

    (*) During Linux startup I get the following message:

    [ 1.926557] omap4-keypad 4ae1c00000000080.keypad: no base address specified
    [ 1.933577] omap4-keypad: probe of 4ae1c00000000080.keypad failed with error2


    Regards,
    Pavel
  • Pavel,

    Well, I would like to continue with this thread because the reason for having opened it is to solve the general problem, that is, get the keypad up & running.

    Regards
    Billa
  • I was looking at your defconfig from your original post and I don't see CONFIG_INPUT_KEYBOARD=y in there.  Maybe that's why it's not working?

  • Nevermind on that last one. CONFIG_INPUT_KEYBOARD is a requirement for the OMAP4 keyboard, so it looks like it gets in there anyway. You may want to explicitly add it to your config file though. I'm still looking to see if I can find some other potential reasons that keyboard isn't working.
  • Billa,

    I'm reviewing the omap4-keypad.c code and the changes you have made. I think most of the code was actually correct in its original form, though there are some specific places where I agree the code in Linux is wrong.

    First, let's review the original code. Consider the KBD_IRQSTATUS register. In OMAP4 this was at offset 0x18 while in AM57xx (the "OMAP5 case" from the code) it is at address 0x24. All the accesses to KBD_IRQSTATUS use the functions kbd_write_irqreg and kbd_read_irqreg. This function accounts for the address difference through its use of irqreg_offset = 0xC. Furthermore, this KBD_IRQSTATUS register behaves the same for both device families, e.g. interrupts are write-1-to-clear in this register. So the only thing needed is to account for the register difference, which was done correctly in the first place.

    Now let's consider one of the changes you made. You changed the define OMAP4_KBD_IRQSTATUS from 0x18 to 0x14. You also changed irqreg_offset from 0xC to 0x10. You still end up accessing the same address offset 0x24, though your change has broken the OMAP4 code. So in my opinion, it should have been left as it was.

    Let's look at accesses to another register, KBD_IRQENABLE. This is the one where we have some issues because the OMAP5/AM57xx version of the peripheral is constructed much differently in that it has _SET and _CLR registers. The kbd_write_irqreg has that offset of 0xC, so any accesses to OMAP4_KBD_IRQENABLE (0x1C) end up going to address 0x28 which is KBD_IRQENABLE_SET. So in short, any code from OMAP4 that was *enabling* interrupts will work correctly. This was another instance where your change continues to work, though I would revert your change for cases that we *enable* interrupts, because it isn't necessary.

    So coming to my final conclusion... The place where we have an issue. Anywhere that attempts to *disable* interrupts is totally wrong in the existing Linux code. It ends up writing KBD_IRQ_ENABLE_SET=0 which does nothing... If we want to clear the interrupts we need to write KBD_IRQ_ENABLE_CLR=7. So your changes related to disabling interrupts looked necessary, and I think that was an important fix. I would recommend however that you change irqreg_offset back to 0xC and adjust your OMAP4_KBD_IRQENABLE_CLR definition accordingly. If you end up carrying patches, that will at least minimize the amount of stuff being changed. It would probably be better to make OMAP4_VAL_IRQDISABLE into one of those variables that gets conditionally initialized based on whether you're OMAP4 or OMAP5 (i.e. like irqreg_offset). You could make it 0 for OMAP4 and 7 for OMAP5. Perhaps the same should be done for the OMAP4_KBD_IRQENABLE_CLR variable, i.e. for OMAP4 it would map to the same value as OMAP4_KBD_IRQENABLE, but for OMAP5 it would be the next register.

    One question for you... In omap4_keypad_irq_handler() you added some additional code to clear pending interrupts. Are you sure that's needed? And more importantly, are you sure it's not causing any issues? Could that be why you're not getting any key presses registered? It looks like the interrupts are supposed to be cleared in omap4_keypad_irq_thread_fn().

    I can take a quick swag at implementing all these changes so that we're on the same page, though I don't have any hardware to actually test it on. It is probably worthwhile for me to try to do this so that we have something more concrete to reference. This was a lot of text!

    Brad

  • Brad,

    I made those changes to have our hw up & running. Once it is working fine we can accomodate it to the initial form with the needed changes.
    I added that additional code otherwise Linux gets stuck during startup. The current situation now is that the driver detects a key pressed or released but that key is not present at device level /dev/input/event0.

    Billa
  • Billa -- can you run "lsmod" and share the output?
  • For what's it's worth, here's the minimal set of changes I had in mind:

    diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c
    index 940d38b08e6..dcb2f2ee175 100644
    --- a/drivers/input/keyboard/omap4-keypad.c
    +++ b/drivers/input/keyboard/omap4-keypad.c
    @@ -59,7 +59,6 @@
    #define OMAP4_DEF_CTRL_PTV_SHIFT 2

    /* OMAP4 values */
    -#define OMAP4_VAL_IRQDISABLE 0x0
    #define OMAP4_VAL_DEBOUNCINGTIME 0x7
    #define OMAP4_VAL_PVT 0x7

    @@ -79,6 +78,8 @@ struct omap4_keypad {
    unsigned int cols;
    u32 reg_offset;
    u32 irqreg_offset;
    + u32 val_irqdisable;
    + u32 offset_irqenable_clr;
    unsigned int row_shift;
    bool no_autorepeat;
    unsigned char key_state[8];
    @@ -118,8 +119,8 @@ static irqreturn_t omap4_keypad_irq_handler(int irq, void *dev_id)

    if (kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS)) {
    /* Disable interrupts */
    - kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
    - OMAP4_VAL_IRQDISABLE);
    + kbd_write_irqreg(keypad_data, keypad_data->offset_irqenable_clr,
    + keypad_data->val_irqdisable);
    return IRQ_WAKE_THREAD;
    }

    @@ -205,8 +206,8 @@ static void omap4_keypad_close(struct input_dev *input)
    disable_irq(keypad_data->irq);

    /* Disable interrupts */
    - kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
    - OMAP4_VAL_IRQDISABLE);
    + kbd_write_irqreg(keypad_data, keypad_data->offset_irqenable_clr,
    + keypad_data->val_irqdisable);

    /* clear pending interrupts */
    kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
    @@ -300,10 +301,14 @@ static int omap4_keypad_probe(struct platform_device *pdev)
    case KBD_REVISION_OMAP4:
    keypad_data->reg_offset = 0x00;
    keypad_data->irqreg_offset = 0x00;
    + keypad_data->val_irqdisable = 0x00;
    + keypad_data->offset_irqenable_clr = OMAP4_KBD_IRQENABLE;
    break;
    case KBD_REVISION_OMAP5:
    keypad_data->reg_offset = 0x10;
    keypad_data->irqreg_offset = 0x0c;
    + keypad_data->val_irqdisable = 0x07;
    + keypad_data->offset_irqenable_clr = OMAP4_KBD_IRQENABLE + 0x04;
    break;
    default:
    dev_err(&pdev->dev,

    This does *not* include the additional lines you had for clearing interrupts in omap4_keypad_irq_handler(). I wasn't expecting that to be necessary, but you may be absolutely correct. My changes above are only to correct the errors that I can spot by analysis of the code. Those are the ones I described in my very long post a little bit earlier today. My intent here was to give a more concrete representation of those comments in terms of how I think it should look.

    Best regards,
    Brad
  • To clarify on my earlier question about modules, I see that your defconfig selects the Matrix keypad as a module. I wanted to check if matrix_keypad.ko and matrix_keymap.ko are loaded.
  • Billa -- one other thought comes to mind... I'm thinking back to my earlier comments about how the unused row pins have a de-selected input state of 0. This could very well cause some kind of false detect or something along those lines. How is your board currently configured? Do you have all 9 of the row pins configured as inputs with the internal pullup enabled? Is that even possible for you hardware? I know you looked at this at one point earlier, but I think it would have been hard to tell at that point given some of the major software issues in the driver that we found. I'm wondering if we need to look into this once more. I'm going to do some checking internally to see if I can understand this more.
  • No, matrix_keypad.ko and matrix_keymap.ko are not loaded.
  • Billa,

    I have checked your keyboard pinmux and I see that for not used row pins (kbd_row3/4/5/6/7/8) you have Pull disabled in the Control Module registers. And this seems to be in conflict with AM570x TRM section 28.2.3 Protocols and Data Formats, where we have the below note:

    NOTE: When using the keyboard controller with a smaller keypad (for example, 5 × 5), unused rows must be tied high to prevent disturbing the scanning process. Normally, all rows must be pulled up internally at the I/O cells of the device.

    I can suggest you to reconfigure these registers (i.e. CTRL_CORE_PAD_VIN2A_VSYNC0, 0x4A003564) with pull up enable and check if there will be any improvement.

    CTRL_CORE_PAD_VIN2A_VSYNC0[16] VIN2A_VSYNC0_PULLUDENABLE = 0 - Enables weak Pull Up/Down
    CTRL_CORE_PAD_VIN2A_VSYNC0[17] VIN2A_VSYNC0_PULLTYPESELECT = 1 - Pull Up is selected

    Regards,
    Pavel
  • I set "CONFIG_KEYBOARD_MATRIX=y" in my config file so I guess that this code is built in Linux kernel and it is running after linux startup.
    Right now I see that when I press a key, the column & row are caught fine by the function driver "omap4_keypad_irq_thread_fn()" but I don´t see it at user level in "/dev/inpunt/event0".
    I also doubt about the values in "linux,keymap = <00000001 00000002 ....." that I have in the device tree "dra7.dtsi". I don´t know the correct values. What values should I put there? What do these values mean?
    Billa
  • All the the registers from kbd_row3 to kbd_row8 are used for different purposes .
  •  Brad,

    Here attached is a column signal taken with an oscillo from AM5708 output pin.

    The white one corresponds to a pinmux PIN_OUTPUT, that is with pull up/down disabled.

    The green one corresponds to a pinmux PIN_OUTPUT_PULLUP, that is with pull up enabled.

    According to the comments, those col pins should be configured as PIN_OUTPUT, but in our case it only works if they are configured as PIN_OUTPUT_PULLUP.

    Another question, accordingto the oscillo, the scan period of the column is when signal is low level (aprox. 25 useg). Is that period length correct? Is it possible to lengthen it?

    Regards

    Billa

  • Jose Carlos Billalabeitia said:
    According to the comments, those col pins should be configured as PIN_OUTPUT, but in our case it only works if they are configured as PIN_OUTPUT_PULLUP.

    Yes.  Rows should be configured as PIN_INPUT_PULLUP and columns should be PIN_OUTPUT.  Can you please provide the devmem2 output for these registers:

    * ROW0: CTRL_CORE_PAD_VIN2A_CLK0, 0x4A00 3554
    * ROW1: CTRL_CORE_PAD_VIN2A_DE0, 0x4A00 3558
    * ROW2: CTRL_CORE_PAD_VIN2A_HSYNC0, 0x4A00 3560
    * COL0: CTRL_CORE_PAD_VIN2A_D3, 0x4A00 3574
    * COL1: CTRL_CORE_PAD_VIN2A_D4, 0x4A00 3578
    * COL2: CTRL_CORE_PAD_VIN2A_D5, 0x4A00 357C
    * COL3: CTRL_CORE_PAD_VIN2A_D6, 0x4A00 3580

    Jose Carlos Billalabeitia said:
    Another question, accordingto the oscillo, the scan period of the column is when signal is low level (aprox. 25 useg). Is that period length correct? Is it possible to lengthen it?

    This seems very short.  The KBD controller functional clock is supposed to be 32 kHz, and according to KBD_CTRL we have a prescaler of /256.  So I really would expect things to be much slower, e.g. 8ms.  Can you get a clock tree dump:

    omapconf --force dra72x export ctt am570x-clocks.txt

    Then attach the txt file and I'll rename to *.rd1 on my side.

  • Jose Carlos Billalabeitia said:
    No, matrix_keypad.ko and matrix_keymap.ko are not loaded.

    Billa,

    Looking at the code inside omap4-keypad.c, it looks to me like matrix_keymap.ko would be necessary.  The code is calling functions from matrix_keymap.c such as matrix_keypad_build_keymap() and matrix_keypad_parse_properties(). Perhaps those functions are statically compiled into the omap4-keypad driver. ?  I think it would be worth a sanity check of loading that module, or perhaps building it into the kernel.  I'm wondering if that is the missing link of why you're not getting any keypad events.

    I'll see if I can dig into the mapping.  That might also be an issue.  Did you add some prints to the area of the driver where it reports the key presses?  What did you see there?

    Brad

  • Brad,

    1.- Here you have the col/row pinmux from Linux:

    root@am57xx-evm:~# devmem2 0x4a003554
    /dev/mem opened.
    Memory mapped at address 0xb6ff3000.
    Read at address  0x4A003554 (0xb6ff3554): 0x00060009
    root@am57xx-evm:~# devmem2 0x4a003558
    /dev/mem opened.
    Memory mapped at address 0xb6f22000.
    Read at address  0x4A003558 (0xb6f22558): 0x00060009
    root@am57xx-evm:~# devmem2 0x4a003560
    /dev/mem opened.
    Memory mapped at address 0xb6f83000.
    Read at address  0x4A003560 (0xb6f83560): 0x00060009
    root@am57xx-evm:~# devmem2 0x4a003574
    /dev/mem opened.
    Memory mapped at address 0xb6fe1000.
    Read at address  0x4A003574 (0xb6fe1574): 0x00020009
    root@am57xx-evm:~# devmem2 0x4a003578
    /dev/mem opened.
    Memory mapped at address 0xb6ff8000.
    Read at address  0x4A003578 (0xb6ff8578): 0x00020009
    root@am57xx-evm:~# devmem2 0x4a00357c
    /dev/mem opened.
    Memory mapped at address 0xb6f88000.
    Read at address  0x4A00357C (0xb6f8857c): 0x00020009
    root@am57xx-evm:~# devmem2 0x4a003580
    /dev/mem opened.
    Memory mapped at address 0xb6f3c000.
    Read at address  0x4A003580 (0xb6f3c580): 0x00020009
    root@am57xx-evm:~#

    2.- Although the scan period may not be long enough, I get the key pressing/releasing event in the driver omap4-keypad.c

    3.- I put a printk in the driver function:


    static irqreturn_t omap4_keypad_irq_thread_fn(int irq, void *dev_id)
    {
     struct omap4_keypad *keypad_data = dev_id;
     struct input_dev *input_dev = keypad_data->input;
     unsigned char key_state[ARRAY_SIZE(keypad_data->key_state)];
     unsigned int col, row, code, changed;
     u32 *new_state = (u32 *) key_state;

     *new_state = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE31_0);
     *(new_state + 1) = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE63_32);

     for (row = 0; row < keypad_data->rows; row++) {
      changed = key_state[row] ^ keypad_data->key_state[row];
      if (!changed)
       continue;

    #if 0
       linux,keymap = <0x00000041 0x00010042 0x00020043 0x00030044
           0x01000045 0x01010046 0x01020047 0x01030048
           0x02000049 0x0201004a 0x0202004b 0x0203004c>;
    #define MATRIX_SCAN_CODE(row, col, row_shift) (((row) << (row_shift)) + (col))
    #endif

      for (col = 0; col < keypad_data->cols; col++) {
       if (changed & (1 << col)) {
        code = MATRIX_SCAN_CODE(row, col,
          keypad_data->row_shift);
    // Billa
    printk("Billa: changed=%08x row=%d  col=%d keypad_data->row_shift=%d code=%08x keypad_data->keymap[%d]=%08x\n", changed, row, col, keypad_data->row_shift, code, code, keypad_data->keymap[code]);
        input_event(input_dev, EV_MSC, MSC_SCAN, code);
        input_report_key(input_dev,
           keypad_data->keymap[code],
           key_state[row] & (1 << col));
       }
      }
     }

     input_sync(input_dev);

     memcpy(keypad_data->key_state, key_state,
      sizeof(keypad_data->key_state));

     /* clear pending interrupts */
     kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
        kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));

     /* enable interrupts */
     kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE_SET,
      OMAP4_DEF_IRQENABLE_EVENTEN |
        OMAP4_DEF_IRQENABLE_LONGKEY);

     return IRQ_HANDLED;
    }

    .. and I got the following messages when presseing/releasing a key:

    root@am57xx-evm:~#
    root@am57xx-evm:~#

    [  860.880981] Billa: changed=00000001 row=0  col=0 keypad_data->row_shift=2 code=00000000 keypad_data->keymap[0]=00000000
    [  861.001419] Billa: changed=00000001 row=0  col=0 keypad_data->row_shift=2 code=00000000 keypad_data->keymap[0]=00000000

    4.- Attached is the file with the information you asked me.

    Regards

    Billa

  • DeviceName DRA72X_SR1.1
    0x4A005100 0x00000110
    0x4A005120 0x00000007
    0x4A00512C 0x00010A04
    0x4A005130 0x00000002
    0x4A00513C 0x00000204
    0x4A005140 0x0000003E
    0x4A005144 0x00000005
    0x4A005154 0x00000005
    0x4A005158 0x00000204
    0x4A00515C 0x00000006
    0x4A005160 0x00000007
    0x4A00516C 0x0081F409
    0x4A005170 0x00000201
    0x4A00519C 0x00000000
    0x4A0051A0 0x00000007
    0x4A0051AC 0x00010A04
    0x4A0051B0 0x00000002
    0x4A0051DC 0x00000000
    0x4A0051E0 0x00000007
    0x4A0051EC 0x00800501
    0x4A0051F0 0x00000001
    0x4A0051F4 0x00000001
    0x4A005210 0x00000007
    0x4A00521C 0x00014D04
    0x4A005220 0x00000202
    0x4A005228 0x00000208
    0x4A005234 0x00000007
    0x4A005240 0x00004B01
    0x4A005244 0x00000201
    0x4A005248 0x00000003
    0x4A005254 0x00000000
    0x4A005284 0x00000005
    0x4A005290 0x00000000
    0x4A005294 0x00000001
    0x4A0052A4 0x00000000
    0x4A0052A8 0x00000007
    0x4A0052B4 0x0000FA04
    0x4A0052B8 0x00000204
    0x4A0052C0 0x00000228
    0x4A0052C4 0x00000208
    0x4A0052D8 0x00000007
    0x4A0052E4 0x0004FD13
    0x4A0052E8 0x00000003
    0x4A005420 0x00000001
    0x4A005520 0x01070000
    0x4A005550 0x00030000
    0x4A005558 0x00000002
    0x4A005560 0x00030000
    0x4A005568 0x00030000
    0x4A005570 0x00030000
    0x4A005578 0x00030000
    0x4A005580 0x00000002
    0x4A005620 0x00070000
    0x4A005660 0x00070000
    0x4A0056A0 0x00070000
    0x4A005744 0x00030000
    0x4A005764 0x00000001
    0x4A008140 0x00000007
    0x4A00814C 0x00006004
    0x4A008150 0x00000804
    0x4A008158 0x00000003
    0x4A00815C 0x00000004
    0x4A008160 0x0000000A
    0x4A008164 0x00000002
    0x4A008180 0x00000007
    0x4A00818C 0x0401E009
    0x4A008190 0x00000202
    0x4A008200 0x00000007
    0x4A00820C 0x04004B00
    0x4A008210 0x0000000F
    0x4A00821C 0x00000102
    0x4A008728 0x00030000
    0x4A008778 0x00000001
    0x4A008780 0x00000001
    0x4A008920 0x00070000
    0x4A008B30 0x00000001
    0x4A008B38 0x00000001
    0x4A008B40 0x00000000
    0x4A008C00 0x00030000
    0x4A008E20 0x00030000
    0x4A008E28 0x00030000
    0x4A008E40 0x00030000
    0x4A008E50 0x01000001
    0x4A008F20 0x00060001
    0x4A008F28 0x00020001
    0x4A009020 0x00070000
    0x4A009028 0x00070000
    0x4A009030 0x00070000
    0x4A009120 0x00070000
    0x4A009130 0x00070000
    0x4A009220 0x0A070000
    0x4A009328 0x01070000
    0x4A009330 0x03040002
    0x4A009340 0x00000101
    0x4A009348 0x00070000
    0x4A009350 0x00040001
    0x4A009358 0x00070000
    0x4A009388 0x00070000
    0x4A0093B0 0x00070000
    0x4A0093B8 0x00070000
    0x4A0093D0 0x08000002
    0x4A0093E0 0x00000001
    0x4A0093E8 0x00030000
    0x4A0093F0 0x00070000
    0x4A009620 0x00030000
    0x4A009728 0x00030000
    0x4A009730 0x00030000
    0x4A009738 0x00030000
    0x4A009740 0x00030000
    0x4A009748 0x00030000
    0x4A009750 0x00030000
    0x4A009760 0x00000001
    0x4A009768 0x00000001
    0x4A009770 0x00000001
    0x4A009778 0x00000001
    0x4A009780 0x00000001
    0x4A009788 0x00030000
    0x4A009790 0x00030000
    0x4A009798 0x00030000
    0x4A0097A0 0x00030000
    0x4A0097A8 0x00030000
    0x4A0097B0 0x00030000
    0x4A0097B8 0x00030000
    0x4A0097C4 0x00000002
    0x4A0097C8 0x00030000
    0x4A0097D0 0x00030000
    0x4A0097D8 0x00010002
    0x4A0097F0 0x00030000
    0x4A0097F8 0x00030000
    0x4A009800 0x00030000
    0x4A009808 0x00030000
    0x4A009810 0x00000001
    0x4A009818 0x00030000
    0x4A009820 0x00030000
    0x4A009828 0x00030000
    0x4A009830 0x00010002
    0x4A009838 0x01030000
    0x4A009840 0x00000002
    0x4A009848 0x00030000
    0x4A009850 0x00000002
    0x4A009858 0x00030000
    0x4A009860 0x00030000
    0x4A009868 0x00030000
    0x4A009870 0x00030000
    0x4A009878 0x00030000
    0x4A009890 0x00030000
    0x4A009898 0x00030000
    0x4A0098A0 0x00030000
    0x4A0098A8 0x00030000
    0x4A0098B0 0x00030000
    0x4A0098B8 0x00030000
    0x4A0098C0 0x00000001
    0x4A0098C8 0x00030000
    0x4A0098D0 0x00030000
    0x4A0098E0 0x00030000
    0x4A0098E8 0x00030000
    0x4A0098F0 0x00030000
    0x4A0098F8 0x00030000
    0x4A009904 0x00030000
    0x4A009908 0x00030000
    0x4AE06108 0x00000000
    0x4AE0610C 0x00000000
    0x4AE06114 0x00000000
    0x4AE06118 0x00000000
    0x4AE06128 0x00000000
    0x4AE0612C 0x00000000
    0x4AE06130 0x00000000
    0x4AE06134 0x00000000
    0x4AE06138 0x00000000
    0x4AE06144 0x00000000
    0x4AE06148 0x00000000
    0x4AE0614C 0x00000000
    0x4AE06150 0x00000000
    0x4AE06154 0x00000000
    0x4AE06158 0x00000000
    0x4AE06164 0x00000000
    0x4AE06168 0x00000000
    0x4AE0616C 0x00000000
    0x4AE06170 0x00000000
    0x4AE06174 0x00000000
    0x4AE06178 0x00000000
    0x4AE06180 0x00000000
    0x4AE06184 0x00000000
    0x4AE06188 0x00000000
    0x4AE0618C 0x00000000
    0x4AE06190 0x00000000
    0x4AE06194 0x00000000
    0x4AE06198 0x00000000
    0x4AE0619C 0x00000000
    0x4AE061A0 0x00000000
    0x4AE061A4 0x00000000
    0x4AE061A8 0x00000000
    0x4AE061AC 0x00000000
    0x4AE061B0 0x00000000
    0x4AE061B4 0x00000000
    0x4AE061B8 0x00000000
    0x4AE061BC 0x00000000
    0x4AE061C0 0x00000000
    0x4AE061C8 0x00000000
    0x4AE061CC 0x00000000
    0x4AE061D0 0x00000000
    0x4AE061D4 0x00000000
    0x4AE061D8 0x00000000
    0x4AE061E0 0x00000000
    0x4AE07830 0x00030000
    0x4AE07838 0x00000001
    0x4AE07840 0x01000002
    0x4AE07878 0x00000002
    0x4AE07880 0x00030000
    0x4AE07888 0x00030000
    
    Sorry, I forgot the file. Here it is.

  • Hmmm, looking at the Clock Tree Tool it doesn't look like the 32k clock is enabled.  I'm not sure if that's a short-coming in the tool, or if it truly isn't on.  Can you please further run "devmem2 0x4ae07800"?  This will provide the value of the CM_WKUPAON_CLKSTCTRL register. Bit 11 is CLKACTIVITY_WKUPAON_SYS_GFCLK and will tell us whether the clock is running.  If the Clock Tree Tool is correct, then bit 11 will be 0 (clock not running).  In order to enable the clock we would need to set CM_WKUPAON_GPIO1_CLKCTRL[8] OPTFCLKEN_DBCLK at address 0x4ae07838.

  • Jose Carlos Billalabeitia said:

    .. and I got the following messages when presseing/releasing a key:

    root@am57xx-evm:~#
    root@am57xx-evm:~#

    [  860.880981] Billa: changed=00000001 row=0  col=0 keypad_data->row_shift=2 code=00000000 keypad_data->keymap[0]=00000000
    [  861.001419] Billa: changed=00000001 row=0  col=0 keypad_data->row_shift=2 code=00000000 keypad_data->keymap[0]=00000000

    So does it behave as expected by only output data when you press a key?  If you wait 10 seconds between key presses for example you would see that?

    How does it behave with respect to pressing different keys?  Does your data ever change?

  • Jose Carlos Billalabeitia said:
    I also doubt about the values in "linux,keymap = <00000001 00000002 ....." that I have in the device tree "dra7.dtsi". I don´t know the correct values. What values should I put there? What do these values mean?

    This would be more appropriate to put in the board dts rather than the SoC.  In any case, the linux,keymap is documented at Documentation/devicetree/bindings/input/matrix-keymap.txt.  Here's a snippet:

    Required properties:
    - linux,keymap: an array of packed 1-cell entries containing the equivalent
    of row, column and linux key-code. The 32-bit big endian cell is packed
    as:
    row << 24 | column << 16 | key-code

    So if I look at yours:

    0x00000041 -> 'A'

    0x00010042 -> 'B'

    0x00020043 -> 'C'

    0x00030044 -> 'D'

    0x01000045 -> 'E'

    0x01010046 -> 'F'

    0x01020047 -> 'G'

    0x01030048 -> 'H'

    0x02000049 -> 'I'

    0x0201004a -> 'J'

    0x0202004b -> 'K'

    0x0203004c -> 'L'

    So the most significant byte is the row (0-2).  The next most significant byte which I colored orange  is the column, 0-3.  The least significant half is the code, which appears to correspond to 'A' through 'L'.  If this is a numeric keypad you should probably modify that.

    Brad

  • Jose Carlos Billalabeitia said:
    [  860.880981] Billa: changed=00000001 row=0  col=0 keypad_data->row_shift=2 code=00000000 keypad_data->keymap[0]=00000000
    [  861.001419] Billa: changed=00000001 row=0  col=0 keypad_data->row_shift=2 code=00000000 keypad_data->keymap[0]=00000000

    I just noticed that your keymap value is 0x00000000.  Did you modify your keymap from what I showed in my previous post?  Or is your dts keymap somehow not making it into that array?

  • Hi Brad

    >> Hmmm, looking at the Clock Tree Tool it doesn't look like the 32k clock is enabled.  I'm not sure if that's a short-coming in the tool, or if it truly isn't on.  Can you please further run "devmem2 0x4ae07800"?  This will >> provide the value of the CM_WKUPAON_CLKSTCTRL register. Bit 11 is CLKACTIVITY_WKUPAON_SYS_GFCLK and will tell us whether the clock is running.  If the Clock Tree Tool is correct, then bit 11 will be 0 >> (clock not running).  In order to enable the clock we would need to set CM_WKUPAON_GPIO1_CLKCTRL[8] OPTFCLKEN_DBCLK at address 0x4ae07838.

    The value at 0x4ae07800 --> 0x0002_D903  (It seems that the clock is running, so maybe the tool is wrong here).

    >> So does it behave as expected by only output data when you press a key?  If you wait 10 seconds between key presses for example you would see that?                                                                                                                                                                                                                                                                                                                                             >> How does it behave with respect to pressing different keys?  Does your data ever change?

    It is working as expected, so it detects the key row/column and its state (pressed/released).

    I guess that according to the "linux,keymap" coding "row << 24 | column << 16 | key-code" I can set "key-code" to any value I consider valid for my application, right?

    In our case it is a keypad with arrows, returns .... to navegate through a menu basically.

    > I just noticed that your keymap value is 0x00000000.  Did you modify your keymap from what I showed in my previous post?  Or is your dts keymap somehow not making it into that array?

    Yes,

                      linux,keymap = <0x00000000 0x00010001 0x00020002 0x00030003

                                                 0x01000004 0x01010005 0x01020006 0x01030007

                                                 0x02000008 0x02010009 0x0202000a 0x0203000b>;

    I am debugging the driver and see that in "case EV_KEY"  function "static int input_get_disposition( ....)" in file "drivers/input/input.c", the function "is_event_supported(code, dev->keybit, KEYMAX)" returns 0.

    It has to do with "dev->keybit" pointer. I don´t know it this can give you some clue about what is happening.

    Regards

    Billa