PCA9698 IO expander - Interrupt support with pca953x linux driver

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

PCA9698 IO expander - Interrupt support with pca953x linux driver

Jump to solution
1,329 Views
JonahW
Contributor II

Hi,

I'm currently working on integrating a number of PCA9698 gpio expanders into an embedded Linux system and wanted to make use of the interrupt functionality that these chips have. 

I've been able to configure the device tree to recognise these and can read the IO on a polling basis, but it seems like the driver does not set up interrupts for these devices.

I noticed that in the pca953x driver, the PCA_INT bit is not set in the device id struct for the 9698 (screenshot below, driver code found here), does this mean that the driver currently does not support interrupt functionality for this particular IO expander?

JonahW_0-1654861587451.png

Thanks for any help you can provide in advance,

Jonah

0 Kudos
1 Solution
1,316 Views
diazmarin09
NXP TechSupport
NXP TechSupport

Hello Jonah,

I hope this response finds you well.

Are you planning to use the interrupt pin (open-drain active LOW)? This pin will be activated when one of the port pins changes state and the port pin is configured as an input and the interrupt on it is not masked.

I assume that the driver is not masking the interrupts. In this case, you must set up the  MSK0 to MSK4 registers. The interrupts are not generated by default.

 

diazmarin09_0-1654894356756.png

So, I do recommend to review the source code and make sure it is setting up the MSK registers.

You may find further information at the chapter 7.4.5 from datasheet.

I hope this information will be useful for you.

Regards,

David

View solution in original post

3 Replies
1,317 Views
diazmarin09
NXP TechSupport
NXP TechSupport

Hello Jonah,

I hope this response finds you well.

Are you planning to use the interrupt pin (open-drain active LOW)? This pin will be activated when one of the port pins changes state and the port pin is configured as an input and the interrupt on it is not masked.

I assume that the driver is not masking the interrupts. In this case, you must set up the  MSK0 to MSK4 registers. The interrupts are not generated by default.

 

diazmarin09_0-1654894356756.png

So, I do recommend to review the source code and make sure it is setting up the MSK registers.

You may find further information at the chapter 7.4.5 from datasheet.

I hope this information will be useful for you.

Regards,

David

1,260 Views
JonahW
Contributor II

Hi David,

Just an update on this in case anyone ever has a similar problem, 

I added the MSK registers to the regmap that the driver configures, and then created a separate pca9698_init function specifically for the 9698 chip that is called in the probe function (mainly copying the existing init function for the PCA957x that was already there). In this new init function I set all of the MSK registers to 0 to configure all inputs to trigger interrupts.

I also added a simple I2C write to this init function to set the mode register (0x2A) to 0x12, which enables SmBus Alert functionality. 

JonahW_0-1656334151397.png

With these changes to the driver I can now query address 0x0C on the i2c bus and the 9698 that pulled the interrupt line low will reply with its address successfully. 

Thanks, 

Jonah

0 Kudos
1,294 Views
JonahW
Contributor II

Hi David,

Thanks for your quick response

Yes I was planning on using the interrupt pin, and I think you're right that setting of the MSK registers might not be happening in the driver code.

Something else I've realised since Friday is that the driver has no way of handling the SMbus Alert functionality that I was planning on using, so I will have to write some new code for this. 

Thanks,

Jonah

 

0 Kudos