Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp2456614pxp; Fri, 18 Mar 2022 10:50:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzdbFsd8onI7tzsjKsfFuXnqjHviX4H6PW56Izg7QCIm4/2obIAz0RvZ/ZtkA6BnAGJnBCB X-Received: by 2002:a17:906:9c81:b0:6df:78a0:fb37 with SMTP id fj1-20020a1709069c8100b006df78a0fb37mr10446128ejc.703.1647625858318; Fri, 18 Mar 2022 10:50:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647625858; cv=none; d=google.com; s=arc-20160816; b=QvXpcWNOO8v472wxqDeJIKWzQxqkKQBpTdpAqwt8AIGZ/tpRThDS8X3VxOaOn4F9xr D2I8WvLshcCSmdn0s9r2poyNsoQ5c+KZl4RqqVn9bYFgAHwUfOwy5ZYBdc0XoZ/S2Vrs 8nSJibGwE47T/pfS2QOCNzOW80NDTTQ/EPOJ4PCtvuZAm6/Nlv/Q7eIrsgA9cKYaaRc+ NSkFWHGB21hoid8Lu1SCbC92drgw0P5/1cNqwrgM+ipSTCMfHqqnxG+3g0mComSOK8NI RnljLEXc+CzsNZCSb1hKglgH4MIYGPYgmhy6VqserpgXvdvR7iqVfjFQ4MHIDLrXUrm9 aedQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id:dkim-signature; bh=Lcg0C4WbCSwnegOj3gPrFKrb+pmIXRsphWzUmjcgDh8=; b=RDjzLuAB1k2albwVN7d5y/0m8TlPkqj9atPdR4G97xNPBbAdiUjOxp/28HLXVpNmCr p9AjAeyNa94lOVSCngo6txrlRh8HparDD8uCbhRMR/r1hv3pFdDM7/JyTcLSXsHV43Dc uqJjXNuRC3G/u4AuT5SQNK92/dIWxQOW6Ta4VzPDu0Pzzqc+isEpySGxpbiqEy1oIegy NkejFu2PIIZJCHJ37kD9JngrXT3mQ1HEq4Hxj+QkvXJYV1lvTpWl/pqaNm/R3Zlk2Jez z0R6+JLTepe0MrcK7wIsQfDdO24plUVu1IAx5SZHKzLEMVfnvqDjbXNuDdG7wCapQ0ys r4MA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@conchuod-ie.20210112.gappssmtp.com header.s=20210112 header.b=Wc9AcVsX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=conchuod.ie Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id qf28-20020a1709077f1c00b006df98bc0432si2041174ejc.449.2022.03.18.10.50.30; Fri, 18 Mar 2022 10:50:58 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@conchuod-ie.20210112.gappssmtp.com header.s=20210112 header.b=Wc9AcVsX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=conchuod.ie Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238494AbiCRQQw (ORCPT + 99 others); Fri, 18 Mar 2022 12:16:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50912 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236805AbiCRQQu (ORCPT ); Fri, 18 Mar 2022 12:16:50 -0400 Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 27A00263D for ; Fri, 18 Mar 2022 09:15:30 -0700 (PDT) Received: by mail-wm1-x334.google.com with SMTP id p184-20020a1c29c1000000b0037f76d8b484so5022527wmp.5 for ; Fri, 18 Mar 2022 09:15:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=conchuod-ie.20210112.gappssmtp.com; s=20210112; h=message-id:date:mime-version:user-agent:subject:content-language:to :cc:references:from:in-reply-to:content-transfer-encoding; bh=Lcg0C4WbCSwnegOj3gPrFKrb+pmIXRsphWzUmjcgDh8=; b=Wc9AcVsXkGm4lGKwlgfXQKLPr4Os+R6ImCHiLJ1gY46QbedjO/UoPR/sRrLMsLpkw8 n/w+za9LV7P0Q12ixcoqHoMR8VFoXEbG9Qc3QfbNvIJOqvzVXbBgqv2Lnuwo4S51XyKG bVfi+jXi7jz756e39+YZuEduXBePuhjotkpktPC1MPiKbt8acVYQczGGK2dOkmd9jNG+ VLJKAEL5NBH+4gMOJKYvbFbPyp69pAPob3T80qGkrmiLmuWVjRXate3buxciX9E/I3tR PI3Hn2eLbfgsPgb8F29+dF9D3o5uEzVMpdTV0Yq1cu3oUoeaf6yyYLOVVkRdeEVgg2g3 jfBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to :content-transfer-encoding; bh=Lcg0C4WbCSwnegOj3gPrFKrb+pmIXRsphWzUmjcgDh8=; b=iVjJPoj/rSSvsY6rVhafl6mQciiwNlsGjM2/rRYXPUJipD27p+5Si229/hf01dH4Nf akb3LVe+bXsckHH9Ca4MURb2V1lsoKF+Ne1a+z51XvKqxsxUokz1Lp/sRASXDI22gWZS X6cVLGCcaVazYhOfqwrevl0xa2eYvGWgMyS/97je5x10dJI9IiS2UGNOkzoYrReAFas9 8uT92aOya0bZSI07Qm0sTktnw7h+xN7+AFpUk8FsvpOT+TN7Wyn7mxUxzZDcJGIlNOFQ KAYCPFmIMlBJeWBRzrtJ4Zo4sWF1f6mziHpQnWvpHgJqs06RFUwk3nEA1MNEljom9XcK o2Uw== X-Gm-Message-State: AOAM531NXTWku4Ok8yRcuPjpIOPyFvcFDH9crYS37WM1E8WJoahIwXAv 2lKgV+W7C+N0Y0sktyM6icAnFg== X-Received: by 2002:a1c:7719:0:b0:38b:7226:d366 with SMTP id t25-20020a1c7719000000b0038b7226d366mr15338501wmi.87.1647620128630; Fri, 18 Mar 2022 09:15:28 -0700 (PDT) Received: from [192.168.2.222] ([109.76.4.19]) by smtp.gmail.com with ESMTPSA id f7-20020a0560001a8700b00203c23e55e0sm6789191wry.78.2022.03.18.09.15.27 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Mar 2022 09:15:28 -0700 (PDT) Message-ID: Date: Fri, 18 Mar 2022 16:15:26 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 Subject: Re: [PATCH] i2c: add support for microchip fpga i2c controllers Content-Language: en-US To: Ben Dooks , Conor Dooley , wsa@kernel.org, linux-i2c@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, daire.mcnamara@microchip.com References: <20220315153206.833291-1-conor.dooley@microchip.com> From: Conor Dooley In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 18/03/2022 14:56, Ben Dooks wrote: > On 15/03/2022 15:32, Conor Dooley wrote: >> Add Microchip CoreI2C i2c controller support. This driver supports the >> "hard" i2c controller on the Microchip PolarFire SoC & the basic feature >> set for "soft" i2c controller implemtations in the FPGA fabric. >> >> Co-developed-by: Daire McNamara >> Signed-off-by: Daire McNamara >> Signed-off-by: Conor Dooley >> --- >>   drivers/i2c/busses/Kconfig              |  11 + >>   drivers/i2c/busses/Makefile             |   1 + >>   drivers/i2c/busses/i2c-microchip-core.c | 487 ++++++++++++++++++++++++ >>   3 files changed, 499 insertions(+) >>   create mode 100644 drivers/i2c/busses/i2c-microchip-core.c >> >> diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig >> index a1bae59208e3..3d4d8e0e9de7 100644 >> --- a/drivers/i2c/busses/Kconfig >> +++ b/drivers/i2c/busses/Kconfig >> @@ -781,6 +781,17 @@ config I2C_MESON >>         If you say yes to this option, support will be included for the >>         I2C interface on the Amlogic Meson family of SoCs. > > snip > >> + >> +static void mchp_corei2c_core_disable(struct mchp_corei2c_dev *idev) >> +{ >> +    u8 ctrl = readl(idev->base + CORE_I2C_CTRL); >> + >> +    ctrl &= ~CTRL_ENS1; >> +    writel(ctrl, idev->base + CORE_I2C_CTRL); >> +} >> + >> +static void mchp_corei2c_core_enable(struct mchp_corei2c_dev *idev) >> +{ >> +    u8 ctrl = readl(idev->base + CORE_I2C_CTRL); >> + >> +    ctrl |= CTRL_ENS1; >> +    writel(ctrl, idev->base + CORE_I2C_CTRL); >> +} > > Not sure why you would use readl/writel with an u8, surely an > readb/writeb be better? Sure, can try drop it to b. > > >> +static irqreturn_t mchp_corei2c_handle_isr(struct mchp_corei2c_dev >> *idev) >> +{ >> +    u32 status = idev->isr_status; >> +    u8 ctrl; >> + >> +    if (!idev->buf) { >> +        dev_warn(idev->dev, "unexpected interrupt\n"); >> +        return IRQ_HANDLED; >> +    } > > is IRQ_HANDLED correct here? Hmm, the dev_warn is probably incorrect too. For the mpfs, the interrupt line isn't shared, but the generic fabric core could be. Ill change this. > >> + >> +static int mchp_corei2c_probe(struct platform_device *pdev) >> +{ >> +    struct mchp_corei2c_dev *idev = NULL; >> +    struct resource *res; >> +    int irq, ret; >> +    u32 val; >> + >> +    idev = devm_kzalloc(&pdev->dev, sizeof(*idev), GFP_KERNEL); >> +    if (!idev) >> +        return -ENOMEM; >> + >> +    idev->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); >> +    if (IS_ERR(idev->base)) >> +        return PTR_ERR(idev->base); >> + >> +    irq = platform_get_irq(pdev, 0); >> +    if (irq < 0) >> +        return dev_err_probe(&pdev->dev, irq, >> +                     "missing interrupt resource\n"); >> + >> +    idev->i2c_clk = devm_clk_get(&pdev->dev, NULL); >> +    if (IS_ERR(idev->i2c_clk)) >> +        return dev_err_probe(&pdev->dev, PTR_ERR(idev->i2c_clk), >> +                     "missing clock\n"); >> + >> +    idev->dev = &pdev->dev; >> +    init_completion(&idev->msg_complete); >> +    spin_lock_init(&idev->lock); >> + >> +    val = device_property_read_u32(idev->dev, "clock-frequency", >> +                       &idev->bus_clk_rate); >> +    if (val) { >> +        dev_info(&pdev->dev, "default to 100kHz\n"); >> +        idev->bus_clk_rate = 100000; >> +    } >> + >> +    if (idev->bus_clk_rate > 400000) >> +        return dev_err_probe(&pdev->dev, -EINVAL, >> +                     "clock-frequency too high: %d\n", >> +                     idev->bus_clk_rate); >> + >> +    ret = devm_request_irq(&pdev->dev, irq, mchp_corei2c_isr, >> IRQF_SHARED, >> +                   pdev->name, idev); >> +    if (ret) >> +        return dev_err_probe(&pdev->dev, ret, >> +                     "failed to claim irq %d\n", irq); >> + >> +    ret = clk_prepare_enable(idev->i2c_clk); >> +    if (ret) >> +        return dev_err_probe(&pdev->dev, ret, >> +                     "failed to enable clock\n"); >> + >> +    ret = mchp_corei2c_init(idev); >> +    if (ret) >> +        return dev_err_probe(&pdev->dev, ret, >> +                     "failed to program clock divider\n"); > > going to leak a prepared clock from here on? Aye, good spot. Thanks. >> +    i2c_set_adapdata(&idev->adapter, idev); >> +    snprintf(idev->adapter.name, sizeof(idev->adapter.name), >> +         "Microchip I2C hw bus"); >> +    idev->adapter.owner = THIS_MODULE; >> +    idev->adapter.algo = &mchp_corei2c_algo; >> +    idev->adapter.dev.parent = &pdev->dev; >> +    idev->adapter.dev.of_node = pdev->dev.of_node; >> + >> +    platform_set_drvdata(pdev, idev); >> + >> +    ret = i2c_add_adapter(&idev->adapter); >> +    if (ret) { >> +        clk_disable_unprepare(idev->i2c_clk); >> +        return ret; >> +    } >> + >> +    dev_info(&pdev->dev, "Microchip I2C Probe Complete\n"); > > not sure if necessary, doesn't the i2c core also announce? The only thing I see on boot is this, but I'll take a look and see if I can do this via the core. > >> +    return 0; >> +} >> + >> +static int mchp_corei2c_remove(struct platform_device *pdev) >> +{ >> +    struct mchp_corei2c_dev *idev = platform_get_drvdata(pdev); >> + >> +    clk_disable_unprepare(idev->i2c_clk); >> +    i2c_del_adapter(&idev->adapter); >> + >> +    return 0; >> +} >> + >> +static const struct of_device_id mchp_corei2c_of_match[] = { >> +    { .compatible = "microchip,mpfs-i2c" }, >> +    { .compatible = "microchip,corei2c-rtl-v7" }, >> +    {}, >> +}; >> +MODULE_DEVICE_TABLE(of, mchp_corei2c_of_match); >> + >> +static struct platform_driver mchp_corei2c_driver = { >> +    .probe = mchp_corei2c_probe, >> +    .remove = mchp_corei2c_remove, >> +    .driver = { >> +        .name = "microchip-corei2c", >> +        .of_match_table = mchp_corei2c_of_match, >> +    }, >> +}; >> + >> +module_platform_driver(mchp_corei2c_driver); >> + >> +MODULE_DESCRIPTION("Microchip CoreI2C bus driver"); >> +MODULE_AUTHOR("Daire McNamara "); >> +MODULE_AUTHOR("Conor Dooley "); >> +MODULE_LICENSE("GPL v2"); > >