From patchwork Wed Jul 6 23:00:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Longerbeam X-Patchwork-Id: 9217393 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 5947F60467 for ; Wed, 6 Jul 2016 23:14:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 49AF428526 for ; Wed, 6 Jul 2016 23:14:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3D29A28529; Wed, 6 Jul 2016 23:14:27 +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 880CB28526 for ; Wed, 6 Jul 2016 23:14:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932692AbcGFXOZ (ORCPT ); Wed, 6 Jul 2016 19:14:25 -0400 Received: from mail-pa0-f66.google.com ([209.85.220.66]:35486 "EHLO mail-pa0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932423AbcGFXOY (ORCPT ); Wed, 6 Jul 2016 19:14:24 -0400 Received: by mail-pa0-f66.google.com with SMTP id dx3so104264pab.2 for ; Wed, 06 Jul 2016 16:14:24 -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=8RECvAvq90iiMOq7P/3gZlHRz0sa0Rm4EZhanNjP1Ro=; b=VXHUl+w+V5alEqmQ+ApeWAvh75k52URqQ9zMpduyosZZObarKIbNWlRLjtgBkIfYf1 bURwkhhbaadN4Trf3hRGp2b0oMiIj2i2H9qnJiEo4OwgFNA/ia7s+alNJss27x1mgyaZ 1D07XEdQBFLbNJo1PmzNIhmnx9rCwPr+6zNLGq6Zkke3Y91Z2kQCJG0iKy9lFAUOCiSn rKWUpYe2h/4WXiXYGR35Ij72yVTlq6K1dUfJGS+j/lY59ES4E4QklgElFI7HmgXRTi71 1rIcKiTTHY5dqvZGmNuAZ5CuFqJpK579lsc77H6FPco0bL4lvwU0aLj3WvRej2fbFQAD 20yg== 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=8RECvAvq90iiMOq7P/3gZlHRz0sa0Rm4EZhanNjP1Ro=; b=HY3pQOkRMN4RRX2/3S6EuLsgRrk8oheaRx2JqthgWZwdAcWc41CXzRA2fk6W0JAEcb 7D38nNODCuZgp2xU2q58vtxZlrqRguXQxuW+IPOeFP/0S6YW3+6VxUtIXjuQnyo0VZ/X q5urMvcbhKGIh9i1vEy2vz91zCUeg+gCXUXAOLIX0RpAWb1AEEbvvyWgQuBQNXD1p7cm RReSkE2+CVEIU/9miYP2onxwMhr6rhP9Vwelr0ewQNLoRdqG3ZBuUhgvty+4+lQwyaKq 1Ui2ExEa/jmYhywcKXXNFTq3291YLwex+1nYi+7gFfIQNULxmhjF9ZQKKGdiltzMx7A0 iTTw== X-Gm-Message-State: ALyK8tKwAOBrDBXAI3j7gs0q3fUBvvgWf4eJfemHlin7moSXt8TVV7Q5MfeQ3NqT23rSHw== X-Received: by 10.66.0.74 with SMTP id 10mr46029409pac.38.1467846059183; Wed, 06 Jul 2016 16:00:59 -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.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 06 Jul 2016 16:00:58 -0700 (PDT) From: Steve Longerbeam X-Google-Original-From: Steve Longerbeam To: linux-media@vger.kernel.org Cc: Steve Longerbeam Subject: [PATCH 10/11] media: adv7180: enable lock/unlock interrupts Date: Wed, 6 Jul 2016 16:00:03 -0700 Message-Id: <1467846004-12731-11-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 Enable the SD lock/unlock interrupts and send V4L2_EVENT_SRC_CH_LOCK_STATUS in the interrupt handler on a detected lock/unlock. Keep track of current input lock status with state->curr_status. Signed-off-by: Steve Longerbeam --- drivers/media/i2c/adv7180.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/drivers/media/i2c/adv7180.c b/drivers/media/i2c/adv7180.c index f76a0e7..4c2623f 100644 --- a/drivers/media/i2c/adv7180.c +++ b/drivers/media/i2c/adv7180.c @@ -216,6 +216,7 @@ struct adv7180_state { int irq; struct gpio_desc *pwdn_gpio; v4l2_std_id curr_norm; + u32 curr_status; /* lock status */ bool autodetect; bool bt656_4; /* use bt.656-4 standard for NTSC */ bool powered; @@ -422,7 +423,12 @@ static int adv7180_g_input_status(struct v4l2_subdev *sd, u32 *status) if (ret) return ret; - ret = __adv7180_status(state, status, NULL); + /* when we are interrupt driven we know the input lock status */ + if (!state->autodetect || state->irq > 0) + *status = state->curr_status; + else + ret = __adv7180_status(state, status, NULL); + mutex_unlock(&state->mutex); return ret; } @@ -437,7 +443,7 @@ static int adv7180_program_std(struct adv7180_state *state) if (ret < 0) return ret; - __adv7180_status(state, NULL, &state->curr_norm); + __adv7180_status(state, &state->curr_status, &state->curr_norm); } else { ret = v4l2_std_to_adv7180(state->curr_norm); if (ret < 0) @@ -872,23 +878,34 @@ static const struct v4l2_subdev_ops adv7180_ops = { static irqreturn_t adv7180_irq(int irq, void *devid) { struct adv7180_state *state = devid; - u8 isr3; + u8 isr1, isr3; mutex_lock(&state->mutex); + isr1 = adv7180_read(state, ADV7180_REG_ISR1); isr3 = adv7180_read(state, ADV7180_REG_ISR3); /* clear */ + adv7180_write(state, ADV7180_REG_ICR1, isr1); adv7180_write(state, ADV7180_REG_ICR3, isr3); - if (isr3 & ADV7180_IRQ3_AD_CHANGE) { - static const struct v4l2_event src_ch = { + if ((isr3 & ADV7180_IRQ3_AD_CHANGE) || + (isr1 & (ADV7180_IRQ1_LOCK | ADV7180_IRQ1_UNLOCK))) { + static struct v4l2_event src_ch = { .type = V4L2_EVENT_SOURCE_CHANGE, - .u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION, }; + if (isr3 & ADV7180_IRQ3_AD_CHANGE) + src_ch.u.src_change.changes |= + V4L2_EVENT_SRC_CH_RESOLUTION; + + if (isr1 & (ADV7180_IRQ1_LOCK | ADV7180_IRQ1_UNLOCK)) + src_ch.u.src_change.changes |= + V4L2_EVENT_SRC_CH_LOCK_STATUS; + v4l2_subdev_notify_event(&state->sd, &src_ch); if (state->autodetect) - __adv7180_status(state, NULL, &state->curr_norm); + __adv7180_status(state, &state->curr_status, + &state->curr_norm); } mutex_unlock(&state->mutex); @@ -1335,7 +1352,9 @@ static int init_device(struct adv7180_state *state) if (ret < 0) goto out_unlock; - ret = adv7180_write(state, ADV7180_REG_IMR1, 0); + /* enable lock/unlock interrupts */ + ret = adv7180_write(state, ADV7180_REG_IMR1, + ADV7180_IRQ1_LOCK | ADV7180_IRQ1_UNLOCK); if (ret < 0) goto out_unlock;