From patchwork Thu Sep 5 13:11:26 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guennadi Liakhovetski X-Patchwork-Id: 2858781 Return-Path: X-Original-To: patchwork-linux-media@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id C21C79F495 for ; Sun, 8 Sep 2013 15:28:23 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C5B88201F6 for ; Sun, 8 Sep 2013 15:28:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0A145201F5 for ; Sun, 8 Sep 2013 15:28:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752760Ab3IHP2Q (ORCPT ); Sun, 8 Sep 2013 11:28:16 -0400 Received: from moutng.kundenserver.de ([212.227.126.186]:65118 "EHLO moutng.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752109Ab3IHP2P (ORCPT ); Sun, 8 Sep 2013 11:28:15 -0400 Received: from axis700.grange (dslb-088-076-066-224.pools.arcor-ip.net [88.76.66.224]) by mrelayeu.kundenserver.de (node=mrbap2) with ESMTP (Nemesis) id 0MalH0-1VYiQ41dBC-00K4VH; Sun, 08 Sep 2013 17:28:11 +0200 Received: by axis700.grange (Postfix, from userid 1000) id EA70540BB6; Thu, 5 Sep 2013 15:11:26 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by axis700.grange (Postfix) with ESMTP id DF94140BB5; Thu, 5 Sep 2013 15:11:26 +0200 (CEST) Date: Thu, 5 Sep 2013 15:11:26 +0200 (CEST) From: Guennadi Liakhovetski X-X-Sender: lyakh@axis700.grange To: Linux Media Mailing List cc: =?ISO-8859-15?Q?Frank_Sch=E4fer?= , Laurent Pinchart , Mauro Carvalho Chehab , Sylwester Nawrocki , Hans Verkuil Subject: [PATCH] em28xx: balance subdevice power-off calls Message-ID: MIME-Version: 1.0 X-Provags-ID: V02:K0:AtwMatyT2y4iSDaB3pvP6LwLjmfVH+6uQeYifYa5HuF oNyWbyYCNGyMVnyBVBsosKlDwk5wuYn+8Vdbfe9Es4IZXEx089 9fBg06xQ6RBzUP6zyBxU0JM2GXY7SdJNs1uV435OIbLR6EPzSC w7sk6jWVXixKQSxuEUlGSzfxnRysgD49TiCEvxWtElMuzOkqVv h/syPQJufqBQOG1vXBJodino4qNxniPvwPQ/tsEXavEO9OxZkf AhttBJDvaRr0dt+LC6RLlj06OFCFjbQg2DthZuLkrQ1RGhDUpO +MhbZTwXsh8BxOx9tYoWU3fa89Vx59aXaISycjqcvRFtzCuyKR EkiKgmC959lDUI6k+vJ9z1Tsr6NuKj84k7VBJz4dS Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Spam-Status: No, score=-7.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The em28xx USB driver powers off its subdevices, by calling their .s_power() methods to save power, but actually never powers them on. Apparently this works with currently used subdevice drivers, but is wrong and might break with some other ones. This patch fixes this issue by adding required .s_power() calls to turn subdevices on. Signed-off-by: Guennadi Liakhovetski --- Please, test - only compile tested due to lack of hardware drivers/media/usb/em28xx/em28xx-cards.c | 1 + drivers/media/usb/em28xx/em28xx-video.c | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c index dc65742..d2d3b06 100644 --- a/drivers/media/usb/em28xx/em28xx-cards.c +++ b/drivers/media/usb/em28xx/em28xx-cards.c @@ -3066,6 +3066,7 @@ static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev, } /* wake i2c devices */ + v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_power, 1); em28xx_wake_i2c(dev); /* init video dma queues */ diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c index 9d10334..283fa26 100644 --- a/drivers/media/usb/em28xx/em28xx-video.c +++ b/drivers/media/usb/em28xx/em28xx-video.c @@ -1589,15 +1589,18 @@ static int em28xx_v4l2_open(struct file *filp) fh->type = fh_type; filp->private_data = fh; - if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) { - em28xx_set_mode(dev, EM28XX_ANALOG_MODE); - em28xx_resolution_set(dev); + if (dev->users == 0) { + v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_power, 1); - /* Needed, since GPIO might have disabled power of - some i2c device - */ - em28xx_wake_i2c(dev); + if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { + em28xx_set_mode(dev, EM28XX_ANALOG_MODE); + em28xx_resolution_set(dev); + /* Needed, since GPIO might have disabled power of + some i2c device + */ + em28xx_wake_i2c(dev); + } } if (vdev->vfl_type == VFL_TYPE_RADIO) {