From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.3 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_PASS,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8D054C43381 for ; Sun, 24 Feb 2019 15:00:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 52BD320652 for ; Sun, 24 Feb 2019 15:00:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=lunn.ch header.i=@lunn.ch header.b="k8cS35vE" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728121AbfBXO5i (ORCPT ); Sun, 24 Feb 2019 09:57:38 -0500 Received: from vps0.lunn.ch ([185.16.172.187]:36805 "EHLO vps0.lunn.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726996AbfBXO5h (ORCPT ); Sun, 24 Feb 2019 09:57:37 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lunn.ch; s=20171124; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID: Subject:Cc:To:From:Date:Sender:Reply-To:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=6LkThywEONI5sPdSm4jo3Z11Yo5ab9q2kc8c84EgcJ4=; b=k8cS35vEjrBQ6COLRmWqa6awOk ijub6816SQoHSvPuaWegRMtTsECXMVFmmO0w5PEpAld3U/GWVvVadSqecHpEsXpRwIxLgvtrbn4iC D7Z0up5MyWXpstlqhhpYpeq5jZN0ieSz1jt3H1Dp4gLJ4vmXHxik564xp/W38cdaqnlI=; Received: from andrew by vps0.lunn.ch with local (Exim 4.89) (envelope-from ) id 1gxvDh-0003XR-7N; Sun, 24 Feb 2019 15:57:33 +0100 Date: Sun, 24 Feb 2019 15:57:33 +0100 From: Andrew Lunn To: Pankaj Bansal Cc: Leo Li , Peter Rosin , Florian Fainelli , Heiner Kallweit , "netdev@vger.kernel.org" Subject: Re: [PATCH v2 2/2] drivers: net: phy: mdio-mux: Add support for Generic Mux controls Message-ID: <20190224145733.GD26626@lunn.ch> References: <20190224141338.29907-1-pankaj.bansal@nxp.com> <20190224141338.29907-2-pankaj.bansal@nxp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190224141338.29907-2-pankaj.bansal@nxp.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org > +static int mdio_mux_multiplexer_switch_fn(int current_child, int desired_child, > + void *data) > +{ > + struct platform_device *pdev; > + struct mdio_mux_multiplexer_state *s; > + int ret = 0; > + > + pdev = (struct platform_device *)data; > + s = (struct mdio_mux_multiplexer_state *)platform_get_drvdata(pdev); platform_get_drvdata() returns a void *. So you don't need the cast. > + if (current_child ^ desired_child) { > + if (current_child != -1) > + ret = mux_control_deselect(s->muxc); > + if (ret) > + return ret; Please use {} here, so you check the error when current_child != -1. > + > + ret = mux_control_select(s->muxc, desired_child); > + if (!ret) > + dev_dbg(&pdev->dev, "%s %d -> %d\n", __func__, > + current_child, desired_child); > + } > + > + return ret; > +} > + > +static int mdio_mux_multiplexer_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct mdio_mux_multiplexer_state *s; > + int ret = 0; > + > + s = devm_kzalloc(&pdev->dev, sizeof(*s), GFP_KERNEL); > + if (!s) > + return -ENOMEM; > + > + s->muxc = devm_mux_control_get(dev, NULL); > + if (IS_ERR(s->muxc)) { > + ret = PTR_ERR(s->muxc); > + if (ret != -EPROBE_DEFER) > + dev_err(&pdev->dev, "Failed to get mux: %d\n", ret); > + return ret; > + } > + > + platform_set_drvdata(pdev, s); > + > + ret = mdio_mux_init(&pdev->dev, pdev->dev.of_node, > + mdio_mux_multiplexer_switch_fn, &s->mux_handle, > + pdev, NULL); > + > + return ret; > +} > + > +static int mdio_mux_multiplexer_remove(struct platform_device *pdev) > +{ > + struct mdio_mux_multiplexer_state *s = platform_get_drvdata(pdev); > + > + mdio_mux_uninit(s->mux_handle); I've never used the multiplexer framework before. But i think you need a call to mux_control_deselect() here in order to unlock the multiplexer. Without that, it will deadlock when you reload the module. Andrew