From: LakshmiPraveen Kopparthi <LakshmiPraveen.Kopparthi@microchip.com>
To: Dmitry Osipenko <digetx@gmail.com>
Cc: <UNGLinuxDriver@microchip.com>, <wsa@kernel.org>,
<andriy.shevchenko@linux.intel.com>, <treding@nvidia.com>,
<mirq-linux@rere.qmqm.pl>, <s.shtylyov@omp.ru>,
<linux-i2c@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v1 1/2] i2c:busses:Register PCI1XXXX adapter to I2C subsystem
Date: Tue, 5 Oct 2021 14:20:40 +0530 [thread overview]
Message-ID: <683a7136ec818d01420a5c2cbf43e13498d82740.camel@microchip.com> (raw)
In-Reply-To: <d39e99ff-6498-e532-e833-1c65861d566f@gmail.com>
On Wed, 2021-09-29 at 10:18 +0300, Dmitry Osipenko wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you
> know the content is safe
>
> 29.09.2021 09:22, LakshmiPraveen Kopparthi пишет:
>
> Change title of the patch to:
>
> "i2c: busses: Add driver for PCI1XXXX adapter"
Ok. I will change it.
>
> ...
> > +#define SMB_CORE_CTRL_ESO (0x40)
> > +#define SMB_CORE_CTRL_FW_ACK (0x10)
>
> Parentheses are not needed here.
ok. Got it.
>
>
> > +#define PCI1XXXX_I2C_TIMEOUT (msecs_to_jiffies(1000))
>
> And here.
ok. Got it.
>
> ...
> > +static irqreturn_t pci1xxxx_i2c_isr(int irq, void *dev)
> > +{
> > + struct pci1xxxx_i2c *i2c = dev;
> > + bool intr_handled = false;
> > + unsigned long flags;
> > + u16 regval;
> > + u8 regval1;
> > +
> > + spin_lock_irqsave(&i2c->lock, flags);
>
> Interrupt is disabled in ISR, this lock does nothing.
Ok. But there are some registers that are read and updated in the ISR
and in the foreground.
I will add the lock for these register access.
>
> > + /* Mask the interrupt */
> > + regval = readw(i2c->i2c_base + SMBUS_GEN_INT_MASK_REG_OFF);
> > + regval |= (SMBALERT_INTR_MASK | I2C_BUF_MSTR_INTR_MASK);
> > + writew(regval, (i2c->i2c_base + SMBUS_GEN_INT_MASK_REG_OFF));
>
> writew(regval, (parentheses not needed here));
>
> Similar for all other places in the code.
ok.Got it.
>
> > + /*
> > + * Read the SMBus interrupt status register to see if the
> > + * DMA_TERM interrupt has caused this callback
> > + */
> > + regval = readw(i2c->i2c_base + SMBUS_GEN_INT_STAT_REG_OFF);
> > +
> > + if (regval & I2C_BUF_MSTR_INTR_MASK) {
> > + regval1 = readb(i2c->i2c_base +
> > SMBUS_INTR_STAT_REG_OFF);
> > + if (regval1 & INTR_STAT_DMA_TERM) {
> > + complete(&i2c->i2c_xfer_done);
> > + intr_handled = true;
> > + writeb(INTR_STAT_DMA_TERM,
> > + (i2c->i2c_base +
> > SMBUS_INTR_STAT_REG_OFF));
> > + }
> > + /* ACK the high level interrupt */
> > + writew(I2C_BUF_MSTR_INTR_MASK,
> > + (i2c->i2c_base + SMBUS_GEN_INT_STAT_REG_OFF));
> > + }
> > +
> > + if (regval & SMBALERT_INTR_MASK) {
> > + intr_handled = true;
> > + /* ACK the high level interrupt */
> > + writew(SMBALERT_INTR_MASK,
> > + (i2c->i2c_base + SMBUS_GEN_INT_STAT_REG_OFF));
> > + }
> > +
> > + regval = readw(i2c->i2c_base + SMBUS_GEN_INT_MASK_REG_OFF);
> > + /* UnMask the interrupt */
> > + regval &= ~(I2C_BUF_MSTR_INTR_MASK | SMBALERT_INTR_MASK);
> > + writew(regval, (i2c->i2c_base + SMBUS_GEN_INT_MASK_REG_OFF));
> > +
> > + spin_unlock_irqrestore(&i2c->lock, flags);
> > +
> > + if (intr_handled)
> > + return IRQ_HANDLED;
> > + else
> > + return IRQ_NONE;
>
> return intr_handled ? IRQ_HANDLED : IRQ_NONE;
>
> Or turn intr_handled into "irqreturn_t ret" and return it directly.
Ok. Got it.
>
> ...> +static void pci1xxxx_i2c_set_freq(struct pci1xxxx_i2c
> *i2c)
> > +{
> > + /*
> > + * The SMB core needs specific values to be set in the
> > BUS_CLK register
> > + * for the corresponding frequency
> > + */
> > + switch (i2c->freq) {
>
> Why i2c->freq is fixed to I2C_MAX_FAST_MODE_FREQ in
> pci1xxxx_i2c_init()?
This is the default frequency at which the adapter shall operate. This
driver is targeted for x86,X64 platforms. Could you please suggest a
way to configure the freqeuncy?
>
> ...
> > +static void pci1xxxx_i2c_init(struct pci1xxxx_i2c *i2c)
> > +{
> > + i2c->freq = I2C_MAX_FAST_MODE_FREQ;
> ...
>
> > +static u32 pci1xxxx_i2c_get_funcs(struct i2c_adapter *adap)
> > +{
> > + return (I2C_FUNC_I2C | I2C_FUNC_PROTOCOL_MANGLING
> > + | I2C_FUNC_SMBUS_BLOCK_PROC_CALL
> > + | I2C_FUNC_SMBUS_READ_BYTE |
> > I2C_FUNC_SMBUS_WRITE_BYTE
> > + | I2C_FUNC_SMBUS_READ_BYTE_DATA
> > + | I2C_FUNC_SMBUS_WRITE_BYTE_DATA
> > + | I2C_FUNC_SMBUS_READ_WORD_DATA
> > + | I2C_FUNC_SMBUS_WRITE_WORD_DATA
> > + | I2C_FUNC_SMBUS_PROC_CALL |
> > I2C_FUNC_SMBUS_READ_BLOCK_DATA
> > + | I2C_FUNC_SMBUS_WRITE_BLOCK_DATA);
> > +}
> The 'or' should be on the right side and parentheses are not needed.
ok.Got it.
>
> ...
> > +static int pci1xxxx_i2c_resume(struct device *dev)> +{
> > + struct pci1xxxx_i2c *i2c = dev_get_drvdata(dev);
> > + struct pci_dev *pdev = to_pci_dev(dev);
> > + u32 regval;
> > +
> > + i2c_mark_adapter_resumed(&i2c->adap);
> > +
> > + regval = readl(i2c->i2c_base + SMBUS_RESET_REG);
> > + regval &= ~PERI_SMBUS_D3_RESET_DIS;
> > + writel(regval, i2c->i2c_base + SMBUS_RESET_REG);
>
> Adapter is resumed after register is written.
Ok. I will change it.
>
> > + return 0;
> > +}
> > +
> > +static SIMPLE_DEV_PM_OPS(pci1xxxx_i2c_pm_ops,
> > pci1xxxx_i2c_suspend,
> > + pci1xxxx_i2c_resume);
> > +
> > +static int pci1xxxx_i2c_probe_pci(struct pci_dev *pdev,
> > + const struct pci_device_id *ent)
> > +{
> ...
> > + pci1xxxx_i2c_init(i2c);
> > +
> > + i2c->adap = pci1xxxx_i2c_ops;
> > +
> > + i2c->adap.class = I2C_CLASS_SPD;
> > + i2c->adap.dev.parent = &pdev->dev;
> > +
> > + snprintf(i2c->adap.name, sizeof(i2c->adap.name),
> > + "MCHP PCI1xxxx i2c adapter at %s", pci_name(pdev));
> > +
> > + i2c_set_adapdata(&i2c->adap, i2c);
> > +
> > + ret = i2c_add_adapter(&i2c->adap);
> > + if (ret) {
> > + dev_err(&pdev->dev, "i2c add adapter failed = %d\n",
> > ret);
> > + goto err_free_region;
>
> pci1xxxx_i2c_shutdown()?
Ok.Understood.Will add it.
>
> > + }
> > +
> > + return 0;
> > +
> > +err_free_region:
> > + pci_release_regions(pdev);
> > + return ret;
> > +}
> > +
> > +static void pci1xxxx_i2c_shutdown(struct pci1xxxx_i2c *i2c)
> > +{
> > + pci1xxxx_i2c_config_padctrl(i2c, false);
> > + pci1xxxx_i2c_configure_core_reg(i2c, false);
> > +}
> > +
> > +static void pci1xxxx_i2c_remove_pci(struct pci_dev *pdev)
> > +{
> > + struct pci1xxxx_i2c *i2c = pci_get_drvdata(pdev);
> > +
> > + pci1xxxx_i2c_shutdown(i2c);
> > + i2c_del_adapter(&i2c->adap);
> > +}
> > +
> > +static const struct pci_device_id pci1xxxx_i2c_pci_id_table[] = {
> > + { PCI_DEVICE(PCI_VENDOR_ID_MICROCHIP, PCI12000_I2C_PID) },
> > + { PCI_DEVICE(PCI_VENDOR_ID_MICROCHIP, PCI11010_I2C_PID) },
> > + { PCI_DEVICE(PCI_VENDOR_ID_MICROCHIP, PCI11101_I2C_PID) },
> > + { PCI_DEVICE(PCI_VENDOR_ID_MICROCHIP, PCI11400_I2C_PID) },
> > + { PCI_DEVICE(PCI_VENDOR_ID_MICROCHIP, PCI11414_I2C_PID) },
> > + {0, }
> > +};
> > +
> > +MODULE_DEVICE_TABLE(pci, pci1xxxx_i2c_pci_id_table);
> > +
> > +static struct pci_driver pci1xxxx_i2c_pci_driver = {
> > + .name = DRV_NAME,
>
> Assign name directly, DRV_NAME unneeded.
ok.Got it.
next prev parent reply other threads:[~2021-10-05 8:50 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-29 6:22 [PATCH v1 0/2] i2c:busses:Microchip PCI1XXXX I2C adapter LakshmiPraveen Kopparthi
2021-09-29 6:22 ` [PATCH v1 1/2] i2c:busses:Register PCI1XXXX adapter to I2C subsystem LakshmiPraveen Kopparthi
2021-09-29 7:18 ` Dmitry Osipenko
2021-09-29 14:35 ` Dmitry Osipenko
2021-10-05 8:49 ` LakshmiPraveen Kopparthi
2021-09-29 16:44 ` Andy Shevchenko
2021-10-05 8:49 ` LakshmiPraveen Kopparthi
2021-10-05 8:50 ` LakshmiPraveen Kopparthi [this message]
2021-10-07 16:24 ` Dmitry Osipenko
2021-10-07 16:33 ` Andy Shevchenko
2021-10-07 16:30 ` Dmitry Osipenko
2021-09-29 17:12 ` Michał Mirosław
2021-10-08 6:22 ` LakshmiPraveen Kopparthi
2021-10-07 16:40 ` Dmitry Osipenko
2021-10-07 17:05 ` Andy Shevchenko
2021-09-29 6:22 ` [PATCH v1 2/2] i2c:busses:Read and Write routines for PCI1XXXX I2C module LakshmiPraveen Kopparthi
2021-09-29 7:20 ` Dmitry Osipenko
2021-10-05 8:48 ` LakshmiPraveen Kopparthi
2021-10-07 16:15 ` Dmitry Osipenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=683a7136ec818d01420a5c2cbf43e13498d82740.camel@microchip.com \
--to=lakshmipraveen.kopparthi@microchip.com \
--cc=UNGLinuxDriver@microchip.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=digetx@gmail.com \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mirq-linux@rere.qmqm.pl \
--cc=s.shtylyov@omp.ru \
--cc=treding@nvidia.com \
--cc=wsa@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).