Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -ruN .a/arch/arm/configs/riogrande_kumquat_defconfig .b/arch/arm/configs/riogrande_kumquat_defconfig
- --- .a/arch/arm/configs/riogrande_kumquat_defconfig 2012-10-23 21:38:03.000000000 +0900
- +++ .b/arch/arm/configs/riogrande_kumquat_defconfig 2013-01-08 21:27:53.000000000 +0900
- @@ -1,6 +1,5 @@
- CONFIG_EXPERIMENTAL=y
- # CONFIG_LOCALVERSION_AUTO is not set
- -CONFIG_SWAP=y
- CONFIG_SYSVIPC=y
- CONFIG_BSD_PROCESS_ACCT=y
- CONFIG_TASKSTATS=y
- @@ -351,6 +350,7 @@
- CONFIG_ANDROID_RAM_CONSOLE=y
- CONFIG_ANDROID_TIMED_GPIO=y
- CONFIG_ANDROID_LOW_MEMORY_KILLER=y
- +CONFIG_ZRAM=y
- CONFIG_CG2900=y
- CONFIG_CG2900_CHIP=y
- CONFIG_STLC2690_CHIP=y
- @@ -401,4 +401,3 @@
- CONFIG_CRYPTO_DEV_UX500_HASH=y
- CONFIG_CRC7=y
- CONFIG_AVERAGE=y
- -CONFIG_ZRAM=y
- diff -ruN .a/arch/arm/configs/riogrande_lotus_defconfig .b/arch/arm/configs/riogrande_lotus_defconfig
- --- .a/arch/arm/configs/riogrande_lotus_defconfig 2012-10-23 21:38:03.000000000 +0900
- +++ .b/arch/arm/configs/riogrande_lotus_defconfig 2013-01-08 21:27:53.000000000 +0900
- @@ -1,6 +1,5 @@
- CONFIG_EXPERIMENTAL=y
- # CONFIG_LOCALVERSION_AUTO is not set
- -CONFIG_SWAP=y
- CONFIG_SYSVIPC=y
- CONFIG_BSD_PROCESS_ACCT=y
- CONFIG_TASKSTATS=y
- @@ -353,6 +352,7 @@
- CONFIG_ANDROID_RAM_CONSOLE=y
- CONFIG_ANDROID_TIMED_GPIO=y
- CONFIG_ANDROID_LOW_MEMORY_KILLER=y
- +CONFIG_ZRAM=y
- CONFIG_CG2900=y
- CONFIG_CG2900_CHIP=y
- CONFIG_STLC2690_CHIP=y
- @@ -403,4 +403,3 @@
- CONFIG_CRYPTO_DEV_UX500_HASH=y
- CONFIG_CRC7=y
- CONFIG_AVERAGE=y
- -CONFIG_ZRAM=y
- diff -ruN .a/arch/arm/configs/riogrande_pepper_defconfig .b/arch/arm/configs/riogrande_pepper_defconfig
- --- .a/arch/arm/configs/riogrande_pepper_defconfig 2012-10-23 21:38:03.000000000 +0900
- +++ .b/arch/arm/configs/riogrande_pepper_defconfig 2013-01-08 21:27:53.000000000 +0900
- @@ -1,6 +1,5 @@
- CONFIG_EXPERIMENTAL=y
- # CONFIG_LOCALVERSION_AUTO is not set
- -CONFIG_SWAP=y
- CONFIG_SYSVIPC=y
- CONFIG_BSD_PROCESS_ACCT=y
- CONFIG_TASKSTATS=y
- @@ -353,6 +352,7 @@
- CONFIG_ANDROID_RAM_CONSOLE=y
- CONFIG_ANDROID_TIMED_GPIO=y
- CONFIG_ANDROID_LOW_MEMORY_KILLER=y
- +CONFIG_ZRAM=y
- CONFIG_CG2900=y
- CONFIG_CG2900_CHIP=y
- CONFIG_STLC2690_CHIP=y
- @@ -403,4 +403,3 @@
- CONFIG_CRYPTO_DEV_UX500_HASH=y
- CONFIG_CRC7=y
- CONFIG_AVERAGE=y
- -CONFIG_ZRAM=y
- diff -ruN .a/drivers/misc/clonedev/clonedev.c .b/drivers/misc/clonedev/clonedev.c
- --- .a/drivers/misc/clonedev/clonedev.c 2012-10-23 21:38:05.000000000 +0900
- +++ .b/drivers/misc/clonedev/clonedev.c 2013-01-08 21:13:47.000000000 +0900
- @@ -48,6 +48,7 @@
- struct compdev *src_compdev;
- struct compdev *dst_compdev;
- bool overlay_case;
- + struct compdev_size src_size;
- struct compdev_size dst_size;
- struct compdev_rect crop_rect;
- struct compdev_scene_info s_info;
- @@ -140,8 +141,7 @@
- return req_id;
- }
- -static void clonedev_best_fit(struct compdev_rect *src_rect,
- - struct compdev_rect *crop_rect,
- +static void clonedev_best_fit(struct compdev_rect *crop_rect,
- struct compdev_rect *dst_rect,
- enum compdev_transform transform)
- {
- @@ -201,6 +201,45 @@
- dst_rect->y += (crop_rect->height - dst_h) >> 1;
- }
- +static void clonedev_rescale_destrect(struct compdev_rect *boundary,
- + struct compdev_size *src_size,
- + struct compdev_rect *dst_rect,
- + enum compdev_transform transform)
- +{
- + uint32_t q, r, src_width;
- + uint32_t x, y, height, width;
- +
- + if (transform == COMPDEV_TRANSFORM_ROT_0) {
- + x = dst_rect->x;
- + y = dst_rect->y;
- + width = dst_rect->width;
- + height = dst_rect->height;
- + src_width = src_size->width;
- + } else if (transform == COMPDEV_TRANSFORM_ROT_90_CW) {
- + x = src_size->height - dst_rect->y - dst_rect->height;
- + y = dst_rect->x;
- + width = dst_rect->height;
- + height = dst_rect->width;
- + src_width = src_size->height;
- + } else if (transform == COMPDEV_TRANSFORM_ROT_90_CCW) {
- + x = dst_rect->y;
- + y = src_size->width - dst_rect->x - dst_rect->width;
- + width = dst_rect->height;
- + height = dst_rect->width;
- + src_width = src_size->height;
- + }
- +
- + q = (boundary->width << 6) / src_width;
- + r = (boundary->width << 6) % src_width;
- +
- + dst_rect->x = (((boundary->x << 6) + ((q * x + r * x / src_width) +
- + (0x1 << 5))) >> 6) & ~0x1;
- + dst_rect->y = ((q * y + r * y / src_width) >> 6) + boundary->y;
- + dst_rect->width = (((q * width + r * width / src_width) +
- + (0x1 << 5)) >> 6) & ~0x1;
- + dst_rect->height = (q * height + r * height / src_width) >> 6;
- +}
- +
- static int clonedev_set_mode_locked(struct clonedev *cd,
- enum clonedev_mode mode)
- {
- @@ -247,9 +286,18 @@
- static void set_transform_and_dest_rect(struct clonedev *cd,
- struct compdev_img *img)
- {
- - /* Adjust destination rect */
- - clonedev_best_fit(&img->src_rect,
- - &cd->crop_rect,
- + struct compdev_rect temp_rect = {0};
- + temp_rect.width = cd->src_size.width;
- + temp_rect.height = cd->src_size.height;
- +
- + /* First adjust src rect to crop_rect */
- + clonedev_best_fit(&cd->crop_rect,
- + &temp_rect,
- + img->transform);
- +
- + /* Now use temp_rect as the boundary */
- + clonedev_rescale_destrect(&temp_rect,
- + &cd->src_size,
- &img->dst_rect,
- img->transform);
- @@ -457,8 +505,12 @@
- b2r2_req_id = ret;
- }
- - dst_img->img.dst_rect.x += cd->crop_rect.x;
- - dst_img->img.dst_rect.y += cd->crop_rect.y;
- + dst_img->img.dst_rect = cd->crop_rect;
- + dst_img->img.src_rect.x = 0;
- + dst_img->img.src_rect.y = 0;
- + dst_img->img.src_rect.width = cd->crop_rect.width;
- + dst_img->img.src_rect.height = cd->crop_rect.height;
- +
- compdev_post_single_buffer_asynch(cd->dst_compdev,
- &dst_img->img, cd->blt_handle, b2r2_req_id);
- @@ -718,6 +770,10 @@
- if (ret < 0)
- goto fail_register_misc;
- + ret = compdev_get_size(cd->src_compdev, &cd->src_size);
- + if (ret < 0)
- + goto fail_register_misc;
- +
- ret = compdev_get_size(cd->dst_compdev, &cd->dst_size);
- if (ret < 0)
- goto fail_register_misc;
- diff -ruN .a/drivers/misc/hwmem/scatt_alloc.c .b/drivers/misc/hwmem/scatt_alloc.c
- --- .a/drivers/misc/hwmem/scatt_alloc.c 2012-10-23 21:38:05.000000000 +0900
- +++ .b/drivers/misc/hwmem/scatt_alloc.c 2013-01-08 21:13:47.000000000 +0900
- @@ -87,6 +87,9 @@
- struct alloc *alloc_l = (struct alloc *)alloc;
- + if (alloc == NULL)
- + return;
- +
- mutex_lock(&lock);
- /* Free all pages in the sglist */
- diff -ruN .a/drivers/mmc/host/mmci.c .b/drivers/mmc/host/mmci.c
- --- .a/drivers/mmc/host/mmci.c 2012-10-23 21:38:05.000000000 +0900
- +++ .b/drivers/mmc/host/mmci.c 2013-01-08 21:13:47.000000000 +0900
- @@ -911,6 +911,8 @@
- if (!data->stop) {
- mmci_request_end(host, data->mrq);
- } else {
- + /* Stop safety timer also before blk-rw stop */
- + del_timer(&host->req_expiry);
- mmci_start_command(host, data->stop, 0);
- }
- }
- diff -ruN .a/drivers/modem/shrm/shrm_protocol.c .b/drivers/modem/shrm/shrm_protocol.c
- --- .a/drivers/modem/shrm/shrm_protocol.c 2012-10-23 21:38:05.000000000 +0900
- +++ .b/drivers/modem/shrm/shrm_protocol.c 2013-01-08 21:13:47.000000000 +0900
- @@ -479,7 +479,7 @@
- dev_err(shrm->dev, "Invalid boot state\n");
- }
- /* start timer here */
- - hrtimer_start(&timer, ktime_set(0, 25*NSEC_PER_MSEC),
- + hrtimer_start(&timer, ktime_set(0, 50*NSEC_PER_MSEC),
- HRTIMER_MODE_REL);
- atomic_dec(&ac_sleep_disable_count);
- @@ -517,7 +517,7 @@
- shrm_audio_tx_state = SHRM_IDLE;
- }
- /* start timer here */
- - hrtimer_start(&timer, ktime_set(0, 25*NSEC_PER_MSEC),
- + hrtimer_start(&timer, ktime_set(0, 50*NSEC_PER_MSEC),
- HRTIMER_MODE_REL);
- atomic_dec(&ac_sleep_disable_count);
- atomic_dec(&ac_msg_pend_1);
- diff -ruN .a/drivers/rmi4/rmi4_driver.c .b/drivers/rmi4/rmi4_driver.c
- --- .a/drivers/rmi4/rmi4_driver.c 2012-10-23 21:38:05.000000000 +0900
- +++ .b/drivers/rmi4/rmi4_driver.c 2013-01-08 21:13:47.000000000 +0900
- @@ -1640,7 +1640,7 @@
- }
- exit:
- - mutex_unlock(&ddata->pdt_lock);
- + UNLOCK_PDT(ddata);
- return err;
- }
- diff -ruN .a/drivers/rmi4/rmi4_spi_adaptor.c .b/drivers/rmi4/rmi4_spi_adaptor.c
- --- .a/drivers/rmi4/rmi4_spi_adaptor.c 2012-10-23 21:38:05.000000000 +0900
- +++ .b/drivers/rmi4/rmi4_spi_adaptor.c 2013-01-08 21:13:47.000000000 +0900
- @@ -256,7 +256,7 @@
- }
- if (n_rx)
- - rmi4_spi_adapter_dbg_dump(dev, txbuf, n_tx,
- + rmi4_spi_adapter_dbg_dump(dev, rxbuf, n_rx,
- "SPI received bytes:");
- error_exit:
- diff -ruN .a/drivers/usb/musb/ux500.c .b/drivers/usb/musb/ux500.c
- --- .a/drivers/usb/musb/ux500.c 2012-10-23 21:38:06.000000000 +0900
- +++ .b/drivers/usb/musb/ux500.c 2013-01-08 21:13:47.000000000 +0900
- @@ -449,18 +449,10 @@
- u8 devctl;
- unsigned long timeout = jiffies + msecs_to_jiffies(1000);
- int ret = 1;
- -#ifdef CONFIG_USB_OTG_20
- - int val = 0;
- -#endif
- /* HDRC controls CPEN, but beware current surges during device
- * connect. They can trigger transient overcurrent conditions
- * that must be ignored.
- */
- -#ifdef CONFIG_USB_OTG_20
- - val = musb_readb(musb->mregs, MUSB_MISC);
- - val |= 0x1C;
- - musb_writeb(musb->mregs, MUSB_MISC, val);
- -#endif
- devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
- if (is_on) {
- diff -ruN .a/drivers/video/av8100/av8100.c .b/drivers/video/av8100/av8100.c
- --- .a/drivers/video/av8100/av8100.c 2012-10-23 21:38:06.000000000 +0900
- +++ .b/drivers/video/av8100/av8100.c 2013-01-08 21:13:47.000000000 +0900
- @@ -31,6 +31,7 @@
- #include <linux/regulator/consumer.h>
- #include <linux/earlysuspend.h>
- #include <linux/mfd/dbx500-prcmu.h>
- +#include <linux/spinlock.h>
- #include "av8100_regs.h"
- #include <video/av8100.h>
- @@ -58,7 +59,10 @@
- #define AV8100_POWERDOWN_TIMER_EVENT 0x200
- #define AV8100_CHECK_HW_STATUS_EVENT 0x400
- #define AV8100_POWER_CYCLE_EVENT 0x800
- -#define AV8100_EVENTS 0xFFE
- +#define AV8100_EARLY_SUSPEND_EVENT 0x1000
- +#define AV8100_LATE_RESUME_EVENT 0x2000
- +#define AV8100_PUT_EVENT 0x4000
- +#define AV8100_EVENTS 0x7FFE
- #define CCI_MAX 50
- #define AV8100_INTERNAL_REG_1 0x8488
- /* Standby search time */
- @@ -70,8 +74,10 @@
- #define AV8100_DISP_OFF_HDMI_OFF_TIME 2
- #define ONI_READ_MAX 20
- #define AV8100_SCAN_WHEN_DISPLAY_IS_POWERED_OFF false
- -#define UFLOW_CNT_MAX 15
- -#define UFLOW_TIME_MAX 1000
- +#define UFLOW_CNT_MAX 60
- +#define UFLOW_CNT_CHECK_HW 10
- +#define UFLOW_TIME_MIN 700
- +#define UFLOW_TIME_MAX 4000
- /* Command offsets */
- #define AV8100_COMMAND_OFFSET 0x10
- @@ -142,15 +148,14 @@
- #define AV8100_WAITTIME_50MS_MAX 55000
- #define AV8100_WATTIME_100US 100
- -static DEFINE_MUTEX(av8100_hw_mutex);
- -#define LOCK_AV8100_HW mutex_lock(&av8100_hw_mutex)
- -#define UNLOCK_AV8100_HW mutex_unlock(&av8100_hw_mutex)
- -static DEFINE_MUTEX(av8100_fwdl_mutex);
- -#define LOCK_AV8100_FWDL mutex_lock(&av8100_fwdl_mutex)
- -#define UNLOCK_AV8100_FWDL mutex_unlock(&av8100_fwdl_mutex)
- -static DEFINE_MUTEX(av8100_usrcnt_mutex);
- -#define LOCK_AV8100_USRCNT mutex_lock(&av8100_usrcnt_mutex)
- -#define UNLOCK_AV8100_USRCNT mutex_unlock(&av8100_usrcnt_mutex)
- +#define LOCK_AV8100_HW mutex_lock(&adev->hw_mutex)
- +#define UNLOCK_AV8100_HW mutex_unlock(&adev->hw_mutex)
- +#define LOCK_AV8100_FWDL mutex_lock(&adev->fwdl_mutex)
- +#define UNLOCK_AV8100_FWDL mutex_unlock(&adev->fwdl_mutex)
- +#define LOCK_AV8100_USRCNT mutex_lock(&adev->usrcnt_mutex)
- +#define UNLOCK_AV8100_USRCNT mutex_unlock(&adev->usrcnt_mutex)
- +#define LOCK_AV8100_CONF mutex_lock(&adev->conf_mutex)
- +#define UNLOCK_AV8100_CONF mutex_unlock(&adev->conf_mutex)
- enum av8100_timer_flag {
- TIMER_UNSET,
- @@ -237,6 +242,7 @@
- bool disp_on;
- bool busy;
- u8 hdcp_state;
- + bool pwr_recover;
- };
- /**
- @@ -302,6 +308,13 @@
- u8 chip_version;
- struct early_suspend early_suspend;
- u32 usr_cnt;
- + bool usr_audio;
- + bool usr_video;
- + struct mutex hw_mutex;
- + struct mutex fwdl_mutex;
- + struct mutex usrcnt_mutex;
- + struct mutex conf_mutex;
- + spinlock_t flag_lock;
- };
- static const unsigned int waittime_retry[10] = {
- @@ -327,6 +340,9 @@
- static const struct color_conversion_cmd *get_color_transform_cmd(
- struct av8100_device *adev,
- enum av8100_color_transform transform);
- +static void put_handle(struct av8100_device *adev);
- +static void early_suspend_handle(struct av8100_device *adev);
- +static void late_resume_handle(struct av8100_device *adev);
- static int av8100_open(struct inode *inode, struct file *filp);
- static int av8100_release(struct inode *inode, struct file *filp);
- static long av8100_ioctl(struct file *file,
- @@ -573,6 +589,37 @@
- return NULL;
- }
- +static void set_flag(struct av8100_device *adev, int av8100_flags)
- +{
- + unsigned long flags;
- +
- + spin_lock_irqsave(&adev->flag_lock, flags);
- + adev->flag |= av8100_flags;
- + spin_unlock_irqrestore(&adev->flag_lock, flags);
- + wake_up_interruptible(&adev->event);
- +}
- +
- +static void clr_flag(struct av8100_device *adev, int av8100_flags)
- +{
- + unsigned long flags;
- +
- + spin_lock_irqsave(&adev->flag_lock, flags);
- + adev->flag &= ~av8100_flags;
- + spin_unlock_irqrestore(&adev->flag_lock, flags);
- +}
- +
- +static int get_flag(struct av8100_device *adev)
- +{
- + unsigned long flags;
- + int av8100_flags;
- +
- + spin_lock_irqsave(&adev->flag_lock, flags);
- + av8100_flags = adev->flag;
- + spin_unlock_irqrestore(&adev->flag_lock, flags);
- +
- + return av8100_flags;
- +}
- +
- static void set_hrtimer(struct av8100_device *adev, enum av8100_timer_flag flag)
- {
- ktime_t time;
- @@ -634,15 +681,19 @@
- dev_dbg(dev, "%s\n", __func__);
- - adev->flag &= ~AV8100_EVENTS;
- + clr_flag(adev, AV8100_EVENTS);
- hrtimer_cancel(&adev->hrtimer);
- adev->params.pre_suspend_power =
- (av8100_status_get().av8100_state > AV8100_OPMODE_SHUTDOWN);
- if (adev->params.pre_suspend_power) {
- - ret = av8100_powerdown();
- - if (ret)
- - dev_err(dev, "av8100_powerdown failed\n");
- + if (adev->usr_audio) {
- + ret = -EBUSY;
- + } else {
- + ret = av8100_powerdown();
- + if (ret)
- + dev_err(dev, "av8100_powerdown failed\n");
- + }
- }
- return ret;
- @@ -685,9 +736,15 @@
- {
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return 0;
- - dev_dbg(adev->dev, "%s\n", __func__);
- - av8100_powerdown();
- - set_hrtimer(adev, TIMER_POWERUP);
- + dev_dbg(adev->dev, "%s %d\n", __func__, adev->usr_audio);
- + if (!adev->usr_audio) {
- + av8100_powerdown();
- + set_hrtimer(adev, TIMER_POWERUP);
- + } else {
- + /* Simulate unplug in order to recover */
- + clr_plug_status(adev, AV8100_HDMI_PLUGIN);
- + adev->params.pwr_recover = true;
- + }
- return 0;
- }
- @@ -699,32 +756,31 @@
- switch (adev->timer_flag) {
- case TIMER_1S:
- - adev->flag |= AV8100_1S_TIMER_EVENT;
- + set_flag(adev, AV8100_1S_TIMER_EVENT);
- break;
- case TIMER_SCAN:
- case TIMER_SCAN2:
- - adev->flag |= AV8100_SCAN_TIMER_EVENT;
- + set_flag(adev, AV8100_SCAN_TIMER_EVENT);
- break;
- case TIMER_HPD:
- - adev->flag |= AV8100_HPD_TIMER_EVENT;
- + set_flag(adev, AV8100_HPD_TIMER_EVENT);
- break;
- case TIMER_POWERSCAN:
- - adev->flag |= AV8100_POWERSCAN_TIMER_EVENT;
- + set_flag(adev, AV8100_POWERSCAN_TIMER_EVENT);
- break;
- case TIMER_RESUME:
- - adev->flag |= AV8100_RESUME_TIMER_EVENT;
- + set_flag(adev, AV8100_RESUME_TIMER_EVENT);
- break;
- case TIMER_POWERUP:
- - adev->flag |= AV8100_POWERUP_TIMER_EVENT;
- + set_flag(adev, AV8100_POWERUP_TIMER_EVENT);
- break;
- case TIMER_POWERDOWN:
- - adev->flag |= AV8100_POWERDOWN_TIMER_EVENT;
- + set_flag(adev, AV8100_POWERDOWN_TIMER_EVENT);
- break;
- default:
- return -EINVAL;
- break;
- }
- - wake_up_interruptible(&adev->event);
- return HRTIMER_NORESTART;
- }
- @@ -762,7 +818,8 @@
- if (adev->params.pulsing_5V == false)
- set_hrtimer(adev, TIMER_1S);
- - av8100_set_state(adev, AV8100_OPMODE_SCAN);
- + if (av8100_status_get().av8100_state > AV8100_OPMODE_SCAN)
- + av8100_set_state(adev, AV8100_OPMODE_SCAN);
- }
- static int fix_cec(struct av8100_device *adev)
- @@ -829,7 +886,7 @@
- struct av8100_platform_data *pdata = adev->dev->platform_data;
- adev->params.fw_loaded = false;
- - adev->flag &= ~(AV8100_EVENTS | AV8100_INT_EVENT);
- + clr_flag(adev, AV8100_EVENTS | AV8100_INT_EVENT);
- if (fix_cec(adev))
- dev_err(adev->dev, "%s %d err\n", __func__, __LINE__);
- @@ -922,8 +979,7 @@
- AV8100_STANDBY_PENDING_INTERRUPT_BPDIG_LOW))
- goto av8100_1s_timer_event_handle_err;
- - adev->flag |= AV8100_FWDL_EVENT2;
- - wake_up_interruptible(&adev->event);
- + set_flag(adev, AV8100_FWDL_EVENT2);
- } else {
- to_scan_mode_2(adev);
- }
- @@ -947,6 +1003,8 @@
- dev_dbg(adev->dev, "Thpd\n");
- + hrtimer_cancel(&adev->hrtimer);
- +
- /* Clear hpdi and cci interrupts */
- if (av8100_reg_stby_pend_int_w(
- AV8100_STANDBY_PENDING_INTERRUPT_HPDI_HIGH,
- @@ -1006,9 +1064,12 @@
- set_plug_status(adev, AV8100_HDMI_PLUGIN);
- } else {
- - av8100_powerdown();
- - msleep(AV8100_WAITTIME_1MS);
- - av8100_powerup();
- + if (!adev->usr_audio) {
- + av8100_powerdown();
- + usleep_range(AV8100_WAITTIME_1MS,
- + AV8100_WAITTIME_1MS_MAX);
- + av8100_powerup();
- + }
- if (adev->params.pulsing_5V == false)
- set_hrtimer(adev, TIMER_1S);
- av8100_set_state(adev, AV8100_OPMODE_SCAN);
- @@ -1041,8 +1102,11 @@
- {
- dev_dbg(adev->dev, "Tpwrdown\n");
- - (void)av8100_powerdown();
- - adev->params.busy = false;
- + /* Power down only if suspended and audio is not a user. */
- + if ((adev->params.suspended) && (!adev->usr_audio))
- + (void)av8100_powerdown();
- + else
- + dev_dbg(adev->dev, "Tpwrdown no action\n");
- }
- static int cci_handle(struct av8100_device *adev, u8 hpdi)
- @@ -1074,7 +1138,7 @@
- /* standby_mode, no scanning */
- av8100_set_state(adev, AV8100_OPMODE_STANDBY);
- - adev->flag &= ~AV8100_EVENTS;
- + clr_flag(adev, AV8100_EVENTS);
- hrtimer_cancel(&adev->hrtimer);
- adev->params.count_cci = 0;
- @@ -1147,9 +1211,8 @@
- } else {
- dev_dbg(adev->dev, "fwdld 0\n");
- - adev->flag |= AV8100_FWDL_EVENT1;
- - adev->flag &= ~AV8100_FWDL_EVENT2;
- - wake_up_interruptible(&adev->event);
- + clr_flag(adev, AV8100_FWDL_EVENT2);
- + set_flag(adev, AV8100_FWDL_EVENT1);
- }
- } else {
- dev_dbg(adev->dev, "HPDint hpds 0\n");
- @@ -1224,6 +1287,7 @@
- static ktime_t earlier;
- ktime_t diff;
- u32 uflow_time;
- + bool check_hw;
- dev_dbg(adev->dev, "uovbi %d\n", onuvb);
- @@ -1232,6 +1296,7 @@
- earlier = ktime_get();
- uflow_cnt++;
- + check_hw = (uflow_cnt % UFLOW_CNT_CHECK_HW) == 0;
- if (uflow_cnt > UFLOW_CNT_MAX) {
- later = ktime_get();
- @@ -1240,19 +1305,16 @@
- dev_dbg(adev->dev, "uovbi 0 time: %d ms", uflow_time);
- /* Underflow error: force power cycle */
- - if (uflow_time < UFLOW_TIME_MAX) {
- - adev->flag |= AV8100_POWER_CYCLE_EVENT;
- - wake_up_interruptible(&adev->event);
- - }
- + if ((uflow_time > UFLOW_TIME_MIN) &&
- + (uflow_time < UFLOW_TIME_MAX))
- + set_flag(adev, AV8100_POWER_CYCLE_EVENT);
- uflow_cnt = 0;
- }
- /* Trig check of hw status */
- - if (!(adev->flag & AV8100_POWER_CYCLE_EVENT) &&
- - (adev->params.fw_loaded)) {
- - adev->flag |= AV8100_CHECK_HW_STATUS_EVENT;
- - wake_up_interruptible(&adev->event);
- - }
- + if (!(get_flag(adev) & AV8100_POWER_CYCLE_EVENT) &&
- + (adev->params.fw_loaded) && check_hw)
- + set_flag(adev, AV8100_CHECK_HW_STATUS_EVENT);
- return 0;
- }
- @@ -1270,6 +1332,9 @@
- u8 cecrx = 0;
- u8 cectx = 0;
- + if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- + return 0;
- +
- /* Get hpdi and cci */
- if (av8100_reg_stby_pend_int_r(&hpdi, NULL, NULL, &cci, NULL))
- goto av8100_int_event_handle_err;
- @@ -1397,8 +1462,17 @@
- while (1) {
- wait_event_interruptible(adev->event, (adev->flag != 0));
- - flags = adev->flag;
- - adev->flag = 0;
- + flags = get_flag(adev);
- + clr_flag(adev, AV8100_EVENTS | AV8100_INT_EVENT);
- +
- + if (flags & AV8100_EARLY_SUSPEND_EVENT)
- + (void)early_suspend_handle(adev);
- +
- + if (flags & AV8100_LATE_RESUME_EVENT)
- + (void)late_resume_handle(adev);
- +
- + if (flags & AV8100_PUT_EVENT)
- + put_handle(adev);
- if (flags & AV8100_INT_EVENT) {
- cnt = 0;
- @@ -1455,8 +1529,7 @@
- struct av8100_device *adev;
- adev = (struct av8100_device *) p;
- - adev->flag |= AV8100_INT_EVENT;
- - wake_up_interruptible(&adev->event);
- + set_flag(adev, AV8100_INT_EVENT);
- return IRQ_HANDLED;
- }
- @@ -1712,7 +1785,7 @@
- adev->params.hdcpm = AV8100_GENERAL_INTERRUPT_MASK_HDCPM_HIGH;
- adev->params.cecm = AV8100_GENERAL_INTERRUPT_MASK_CECM_HIGH;
- - adev->params.uovbm = AV8100_GENERAL_INTERRUPT_MASK_UOVBM_HIGH;
- + adev->params.uovbm = AV8100_GENERAL_INTERRUPT_MASK_UOVBM_LOW;
- adev->params.powerdown_scan = AV8100_SCAN_WHEN_DISPLAY_IS_POWERED_OFF;
- @@ -2760,7 +2833,73 @@
- return 0;
- }
- -int av8100_hdmi_get(void)
- +static int av8100_powerscan(bool disp_user)
- +{
- + struct av8100_device *adev;
- + int ret = 0;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev) {
- + ret = -EFAULT;
- + goto av8100_powerscan_end;
- + }
- +
- + dev_dbg(adev->dev, "%s %d\n", __func__, disp_user);
- +
- + if ((av8100_status_get().av8100_state < AV8100_OPMODE_STANDBY) ||
- + (disp_user && !adev->params.disp_on))
- + goto av8100_powerscan_end;
- +
- + if (disp_user)
- + adev->params.disp_on = false;
- +
- + if (adev->params.powerdown_scan ||
- + (disp_user && !adev->params.suspended)) {
- + if (av8100_status_get().av8100_state > AV8100_OPMODE_SCAN) {
- + dev_dbg(adev->dev, "set to scan mode\n");
- + av8100_disable_interrupt();
- + set_flag(adev, AV8100_SCAN_TIMER_EVENT);
- + }
- +
- + ret = av8100_5V_w(AV8100_DENC_OFF_TIME,
- + adev->params.hdmi_off_time, adev->params.on_time);
- + set_hrtimer(adev, TIMER_POWERSCAN);
- + } else if (disp_user && adev->params.suspended) {
- + /* Allow for a final CEC to be sent before powerdown */
- + av8100_disable_interrupt();
- + clr_plug_status(adev, AV8100_HDMI_PLUGIN);
- + set_hrtimer(adev, TIMER_POWERDOWN);
- + adev->params.busy = true;
- + } else {
- + if (!adev->usr_audio)
- + ret = av8100_powerdown();
- + }
- +av8100_powerscan_end:
- + return ret;
- +}
- +
- +static void put_handle(struct av8100_device *adev)
- +{
- + bool powerscan = false;
- +
- + if ((adev->params.pwr_recover) && (!adev->usr_audio)) {
- + adev->params.pwr_recover = false;
- + av8100_powerdown();
- + usleep_range(AV8100_WAITTIME_5MS,
- + AV8100_WAITTIME_5MS_MAX);
- + av8100_powerup();
- +
- + powerscan = true;
- + } else if (adev->params.suspended) {
- + powerscan = true;
- + }
- +
- + if (powerscan)
- + if (av8100_powerscan(true))
- + dev_err(adev->dev, "av8100_powerscan failed\n");
- +}
- +
- +int av8100_hdmi_get(enum av8100_hdmi_user user)
- {
- struct av8100_device *adev;
- int usr_cnt;
- @@ -2768,18 +2907,42 @@
- adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- if (!adev)
- return -EFAULT;
- + if (adev->timer_flag == TIMER_POWERDOWN) {
- + dev_dbg(adev->dev, "%s busy %d\n", __func__, user);
- + return -EBUSY;
- + }
- + if (adev->params.suspended && (user == AV8100_HDMI_USER_AUDIO)) {
- + dev_dbg(adev->dev, "%s suspended %d\n", __func__, user);
- + return -EPERM;
- + }
- LOCK_AV8100_USRCNT;
- - adev->usr_cnt++;
- + switch (user) {
- + case AV8100_HDMI_USER_AUDIO:
- + if (!adev->usr_audio) {
- + adev->usr_cnt++;
- + adev->usr_audio = true;
- + }
- + break;
- + case AV8100_HDMI_USER_VIDEO:
- + if (!adev->usr_video) {
- + adev->usr_cnt++;
- + adev->usr_video = true;
- + }
- + break;
- + default:
- + break;
- + }
- usr_cnt = adev->usr_cnt;
- UNLOCK_AV8100_USRCNT;
- - dev_dbg(adev->dev, "%s %d\n", __func__, usr_cnt);
- +
- + dev_dbg(adev->dev, "%s %d %d\n", __func__, usr_cnt, user);
- return usr_cnt;
- }
- EXPORT_SYMBOL(av8100_hdmi_get);
- -int av8100_hdmi_put(void)
- +int av8100_hdmi_put(enum av8100_hdmi_user user)
- {
- struct av8100_device *adev;
- int usr_cnt;
- @@ -2789,16 +2952,30 @@
- return -EFAULT;
- LOCK_AV8100_USRCNT;
- - if (adev->usr_cnt)
- - adev->usr_cnt--;
- + switch (user) {
- + case AV8100_HDMI_USER_AUDIO:
- + if (adev->usr_audio) {
- + adev->usr_cnt--;
- + adev->usr_audio = false;
- + }
- + break;
- + case AV8100_HDMI_USER_VIDEO:
- + if (adev->usr_video) {
- + adev->usr_cnt--;
- + adev->usr_video = false;
- + }
- + break;
- + default:
- + break;
- + }
- usr_cnt = adev->usr_cnt;
- - UNLOCK_AV8100_USRCNT;
- - dev_dbg(adev->dev, "%s %d\n", __func__, usr_cnt);
- + dev_dbg(adev->dev, "%s %d %d\n", __func__, usr_cnt, user);
- if (usr_cnt == 0)
- - if (av8100_powerscan(true))
- - dev_err(adev->dev, "av8100_powerscan failed\n");
- + set_flag(adev, AV8100_PUT_EVENT);
- +
- + UNLOCK_AV8100_USRCNT;
- return usr_cnt;
- }
- @@ -2806,9 +2983,7 @@
- int av8100_hdmi_video_off(void)
- {
- - int ret;
- struct av8100_device *adev;
- - union av8100_configuration config;
- adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- if (!adev)
- @@ -2819,119 +2994,103 @@
- if (av8100_status_get().av8100_state < AV8100_OPMODE_VIDEO)
- return 0;
- - /* Get current av8100 video input format */
- - ret = av8100_conf_get(AV8100_COMMAND_VIDEO_INPUT_FORMAT,
- - &config);
- - if (ret) {
- - dev_err(adev->dev, "%s:av8100_conf_get "
- - "AV8100_COMMAND_VIDEO_INPUT_FORMAT failed\n",
- - __func__);
- - return -EFAULT;
- - }
- + /* Video is off: mask uovbi interrupts */
- + if (av8100_reg_gen_int_mask_w(
- + AV8100_GENERAL_INTERRUPT_MASK_EOCM_LOW,
- + AV8100_GENERAL_INTERRUPT_MASK_VSIM_LOW,
- + AV8100_GENERAL_INTERRUPT_MASK_VSOM_LOW,
- + adev->params.cecm,
- + adev->params.hdcpm,
- + AV8100_GENERAL_INTERRUPT_MASK_UOVBM_LOW,
- + AV8100_GENERAL_INTERRUPT_MASK_TEM_LOW))
- + dev_dbg(adev->dev, "av8100_reg_gen_int_mask_w err\n");
- - config.video_input_format.dsi_input_mode = AV8100_HDMI_DSI_OFF;
- + av8100_set_state(adev, AV8100_OPMODE_IDLE);
- - ret = av8100_conf_prep(AV8100_COMMAND_VIDEO_INPUT_FORMAT,
- - &config);
- - if (ret) {
- - dev_err(adev->dev, "%s:av8100_conf_prep "
- - "AV8100_COMMAND_VIDEO_INPUT_FORMAT failed\n",
- - __func__);
- - return -EFAULT;
- - }
- + return 0;
- +}
- +EXPORT_SYMBOL(av8100_hdmi_video_off);
- - /* Video input */
- - ret = av8100_conf_w(AV8100_COMMAND_VIDEO_INPUT_FORMAT,
- - NULL, NULL, I2C_INTERFACE);
- - if (ret) {
- - dev_err(adev->dev, "%s:av8100_conf_w "
- - "AV8100_COMMAND_VIDEO_INPUT_FORMAT failed\n",
- - __func__);
- +int av8100_hdmi_video_on(void)
- +{
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- return -EFAULT;
- - }
- - av8100_set_state(adev, AV8100_OPMODE_IDLE);
- + dev_dbg(adev->dev, "%s\n", __func__);
- +
- + if (av8100_status_get().av8100_state < AV8100_OPMODE_IDLE)
- + return 0;
- +
- + /* Video is on: unmask uovbi interrupts */
- + if (av8100_reg_gen_int_mask_w(
- + AV8100_GENERAL_INTERRUPT_MASK_EOCM_LOW,
- + AV8100_GENERAL_INTERRUPT_MASK_VSIM_LOW,
- + AV8100_GENERAL_INTERRUPT_MASK_VSOM_LOW,
- + adev->params.cecm,
- + adev->params.hdcpm,
- + AV8100_GENERAL_INTERRUPT_MASK_UOVBM_HIGH,
- + AV8100_GENERAL_INTERRUPT_MASK_TEM_LOW))
- + dev_dbg(adev->dev, "av8100_reg_gen_int_mask_w err\n");
- +
- + av8100_set_state(adev, AV8100_OPMODE_VIDEO);
- return 0;
- }
- -EXPORT_SYMBOL(av8100_hdmi_video_off);
- +EXPORT_SYMBOL(av8100_hdmi_video_on);
- -int av8100_powerwakeup(bool disp_user)
- +void av8100_conf_lock(void)
- {
- struct av8100_device *adev;
- - int ret = 0;
- adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- if (!adev)
- - return -EFAULT;
- + return;
- - dev_dbg(adev->dev, "%s %d\n", __func__, disp_user);
- + LOCK_AV8100_CONF;
- +}
- +EXPORT_SYMBOL(av8100_conf_lock);
- - if (adev->params.suspended) {
- - dev_dbg(adev->dev, "suspended\n");
- - goto av8100_powerwakeup_end;
- - }
- +void av8100_conf_unlock(void)
- +{
- + struct av8100_device *adev;
- - if (disp_user) {
- - adev->params.disp_on = true;
- - if (av8100_status_get().av8100_state < AV8100_OPMODE_STANDBY)
- - ret = av8100_powerup();
- - } else {
- - if (av8100_status_get().av8100_state > AV8100_OPMODE_SHUTDOWN)
- - av8100_powerdown();
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return;
- - set_hrtimer(adev, TIMER_POWERUP);
- - }
- -av8100_powerwakeup_end:
- - return ret;
- + UNLOCK_AV8100_CONF;
- }
- -EXPORT_SYMBOL(av8100_powerwakeup);
- +EXPORT_SYMBOL(av8100_conf_unlock);
- -int av8100_powerscan(bool disp_user)
- +int av8100_powerwakeup(bool disp_user)
- {
- struct av8100_device *adev;
- int ret = 0;
- adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- - if (!adev) {
- - ret = -EFAULT;
- - goto av8100_powerscan_end;
- - }
- + if (!adev)
- + return -EFAULT;
- dev_dbg(adev->dev, "%s %d\n", __func__, disp_user);
- - if ((av8100_status_get().av8100_state < AV8100_OPMODE_STANDBY) ||
- - (disp_user && !adev->params.disp_on))
- - goto av8100_powerscan_end;
- + if (adev->params.suspended) {
- + dev_dbg(adev->dev, "suspended\n");
- + goto av8100_powerwakeup_end;
- + }
- if (disp_user)
- - adev->params.disp_on = false;
- + adev->params.disp_on = true;
- - if (adev->params.powerdown_scan ||
- - (disp_user && !adev->params.suspended)) {
- - if (av8100_status_get().av8100_state > AV8100_OPMODE_SCAN) {
- - dev_dbg(adev->dev, "set to scan mode\n");
- - av8100_disable_interrupt();
- - adev->flag |= AV8100_SCAN_TIMER_EVENT;
- - wake_up_interruptible(&adev->event);
- - }
- + if (av8100_status_get().av8100_state < AV8100_OPMODE_STANDBY)
- + ret = av8100_powerup();
- - ret = av8100_5V_w(AV8100_DENC_OFF_TIME,
- - adev->params.hdmi_off_time, adev->params.on_time);
- - set_hrtimer(adev, TIMER_POWERSCAN);
- - } else if (disp_user && adev->params.suspended) {
- - /* Allow for a final CEC to be sent before powerdown */
- - av8100_disable_interrupt();
- - clr_plug_status(adev, AV8100_HDMI_PLUGIN);
- - set_hrtimer(adev, TIMER_POWERDOWN);
- - adev->params.busy = true;
- - } else {
- - ret = av8100_powerdown();
- - }
- -av8100_powerscan_end:
- +av8100_powerwakeup_end:
- return ret;
- }
- -EXPORT_SYMBOL(av8100_powerscan);
- +EXPORT_SYMBOL(av8100_powerwakeup);
- int av8100_powerup(void)
- {
- @@ -2980,7 +3139,7 @@
- return -EFAULT;
- adev->params.busy = false;
- - adev->flag &= ~AV8100_EVENTS;
- + clr_flag(adev, AV8100_EVENTS | AV8100_INT_EVENT);
- adev->timer_flag = TIMER_UNSET;
- hrtimer_cancel(&adev->hrtimer);
- pdata = adev->dev->platform_data;
- @@ -3026,6 +3185,8 @@
- gpio_set_value_cansleep(pdata->reset, 0);
- + adev->params.fw_loaded = false;
- +
- /* Regulator disable */
- if ((adev->params.regulator_pwr) &&
- (adev->params.regulator_requested)) {
- @@ -3343,8 +3504,8 @@
- av8100_download_firmware_err2:
- UNLOCK_AV8100_FWDL;
- - adev->flag |= AV8100_SCAN_TIMER_EVENT;
- - wake_up_interruptible(&adev->event);
- + if (!adev->params.suspended)
- + set_flag(adev, AV8100_SCAN_TIMER_EVENT);
- return retval;
- }
- @@ -3443,6 +3604,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3556,6 +3722,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3583,6 +3754,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3611,6 +3787,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3638,6 +3819,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3665,6 +3851,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3689,6 +3880,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3743,6 +3939,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3817,6 +4018,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3847,6 +4053,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3885,6 +4096,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3926,6 +4142,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -3966,6 +4187,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -4005,6 +4231,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -4043,6 +4274,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -4071,6 +4307,11 @@
- {
- int retval;
- u8 val;
- + struct av8100_device *adev;
- +
- + adev = devnr_to_adev(AV8100_DEVNR_DEFAULT);
- + if (!adev)
- + return -EINVAL;
- if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- return -EINVAL;
- @@ -4506,10 +4747,8 @@
- cnt++;
- }
- dev_dbg(adev->dev, "first return cnt:%d\n", cnt);
- - if (cnt == cnt_max) {
- - adev->flag |= AV8100_CHECK_HW_STATUS_EVENT;
- - wake_up_interruptible(&adev->event);
- - }
- + if (cnt == cnt_max)
- + set_flag(adev, AV8100_CHECK_HW_STATUS_EVENT);
- if (retval) {
- UNLOCK_AV8100_HW;
- @@ -4596,10 +4835,9 @@
- cnt++;
- }
- dev_dbg(adev->dev, "first return cnt:%d\n", cnt);
- - if (cnt == cnt_max) {
- - adev->flag |= AV8100_CHECK_HW_STATUS_EVENT;
- - wake_up_interruptible(&adev->event);
- - }
- + if (cnt == cnt_max)
- + set_flag(adev, AV8100_CHECK_HW_STATUS_EVENT);
- +
- if (retval)
- goto av8100_conf_w_raw_out;
- @@ -4747,6 +4985,11 @@
- struct av8100_device *adev =
- container_of(data, struct av8100_device, early_suspend);
- + set_flag(adev, AV8100_EARLY_SUSPEND_EVENT);
- +}
- +
- +static void early_suspend_handle(struct av8100_device *adev)
- +{
- if (!adev->params.disp_on)
- (void)av8100_powerscan(false);
- adev->params.suspended = true;
- @@ -4757,8 +5000,34 @@
- struct av8100_device *adev =
- container_of(data, struct av8100_device, early_suspend);
- + set_flag(adev, AV8100_LATE_RESUME_EVENT);
- +}
- +
- +static void late_resume_pd_cancel(struct av8100_device *adev)
- +{
- + u8 hpds;
- +
- + adev->params.busy = false;
- + adev->timer_flag = TIMER_UNSET;
- + if (av8100_status_get().av8100_state <= AV8100_OPMODE_SHUTDOWN)
- + return;
- +
- + av8100_enable_interrupt();
- + if ((av8100_reg_stby_r(NULL, NULL, &hpds, NULL, NULL)) == 0)
- + if (hpds)
- + set_plug_status(adev, AV8100_HDMI_PLUGIN);
- +}
- +
- +static void late_resume_handle(struct av8100_device *adev)
- +{
- adev->params.suspended = false;
- - (void)av8100_powerwakeup(false);
- + if (!adev->params.disp_on) {
- + if (adev->timer_flag == TIMER_POWERDOWN)
- + late_resume_pd_cancel(adev);
- + clr_flag(adev, AV8100_EVENTS);
- + hrtimer_cancel(&adev->hrtimer);
- + (void)av8100_powerwakeup(false);
- + }
- }
- static int av8100_open(struct inode *inode, struct file *filp)
- @@ -4805,6 +5074,13 @@
- dev_info(dev, "av8100_params_init failed\n");
- return -EFAULT;
- }
- +
- + mutex_init(&adev->hw_mutex);
- + mutex_init(&adev->fwdl_mutex);
- + mutex_init(&adev->usrcnt_mutex);
- + mutex_init(&adev->conf_mutex);
- + spin_lock_init(&adev->flag_lock);
- +
- return 0;
- }
- diff -ruN .a/drivers/video/av8100/hdmi.c .b/drivers/video/av8100/hdmi.c
- --- .a/drivers/video/av8100/hdmi.c 2012-10-23 21:38:06.000000000 +0900
- +++ .b/drivers/video/av8100/hdmi.c 2013-01-08 21:13:47.000000000 +0900
- @@ -409,6 +409,7 @@
- {
- union av8100_configuration config;
- struct av8100_status status;
- + int ret = 0;
- status = av8100_status_get();
- if (status.av8100_state < AV8100_OPMODE_STANDBY)
- @@ -429,19 +430,24 @@
- config.infoframes_format.crc = crc;
- config.infoframes_format.length = data_len;
- memcpy(&config.infoframes_format.data, data, data_len);
- + av8100_conf_lock();
- if (av8100_conf_prep(AV8100_COMMAND_INFOFRAMES,
- &config) != 0) {
- dev_err(hdev->dev, "av8100_conf_prep FAIL\n");
- - return -EINVAL;
- + ret = -EINVAL;
- + goto infofrsend_end;
- }
- if (av8100_conf_w(AV8100_COMMAND_INFOFRAMES,
- NULL, NULL, I2C_INTERFACE) != 0) {
- dev_err(hdev->dev, "av8100_conf_w FAIL\n");
- - return -EINVAL;
- + ret = -EINVAL;
- + goto infofrsend_end;
- }
- - return 0;
- +infofrsend_end:
- + av8100_conf_unlock();
- + return ret;
- }
- static int hdcpchkaesotp(struct hdmi_device *hdev, u8 *crc, u8 *progged)
- @@ -696,6 +702,7 @@
- {
- union av8100_configuration config;
- struct av8100_status status;
- + int ret = 0;
- status = av8100_status_get();
- if (status.av8100_state < AV8100_OPMODE_STANDBY) {
- @@ -720,19 +727,24 @@
- config.audio_input_format.audio_if_mode = cfg->if_mode;
- config.audio_input_format.audio_mute = cfg->mute;
- + av8100_conf_lock();
- if (av8100_conf_prep(AV8100_COMMAND_AUDIO_INPUT_FORMAT,
- &config) != 0) {
- dev_err(hdev->dev, "av8100_conf_prep FAIL\n");
- - return -EINVAL;
- + ret = -EINVAL;
- + goto audiocfg_end;
- }
- if (av8100_conf_w(AV8100_COMMAND_AUDIO_INPUT_FORMAT,
- NULL, NULL, I2C_INTERFACE) != 0) {
- dev_err(hdev->dev, "av8100_conf_w FAIL\n");
- - return -EINVAL;
- + ret = -EINVAL;
- + goto audiocfg_end;
- }
- - return 0;
- +audiocfg_end:
- + av8100_conf_unlock();
- + return ret;
- }
- /* sysfs */
- @@ -2162,15 +2174,19 @@
- else
- config.hdmi_format.hdmi_mode = AV8100_HDMI_ON;
- + av8100_conf_lock();
- if (av8100_conf_prep(AV8100_COMMAND_HDMI, &config) != 0) {
- dev_err(hdev->dev, "av8100_conf_prep FAIL\n");
- + av8100_conf_unlock();
- return -EINVAL;
- }
- if (av8100_conf_w(AV8100_COMMAND_HDMI, NULL, NULL,
- I2C_INTERFACE) != 0) {
- dev_err(hdev->dev, "av8100_conf_w FAIL\n");
- + av8100_conf_unlock();
- return -EINVAL;
- }
- + av8100_conf_unlock();
- }
- break;
- diff -ruN .a/drivers/video/mcde/display-av8100.c .b/drivers/video/mcde/display-av8100.c
- --- .a/drivers/video/mcde/display-av8100.c 2012-10-23 21:38:06.000000000 +0900
- +++ .b/drivers/video/mcde/display-av8100.c 2013-01-08 21:13:47.000000000 +0900
- @@ -972,34 +972,48 @@
- }
- }
- + av8100_conf_lock();
- +
- /*
- * Don't look at dev->port->hdmi_sdtv_switch; it states only which
- * one should be started, not which one is currently working
- */
- - if (av8100_conf_get(AV8100_COMMAND_HDMI, &av8100_config))
- - return -EFAULT;
- + if (av8100_conf_get(AV8100_COMMAND_HDMI, &av8100_config)) {
- + ret = -EFAULT;
- + goto hdmi_set_video_mode_end;
- + }
- if (av8100_config.hdmi_format.hdmi_mode == AV8100_HDMI_ON) {
- /* Set HDMI mode to OFF */
- av8100_config.hdmi_format.hdmi_mode = AV8100_HDMI_OFF;
- av8100_config.hdmi_format.dvi_format = AV8100_DVI_CTRL_CTL0;
- av8100_config.hdmi_format.hdmi_format = AV8100_HDMI;
- - if (av8100_conf_prep(AV8100_COMMAND_HDMI, &av8100_config))
- - return -EFAULT;
- + if (av8100_conf_prep(AV8100_COMMAND_HDMI, &av8100_config)) {
- + ret = -EFAULT;
- + goto hdmi_set_video_mode_end;
- + }
- if (av8100_conf_w(AV8100_COMMAND_HDMI, NULL, NULL,
- - I2C_INTERFACE))
- - return -EFAULT;
- + I2C_INTERFACE)) {
- + ret = -EFAULT;
- + goto hdmi_set_video_mode_end;
- + }
- + }
- + if (av8100_conf_get(AV8100_COMMAND_DENC, &av8100_config)) {
- + ret = -EFAULT;
- + goto hdmi_set_video_mode_end;
- }
- - if (av8100_conf_get(AV8100_COMMAND_DENC, &av8100_config))
- - return -EFAULT;
- if (av8100_config.denc_format.enable) {
- /* Turn off DENC */
- av8100_config.denc_format.enable = 0;
- - if (av8100_conf_prep(AV8100_COMMAND_DENC, &av8100_config))
- - return -EFAULT;
- + if (av8100_conf_prep(AV8100_COMMAND_DENC, &av8100_config)) {
- + ret = -EFAULT;
- + goto hdmi_set_video_mode_end;
- + }
- if (av8100_conf_w(AV8100_COMMAND_DENC, NULL, NULL,
- - I2C_INTERFACE))
- - return -EFAULT;
- + I2C_INTERFACE)) {
- + ret = -EFAULT;
- + goto hdmi_set_video_mode_end;
- + }
- }
- /* Get current av8100 video output format */
- @@ -1009,7 +1023,7 @@
- dev_err(&dev->dev, "%s:av8100_conf_get "
- "AV8100_COMMAND_VIDEO_OUTPUT_FORMAT failed\n",
- __func__);
- - return ret;
- + goto hdmi_set_video_mode_end;
- }
- if (dev->port->hdmi_sdtv_switch == SDTV_SWITCH)
- @@ -1033,7 +1047,7 @@
- av8100_config.video_output_format.video_output_cea_vesa) {
- dev_err(&dev->dev, "%s:video output format not found "
- "\n", __func__);
- - return ret;
- + goto hdmi_set_video_mode_end;
- }
- ret = av8100_conf_prep(AV8100_COMMAND_VIDEO_OUTPUT_FORMAT,
- @@ -1042,7 +1056,7 @@
- dev_err(&dev->dev, "%s:av8100_conf_prep "
- "AV8100_COMMAND_VIDEO_OUTPUT_FORMAT failed\n",
- __func__);
- - return ret;
- + goto hdmi_set_video_mode_end;
- }
- /* Get current av8100 video input format */
- @@ -1052,7 +1066,7 @@
- dev_err(&dev->dev, "%s:av8100_conf_get "
- "AV8100_COMMAND_VIDEO_INPUT_FORMAT failed\n",
- __func__);
- - return ret;
- + goto hdmi_set_video_mode_end;
- }
- /* Set correct av8100 video input pixel format */
- @@ -1107,7 +1121,7 @@
- dev_err(&dev->dev, "%s:av8100_conf_prep "
- "AV8100_COMMAND_VIDEO_INPUT_FORMAT failed\n",
- __func__);
- - return ret;
- + goto hdmi_set_video_mode_end;
- }
- ret = av8100_conf_w(AV8100_COMMAND_VIDEO_INPUT_FORMAT,
- @@ -1116,7 +1130,7 @@
- dev_err(&dev->dev, "%s:av8100_conf_w "
- "AV8100_COMMAND_VIDEO_INPUT_FORMAT failed\n",
- __func__);
- - return ret;
- + goto hdmi_set_video_mode_end;
- }
- if (dev->port->hdmi_sdtv_switch == SDTV_SWITCH) {
- @@ -1141,7 +1155,7 @@
- dev_err(&dev->dev, "%s:av8100_configuration_prepare "
- "AV8100_COMMAND_COLORSPACECONVERSION failed\n",
- __func__);
- - return ret;
- + goto hdmi_set_video_mode_end;
- }
- ret = av8100_conf_w(
- @@ -1151,7 +1165,7 @@
- dev_err(&dev->dev, "%s:av8100_conf_w "
- "AV8100_COMMAND_COLORSPACECONVERSION failed\n",
- __func__);
- - return ret;
- + goto hdmi_set_video_mode_end;
- }
- /* Set video output format */
- @@ -1159,7 +1173,7 @@
- NULL, NULL, I2C_INTERFACE);
- if (ret) {
- dev_err(&dev->dev, "av8100_conf_w failed\n");
- - return ret;
- + goto hdmi_set_video_mode_end;
- }
- /* Set audio input format */
- @@ -1169,13 +1183,16 @@
- dev_err(&dev->dev, "%s:av8100_conf_w "
- "AV8100_COMMAND_AUDIO_INPUT_FORMAT failed\n",
- __func__);
- - return ret;
- + goto hdmi_set_video_mode_end;
- }
- dev->update_flags |= UPDATE_FLAG_VIDEO_MODE;
- dev->first_update = true;
- - return 0;
- +hdmi_set_video_mode_end:
- + av8100_conf_unlock();
- +
- + return ret;
- }
- static u16 rotate_byte_left(u8 c, int nr)
- @@ -1264,10 +1281,13 @@
- * Only one of them should be enabled.
- * Note HDMI/DVI and DENC are always turned off in set_video_mode.
- */
- + av8100_conf_lock();
- switch (dev->port->hdmi_sdtv_switch) {
- case SDTV_SWITCH:
- - if (av8100_conf_get(AV8100_COMMAND_DENC, &av8100_config))
- - return -EFAULT;
- + if (av8100_conf_get(AV8100_COMMAND_DENC, &av8100_config)) {
- + ret = -EFAULT;
- + goto hdmi_on_first_update_end;
- + }
- av8100_config.denc_format.enable = 1;
- if (dev->video_mode.yres == NATIVE_YRES_SDTV) {
- av8100_config.denc_format.standard_selection =
- @@ -1300,7 +1320,7 @@
- if (ret) {
- dev_err(&dev->dev, "%s:av8100_conf_prep "
- "AV8100_COMMAND_HDMI/DENC failed\n", __func__);
- - return ret;
- + goto hdmi_on_first_update_end;
- }
- if (dev->port->hdmi_sdtv_switch == SDTV_SWITCH)
- @@ -1312,12 +1332,16 @@
- if (ret) {
- dev_err(&dev->dev, "%s:av8100_conf_w "
- "AV8100_COMMAND_HDMI/DENC failed\n", __func__);
- - return ret;
- + goto hdmi_on_first_update_end;
- }
- -
- +hdmi_on_first_update_end:
- + av8100_conf_unlock();
- return ret;
- }
- +#define HDMI_GET_RETRY_TIME 500000
- +#define HDMI_GET_RETRY_CNT_MAX 4
- +
- static int hdmi_set_power_mode(struct mcde_display_device *ddev,
- enum mcde_display_power_mode power_mode)
- {
- @@ -1327,6 +1351,9 @@
- /* OFF -> STANDBY */
- if (ddev->power_mode == MCDE_DISPLAY_PM_OFF &&
- power_mode != MCDE_DISPLAY_PM_OFF) {
- + int cnt;
- + int get_res;
- +
- /*
- * the regulator for analog TV out is only enabled here,
- * this means that one needs to switch to the OFF state
- @@ -1341,9 +1368,21 @@
- ddev->power_mode = MCDE_DISPLAY_PM_STANDBY;
- /* Get HDMI resource */
- - av8100_hdmi_get();
- + for (cnt = 0; cnt < HDMI_GET_RETRY_CNT_MAX; cnt++) {
- + get_res = av8100_hdmi_get(AV8100_HDMI_USER_VIDEO);
- + if (get_res >= 0)
- + break;
- + else
- + usleep_range(HDMI_GET_RETRY_TIME,
- + HDMI_GET_RETRY_TIME * 12 / 10);
- + }
- - hdmi_set_port_pixel_format(ddev);
- + if (get_res < 0)
- + return -EFAULT;
- + else if (get_res > 1)
- + av8100_hdmi_video_on();
- + else
- + hdmi_set_port_pixel_format(ddev);
- }
- /* STANDBY -> ON */
- if (ddev->power_mode == MCDE_DISPLAY_PM_STANDBY &&
- @@ -1364,8 +1403,8 @@
- memset(&(ddev->video_mode), 0, sizeof(struct mcde_video_mode));
- /* Put HDMI resource */
- - if (av8100_hdmi_put()) {
- - /* Audio is still used; disable video */
- + if (av8100_hdmi_put(AV8100_HDMI_USER_VIDEO)) {
- + /* Audio is still used */
- av8100_hdmi_video_off();
- }
- diff -ruN .a/drivers/video/mcde/mcde_hw.c .b/drivers/video/mcde/mcde_hw.c
- --- .a/drivers/video/mcde/mcde_hw.c 2012-10-23 21:38:06.000000000 +0900
- +++ .b/drivers/video/mcde/mcde_hw.c 2013-01-08 21:13:47.000000000 +0900
- @@ -3533,6 +3533,9 @@
- static int _mcde_chnl_enable(struct mcde_chnl_state *chnl)
- {
- dev_vdbg(&mcde_dev->dev, "%s\n", __func__);
- + if (!chnl)
- + return -EINVAL;
- +
- chnl->enabled = true;
- chnl->first_frame_vsync_fix = true;
- return 0;
- @@ -3676,7 +3679,7 @@
- {
- dev_vdbg(&mcde_dev->dev, "%s\n", __func__);
- - if (!chnl->reserved)
- + if (!chnl || !chnl->reserved)
- return -EINVAL;
- chnl->power_mode = power_mode;
- diff -ruN .a/include/video/av8100.h .b/include/video/av8100.h
- --- .a/include/video/av8100.h 2012-10-23 21:38:06.000000000 +0900
- +++ .b/include/video/av8100.h 2013-01-08 21:13:47.000000000 +0900
- @@ -201,6 +201,11 @@
- AV8100_PATTERN_AUDIO_I2S_MEM
- };
- +enum av8100_hdmi_user {
- + AV8100_HDMI_USER_AUDIO,
- + AV8100_HDMI_USER_VIDEO
- +};
- +
- struct av8100_video_input_format_cmd {
- enum av8100_dsi_mode dsi_input_mode;
- enum av8100_pixel_format input_pixel_format;
- @@ -409,11 +414,13 @@
- int av8100_init(void);
- void av8100_exit(void);
- -int av8100_hdmi_get(void);
- -int av8100_hdmi_put(void);
- +int av8100_hdmi_get(enum av8100_hdmi_user user);
- +int av8100_hdmi_put(enum av8100_hdmi_user user);
- int av8100_hdmi_video_off(void);
- +int av8100_hdmi_video_on(void);
- +void av8100_conf_lock(void);
- +void av8100_conf_unlock(void);
- int av8100_powerwakeup(bool from_scan_mode);
- -int av8100_powerscan(bool to_scan_mode);
- int av8100_powerup(void);
- int av8100_powerdown(void);
- int av8100_disable_interrupt(void);
- diff -ruN .a/kernel-build-sin.sh .b/kernel-build-sin.sh
- --- .a/kernel-build-sin.sh 2012-10-23 21:38:06.000000000 +0900
- +++ .b/kernel-build-sin.sh 1970-01-01 09:00:00.000000000 +0900
- @@ -1,102 +0,0 @@
- -#!/bin/bash
- -
- -die () {
- - echo >&2 "$@"
- - exit 1
- -}
- -
- -PRODUCT_DEFCNFG=$1
- -FSCONFIG=$2
- -
- -[ "$1" = "" ] && die "product{cdb/hayabusa/..} has to be specified as first argument"
- -[ "$2" = "" ] && die "fsconfig.xml has to be specified as second argument"
- -
- -if [ ! -f "arch/arm/configs/${PRODUCT_DEFCNFG}" ]; then
- - # instead of specifying blue_cdb_defconfig, it could be 'cdb'
- - PRODUCT_DEFCNFG=riogrande_${PRODUCT_DEFCNFG}_defconfig
- -fi
- -
- -if [ ! -f "arch/arm/configs/${PRODUCT_DEFCNFG}" ]; then
- - echo "Please use any of the following products:"
- - for line in $(ls arch/arm/configs/riogrande_*_defconfig);
- - do
- - NAME=$(basename $line)
- - echo " - $NAME"
- - done
- - exit 1
- -fi
- -
- -if [ ! -f "$OUT/ramdisk.img" ]; then
- - echo "Missing ramdisk.img in $OUT"
- - exit 1
- -fi
- -
- -echo "Using defconfig ${PRODUCT_DEFCNFG}"
- -
- -#---------------------------------------------------------------------
- -# Check the actual number of CPUs on the machine and adjust the number
- -#---------------------------------------------------------------------
- -CPU_COUNT=`grep "^processor" /proc/cpuinfo | wc -l`
- -if [ $? -eq 0 -a -n "$CPU_COUNT" ] ; then
- - JOBS=`expr $CPU_COUNT + 1`
- - echo Found $CPU_COUNT CPUs, building with $JOBS parallel jobs.
- -else
- - JOBS=5
- - echo Unable to determine number of CPUs, defaulting to $JOBS parallel jobs.
- -fi
- -
- -#------------------------------------------------------------
- -# Need this to be able to build. Taken from kernel/Android.mk
- -#------------------------------------------------------------
- -export STERICSSON_WLAN_BUILT_IN=y
- -
- -if [ "$3" == "clean" ] ; then
- - echo 'Cleaning build...'
- - #-------------------
- - # Clean up the build
- - #-------------------
- - ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- make mrproper
- -fi
- -
- -if [ ! -e ".config" ] ; then
- - echo 'No .config file, generating...'
- - #---------------------------
- - # kernel configuration setup
- - #---------------------------
- - ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- make $PRODUCT_DEFCNFG
- -fi
- -
- -#------
- -# Build
- -#------
- -ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- make -j$JOBS
- -
- -if [ $? -ne 0 ] ; then
- - echo "Build error - skip signing"
- - exit 1
- -fi
- -
- -#------
- -# Sign
- -#------
- -
- -SIN_PATH=../vendor/semc/build/sin
- -
- -MKELFPY=$SIN_PATH/mkelf.py
- -SEMCSC=$SIN_PATH/semcsc.py
- -CSH=$SIN_PATH/create_sin_header
- -
- -# kernel.elf
- -$MKELFPY -o kernel-unsigned.elf arch/arm/boot/zImage@0x00008000 \
- - $OUT/ramdisk.img@0x1000000,ramdisk $OUT/cmdline.txt@cmdline
- -
- -$SEMCSC -c $FSCONFIG -p Kernel -t internal -i kernel-unsigned.elf -o kernel.elf
- -
- -# kernel.si_
- -$CSH Kernel $FSCONFIG kernel.si_
- -cat kernel.elf >> kernel.si_
- -
- -# kernel.sin
- -$SEMCSC -c $FSCONFIG -p Kernel -t external -i kernel.si_ -o kernel.sin
- -
- -echo "All done."
- diff -ruN .a/net/compat-wireless/drivers/staging/cw1200/ap.c .b/net/compat-wireless/drivers/staging/cw1200/ap.c
- --- .a/net/compat-wireless/drivers/staging/cw1200/ap.c 2012-10-23 21:38:07.000000000 +0900
- +++ .b/net/compat-wireless/drivers/staging/cw1200/ap.c 2013-01-08 21:13:48.000000000 +0900
- @@ -532,6 +532,17 @@
- MAX_BEACON_SKIP_TIME_MS ? 1 :
- priv->join_dtim_period, 0));
- + if (sta && cw1200_is_ht(&priv->ht_info)) {
- + if (priv->join_status == CW1200_JOIN_STATUS_STA &&
- + !priv->block_ack_enabled) {
- + ap_printk(KERN_DEBUG
- + "[STA] Enabling Block ACK\n");
- + WARN_ON(wsm_set_block_ack_policy(priv,
- + priv->ba_tid_mask,
- + priv->ba_tid_mask));
- + priv->block_ack_enabled = true;
- + }
- + }
- cw1200_set_pm(priv, &priv->powersave_mode);
- if (priv->vif->p2p) {
- ap_printk(KERN_DEBUG
- diff -ruN .a/net/compat-wireless/drivers/staging/cw1200/cw1200.h .b/net/compat-wireless/drivers/staging/cw1200/cw1200.h
- --- .a/net/compat-wireless/drivers/staging/cw1200/cw1200.h 2012-10-23 21:38:07.000000000 +0900
- +++ .b/net/compat-wireless/drivers/staging/cw1200/cw1200.h 2013-01-08 21:13:48.000000000 +0900
- @@ -53,11 +53,6 @@
- #define CW1200_MAX_TID (8)
- -#define CW1200_BLOCK_ACK_CNT (30)
- -#define CW1200_BLOCK_ACK_THLD (800)
- -#define CW1200_BLOCK_ACK_HIST (3)
- -#define CW1200_BLOCK_ACK_INTERVAL (1 * HZ / CW1200_BLOCK_ACK_HIST)
- -
- #define CW1200_JOIN_TIMEOUT (1 * HZ)
- #define CW1200_AUTH_TIMEOUT (5 * HZ)
- @@ -172,15 +167,6 @@
- struct work_struct update_filtering_work;
- struct work_struct set_beacon_wakeup_period_work;
- u8 ba_tid_mask;
- - int ba_acc;
- - int ba_cnt;
- - int ba_cnt_rx;
- - int ba_acc_rx;
- - int ba_hist;
- - struct timer_list ba_timer;
- - spinlock_t ba_lock;
- - bool ba_ena;
- - struct work_struct ba_work;
- struct cw1200_pm_state pm_state;
- struct wsm_p2p_ps_modeinfo p2p_ps_modeinfo;
- struct wsm_uapsd_info uapsd_info;
- @@ -306,6 +292,7 @@
- u8 action_linkid;
- #endif
- atomic_t hw_state;
- + bool block_ack_enabled;
- };
- struct cw1200_sta_priv {
- diff -ruN .a/net/compat-wireless/drivers/staging/cw1200/debug.c .b/net/compat-wireless/drivers/staging/cw1200/debug.c
- --- .a/net/compat-wireless/drivers/staging/cw1200/debug.c 2012-10-23 21:38:07.000000000 +0900
- +++ .b/net/compat-wireless/drivers/staging/cw1200/debug.c 2013-01-08 21:13:48.000000000 +0900
- @@ -112,20 +112,6 @@
- struct list_head *item;
- struct cw1200_common *priv = seq->private;
- struct cw1200_debug_priv *d = priv->debug;
- - int ba_cnt, ba_acc, ba_cnt_rx, ba_acc_rx, ba_avg = 0, ba_avg_rx = 0;
- - bool ba_ena;
- -
- - spin_lock_bh(&priv->ba_lock);
- - ba_cnt = priv->debug->ba_cnt;
- - ba_acc = priv->debug->ba_acc;
- - ba_cnt_rx = priv->debug->ba_cnt_rx;
- - ba_acc_rx = priv->debug->ba_acc_rx;
- - ba_ena = priv->ba_ena;
- - if (ba_cnt)
- - ba_avg = ba_acc / ba_cnt;
- - if (ba_cnt_rx)
- - ba_avg_rx = ba_acc_rx / ba_cnt_rx;
- - spin_unlock_bh(&priv->ba_lock);
- seq_puts(seq, "CW1200 Wireless LAN driver status\n");
- seq_printf(seq, "Hardware: %d.%d\n",
- @@ -238,11 +224,6 @@
- ++i;
- spin_unlock_bh(&priv->tx_policy_cache.lock);
- seq_printf(seq, "RC in use: %d\n", i);
- - seq_printf(seq, "BA stat: %d, %d (%d)\n",
- - ba_cnt, ba_acc, ba_avg);
- - seq_printf(seq, "BA RX stat: %d, %d (%d)\n",
- - ba_cnt_rx, ba_acc_rx, ba_avg_rx);
- - seq_printf(seq, "Block ACK: %s\n", ba_ena ? "on" : "off");
- seq_puts(seq, "\n");
- for (i = 0; i < 4; ++i) {
- diff -ruN .a/net/compat-wireless/drivers/staging/cw1200/debug.h .b/net/compat-wireless/drivers/staging/cw1200/debug.h
- --- .a/net/compat-wireless/drivers/staging/cw1200/debug.h 2012-10-23 21:38:07.000000000 +0900
- +++ .b/net/compat-wireless/drivers/staging/cw1200/debug.h 2013-01-08 21:13:48.000000000 +0900
- @@ -45,10 +45,6 @@
- int tx_ttl;
- int tx_burst;
- int rx_burst;
- - int ba_cnt;
- - int ba_acc;
- - int ba_cnt_rx;
- - int ba_acc_rx;
- #ifdef CONFIG_CW1200_ITP
- struct cw1200_itp itp;
- #endif /* CONFIG_CW1200_ITP */
- @@ -112,16 +108,6 @@
- ++priv->debug->rx_burst;
- }
- -static inline void cw1200_debug_ba(struct cw1200_common *priv,
- - int ba_cnt, int ba_acc, int ba_cnt_rx,
- - int ba_acc_rx)
- -{
- - priv->debug->ba_cnt = ba_cnt;
- - priv->debug->ba_acc = ba_acc;
- - priv->debug->ba_cnt_rx = ba_cnt_rx;
- - priv->debug->ba_acc_rx = ba_acc_rx;
- -}
- -
- int cw1200_print_fw_version(struct cw1200_common *priv, u8 *buf, size_t len);
- typedef enum {
- @@ -202,11 +188,6 @@
- {
- }
- -static inline void cw1200_debug_ba(struct cw1200_common *priv,
- - int ba_cnt, int ba_acc, int ba_cnt_rx, int ba_acc_rx)
- -{
- -}
- -
- int cw1200_print_fw_version(struct cw1200_common *priv, u8 *buf, size_t len)
- {
- }
- diff -ruN .a/net/compat-wireless/drivers/staging/cw1200/main.c .b/net/compat-wireless/drivers/staging/cw1200/main.c
- --- .a/net/compat-wireless/drivers/staging/cw1200/main.c 2012-10-23 21:38:07.000000000 +0900
- +++ .b/net/compat-wireless/drivers/staging/cw1200/main.c 2013-01-08 21:13:48.000000000 +0900
- @@ -367,14 +367,9 @@
- INIT_WORK(&priv->update_filtering_work, cw1200_update_filtering_work);
- INIT_WORK(&priv->set_beacon_wakeup_period_work,
- cw1200_set_beacon_wakeup_period_work);
- - INIT_WORK(&priv->ba_work, cw1200_ba_work);
- init_timer(&priv->mcast_timeout);
- priv->mcast_timeout.data = (unsigned long)priv;
- priv->mcast_timeout.function = cw1200_mcast_timeout;
- - spin_lock_init(&priv->ba_lock);
- - init_timer(&priv->ba_timer);
- - priv->ba_timer.data = (unsigned long)priv;
- - priv->ba_timer.function = cw1200_ba_timer;
- if (unlikely(cw1200_queue_stats_init(&priv->tx_queue_stats,
- CW1200_LINK_ID_MAX,
- cw1200_skb_dtor,
- @@ -474,7 +469,6 @@
- ieee80211_unregister_hw(dev);
- del_timer_sync(&priv->mcast_timeout);
- - del_timer_sync(&priv->ba_timer);
- cw1200_debug_release(priv);
- diff -ruN .a/net/compat-wireless/drivers/staging/cw1200/pm.c .b/net/compat-wireless/drivers/staging/cw1200/pm.c
- --- .a/net/compat-wireless/drivers/staging/cw1200/pm.c 2012-10-23 21:38:07.000000000 +0900
- +++ .b/net/compat-wireless/drivers/staging/cw1200/pm.c 2013-01-08 21:13:48.000000000 +0900
- @@ -309,9 +309,6 @@
- if (ret)
- goto revert5;
- - /* Cancel block ack stat timer */
- - del_timer_sync(&priv->ba_timer);
- -
- /* Store suspend state */
- pm_state->suspend_state = state;
- @@ -404,13 +401,6 @@
- cw1200_resume_work(priv, &priv->link_id_gc_work,
- state->link_id_gc);
- - /* Restart block ack stat */
- - spin_lock_bh(&priv->ba_lock);
- - if (priv->ba_cnt)
- - mod_timer(&priv->ba_timer,
- - jiffies + CW1200_BLOCK_ACK_INTERVAL);
- - spin_unlock_bh(&priv->ba_lock);
- -
- /* Remove UDP port filter */
- wsm_set_udp_port_filter(priv, &cw1200_udp_port_filter_off);
- diff -ruN .a/net/compat-wireless/drivers/staging/cw1200/sta.c .b/net/compat-wireless/drivers/staging/cw1200/sta.c
- --- .a/net/compat-wireless/drivers/staging/cw1200/sta.c 2012-10-23 21:38:07.000000000 +0900
- +++ .b/net/compat-wireless/drivers/staging/cw1200/sta.c 2013-01-08 21:13:48.000000000 +0900
- @@ -101,6 +101,7 @@
- priv->cqm_link_loss_count = 60;
- priv->cqm_beacon_loss_count = 20;
- + priv->block_ack_enabled = false;
- /* Temporary configuration - beacon filter table */
- __cw1200_bf_configure(priv);
- @@ -141,7 +142,6 @@
- cancel_delayed_work_sync(&priv->link_id_gc_work);
- flush_workqueue(priv->workqueue);
- del_timer_sync(&priv->mcast_timeout);
- - del_timer_sync(&priv->ba_timer);
- mutex_lock(&priv->conf_mutex);
- priv->mode = NL80211_IFTYPE_UNSPECIFIED;
- @@ -1580,15 +1580,6 @@
- WARN_ON(wsm_set_block_ack_policy(priv,
- 0, priv->ba_tid_mask));
- - spin_lock_bh(&priv->ba_lock);
- - priv->ba_ena = false;
- - priv->ba_cnt = 0;
- - priv->ba_acc = 0;
- - priv->ba_hist = 0;
- - priv->ba_cnt_rx = 0;
- - priv->ba_acc_rx = 0;
- - spin_unlock_bh(&priv->ba_lock);
- -
- mgmt_policy.protectedMgmtEnable = 0;
- mgmt_policy.unprotectedMgmtFramesAllowed = 1;
- mgmt_policy.encryptionForAuthFrame = 1;
- @@ -1635,7 +1626,6 @@
- };
- cancel_delayed_work(&priv->join_timeout);
- - del_timer_sync(&priv->ba_timer);
- mutex_lock(&priv->conf_mutex);
- priv->join_pending = false;
- if (unlikely(atomic_read(&priv->scan.in_progress))) {
- @@ -1678,6 +1668,7 @@
- cw1200_update_listening(priv, priv->listening);
- WARN_ON(wsm_set_block_ack_policy(priv,
- 0, priv->ba_tid_mask));
- + priv->block_ack_enabled = false;
- priv->disable_beacon_filter = false;
- cw1200_update_filtering(priv);
- memset(&priv->association_mode, 0,
- @@ -1780,72 +1771,6 @@
- return ret;
- }
- -void cw1200_ba_work(struct work_struct *work)
- -{
- - struct cw1200_common *priv =
- - container_of(work, struct cw1200_common, ba_work);
- - u8 tx_ba_tid_mask;
- -
- - if (priv->join_status != CW1200_JOIN_STATUS_STA)
- - return;
- -
- - spin_lock_bh(&priv->ba_lock);
- - tx_ba_tid_mask = priv->ba_ena ? priv->ba_tid_mask : 0;
- - spin_unlock_bh(&priv->ba_lock);
- -
- - wsm_lock_tx(priv);
- -
- - WARN_ON(wsm_set_block_ack_policy(priv,
- - tx_ba_tid_mask, priv->ba_tid_mask));
- -
- - wsm_unlock_tx(priv);
- -}
- -
- -void cw1200_ba_timer(unsigned long arg)
- -{
- - bool ba_ena;
- - struct cw1200_common *priv =
- - (struct cw1200_common *)arg;
- -
- - spin_lock_bh(&priv->ba_lock);
- - cw1200_debug_ba(priv, priv->ba_cnt, priv->ba_acc, priv->ba_cnt_rx, priv->ba_acc_rx);
- -
- - if (atomic_read(&priv->scan.in_progress)) {
- - priv->ba_cnt = 0;
- - priv->ba_acc = 0;
- - priv->ba_cnt_rx = 0;
- - priv->ba_acc_rx = 0;
- - goto skip_statistic_update;
- - }
- -
- - if (priv->ba_cnt >= CW1200_BLOCK_ACK_CNT &&
- - (priv->ba_acc / priv->ba_cnt >= CW1200_BLOCK_ACK_THLD ||
- - (priv->ba_cnt_rx >= CW1200_BLOCK_ACK_CNT &&
- - priv->ba_acc_rx / priv->ba_cnt_rx >= CW1200_BLOCK_ACK_THLD)))
- - ba_ena = true;
- - else
- - ba_ena = false;
- -
- - priv->ba_cnt = 0;
- - priv->ba_acc = 0;
- - priv->ba_cnt_rx = 0;
- - priv->ba_acc_rx = 0;
- -
- - if (ba_ena != priv->ba_ena) {
- - if (ba_ena || ++priv->ba_hist >= CW1200_BLOCK_ACK_HIST) {
- - priv->ba_ena = ba_ena;
- - priv->ba_hist = 0;
- - sta_printk(KERN_DEBUG "[STA] %s block ACK:\n",
- - ba_ena ? "enable" : "disable");
- - queue_work(priv->workqueue, &priv->ba_work);
- - }
- - } else if (priv->ba_hist)
- - --priv->ba_hist;
- -
- -skip_statistic_update:
- - spin_unlock_bh(&priv->ba_lock);
- -}
- -
- const u8 *cw1200_get_ie(u8 *start, size_t len, u8 ie)
- {
- u8 *end, *pos;
- diff -ruN .a/net/compat-wireless/drivers/staging/cw1200/sta.h .b/net/compat-wireless/drivers/staging/cw1200/sta.h
- --- .a/net/compat-wireless/drivers/staging/cw1200/sta.h 2012-10-23 21:38:07.000000000 +0900
- +++ .b/net/compat-wireless/drivers/staging/cw1200/sta.h 2013-01-08 21:13:48.000000000 +0900
- @@ -92,8 +92,6 @@
- int cw1200_disable_listening(struct cw1200_common *priv);
- int cw1200_set_uapsd_param(struct cw1200_common *priv,
- const struct wsm_edca_params *arg);
- -void cw1200_ba_work(struct work_struct *work);
- -void cw1200_ba_timer(unsigned long arg);
- const u8 *cw1200_get_ie(u8 *start, size_t len, u8 ie);
- #endif
- diff -ruN .a/net/compat-wireless/drivers/staging/cw1200/txrx.c .b/net/compat-wireless/drivers/staging/cw1200/txrx.c
- --- .a/net/compat-wireless/drivers/staging/cw1200/txrx.c 2012-10-23 21:38:07.000000000 +0900
- +++ .b/net/compat-wireless/drivers/staging/cw1200/txrx.c 2013-01-08 21:13:48.000000000 +0900
- @@ -790,27 +790,6 @@
- return !was_buffered;
- }
- -static void
- -cw1200_tx_h_ba_stat(struct cw1200_common *priv,
- - struct cw1200_txinfo *t)
- -{
- - if (priv->join_status != CW1200_JOIN_STATUS_STA)
- - return;
- - if (!cw1200_is_ht(&priv->ht_info))
- - return;
- - if (!ieee80211_is_data(t->hdr->frame_control))
- - return;
- -
- - spin_lock_bh(&priv->ba_lock);
- - priv->ba_acc += t->skb->len - t->hdrlen;
- - if (!(priv->ba_cnt_rx || priv->ba_cnt)) {
- - mod_timer(&priv->ba_timer,
- - jiffies + CW1200_BLOCK_ACK_INTERVAL);
- - }
- - priv->ba_cnt++;
- - spin_unlock_bh(&priv->ba_lock);
- -}
- -
- static int
- cw1200_tx_h_skb_pad(struct cw1200_common *priv,
- struct wsm_tx *wsm,
- @@ -890,7 +869,6 @@
- rcu_read_lock();
- sta = rcu_dereference(t.tx_info->control.sta);
- - cw1200_tx_h_ba_stat(priv, &t);
- spin_lock_bh(&priv->ps_state_lock);
- {
- tid_update = cw1200_tx_h_pm_state(priv, &t);
- @@ -1154,25 +1132,6 @@
- ieee80211_tx_status(priv->hw, skb);
- }
- -static void
- -cw1200_rx_h_ba_stat(struct cw1200_common *priv,
- - size_t hdrlen, size_t skb_len )
- -{
- - if (priv->join_status != CW1200_JOIN_STATUS_STA)
- - return;
- - if (!cw1200_is_ht(&priv->ht_info))
- - return;
- -
- - spin_lock_bh(&priv->ba_lock);
- - priv->ba_acc_rx += skb_len - hdrlen;
- - if (!(priv->ba_cnt_rx || priv->ba_cnt)) {
- - mod_timer(&priv->ba_timer,
- - jiffies + CW1200_BLOCK_ACK_INTERVAL);
- - }
- - priv->ba_cnt_rx++;
- - spin_unlock_bh(&priv->ba_lock);
- -}
- -
- void cw1200_rx_cb(struct cw1200_common *priv,
- struct wsm_rx *arg,
- struct sk_buff **skb_p)
- @@ -1368,9 +1327,6 @@
- else
- grace_period = 1 * HZ;
- - if (ieee80211_is_data(frame->frame_control))
- - cw1200_rx_h_ba_stat( priv, hdrlen, skb->len);
- -
- cw1200_pm_stay_awake(&priv->pm_state, grace_period);
- if (unlikely(cw1200_itp_rxed(priv, skb)))
- diff -ruN .a/sound/soc/codecs/av8100_audio.c .b/sound/soc/codecs/av8100_audio.c
- --- .a/sound/soc/codecs/av8100_audio.c 2012-10-23 21:38:07.000000000 +0900
- +++ .b/sound/soc/codecs/av8100_audio.c 2013-01-08 21:13:48.000000000 +0900
- @@ -179,12 +179,14 @@
- config.hdmi_format.hdmi_mode = AV8100_HDMI_ON;
- config.hdmi_format.hdmi_format = AV8100_HDMI;
- config.hdmi_format.dvi_format = AV8100_DVI_CTRL_CTL0;
- + av8100_conf_lock();
- ret = av8100_conf_prep(AV8100_COMMAND_HDMI, &config);
- if (ret != 0) {
- pr_err("%s: Setting hdmi_format failed "
- "(av8100_conf_prep returned %d)!\n",
- __func__,
- ret);
- + av8100_conf_unlock();
- return -EINVAL;
- }
- ret = av8100_conf_w(AV8100_COMMAND_HDMI,
- @@ -196,9 +198,11 @@
- "(av8100_conf_w returned %d)!\n",
- __func__,
- ret);
- + av8100_conf_unlock();
- return -EINVAL;
- }
- + av8100_conf_unlock();
- return 0;
- }
- @@ -258,12 +262,14 @@
- /* Send audio info-frame */
- pr_info("%s: Sending audio info-frame.", __func__);
- + av8100_conf_lock();
- ret = av8100_conf_prep(AV8100_COMMAND_INFOFRAMES, &config);
- if (ret != 0) {
- pr_err("%s: Sending audio info-frame failed "
- "(av8100_conf_prep returned %d)!\n",
- __func__,
- ret);
- + av8100_conf_unlock();
- return -EINVAL;
- }
- ret = av8100_conf_w(AV8100_COMMAND_INFOFRAMES,
- @@ -275,9 +281,11 @@
- "(av8100_conf_w returned %d)!\n",
- __func__,
- ret);
- + av8100_conf_unlock();
- return -EINVAL;
- }
- + av8100_conf_unlock();
- return 0;
- }
- @@ -302,7 +310,8 @@
- pr_debug("%s: Enter.\n", __func__);
- /* Get HDMI resource */
- - av8100_hdmi_get();
- + if (av8100_hdmi_get(AV8100_HDMI_USER_AUDIO) < 0)
- + return -EBUSY;
- /* Startup AV8100 if it is not already started */
- ret = av8100_codec_powerup();
- @@ -312,7 +321,7 @@
- __func__,
- ret);
- /* Put HDMI resource */
- - av8100_hdmi_put();
- + av8100_hdmi_put(AV8100_HDMI_USER_AUDIO);
- return -EINVAL;
- }
- @@ -323,7 +332,7 @@
- struct snd_soc_dai *codec_dai)
- {
- /* Put HDMI resource */
- - av8100_hdmi_put();
- + av8100_hdmi_put(AV8100_HDMI_USER_AUDIO);
- pr_debug("%s: Enter.\n", __func__);
- }
- @@ -367,12 +376,14 @@
- config.audio_input_format.audio_word_lg = AV8100_AUDIO_16BITS;
- config.audio_input_format.audio_format = AV8100_AUDIO_LPCM_MODE;
- config.audio_input_format.audio_mute = AV8100_AUDIO_MUTE_DISABLE;
- + av8100_conf_lock();
- ret = av8100_conf_prep(AV8100_COMMAND_AUDIO_INPUT_FORMAT, &config);
- if (ret != 0) {
- pr_err("%s: Setting audio_input_format failed "
- "(av8100_conf_prep returned %d)!\n",
- __func__,
- ret);
- + av8100_conf_unlock();
- return -EINVAL;
- }
- ret = av8100_conf_w(AV8100_COMMAND_AUDIO_INPUT_FORMAT,
- @@ -384,9 +395,11 @@
- "(av8100_conf_w returned %d)!\n",
- __func__,
- ret);
- - return -EINVAL;
- + av8100_conf_unlock();
- + return -EINVAL;
- }
- + av8100_conf_unlock();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement