Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp1403823imm; Sat, 6 Oct 2018 02:41:14 -0700 (PDT) X-Google-Smtp-Source: ACcGV62+ewWYEGpB/fnh59BhXwYZFLeAKLTAfFl1iKqvWYnqDYyT99SPmnPiDKk4kbFJOHjenwf5 X-Received: by 2002:a17:902:780d:: with SMTP id p13-v6mr15255620pll.96.1538818874527; Sat, 06 Oct 2018 02:41:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538818874; cv=none; d=google.com; s=arc-20160816; b=tnX4ZHyrfYpD+UM7pThOYVWxC9MKhkU0pPbVZzGYVD/MK/PZhyAF/SqPjfp2GIC/mE 4FqMxF1KhGukEWNpQWnoo5HDPYQs9MGbieAA9CjFKl6OrPM7SLuMrEQ7H2MKLdgyKiYD lYpD+6w+sPOUCpV4Ot8RSjSOupGJEWTayHgo6u50buQoK6L6ZUnXwRQIcE+6tGkNx5xV fB/2FOBY3R2c312dv3N955kXvqQ6KvxS2Vy5azHmVe43oVVA/zY+R6mKYRnG1m4C0+4H zMevUr9RO6WiCoJ5bO6BgeESvDItgcJ8WeNba1mGGyql3lthW/IiL2dVLQQqqMLmuBVE Ha2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=EPPwqqIb/Y6yR/M2s+0KfsFqC+7fRyJ0znolBMkQ0RM=; b=xzeRpgF+ITP5sYXvkOaOworEVcugFzTwjCax843YMXNZeiV93M4RzirVjq3TdYF8M6 TvqGZuPcbAzt8v1YByJDGwuXexhZ314kKSErebrFeQvyIWh2B4Bi2asKh2ta8mmFNI8N Y8MQXG4m8yPDULPkdFglnVF58YT2o/ohQ4V6v4AtGjxrQkTIehI6izA2ZrHWv3Kc93Lx aXTz9KaSooeZQoQkkp5KZ9wMWlhd2k+be/hZSnnJm+lNvPvhsLC58CDk2DwqMxla1pnW AA7AmPyc/bdpQs/UGQTfwkf2zH/MmFo5r2+x163j2XeK1NMWhIyUuiR2Mmght7yM8elv NMXQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y8-v6si10951060plk.240.2018.10.06.02.40.41; Sat, 06 Oct 2018 02:41:14 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727302AbeJFQnN (ORCPT + 99 others); Sat, 6 Oct 2018 12:43:13 -0400 Received: from gofer.mess.org ([88.97.38.141]:33405 "EHLO gofer.mess.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726409AbeJFQnN (ORCPT ); Sat, 6 Oct 2018 12:43:13 -0400 Received: by gofer.mess.org (Postfix, from userid 1000) id B2D1060777; Sat, 6 Oct 2018 10:40:33 +0100 (BST) Date: Sat, 6 Oct 2018 10:40:33 +0100 From: Sean Young To: ektor5 Cc: hverkuil@xs4all.nl, luca.pisani@udoo.org, jose.abreu@synopsys.com, sakari.ailus@linux.intel.com, jacopo@jmondi.org, Mauro Carvalho Chehab , Greg Kroah-Hartman , "David S. Miller" , Andrew Morton , Arnd Bergmann , Hans Verkuil , Laurent Pinchart , Geert Uytterhoeven , Jacob Chen , Thomas Gleixner , Kate Stewart , Neil Armstrong , Todor Tomov , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org Subject: Re: [PATCH v2 2/2] seco-cec: add Consumer-IR support Message-ID: <20181006094033.xyphjosvwpvg57ay@gofer.mess.org> References: <3eb65888e2bd0869341732312460d24ee99d8d13.1538760098.git.ek5.chimenti@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3eb65888e2bd0869341732312460d24ee99d8d13.1538760098.git.ek5.chimenti@gmail.com> User-Agent: NeoMutt/20170113 (1.7.2) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Oct 05, 2018 at 07:33:59PM +0200, ektor5 wrote: > From: Ettore Chimenti > > Introduce support for Consumer-IR into seco-cec driver, as it shares the > same interrupt for receiving messages. > The device decodes RC5 signals only, defaults to hauppauge mapping. > It will spawn an input interface using the RC framework (like CEC > device). > > Signed-off-by: Ettore Chimenti Looks great, thanks! Reviewed-by: Sean Young > --- > drivers/media/platform/Kconfig | 10 ++ > drivers/media/platform/seco-cec/seco-cec.c | 125 ++++++++++++++++++++- > drivers/media/platform/seco-cec/seco-cec.h | 11 ++ > 3 files changed, 145 insertions(+), 1 deletion(-) > > diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig > index 51cd1fd005e3..e6b45da2af6d 100644 > --- a/drivers/media/platform/Kconfig > +++ b/drivers/media/platform/Kconfig > @@ -625,6 +625,16 @@ config VIDEO_SECO_CEC > CEC bus is present in the HDMI connector and enables communication > between compatible devices. > > +config VIDEO_SECO_RC > + bool "SECO Boards IR RC5 support" > + depends on VIDEO_SECO_CEC > + select RC_CORE > + help > + If you say yes here you will get support for the > + SECO Boards Consumer-IR in seco-cec driver. > + The embedded controller supports RC5 protocol only, default mapping > + is set to rc-hauppauge. > + > endif #CEC_PLATFORM_DRIVERS > > menuconfig SDR_PLATFORM_DRIVERS > diff --git a/drivers/media/platform/seco-cec/seco-cec.c b/drivers/media/platform/seco-cec/seco-cec.c > index 990e88f979a2..6ae42fc855ef 100644 > --- a/drivers/media/platform/seco-cec/seco-cec.c > +++ b/drivers/media/platform/seco-cec/seco-cec.c > @@ -26,6 +26,8 @@ struct secocec_data { > struct platform_device *pdev; > struct cec_adapter *cec_adap; > struct cec_notifier *notifier; > + struct rc_dev *ir; > + char ir_input_phys[32]; > int irq; > }; > > @@ -371,6 +373,114 @@ struct cec_adap_ops secocec_cec_adap_ops = { > .adap_transmit = secocec_adap_transmit, > }; > > +#ifdef CONFIG_VIDEO_SECO_RC > +static int secocec_ir_probe(void *priv) > +{ > + struct secocec_data *cec = priv; > + struct device *dev = cec->dev; > + int status; > + u16 val; > + > + /* Prepare the RC input device */ > + cec->ir = devm_rc_allocate_device(dev, RC_DRIVER_SCANCODE); > + if (!cec->ir) > + return -ENOMEM; > + > + snprintf(cec->ir_input_phys, sizeof(cec->ir_input_phys), > + "%s/input0", dev_name(dev)); > + > + cec->ir->device_name = dev_name(dev); > + cec->ir->input_phys = cec->ir_input_phys; > + cec->ir->input_id.bustype = BUS_HOST; > + cec->ir->input_id.vendor = 0; > + cec->ir->input_id.product = 0; > + cec->ir->input_id.version = 1; > + cec->ir->driver_name = SECOCEC_DEV_NAME; > + cec->ir->allowed_protocols = RC_PROTO_BIT_RC5; > + cec->ir->priv = cec; > + cec->ir->map_name = RC_MAP_HAUPPAUGE; > + cec->ir->timeout = MS_TO_NS(100); > + > + /* Clear the status register */ > + status = smb_rd16(SECOCEC_STATUS_REG_1, &val); > + if (status != 0) > + goto err; > + > + status = smb_wr16(SECOCEC_STATUS_REG_1, val); > + if (status != 0) > + goto err; > + > + /* Enable the interrupts */ > + status = smb_rd16(SECOCEC_ENABLE_REG_1, &val); > + if (status != 0) > + goto err; > + > + status = smb_wr16(SECOCEC_ENABLE_REG_1, > + val | SECOCEC_ENABLE_REG_1_IR); > + if (status != 0) > + goto err; > + > + dev_dbg(dev, "IR enabled"); > + > + status = devm_rc_register_device(dev, cec->ir); > + > + if (status) { > + dev_err(dev, "Failed to prepare input device"); > + cec->ir = NULL; > + goto err; > + } > + > + return 0; > + > +err: > + smb_rd16(SECOCEC_ENABLE_REG_1, &val); > + > + smb_wr16(SECOCEC_ENABLE_REG_1, > + val & ~SECOCEC_ENABLE_REG_1_IR); > + > + dev_dbg(dev, "IR disabled"); > + return status; > +} > + > +static int secocec_ir_rx(struct secocec_data *priv) > +{ > + struct secocec_data *cec = priv; > + struct device *dev = cec->dev; > + u16 val, status, key, addr, toggle; > + > + if (!cec->ir) > + return -ENODEV; > + > + status = smb_rd16(SECOCEC_IR_READ_DATA, &val); > + if (status != 0) > + goto err; > + > + key = val & SECOCEC_IR_COMMAND_MASK; > + addr = (val & SECOCEC_IR_ADDRESS_MASK) >> SECOCEC_IR_ADDRESS_SHL; > + toggle = (val & SECOCEC_IR_TOGGLE_MASK) >> SECOCEC_IR_TOGGLE_SHL; > + > + rc_keydown(cec->ir, RC_PROTO_RC5, RC_SCANCODE_RC5(addr, key), toggle); > + > + dev_dbg(dev, "IR key pressed: 0x%02x addr 0x%02x toggle 0x%02x", key, > + addr, toggle); > + > + return 0; > + > +err: > + dev_err(dev, "IR Receive message failed (%d)", status); > + return -EIO; > +} > +#else > +static void secocec_ir_rx(struct secocec_data *priv) > +{ > +} > + > +static int secocec_ir_probe(void *priv) > +{ > + return 0; > +} > +#endif > + > static irqreturn_t secocec_irq_handler(int irq, void *priv) > { > struct secocec_data *cec = priv; > @@ -406,7 +516,8 @@ static irqreturn_t secocec_irq_handler(int irq, void *priv) > if (status_val & SECOCEC_STATUS_REG_1_IR) { > dev_dbg(dev, "IR RC5 Interrupt Caught"); > val |= SECOCEC_STATUS_REG_1_IR; > - /* TODO IRDA RX */ > + > + secocec_ir_rx(cec); > } > > /* Reset status register */ > @@ -576,6 +687,10 @@ static int secocec_probe(struct platform_device *pdev) > if (secocec->notifier) > cec_register_cec_notifier(secocec->cec_adap, secocec->notifier); > > + ret = secocec_ir_probe(secocec); > + if (ret) > + goto err_delete_adapter; > + > platform_set_drvdata(pdev, secocec); > > dev_dbg(dev, "Device registered"); > @@ -593,7 +708,15 @@ static int secocec_probe(struct platform_device *pdev) > static int secocec_remove(struct platform_device *pdev) > { > struct secocec_data *secocec = platform_get_drvdata(pdev); > + u16 val; > + > + if (secocec->ir) { > + smb_rd16(SECOCEC_ENABLE_REG_1, &val); > > + smb_wr16(SECOCEC_ENABLE_REG_1, val & ~SECOCEC_ENABLE_REG_1_IR); > + > + dev_dbg(&pdev->dev, "IR disabled"); > + } > cec_unregister_adapter(secocec->cec_adap); > > if (secocec->notifier) > diff --git a/drivers/media/platform/seco-cec/seco-cec.h b/drivers/media/platform/seco-cec/seco-cec.h > index 93020900935e..3f1aad89b073 100644 > --- a/drivers/media/platform/seco-cec/seco-cec.h > +++ b/drivers/media/platform/seco-cec/seco-cec.h > @@ -99,6 +99,17 @@ > > #define SECOCEC_IR_READ_DATA 0x3e > > +/* > + * IR > + */ > + > +#define SECOCEC_IR_COMMAND_MASK 0x007F > +#define SECOCEC_IR_COMMAND_SHL 0 > +#define SECOCEC_IR_ADDRESS_MASK 0x1F00 > +#define SECOCEC_IR_ADDRESS_SHL 7 > +#define SECOCEC_IR_TOGGLE_MASK 0x8000 > +#define SECOCEC_IR_TOGGLE_SHL 15 > + > /* > * Enabling register > */ > -- > 2.18.0