From patchwork Mon Aug 21 09:33:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maciej Purski X-Patchwork-Id: 9911967 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 0FC8F602D8 for ; Mon, 21 Aug 2017 09:33:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0521728727 for ; Mon, 21 Aug 2017 09:33:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EE16C2876C; Mon, 21 Aug 2017 09:33:43 +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=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D139F28777 for ; Mon, 21 Aug 2017 09:33:42 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9D6FF6E20D; Mon, 21 Aug 2017 09:33:41 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by gabe.freedesktop.org (Postfix) with ESMTPS id BF3B06E20D for ; Mon, 21 Aug 2017 09:33:40 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20170821093337euoutp02f1c41327c9252255bd8612c9741c0704~c0q1UNtGx0793507935euoutp02w; Mon, 21 Aug 2017 09:33:37 +0000 (GMT) Received: from eusmges5.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20170821093336eucas1p25515af7f917dfd73f66f9d4659d23ef3~c0q0WgaNu0983109831eucas1p2k; Mon, 21 Aug 2017 09:33:36 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges5.samsung.com (EUCPMTA) with SMTP id 8F.91.12743.FE8AA995; Mon, 21 Aug 2017 10:33:36 +0100 (BST) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20170821093335eucas1p2e979406e4ad0b823a57f575c1e6d92d0~c0qzlvp1q2384323843eucas1p2y; Mon, 21 Aug 2017 09:33:35 +0000 (GMT) X-AuditID: cbfec7f5-f79d06d0000031c7-91-599aa8f0c66c Received: from eusync4.samsung.com ( [203.254.199.214]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 2D.F3.18832.FE8AA995; Mon, 21 Aug 2017 10:33:35 +0100 (BST) Received: from AMDC2075.DIGITAL.local ([106.120.51.25]) by eusync4.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OV100G5A3VUNS10@eusync4.samsung.com>; Mon, 21 Aug 2017 10:33:35 +0100 (BST) From: Maciej Purski To: dri-devel@lists.freedesktop.org Subject: [PATCH v3] drm/bridge/sii8620: add remote control support Date: Mon, 21 Aug 2017 11:33:21 +0200 Message-id: <1503308001-20661-1-git-send-email-m.purski@samsung.com> X-Mailer: git-send-email 2.7.4 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrNIsWRmVeSWpSXmKPExsWy7djP87ofVsyKNHhzj8ni1rpzrBa9504y WTR1vGW12DhjPavFla/v2Sw6Jy5ht1jw8haLA7vH5b5eJo/ZHTNZPbZ/e8Dqcb/7OJNH35ZV jAGsUVw2Kak5mWWpRfp2CVwZXy8dZi04YFLx7FQDYwPjbO0uRk4OCQETiZ5r+xkhbDGJC/fW s3UxcnEICSxllOi6NY0FwvnMKHHm6j8mmI6Lm5cyQiSWMUrcWvWVDSQhJPCfUWL/YdEuRg4O NgEtiTXt8SBhEQFlib8TV4HVMwusYJT4OuchWL2wgJPEos3XGUHqWQRUJe7N1QAJ8wq4SJx8 954ZYpecxM1zncwgvRIC19kkzr67CFYvISArsekAVI2LxJyLi6BsYYlXx7ewQ9gyEp0dB6Fu rpa4+HUXG4RdI9F4ewNUjbXE50lbwHqZBfgkJm2bzgwxnleio00IosRD4smDA1BjHCUeXv3F BPFtrMSEJYvYJjBKL2BkWMUoklpanJueWmyqV5yYW1yal66XnJ+7iREYpaf/Hf+6g3HpMatD jAIcjEo8vDfyZ0UKsSaWFVfmHmKU4GBWEuHdtRAoxJuSWFmVWpQfX1Sak1p8iFGag0VJnNc2 qi1SSCA9sSQ1OzW1ILUIJsvEwSnVwJhpwlws9DjozJ6HDfum11efWM8YeXxV2JySnezZGZqJ lYYV/rY6MbevfFcrys06nOqv3ccm+DM137T/QI6EyGnnf1H24f6B+7Ymnb6y23Bx7sIgjyPH Lzyeu4nz0/bil8UvuBe9nfM1NiKQSad0tpKLXTprh3jOgslMlY+vafenic59mGi1X4mlOCPR UIu5qDgRAMgD+F/OAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrALMWRmVeSWpSXmKPExsVy+t/xa7rvV8yKNLg6Xd3i1rpzrBa9504y WTR1vGW12DhjPavFla/v2Sw6Jy5ht1jw8haLA7vH5b5eJo/ZHTNZPbZ/e8Dqcb/7OJNH35ZV jAGsUW42GamJKalFCql5yfkpmXnptkqhIW66FkoKeYm5qbZKEbq+IUFKCmWJOaVAnpEBGnBw DnAPVtK3S3DL+HrpMGvBAZOKZ6caGBsYZ2t3MXJySAiYSFzcvJQRwhaTuHBvPVsXIxeHkMAS Rom+JQ+ZIZxGJolfW3uAqjg42AS0JNa0x4M0iAgoS/yduAqsmVlgBaPEiyNiILawgJPEos3X wcpZBFQl7s3VAAnzCrhInHz3nhlil5zEzXOdzBMYuRcwMqxiFEktLc5Nzy021CtOzC0uzUvX S87P3cQIDM1tx35u3sF4aWPwIUYBDkYlHl6DolmRQqyJZcWVuYcYJTiYlUR4dy0ECvGmJFZW pRblxxeV5qQWH2I0Bdo9kVlKNDkfGDd5JfGGJobmloZGxhYW5kZGSuK86pebIoUE0hNLUrNT UwtSi2D6mDg4pRoY2Wxzd5UETerSjZyt8GdJ/1abbNv+uW+tvny4VMqo8PfjyaoW9c6Pp+9M D0vPlD4+7djirari0S8O75+3JnGPyqx1Lvd/Li/YHxHEKGN/eL//lOmOIkdK5TYe3RxyhumU 8+w/s4tvVE7OXLHiWIOb2/1MswrhRW90u/6t1TxqbFKfaGzaLJ4vq8RSnJFoqMVcVJwIAOob XuljAgAA X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170821093335eucas1p2e979406e4ad0b823a57f575c1e6d92d0 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?TWFjaWVqIFB1cnNraRtTZWN1cml0eSAoVFApG1NhbXN1bmcg?= =?UTF-8?B?RWxlY3Ryb25pY3MbVHJhaW5lZSAoKQ==?= X-Global-Sender: =?UTF-8?B?TWFjaWVqIFB1cnNraRtTZWN1cml0eSAoVFApG1NhbXN1bmcg?= =?UTF-8?B?RWxlY3Ryb25pY3MbVHJhaW5lZSAoKQ==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTU=?= CMS-TYPE: 201P X-CMS-RootMailID: 20170821093335eucas1p2e979406e4ad0b823a57f575c1e6d92d0 X-RootMTR: 20170821093335eucas1p2e979406e4ad0b823a57f575c1e6d92d0 References: Cc: b.zolnierkie@samsung.com, Maciej Purski , Laurent.pinchart@ideasonboard.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP MHL specification defines Remote Control Protocol(RCP) to send input events between MHL devices. The driver now recognizes RCP messages and reacts to them by reporting key events to input subsystem, allowing a user to control a device using TV remote control. Changes in v2: - use RC subsystem (including CEC keymap) - RC device initialized in attach drm_bridge callback and removed in detach callback. This is necessary, because RC_CORE, which is needed during rc_dev init, is loaded after sii8620. DRM bridge is binded later which solves the problem. - add RC_CORE dependency Changes in v3: - fix error handling in init_rcp and in attach callback Signed-off-by: Maciej Purski --- drivers/gpu/drm/bridge/Kconfig | 2 +- drivers/gpu/drm/bridge/sil-sii8620.c | 101 +++++++++++++++++++++++++++++++++-- include/drm/bridge/mhl.h | 4 ++ 3 files changed, 101 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index adf9ae0..6ef901c 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -71,7 +71,7 @@ config DRM_PARADE_PS8622 config DRM_SIL_SII8620 tristate "Silicon Image SII8620 HDMI/MHL bridge" - depends on OF + depends on OF && RC_CORE select DRM_KMS_HELPER help Silicon Image SII8620 HDMI/MHL bridge chip driver. diff --git a/drivers/gpu/drm/bridge/sil-sii8620.c b/drivers/gpu/drm/bridge/sil-sii8620.c index 2d51a22..e072bca 100644 --- a/drivers/gpu/drm/bridge/sil-sii8620.c +++ b/drivers/gpu/drm/bridge/sil-sii8620.c @@ -28,6 +28,8 @@ #include #include +#include + #include "sil-sii8620.h" #define SII8620_BURST_BUF_LEN 288 @@ -58,6 +60,7 @@ enum sii8620_mt_state { struct sii8620 { struct drm_bridge bridge; struct device *dev; + struct rc_dev *rc_dev; struct clk *clk_xtal; struct gpio_desc *gpio_reset; struct gpio_desc *gpio_int; @@ -431,6 +434,16 @@ static void sii8620_mt_rap(struct sii8620 *ctx, u8 code) sii8620_mt_msc_msg(ctx, MHL_MSC_MSG_RAP, code); } +static void sii8620_mt_rcpk(struct sii8620 *ctx, u8 code) +{ + sii8620_mt_msc_msg(ctx, MHL_MSC_MSG_RCPK, code); +} + +static void sii8620_mt_rcpe(struct sii8620 *ctx, u8 code) +{ + sii8620_mt_msc_msg(ctx, MHL_MSC_MSG_RCPE, code); +} + static void sii8620_mt_read_devcap_send(struct sii8620 *ctx, struct sii8620_mt_msg *msg) { @@ -1753,6 +1766,25 @@ static void sii8620_send_features(struct sii8620 *ctx) sii8620_write_buf(ctx, REG_MDT_XMIT_WRITE_PORT, buf, ARRAY_SIZE(buf)); } +static bool sii8620_rcp_consume(struct sii8620 *ctx, u8 scancode) +{ + bool pressed = !(scancode & MHL_RCP_KEY_RELEASED_MASK); + + scancode &= MHL_RCP_KEY_ID_MASK; + + if (!ctx->rc_dev) { + dev_dbg(ctx->dev, "RCP input device not initialized\n"); + return false; + } + + if (pressed) + rc_keydown(ctx->rc_dev, RC_TYPE_CEC, scancode, 0); + else + rc_keyup(ctx->rc_dev); + + return true; +} + static void sii8620_msc_mr_set_int(struct sii8620 *ctx) { u8 ints[MHL_INT_SIZE]; @@ -1804,19 +1836,25 @@ static void sii8620_msc_mt_done(struct sii8620 *ctx) static void sii8620_msc_mr_msc_msg(struct sii8620 *ctx) { - struct sii8620_mt_msg *msg = sii8620_msc_msg_first(ctx); + struct sii8620_mt_msg *msg; u8 buf[2]; - if (!msg) - return; - sii8620_read_buf(ctx, REG_MSC_MR_MSC_MSG_RCVD_1ST_DATA, buf, 2); switch (buf[0]) { case MHL_MSC_MSG_RAPK: + msg = sii8620_msc_msg_first(ctx); + if (!msg) + return; msg->ret = buf[1]; ctx->mt_state = MT_STATE_DONE; break; + case MHL_MSC_MSG_RCP: + if (!sii8620_rcp_consume(ctx, buf[1])) + sii8620_mt_rcpe(ctx, + MHL_RCPE_STATUS_INEFFECTIVE_KEY_CODE); + sii8620_mt_rcpk(ctx, buf[1]); + break; default: dev_err(ctx->dev, "%s message type %d,%d not supported", __func__, buf[0], buf[1]); @@ -2102,11 +2140,62 @@ static void sii8620_cable_in(struct sii8620 *ctx) enable_irq(to_i2c_client(ctx->dev)->irq); } +static void sii8620_init_rcp_input_dev(struct sii8620 *ctx) +{ + struct rc_dev *rc_dev; + int ret; + + rc_dev = rc_allocate_device(RC_DRIVER_SCANCODE); + if (!rc_dev) { + dev_err(ctx->dev, "Failed to allocate RC device\n"); + ctx->error = -ENOMEM; + return; + } + + rc_dev->input_phys = "sii8620/input0"; + rc_dev->input_id.bustype = BUS_VIRTUAL; + rc_dev->map_name = RC_MAP_CEC; + rc_dev->allowed_protocols = RC_BIT_CEC; + rc_dev->driver_name = "sii8620"; + rc_dev->input_name = "sii8620"; + + ret = rc_register_device(rc_dev); + ctx->rc_dev = rc_dev; + + if (ret) { + dev_err(ctx->dev, "Failed to register RC device\n"); + ctx->error = ret; + rc_free_device(ctx->rc_dev); + } +} + +static void sii8620_remove_rcp_input_dev(struct sii8620 *ctx) +{ + rc_unregister_device(ctx->rc_dev); + rc_free_device(ctx->rc_dev); +} + static inline struct sii8620 *bridge_to_sii8620(struct drm_bridge *bridge) { return container_of(bridge, struct sii8620, bridge); } +static int sii8620_attach(struct drm_bridge *bridge) +{ + struct sii8620 *ctx = bridge_to_sii8620(bridge); + + sii8620_init_rcp_input_dev(ctx); + + return sii8620_clear_error(ctx); +} + +static void sii8620_detach(struct drm_bridge *bridge) +{ + struct sii8620 *ctx = bridge_to_sii8620(bridge); + + sii8620_remove_rcp_input_dev(ctx); +} + static bool sii8620_mode_fixup(struct drm_bridge *bridge, const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) @@ -2151,6 +2240,8 @@ static bool sii8620_mode_fixup(struct drm_bridge *bridge, } static const struct drm_bridge_funcs sii8620_bridge_funcs = { + .attach = sii8620_attach, + .detach = sii8620_detach, .mode_fixup = sii8620_mode_fixup, }; @@ -2217,8 +2308,8 @@ static int sii8620_remove(struct i2c_client *client) struct sii8620 *ctx = i2c_get_clientdata(client); disable_irq(to_i2c_client(ctx->dev)->irq); - drm_bridge_remove(&ctx->bridge); sii8620_hw_off(ctx); + drm_bridge_remove(&ctx->bridge); return 0; } diff --git a/include/drm/bridge/mhl.h b/include/drm/bridge/mhl.h index fbdfc8d..96a5e0f 100644 --- a/include/drm/bridge/mhl.h +++ b/include/drm/bridge/mhl.h @@ -262,6 +262,10 @@ enum { #define MHL_RAPK_UNSUPPORTED 0x02 /* Rcvd RAP action code not supported */ #define MHL_RAPK_BUSY 0x03 /* Responder too busy to respond */ +/* Bit masks for RCP messages */ +#define MHL_RCP_KEY_RELEASED_MASK 0x80 +#define MHL_RCP_KEY_ID_MASK 0x7F + /* * Error status codes for RCPE messages */