diff options
author | Xinyu Chen <b03824@freescale.com> | 2011-08-09 08:52:40 +0800 |
---|---|---|
committer | Xinyu Chen <b03824@freescale.com> | 2011-08-09 08:52:40 +0800 |
commit | b81f1bfac13d7eb6f9f2acd9e52e45bcebb65f9d (patch) | |
tree | b2e92c975632ce5198613ddb3d67729e770b7191 | |
parent | c7a972020f52d432f1c6a6425fbdeab9124da092 (diff) |
Update mx6 android defconfig to enable cs42888 codec.
Resolve the touch intr pin request conflict.
Add ipuv3 fb earlysuspend callbacks.
Avoid the cs42888 suspend/resume failed issue when we do not
have the audio extension board (cs42888 on it) connected.
Signed-off-by: Xinyu Chen <xinyu.chen@freescale.com>
-rw-r--r-- | arch/arm/configs/imx6_android_defconfig | 23 | ||||
-rw-r--r-- | arch/arm/mach-mx6/board-mx6q_sabreauto.c | 4 | ||||
-rw-r--r-- | drivers/video/mxc/mxc_ipuv3_fb.c | 58 | ||||
-rw-r--r-- | sound/soc/codecs/cs42888.c | 9 |
4 files changed, 79 insertions, 15 deletions
diff --git a/arch/arm/configs/imx6_android_defconfig b/arch/arm/configs/imx6_android_defconfig index 096aeb2ca0a0..bef87d1a927a 100644 --- a/arch/arm/configs/imx6_android_defconfig +++ b/arch/arm/configs/imx6_android_defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux/arm 2.6.38 Kernel Configuration -# Tue Jul 26 19:45:37 2011 +# Tue Aug 2 13:07:24 2011 # CONFIG_ARM=y CONFIG_HAVE_PWM=y @@ -280,6 +280,7 @@ CONFIG_IMX_HAVE_PLATFORM_FSL_USB2_UDC=y CONFIG_IMX_HAVE_PLATFORM_IMX2_WDT=y CONFIG_IMX_HAVE_PLATFORM_IMX_SNVS_RTC=y CONFIG_IMX_HAVE_PLATFORM_IMX_I2C=y +CONFIG_IMX_HAVE_PLATFORM_IMX_ESAI=y CONFIG_IMX_HAVE_PLATFORM_IMX_UART=y CONFIG_IMX_HAVE_PLATFORM_MXC_EHCI=y CONFIG_IMX_HAVE_PLATFORM_MXC_PWM=y @@ -291,10 +292,12 @@ CONFIG_IMX_HAVE_PLATFORM_AHCI=y CONFIG_IMX_HAVE_PLATFORM_IMX_OCOTP=y CONFIG_IMX_HAVE_PLATFORM_LDB=y CONFIG_IMX_HAVE_PLATFORM_VIV_GPU=y +CONFIG_IMX_HAVE_PLATFORM_MXC_HDMI=y CONFIG_IMX_HAVE_PLATFORM_IMX_ANATOP_THERMAL=y CONFIG_IMX_HAVE_PLATFORM_FSL_OTG=y CONFIG_IMX_HAVE_PLATFORM_FSL_USB_WAKEUP=y CONFIG_IMX_HAVE_PLATFORM_IMX_PM=y +CONFIG_IMX_HAVE_PLATFORM_IMX_ASRC=y # # Freescale MXC Implementations @@ -307,6 +310,7 @@ CONFIG_IMX_HAVE_PLATFORM_IMX_PM=y # CONFIG_ARCH_MX5 is not set CONFIG_ARCH_MX6=y CONFIG_FORCE_MAX_ZONEORDER=13 +CONFIG_DMA_ZONE_SIZE=96 CONFIG_ARCH_MX6Q=y CONFIG_SOC_IMX6Q=y CONFIG_MACH_MX6Q_SABREAUTO=y @@ -320,7 +324,6 @@ CONFIG_MXC_PWM=y # CONFIG_MXC_DEBUG_BOARD is not set CONFIG_ARCH_MXC_IOMUX_V3=y CONFIG_IRAM_ALLOC=y -CONFIG_DMA_ZONE_SIZE=96 CONFIG_CLK_DEBUG=y # @@ -369,7 +372,6 @@ CONFIG_CPU_HAS_PMU=y # CONFIG_ARM_ERRATA_751472 is not set # CONFIG_ARM_ERRATA_753970 is not set CONFIG_ARM_GIC=y -# CONFIG_FIQ_DEBUGGER is not set # # Bus support @@ -866,7 +868,6 @@ CONFIG_MTD_CFI_I2=y # CONFIG_MTD_DOC2000 is not set # CONFIG_MTD_DOC2001 is not set # CONFIG_MTD_DOC2001PLUS is not set -CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_ECC=y # CONFIG_MTD_NAND_ECC_SMC is not set CONFIG_MTD_NAND=y @@ -874,6 +875,7 @@ CONFIG_MTD_NAND=y # CONFIG_MTD_SM_COMMON is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_GPIO is not set +CONFIG_MTD_NAND_IDS=y # CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_NANDSIM is not set # CONFIG_MTD_NAND_PLATFORM is not set @@ -1090,7 +1092,6 @@ CONFIG_FEC=y # CONFIG_NETDEV_10000 is not set CONFIG_WLAN=y # CONFIG_USB_ZD1201 is not set -# CONFIG_BCM4329 is not set # CONFIG_HOSTAP is not set # CONFIG_ATH6K_LEGACY is not set @@ -1181,7 +1182,6 @@ CONFIG_TOUCHSCREEN_EGALAX=y # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_QT602240 is not set -# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_WM97XX is not set @@ -1261,7 +1261,6 @@ CONFIG_HW_RANDOM=y # CONFIG_R3964 is not set # CONFIG_RAW_DRIVER is not set # CONFIG_TCG_TPM is not set -# CONFIG_DCC_TTY is not set # CONFIG_RAMOOPS is not set CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y @@ -1577,6 +1576,7 @@ CONFIG_FB_MXC_LDB=y # CONFIG_FB_MXC_ASYNC_PANEL is not set # CONFIG_FB_MXC_EINK_PANEL is not set # CONFIG_FB_MXC_ELCDIF_FB is not set +# CONFIG_FB_MXC_HDMI is not set # # Console display driver support @@ -1634,11 +1634,11 @@ CONFIG_SND_SOC=y CONFIG_SND_SOC_AC97_BUS=y CONFIG_SND_IMX_SOC=y CONFIG_SND_MXC_SOC_MX2=y -CONFIG_SND_MXC_SOC_SPDIF_DAI=y -CONFIG_SND_SOC_IMX_SPDIF=y +CONFIG_SND_SOC_IMX_CS42888=y +# CONFIG_SND_SOC_IMX_SPDIF is not set CONFIG_SND_SOC_I2C_AND_SPI=y # CONFIG_SND_SOC_ALL_CODECS is not set -CONFIG_SND_SOC_MXC_SPDIF=y +CONFIG_SND_SOC_CS42888=y # CONFIG_SOUND_PRIME is not set CONFIG_AC97_BUS=y CONFIG_HID_SUPPORT=y @@ -2095,6 +2095,7 @@ CONFIG_MXC_VPU=y # # MXC Asynchronous Sample Rate Converter support # +# CONFIG_MXC_ASRC is not set # # MXC Bluetooth support @@ -2134,7 +2135,6 @@ CONFIG_EXT3_FS_XATTR=y # CONFIG_EXT3_FS_POSIX_ACL is not set # CONFIG_EXT3_FS_SECURITY is not set CONFIG_EXT4_FS=y -CONFIG_EXT4_USE_FOR_EXT23=y CONFIG_EXT4_FS_XATTR=y # CONFIG_EXT4_FS_POSIX_ACL is not set # CONFIG_EXT4_FS_SECURITY is not set @@ -2201,7 +2201,6 @@ CONFIG_MISC_FILESYSTEMS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set -# CONFIG_YAFFS_FS is not set CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_WRITEBUFFER=y diff --git a/arch/arm/mach-mx6/board-mx6q_sabreauto.c b/arch/arm/mach-mx6/board-mx6q_sabreauto.c index 491ddd664b1d..ee6014a83271 100644 --- a/arch/arm/mach-mx6/board-mx6q_sabreauto.c +++ b/arch/arm/mach-mx6/board-mx6q_sabreauto.c @@ -772,8 +772,8 @@ static void __init mx6_board_init(void) imx6q_add_asrc(&imx_asrc_data); /* DISP0 Detect */ - gpio_request(MX6Q_SABREAUTO_DISP0_DET_INT, "disp0-detect"); - gpio_direction_input(MX6Q_SABREAUTO_DISP0_DET_INT); + //gpio_request(MX6Q_SABREAUTO_DISP0_DET_INT, "disp0-detect"); + //gpio_direction_input(MX6Q_SABREAUTO_DISP0_DET_INT); /* DISP0 Reset - Assert for i2c disabled mode */ gpio_request(MX6Q_SABREAUTO_DISP0_RESET, "disp0-reset"); diff --git a/drivers/video/mxc/mxc_ipuv3_fb.c b/drivers/video/mxc/mxc_ipuv3_fb.c index d1252bae883c..1f4600ad38cf 100644 --- a/drivers/video/mxc/mxc_ipuv3_fb.c +++ b/drivers/video/mxc/mxc_ipuv3_fb.c @@ -46,6 +46,7 @@ #include <linux/mxcfb.h> #include <linux/uaccess.h> #include <linux/fsl_devices.h> +#include <linux/earlysuspend.h> #include <asm/mach-types.h> #include <mach/ipu-v3.h> #include "mxc_dispdrv.h" @@ -2012,9 +2013,59 @@ static struct platform_driver mxcfb_driver = { }, .probe = mxcfb_probe, .remove = mxcfb_remove, +#ifndef CONFIG_HAS_EARLYSUSPEND .suspend = mxcfb_suspend, .resume = mxcfb_resume, +#endif +}; + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void mxcfb_early_suspend(struct early_suspend *h) +{ + int i; + struct platform_device *pdev; + struct mxcfb_info *mxcfbi; + pm_message_t state = { .event = PM_EVENT_SUSPEND }; + struct fb_event event; + int blank = FB_BLANK_POWERDOWN; + + for (i = 0; i < num_registered_fb; i++) { + mxcfbi = (struct mxcfb_info *)registered_fb[i]->par; + if (!mxcfbi || mxcfbi->ipu_ch == MEM_FG_SYNC) + continue; + pdev = to_platform_device(registered_fb[i]->device); + mxcfb_suspend(pdev, state); + event.info = registered_fb[i]; + event.data = ␣ + fb_notifier_call_chain(FB_EVENT_BLANK, &event); + } +} + +static void mxcfb_later_resume(struct early_suspend *h) +{ + int i; + struct platform_device *pdev; + struct fb_event event; + struct mxcfb_info *mxcfbi; + + for (i = num_registered_fb - 1; i >= 0; i-- ) { + mxcfbi = (struct mxcfb_info *)registered_fb[i]->par; + if (!mxcfbi || mxcfbi->ipu_ch == MEM_FG_SYNC) + continue; + pdev = to_platform_device(registered_fb[i]->device); + mxcfb_resume(pdev); + event.info = registered_fb[i]; + event.data = &mxcfbi->next_blank; + fb_notifier_call_chain(FB_EVENT_BLANK, &event); + } +} + +struct early_suspend fbdrv_earlysuspend = { + .level = EARLY_SUSPEND_LEVEL_DISABLE_FB, + .suspend = mxcfb_early_suspend, + .resume = mxcfb_later_resume, }; +#endif /*! * Main entry function for the framebuffer. The function registers the power @@ -2025,11 +2076,16 @@ static struct platform_driver mxcfb_driver = { */ int __init mxcfb_init(void) { - return platform_driver_register(&mxcfb_driver); + int ret; + ret = platform_driver_register(&mxcfb_driver); + if (!ret) + register_early_suspend(&fbdrv_earlysuspend); + return ret; } void mxcfb_exit(void) { + unregister_early_suspend(&fbdrv_earlysuspend); platform_driver_unregister(&mxcfb_driver); } diff --git a/sound/soc/codecs/cs42888.c b/sound/soc/codecs/cs42888.c index 2ccc9dfbbf68..f64459cd9f07 100644 --- a/sound/soc/codecs/cs42888.c +++ b/sound/soc/codecs/cs42888.c @@ -144,6 +144,7 @@ static const char *cs42888_supply_names[CS42888_NUM_SUPPLIES] = { #define DIF_RIGHT_J 2 #define DIF_TDM 6 +static int cs42888_probed; /* Private data for the CS42888 */ struct cs42888_private { struct snd_soc_codec *codec; @@ -854,6 +855,8 @@ static int cs42888_probe(struct snd_soc_codec *codec) /* Add DAPM controls */ cs42888_add_widgets(codec); + cs42888_probed = 1; + return 0; err: regulator_bulk_disable(ARRAY_SIZE(cs42888->supplies), @@ -873,6 +876,7 @@ static int cs42888_remove(struct snd_soc_codec *codec) { struct cs42888_private *cs42888 = snd_soc_codec_get_drvdata(codec); + cs42888_probed = 0; regulator_bulk_disable(ARRAY_SIZE(cs42888->supplies), cs42888->supplies); regulator_bulk_free(ARRAY_SIZE(cs42888->supplies), @@ -968,6 +972,9 @@ static int cs42888_i2c_suspend(struct i2c_client *client, pm_message_t mesg) { struct cs42888_private *cs42888 = i2c_get_clientdata(client); struct snd_soc_codec *codec = cs42888->codec; + + if (!cs42888_probed) + return 0; int reg = snd_soc_read(codec, CS42888_PWRCTL) | CS42888_PWRCTL_PDN_MASK; return snd_soc_write(codec, CS42888_PWRCTL, reg); @@ -979,6 +986,8 @@ static int cs42888_i2c_resume(struct i2c_client *client) struct snd_soc_codec *codec = cs42888->codec; int reg; + if (!cs42888_probed) + return 0; /* In case the device was put to hard reset during sleep, we need to * wait 500ns here before any I2C communication. */ ndelay(500); |