From patchwork Thu Apr 18 21:35:43 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guennadi Liakhovetski X-Patchwork-Id: 2462511 Return-Path: X-Original-To: patchwork-linux-media@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 07EBCDF2E5 for ; Thu, 18 Apr 2013 21:36:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S936509Ab3DRVgC (ORCPT ); Thu, 18 Apr 2013 17:36:02 -0400 Received: from moutng.kundenserver.de ([212.227.126.187]:60219 "EHLO moutng.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S936231Ab3DRVf6 (ORCPT ); Thu, 18 Apr 2013 17:35:58 -0400 Received: from axis700.grange (dslb-088-077-162-170.pools.arcor-ip.net [88.77.162.170]) by mrelayeu.kundenserver.de (node=mrbap2) with ESMTP (Nemesis) id 0M9N4I-1UNxbe3YVy-00D34m; Thu, 18 Apr 2013 23:35:57 +0200 Received: from 6a.grange (6a.grange [192.168.1.11]) by axis700.grange (Postfix) with ESMTPS id 9BEC440BD1; Thu, 18 Apr 2013 23:35:55 +0200 (CEST) Received: from lyakh by 6a.grange with local (Exim 4.72) (envelope-from ) id 1USwUl-0005eA-A8; Thu, 18 Apr 2013 23:35:55 +0200 From: Guennadi Liakhovetski To: linux-media@vger.kernel.org Cc: Laurent Pinchart , Guennadi Liakhovetski Subject: [PATCH 22/24] V4L2: soc-camera: use the pad-operation wrapper Date: Thu, 18 Apr 2013 23:35:43 +0200 Message-Id: <1366320945-21591-23-git-send-email-g.liakhovetski@gmx.de> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1366320945-21591-1-git-send-email-g.liakhovetski@gmx.de> References: <1366320945-21591-1-git-send-email-g.liakhovetski@gmx.de> X-Provags-ID: V02:K0:5ZUDalP2O1tEygjHPhoQI0diYqBsDyr4ejtHE9SJkbp +kdzxIgr5djm8GBNUtfnDLSsDS2WCQ1GpotMR+iReQ4Ypjb/OK ebBN8v5CMRWK4i0lWFiETw0zQKPY7fv+TNtoQOF4HVU4QvUcHk XjHDbaqs8BxrCGgaEg7Zt2Xtzt0vYX1i+2icu608XMbqysvS4M peKHQwm7XiYPojHPTX/It9gz1lqPvFpSoOT2inDLPp2k1On485 bQbydIEAbtkVCwg4rs+5Pq8EOsk6ZiJVjDDUuYA1b2Pewjk6g5 1AAQ6ppXLgvlizMkab81vJ+Jeye4xlNBZsKl9uCq6GzW/Dob2y +l0T6KiiQfsoHMn2wYFmvpizmWd0h245RT/XJjb6zH19w64e07 OhpfPor4MqBWePJvSBmlo3mnky9QLmsEMk= Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org This patch adds support for the pad-operation wrapper to soc-camera, which allows pure pad-level subdevice drivers, e.g. mt9p031 to be used with soc-camera. Signed-off-by: Guennadi Liakhovetski --- drivers/media/platform/soc_camera/soc_camera.c | 19 +++++++++++++++++-- 1 files changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/soc_camera/soc_camera.c b/drivers/media/platform/soc_camera/soc_camera.c index 3113287..dfd1741 100644 --- a/drivers/media/platform/soc_camera/soc_camera.c +++ b/drivers/media/platform/soc_camera/soc_camera.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -62,7 +63,9 @@ struct soc_camera_async_client { struct v4l2_async_subdev *sensor; struct v4l2_async_notifier notifier; struct platform_device *pdev; - struct list_head list; /* needed for clean up */ + /* needed for clean up */ + struct list_head list; + struct v4l2_subdev *subdev; }; static int soc_camera_video_start(struct soc_camera_device *icd); @@ -1301,10 +1304,14 @@ static int soc_camera_probe_finish(struct soc_camera_device *icd) if (ret < 0) return ret; + ret = v4l2_subdev_pad_wrap(sd); + if (ret < 0 && ret != -ENOSYS) + return ret; + ret = soc_camera_add_device(icd); if (ret < 0) { dev_err(icd->pdev, "Couldn't activate the camera: %d\n", ret); - return ret; + goto eadddev; } /* At this point client .probe() should have run already */ @@ -1329,6 +1336,8 @@ static int soc_camera_probe_finish(struct soc_camera_device *icd) return 0; +eadddev: + v4l2_subdev_pad_unwrap(sd); evidstart: soc_camera_free_user_formats(icd); eusrfmt: @@ -1693,6 +1702,8 @@ static int soc_camera_remove(struct soc_camera_device *icd) { struct soc_camera_desc *sdesc = to_soc_camera_desc(icd); struct video_device *vdev = icd->vdev; + struct v4l2_subdev *sd = icd->sasc ? icd->sasc->subdev : + soc_camera_to_subdev(icd); v4l2_ctrl_handler_free(&icd->ctrl_handler); if (vdev) { @@ -1700,6 +1711,9 @@ static int soc_camera_remove(struct soc_camera_device *icd) icd->vdev = NULL; } + /* Before cleaning up the sensor subdevice */ + v4l2_subdev_pad_unwrap(sd); + if (sdesc->host_desc.board_info) { soc_camera_i2c_free(icd); } else { @@ -1867,6 +1881,7 @@ void soc_camera_host_unregister(struct soc_camera_host *ici) /* as long as we hold the device, sasc won't be freed */ get_device(icd->pdev); list_add(&icd->sasc->list, ¬ifiers); + icd->sasc->subdev = soc_camera_to_subdev(icd); } mutex_unlock(&list_lock);