[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Yg89wEi9I4LpcPus@matsya>
Date: Fri, 18 Feb 2022 12:03:36 +0530
From: Vinod Koul <vkoul@...nel.org>
To: Bjorn Andersson <bjorn.andersson@...aro.org>
Cc: Wolfram Sang <wsa@...nel.org>, linux-arm-msm@...r.kernel.org,
Andy Gross <agross@...nel.org>,
Douglas Anderson <dianders@...omium.org>,
Matthias Kaehlcke <mka@...omium.org>,
linux-i2c@...r.kernel.org, linux-kernel@...r.kernel.org,
Alexey Minnekhanov <alexeymin@...tmarketos.org>
Subject: Re: [PATCH v5] i2c: qcom-geni: Add support for GPI DMA
On 17-02-22, 09:35, Bjorn Andersson wrote:
> > +static void i2c_gpi_cb_result(void *cb, const struct dmaengine_result *result)
> > +{
> > + struct geni_i2c_dev *gi2c = cb;
> > +
> > + if (result->result != DMA_TRANS_NOERROR) {
> > + dev_err(gi2c->se.dev, "DMA txn failed:%d\n", result->result);
>
> Iiuc the API the expectation is that if we get !NOERROR we shouldn't
> expect to get NOERROR after that.
>
> If so we're just returning here and leaving geni_i2c_gpi_xfer() to just
> timeout in a HZ or so. Given that xfer happens under the adaptor lock,
> how about carrying an error in geni_i2c_dev and complete(&done) here as
> well?
Yes we should call complete for errors too, will add that
> > +static int setup_gpi_dma(struct geni_i2c_dev *gi2c)
> > +{
> > + int ret;
> > +
> > + geni_se_select_mode(&gi2c->se, GENI_GPI_DMA);
> > + gi2c->tx_c = dma_request_chan(gi2c->se.dev, "tx");
> > + if (IS_ERR(gi2c->tx_c)) {
> > + ret = dev_err_probe(gi2c->se.dev, PTR_ERR(gi2c->tx_c),
> > + "Failed to get tx DMA ch\n");
> > + if (ret < 0)
> > + goto err_tx;
> > + }
> > +
> > + gi2c->rx_c = dma_request_chan(gi2c->se.dev, "rx");
> > + if (IS_ERR(gi2c->rx_c)) {
> > + ret = dev_err_probe(gi2c->se.dev, PTR_ERR(gi2c->rx_c),
> > + "Failed to get rx DMA ch\n");
> > + if (ret < 0)
> > + goto err_rx;
> > + }
> > +
> > + dev_dbg(gi2c->se.dev, "Grabbed GPI dma channels\n");
> > + return 0;
> > +
> > +err_rx:
> > + dma_release_channel(gi2c->tx_c);
> > + gi2c->tx_c = NULL;
>
> You're not accessing tx_c or rx_c again when returning an error here. So
> I don't think there's a reason to clear them.
Will drop that
> > static int geni_i2c_remove(struct platform_device *pdev)
> > {
> > struct geni_i2c_dev *gi2c = platform_get_drvdata(pdev);
> >
> > + release_gpi_dma(gi2c);
>
> Your i2c devices aren't torn down until i2c_del_adapter(), so you might
> still end up trying to use the two channels here, after releasing them.
>
> In other words, I think you should reorder these.
Agreed it should be other way round!
Thanks
--
~Vinod
Powered by blists - more mailing lists