From patchwork Wed Jul 6 22:59:55 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Longerbeam X-Patchwork-Id: 9217387 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B9DBC60467 for ; Wed, 6 Jul 2016 23:13:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 96DD528524 for ; Wed, 6 Jul 2016 23:13:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 78ACA28527; Wed, 6 Jul 2016 23:13:25 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D490C28524 for ; Wed, 6 Jul 2016 23:13:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932458AbcGFXNX (ORCPT ); Wed, 6 Jul 2016 19:13:23 -0400 Received: from mail-pa0-f66.google.com ([209.85.220.66]:33424 "EHLO mail-pa0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752634AbcGFXNW (ORCPT ); Wed, 6 Jul 2016 19:13:22 -0400 Received: by mail-pa0-f66.google.com with SMTP id ts6so110508pac.0 for ; Wed, 06 Jul 2016 16:13:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ahLzmbGlNlOpnfRRt7nL16MARTE4H2hjq2Bs2MvvEWg=; b=RQxvuVyXUlO1voXAMS61rpehJcLRu07bt3Hdw1yDSKhJZ4nIYp4FmYnBCtS9z7p31y zfbB/HMolpFKQuTz12qJxR0Ng7XQ12rsIcccNvVtZff914Iyr7WPhRPlrDa/1BHgyuPf AQJD7nkTuVRsmqqK8prkEn7KcsKR09B14KjKDwRMjglKPcPR5u0kgRWrfwV35wskGG4K 21qoRYE5F11T1jrYe+eTPLSsXv/acGENMc1G6t8SJP7fOypEyieaegygPM+fNKoHIrKy 643/lHMcNF8on6sZHUz05IfUEj3YZ1g1yRCFo7iMtWnxLThgzsACdrNmpgerr9IN2k5t aWMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ahLzmbGlNlOpnfRRt7nL16MARTE4H2hjq2Bs2MvvEWg=; b=huFPydRwrDW/xKYYdIgOoEfNfW3d89y1+UdiA72gmgblbd7Kh+CEdho/jal9tW9V7Y agl9jTZWE3ab0W9Puy4+8PwkinLVqgFbFNaYh9e84YrNuHLEnBXMtX/sPYx+5vI3NREF rsI4si3j/j0C5QMyXDuDMZtuAOzmJzKw3x4YeIoMisUQTR3F9gQz8TfXfVzv9WgU+7xC Lfo6xzZoEcyb2NKvn0rVVn+7q4L6nu+ZbPElvBJIF+ijwoHq86fMOeGFFzyZZZSDk2xx ffe9J+A+k7nCFr/9VDqVD499gdmfVEu42lieAXTOA7yZpv/xYb175QmyQrnhB36zlfyg wDXA== X-Gm-Message-State: ALyK8tIypbOoEd98iwYGvlYoKEZnjSV1AvsmELkG2e5GlIHFhhiKESCV0a2jtpX7KtugQg== X-Received: by 10.66.21.132 with SMTP id v4mr45838360pae.54.1467846051214; Wed, 06 Jul 2016 16:00:51 -0700 (PDT) Received: from mothership.sklembedded.com (c-73-241-2-21.hsd1.ca.comcast.net. [73.241.2.21]) by smtp.googlemail.com with ESMTPSA id v126sm6915578pfb.60.2016.07.06.16.00.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 06 Jul 2016 16:00:50 -0700 (PDT) From: Steve Longerbeam X-Google-Original-From: Steve Longerbeam To: linux-media@vger.kernel.org Cc: Steve Longerbeam Subject: [PATCH 02/11] Revert "[media] adv7180: fix broken standards handling" Date: Wed, 6 Jul 2016 15:59:55 -0700 Message-Id: <1467846004-12731-3-git-send-email-steve_longerbeam@mentor.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1467846004-12731-1-git-send-email-steve_longerbeam@mentor.com> References: <1467846004-12731-1-git-send-email-steve_longerbeam@mentor.com> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Autodetect was likely broken only because access to the interrupt registers were broken, so there were no standard change interrupts. After fixing that, and reverting this, autodetect seems to work just fine on an i.mx6q SabreAuto. This reverts commit 937feeed3f0ae8a0389d5732f6db63dd912acd99. Tested-by: Tim Harvey Acked-by: Tim Harvey --- drivers/media/i2c/adv7180.c | 118 ++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 80 deletions(-) diff --git a/drivers/media/i2c/adv7180.c b/drivers/media/i2c/adv7180.c index 95cbc85..967303a 100644 --- a/drivers/media/i2c/adv7180.c +++ b/drivers/media/i2c/adv7180.c @@ -26,9 +26,8 @@ #include #include #include -#include #include -#include +#include #include #include #include @@ -193,8 +192,8 @@ struct adv7180_state { struct mutex mutex; /* mutual excl. when accessing chip */ int irq; v4l2_std_id curr_norm; + bool autodetect; bool powered; - bool streaming; u8 input; struct i2c_client *client; @@ -339,26 +338,12 @@ static int adv7180_querystd(struct v4l2_subdev *sd, v4l2_std_id *std) if (err) return err; - if (state->streaming) { - err = -EBUSY; - goto unlock; - } - - err = adv7180_set_video_standard(state, - ADV7180_STD_AD_PAL_BG_NTSC_J_SECAM); - if (err) - goto unlock; - - msleep(100); - __adv7180_status(state, NULL, std); - - err = v4l2_std_to_adv7180(state->curr_norm); - if (err < 0) - goto unlock; - - err = adv7180_set_video_standard(state, err); + /* when we are interrupt driven we know the state */ + if (!state->autodetect || state->irq > 0) + *std = state->curr_norm; + else + err = __adv7180_status(state, NULL, std); -unlock: mutex_unlock(&state->mutex); return err; } @@ -402,13 +387,23 @@ static int adv7180_program_std(struct adv7180_state *state) { int ret; - ret = v4l2_std_to_adv7180(state->curr_norm); - if (ret < 0) - return ret; + if (state->autodetect) { + ret = adv7180_set_video_standard(state, + ADV7180_STD_AD_PAL_BG_NTSC_J_SECAM); + if (ret < 0) + return ret; + + __adv7180_status(state, NULL, &state->curr_norm); + } else { + ret = v4l2_std_to_adv7180(state->curr_norm); + if (ret < 0) + return ret; + + ret = adv7180_set_video_standard(state, ret); + if (ret < 0) + return ret; + } - ret = adv7180_set_video_standard(state, ret); - if (ret < 0) - return ret; return 0; } @@ -420,12 +415,18 @@ static int adv7180_s_std(struct v4l2_subdev *sd, v4l2_std_id std) if (ret) return ret; - /* Make sure we can support this std */ - ret = v4l2_std_to_adv7180(std); - if (ret < 0) - goto out; + /* all standards -> autodetect */ + if (std == V4L2_STD_ALL) { + state->autodetect = true; + } else { + /* Make sure we can support this std */ + ret = v4l2_std_to_adv7180(std); + if (ret < 0) + goto out; - state->curr_norm = std; + state->curr_norm = std; + state->autodetect = false; + } ret = adv7180_program_std(state); out: @@ -746,40 +747,6 @@ static int adv7180_g_tvnorms(struct v4l2_subdev *sd, v4l2_std_id *norm) return 0; } -static int adv7180_s_stream(struct v4l2_subdev *sd, int enable) -{ - struct adv7180_state *state = to_state(sd); - int ret; - - /* It's always safe to stop streaming, no need to take the lock */ - if (!enable) { - state->streaming = enable; - return 0; - } - - /* Must wait until querystd released the lock */ - ret = mutex_lock_interruptible(&state->mutex); - if (ret) - return ret; - state->streaming = enable; - mutex_unlock(&state->mutex); - return 0; -} - -static int adv7180_subscribe_event(struct v4l2_subdev *sd, - struct v4l2_fh *fh, - struct v4l2_event_subscription *sub) -{ - switch (sub->type) { - case V4L2_EVENT_SOURCE_CHANGE: - return v4l2_src_change_event_subdev_subscribe(sd, fh, sub); - case V4L2_EVENT_CTRL: - return v4l2_ctrl_subdev_subscribe_event(sd, fh, sub); - default: - return -EINVAL; - } -} - static const struct v4l2_subdev_video_ops adv7180_video_ops = { .s_std = adv7180_s_std, .g_std = adv7180_g_std, @@ -789,13 +756,10 @@ static const struct v4l2_subdev_video_ops adv7180_video_ops = { .g_mbus_config = adv7180_g_mbus_config, .cropcap = adv7180_cropcap, .g_tvnorms = adv7180_g_tvnorms, - .s_stream = adv7180_s_stream, }; static const struct v4l2_subdev_core_ops adv7180_core_ops = { .s_power = adv7180_s_power, - .subscribe_event = adv7180_subscribe_event, - .unsubscribe_event = v4l2_event_subdev_unsubscribe, }; static const struct v4l2_subdev_pad_ops adv7180_pad_ops = { @@ -820,14 +784,8 @@ static irqreturn_t adv7180_irq(int irq, void *devid) /* clear */ adv7180_write(state, ADV7180_REG_ICR3, isr3); - if (isr3 & ADV7180_IRQ3_AD_CHANGE) { - static const struct v4l2_event src_ch = { - .type = V4L2_EVENT_SOURCE_CHANGE, - .u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION, - }; - - v4l2_subdev_notify_event(&state->sd, &src_ch); - } + if (isr3 & ADV7180_IRQ3_AD_CHANGE && state->autodetect) + __adv7180_status(state, NULL, &state->curr_norm); mutex_unlock(&state->mutex); return IRQ_HANDLED; @@ -1272,7 +1230,7 @@ static int adv7180_probe(struct i2c_client *client, state->irq = client->irq; mutex_init(&state->mutex); - state->curr_norm = V4L2_STD_NTSC; + state->autodetect = true; if (state->chip_info->flags & ADV7180_FLAG_RESET_POWERED) state->powered = true; else @@ -1280,7 +1238,7 @@ static int adv7180_probe(struct i2c_client *client, state->input = 0; sd = &state->sd; v4l2_i2c_subdev_init(sd, client, &adv7180_ops); - sd->flags = V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; + sd->flags = V4L2_SUBDEV_FL_HAS_DEVNODE; ret = adv7180_init_controls(state); if (ret)