Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751259AbdIOFvr (ORCPT ); Fri, 15 Sep 2017 01:51:47 -0400 Received: from mailout2.samsung.com ([203.254.224.25]:37238 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751197AbdIOFvo (ORCPT ); Fri, 15 Sep 2017 01:51:44 -0400 X-AuditID: b6c32a4a-f79896d000000f29-3a-59bb6a6e5398 From: Satendra Singh Thakur To: mchehab@kernel.org, max.kellermann@gmail.com, sakari.ailus@linux.intel.com, mingo@kernel.org, hans.verkuil@cisco.com, yamada.masahiro@socionext.com, shuah@kernel.org Cc: satendra.t@samsung.com, linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, taeyoung0432.lee@samsung.com, jackee.lee@samsung.com, hemanshu.s@samsung.com, madhur.verma@samsung.com Subject: [PATCH v1] [DVB][FRONTEND] Added a new ioctl for optimizing frontend property set operation Date: Fri, 15 Sep 2017 01:50:29 -0400 Message-Id: <1505454629-10240-1-git-send-email-satendra.t@samsung.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <20170914175059.722ac4f3@vento.lan> X-Brightmail-Tracker: H4sIAAAAAAAAA0VSaUwTURj0dY8uaHVTUJ9EkSwYIwmlW1tYDHhEJQ0YgxiNaAxs4Ako3Tbd Fo/EiAqKiKIJWsPlQUMF8WpApVhE8D4Kiho10R/eEA+UwxgUbbsa/83Mm/ne5MtHYcpjZAiV K1iQWeDzGDIQv9A5a2aUsL41TT3kYDn7D5eM6+v6iHH9trsY1+OqIrnSc80E13nITnJPntTI uTrnTxl3avQO4L41Dcu4011FOFfee0bOHa9yEJz75QCYP15fPnKe0LdUvJDrnQ17SH3N7WX6 /U0NQH/L9h3XDzhDU+SrUXwO4rOQOQwJmcasXCE7gUlenr4wXRejZqPYOC6WCRN4A0pgFi1J iUrMzfNWZsLy+TyrV0rhRZGJnhtvNlotKCzHKFoSmDUsq1Gx6liVRqNRaXVr52h0XksGyilt 7SZNj+dvGvwySBSA7doSEEBBWguPFlUREp4Eu1+eJUtAIKWkWwGsHDxDSOQbgAfb7+M+l5Ie BrDn6cJ/aff+HplkcgN4w34Pk8gQgO++dPsTpNf1vuqIf1QwfRrAk85qvwujrwJY7Bz0vlBU EL0ONtsSfQGcngEf1tv8pRR0IvS0Df0tGAqfefZgPhxAq6G9bNQ/FNKvSfja0Y9LpkXwmv0r JuEg2HezSS7hENhbtksuBcoALP3kABI55S0+2vs3MQ8WlrfjvkYYPQuedUVLcgIs7LroH4TR 4+G+kTcySY+A9R86MZ8d0gpYvEspyXrY/+oHIckL4OW3K6St7ATwg6dSdgBMr/j/wTEAGsAU ZBIN2UjUmTQC2qgSeYNoFbJVmUaDE/ivMzLpEqjzLOkANAWYcYpL+1xpSoLPFzcbOgCkMCZY kbG0NU2pyOI3b0FmY7rZmofEDqDzbvMgFjIx0+i9dcGSzmrj1NqYmFhWrY7TMpMVN1qsaUo6 m7egDQiZkPlfTkYFhBSAlReTr7sGCi58/LW40JN6uLtdtOn6Gk0RD27O3hruDrwdXms4wD1i Jqw9kfomvn7btb0etWsmUdNYNLw0cvvU646TulWxjg3PwumSpOKHPZ8bLWMmWpOrQ6dlOkZ2 VhfVNlyZIM9wWyLw4h2/V9UvHtubv9s18PxX/8ittgCxzonLGVzM4dlIzCzyfwDJLS6uswMA AA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrELMWRmVeSWpSXmKPExsWy7bCSvG5e1u5Ig/ZWeYslP3cxWbw6/4bZ 4sP008wWl3fNYbPo2bCV1eLw1CVsFteuzWO3WLbpD5PF6n+nGC0+bfnGZLH2fCuLxZSX69gt Fs5Zzmqx995nRgc+jym/N7J67Jx1l91j06pONo95JwM9+rasYvQ4Mf07i8fnTXIB7FFcNimp OZllqUX6dglcGT27L7AVXHWo+PL+C2sDY6NJFyMnh4SAicTevstMXYxcHEICuxklDr2bzwKR kJJY9mYbG4QtLLHy33N2iKLPjBJ/95xnAkmwAXU/nzODFSQhIrCVUWLO1mNsIA6zwElGiZer l4NVCQukSGw9+p8ZxGYRUJW4tHI6K4jNK+AmcW7fV1aIFXISN891gtVwChhILOn/BxYXEtCX eHNtG9MERr4FjAyrGCVTC4pz03OLDQuM8lLL9YoTc4tL89L1kvNzNzGCQ1pLawfjiRPxhxgF OBiVeHh39O6KFGJNLCuuzD3EKMHBrCTCm+C3O1KINyWxsiq1KD++qDQntfgQozQHi5I4b1rv jEghgfTEktTs1NSC1CKYLBMHp1QDo8uO23/3Ks5ZOX337p3BMhlnD4uq7Di04ZmiyEuNP6by L54vrjkxbY3q7wO3JCv59I1y5727KJHUnX2rPvxFzGnhukb1qD9m07ZEz9mmcDJzGZtb9BFF o0viLn1qkpXWsoERT1U0eFguyKUcWHrf+vjVc+ki77LjuI+9ZX9levK0JUtcSsZvSSWW4oxE Qy3mouJEAJ5KoR5lAgAA X-CMS-MailID: 20170915055142epcas5p457cd31640e1af9195733f30c2072eafc X-Msg-Generator: CA X-Sender-IP: 182.195.40.13 X-Local-Sender: =?UTF-8?B?U2F0ZW5kcmEgU2luZ2ggVGhha3VyG1NSSS1EZWxoaS1TeXN0?= =?UTF-8?B?ZW0gUy9XIFRlYW0b7IK87ISx7KCE7J6QG0NoaWVmIEVuZ2luZWVy?= X-Global-Sender: =?UTF-8?B?U2F0ZW5kcmEgU2luZ2ggVGhha3VyG1NSSS1EZWxoaS1TeXN0?= =?UTF-8?B?ZW0gUy9XIFRlYW0bU2Ftc3VuZyBFbGVjdHJvbmljcxtDaGllZiBFbmdpbmVl?= =?UTF-8?B?cg==?= X-Sender-Code: =?UTF-8?B?QzEwG1NXQUhRG0MxMElEMDJJRDAyODExMg==?= Content-Type: text/plain; charset="utf-8" X-MTR: 20170915055142epcas5p457cd31640e1af9195733f30c2072eafc CMS-TYPE: 105P DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20170915055142epcas5p457cd31640e1af9195733f30c2072eafc X-RootMTR: 20170915055142epcas5p457cd31640e1af9195733f30c2072eafc References: <20170914175059.722ac4f3@vento.lan> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7976 Lines: 299 Hello Mr Chehab, Thanks for reviewing the patch. I have modified the patch as per your comments. Please check if it looks fine now. Signed-off-by: Satendra Singh Thakur --- drivers/media/dvb-core/dvb_frontend.c | 212 +++++++++++++++++++++++++++++++++- include/uapi/linux/dvb/frontend.h | 24 ++++ 2 files changed, 234 insertions(+), 2 deletions(-) diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c index e3fff8f..bc35a86 100644 --- a/drivers/media/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb-core/dvb_frontend.c @@ -1914,6 +1914,188 @@ static int dtv_property_process_set(struct dvb_frontend *fe, return r; } +/** + * dtv_property_short_process_set + * @fe: Pointer to struct dvb_frontend + * @file: Pointer to struct file + * @cmd: Property name + * @data: Property value + * + * helper function for dvb_frontend_ioctl_properties, + * which can be used to set dtv property using ioctl + * cmd FE_SET_PROPERTY_SHORT. + * It assigns property value to corresponding member of + * property-cache structure + * This func is a variant of the func dtv_property_process_set + * Returns: + * Zero on success, negative errno on failure. + */ +static int dtv_property_short_process_set(struct dvb_frontend *fe, + struct file *file, + u32 cmd, u32 data) +{ + int r = 0; + struct dtv_frontend_properties *c = &fe->dtv_property_cache; + switch (cmd) { + case DTV_CLEAR: + /* + * Reset a cache of data specific to the frontend here. This + * does not effect hardware. + */ + dvb_frontend_clear_cache(fe); + break; + case DTV_TUNE: + /* interpret the cache of data, build either a traditional + * frontend tune request so we can pass validation in the + * FE_SET_FRONTEND ioctl. + */ + c->state = cmd; + dev_dbg(fe->dvb->device, "%s: Finalised property cache\n", + __func__); + + r = dtv_set_frontend(fe); + break; + case DTV_FREQUENCY: + c->frequency = data; + break; + case DTV_MODULATION: + c->modulation = data; + break; + case DTV_BANDWIDTH_HZ: + c->bandwidth_hz = data; + break; + case DTV_INVERSION: + c->inversion = data; + break; + case DTV_SYMBOL_RATE: + c->symbol_rate = data; + break; + case DTV_INNER_FEC: + c->fec_inner = data; + break; + case DTV_PILOT: + c->pilot = data; + break; + case DTV_ROLLOFF: + c->rolloff = data; + break; + case DTV_DELIVERY_SYSTEM: + r = dvbv5_set_delivery_system(fe, data); + break; + case DTV_VOLTAGE: + c->voltage = data; + r = dvb_frontend_ioctl_legacy(file, FE_SET_VOLTAGE, + (void *)c->voltage); + break; + case DTV_TONE: + c->sectone = data; + r = dvb_frontend_ioctl_legacy(file, FE_SET_TONE, + (void *)c->sectone); + break; + case DTV_CODE_RATE_HP: + c->code_rate_HP = data; + break; + case DTV_CODE_RATE_LP: + c->code_rate_LP = data; + break; + case DTV_GUARD_INTERVAL: + c->guard_interval = data; + break; + case DTV_TRANSMISSION_MODE: + c->transmission_mode = data; + break; + case DTV_HIERARCHY: + c->hierarchy = data; + break; + case DTV_INTERLEAVING: + c->interleaving = data; + break; + + /* ISDB-T Support here */ + case DTV_ISDBT_PARTIAL_RECEPTION: + c->isdbt_partial_reception = data; + break; + case DTV_ISDBT_SOUND_BROADCASTING: + c->isdbt_sb_mode = data; + break; + case DTV_ISDBT_SB_SUBCHANNEL_ID: + c->isdbt_sb_subchannel = data; + break; + case DTV_ISDBT_SB_SEGMENT_IDX: + c->isdbt_sb_segment_idx = data; + break; + case DTV_ISDBT_SB_SEGMENT_COUNT: + c->isdbt_sb_segment_count = data; + break; + case DTV_ISDBT_LAYER_ENABLED: + c->isdbt_layer_enabled = data; + break; + case DTV_ISDBT_LAYERA_FEC: + c->layer[0].fec = data; + break; + case DTV_ISDBT_LAYERA_MODULATION: + c->layer[0].modulation = data; + break; + case DTV_ISDBT_LAYERA_SEGMENT_COUNT: + c->layer[0].segment_count = data; + break; + case DTV_ISDBT_LAYERA_TIME_INTERLEAVING: + c->layer[0].interleaving = data; + break; + case DTV_ISDBT_LAYERB_FEC: + c->layer[1].fec = data; + break; + case DTV_ISDBT_LAYERB_MODULATION: + c->layer[1].modulation = data; + break; + case DTV_ISDBT_LAYERB_SEGMENT_COUNT: + c->layer[1].segment_count = data; + break; + case DTV_ISDBT_LAYERB_TIME_INTERLEAVING: + c->layer[1].interleaving = data; + break; + case DTV_ISDBT_LAYERC_FEC: + c->layer[2].fec = data; + break; + case DTV_ISDBT_LAYERC_MODULATION: + c->layer[2].modulation = data; + break; + case DTV_ISDBT_LAYERC_SEGMENT_COUNT: + c->layer[2].segment_count = data; + break; + case DTV_ISDBT_LAYERC_TIME_INTERLEAVING: + c->layer[2].interleaving = data; + break; + + /* Multistream support */ + case DTV_STREAM_ID: + case DTV_DVBT2_PLP_ID_LEGACY: + c->stream_id = data; + break; + + /* ATSC-MH */ + case DTV_ATSCMH_PARADE_ID: + fe->dtv_property_cache.atscmh_parade_id = data; + break; + case DTV_ATSCMH_RS_FRAME_ENSEMBLE: + fe->dtv_property_cache.atscmh_rs_frame_ensemble = data; + break; + + case DTV_LNA: + c->lna = data; + if (fe->ops.set_lna) + r = fe->ops.set_lna(fe); + if (r < 0) + c->lna = LNA_AUTO; + break; + + default: + return -EINVAL; + } + + return r; +} + static int dvb_frontend_ioctl(struct file *file, unsigned int cmd, void *parg) { @@ -1939,7 +2121,8 @@ static int dvb_frontend_ioctl(struct file *file, return -EPERM; } - if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY)) + if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY) + || (cmd == FE_SET_PROPERTY_SHORT)) err = dvb_frontend_ioctl_properties(file, cmd, parg); else { c->state = DTV_UNDEFINED; @@ -2026,7 +2209,32 @@ static int dvb_frontend_ioctl_properties(struct file *file, err = -EFAULT; goto out; } - + /* New ioctl for optimizing property set + */ + } else if (cmd == FE_SET_PROPERTY_SHORT) { + struct dtv_property_short *tvp_short = NULL; + struct dtv_properties_short *tvps_short = parg; + + dev_dbg(fe->dvb->device, "%s: properties.num = %d\n", __func__, tvps_short->num); + dev_dbg(fe->dvb->device, "%s: properties.props = %p\n", __func__, tvps_short->props); + if ((!tvps_short->num) || + (tvps_short->num > DTV_IOCTL_MAX_MSGS)) + return -EINVAL; + tvp_short = memdup_user(tvps_short->props, + tvps_short->num * sizeof(*tvp_short)); + if (IS_ERR(tvp_short)) + return PTR_ERR(tvp_short); + for (i = 0; i < tvps_short->num; i++) { + err = dtv_property_short_process_set(fe, file, + (tvp_short + i)->cmd, (tvp_short + i)->data); + if (err < 0) { + kfree(tvp_short); + return err; + } + } + if (c->state == DTV_TUNE) + dev_dbg(fe->dvb->device, "%s: Property cache is full, tuning\n", __func__); + kfree(tvp_short); } else err = -EOPNOTSUPP; diff --git a/include/uapi/linux/dvb/frontend.h b/include/uapi/linux/dvb/frontend.h index 00a20cd..aa82179 100644 --- a/include/uapi/linux/dvb/frontend.h +++ b/include/uapi/linux/dvb/frontend.h @@ -476,6 +476,17 @@ struct dtv_property { int result; } __attribute__ ((packed)); +/** + * @struct dtv_property_short + * A shorter version of struct dtv_property + * @cmd: Property type + * @data: Property value + */ +struct dtv_property_short { + __u32 cmd; + __u32 data; +}; + /* num of properties cannot exceed DTV_IOCTL_MAX_MSGS per ioctl */ #define DTV_IOCTL_MAX_MSGS 64 @@ -484,6 +495,18 @@ struct dtv_properties { struct dtv_property *props; }; +/** + * @struct dtv_properties_short + * A variant of struct dtv_properties + * to support struct dtv_property_short + * @num: Number of properties + * @props: Pointer to struct dtv_property_short + */ +struct dtv_properties_short { + __u32 num; + struct dtv_property_short *props; +}; + #if defined(__DVB_CORE__) || !defined (__KERNEL__) /* @@ -565,6 +588,7 @@ struct dvb_frontend_event { #define FE_SET_PROPERTY _IOW('o', 82, struct dtv_properties) #define FE_GET_PROPERTY _IOR('o', 83, struct dtv_properties) +#define FE_SET_PROPERTY_SHORT _IOW('o', 84, struct dtv_properties_short) /** * When set, this flag will disable any zigzagging or other "normal" tuning -- 2.7.4