* [RFC]: Supporting PIO mode of operation in i2c_msg->flags [not found] <5562EF9D.1090403@linaro.org> @ 2015-05-28 13:55 ` Vaibhav Hiremath 2015-06-11 19:50 ` Vaibhav Hiremath 0 siblings, 1 reply; 2+ messages in thread From: Vaibhav Hiremath @ 2015-05-28 13:55 UTC (permalink / raw) To: linux-arm-kernel On Monday 25 May 2015 03:17 PM, Vaibhav Hiremath wrote: > > Hi, > > This is rather an old issue, for which I have also done custom & hacky > solution in the past. > > Please let me know if there is already an some other method or accepted > workaround to this issue. Also, let me know if you have any suggestions > on this patch, I would be happy to work on it. > > > Problem Statement: > ------------------ > In certain embedded platforms, the board power on/off is managed by > PMIC IC, which in most of the cases is over I2C bus. > So during shutdown/reboot you may have to do I2C transactions to access > PMIC, which may sleep if I2C bus driver is not functioning in PIO by > default. > > This is unexpected, to sleep after you disable the interrupts. > > For example, > > During reboot/shutdown, the execution call reaches to, > > void machine_power_off(void) > { > local_irq_disable(); > smp_send_stop(); > if (pm_power_off) > pm_power_off(); > } > > pm_power_off will try to do I2C transaction to access PMIC, which may > sleep/schedule. > > > Current implementation: > -------------------- > > Everyone probably does have their own custom implementation for this. > Or some other mechanism to achieve this (may be hardware support). > > > Proposal: > --------- > > If I am not missing any other way of handling this situation, > below proposal should be clean and acceptable (I hope so :) ) > > > Add flags to choose PIO mode, for I2C transactions, and the default > would be to non-PIO mode. > > > struct i2c_msg flags : > > #define I2C_M_PIO 0x0800 > > > And also add respective functionality flags > > #define I2C_FUNC_PIO 0x10000000 /* Driver should support PIO mode*/ > > > In the bus driver, > > Inside master_xfer() callback we will check whether the intended i2c > transaction is meant to be processed in PIO mode, if yes, then we will > call PIO api, else as usual non-pio api should serve. > > > static int xxx_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int > num) > { > ... > > > /* We can also check i2c_check_functionality(adap,I2C_FUNC_PIO) */ > if (msg->flags & I2C_M_PIO) { > /* PIO mode operation */ > } else { > /* non-pio mode of operation */ > } > > > ... > > > return ret; > } > > > Feedback/comments are always welcome. > > Thanks, > Vaibhav Any comments on the RFC? Also, + linux-arm & Wolfram Sang Thanks, Vaibhav ^ permalink raw reply [flat|nested] 2+ messages in thread
* [RFC]: Supporting PIO mode of operation in i2c_msg->flags 2015-05-28 13:55 ` [RFC]: Supporting PIO mode of operation in i2c_msg->flags Vaibhav Hiremath @ 2015-06-11 19:50 ` Vaibhav Hiremath 0 siblings, 0 replies; 2+ messages in thread From: Vaibhav Hiremath @ 2015-06-11 19:50 UTC (permalink / raw) To: linux-arm-kernel On Thursday 28 May 2015 07:25 PM, Vaibhav Hiremath wrote: > > > On Monday 25 May 2015 03:17 PM, Vaibhav Hiremath wrote: >> >> Hi, >> >> This is rather an old issue, for which I have also done custom & hacky >> solution in the past. >> >> Please let me know if there is already an some other method or accepted >> workaround to this issue. Also, let me know if you have any suggestions >> on this patch, I would be happy to work on it. >> >> >> Problem Statement: >> ------------------ >> In certain embedded platforms, the board power on/off is managed by >> PMIC IC, which in most of the cases is over I2C bus. >> So during shutdown/reboot you may have to do I2C transactions to access >> PMIC, which may sleep if I2C bus driver is not functioning in PIO by >> default. >> >> This is unexpected, to sleep after you disable the interrupts. >> >> For example, >> >> During reboot/shutdown, the execution call reaches to, >> >> void machine_power_off(void) >> { >> local_irq_disable(); >> smp_send_stop(); >> if (pm_power_off) >> pm_power_off(); >> } >> >> pm_power_off will try to do I2C transaction to access PMIC, which may >> sleep/schedule. >> >> >> Current implementation: >> -------------------- >> >> Everyone probably does have their own custom implementation for this. >> Or some other mechanism to achieve this (may be hardware support). >> >> >> Proposal: >> --------- >> >> If I am not missing any other way of handling this situation, >> below proposal should be clean and acceptable (I hope so :) ) >> >> >> Add flags to choose PIO mode, for I2C transactions, and the default >> would be to non-PIO mode. >> >> >> struct i2c_msg flags : >> >> #define I2C_M_PIO 0x0800 >> >> >> And also add respective functionality flags >> >> #define I2C_FUNC_PIO 0x10000000 /* Driver should support PIO mode*/ >> >> >> In the bus driver, >> >> Inside master_xfer() callback we will check whether the intended i2c >> transaction is meant to be processed in PIO mode, if yes, then we will >> call PIO api, else as usual non-pio api should serve. >> >> >> static int xxx_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int >> num) >> { >> ... >> >> >> /* We can also check i2c_check_functionality(adap,I2C_FUNC_PIO) */ >> if (msg->flags & I2C_M_PIO) { >> /* PIO mode operation */ >> } else { >> /* non-pio mode of operation */ >> } >> >> >> ... >> >> >> return ret; >> } >> >> >> Feedback/comments are always welcome. >> >> Thanks, >> Vaibhav > > > Any comments on the RFC? > > Also, > + linux-arm & Wolfram Sang > Wolfram, Any comment on this RFC? Thanks, Vaibhav ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-06-11 19:50 UTC | newest] Thread overview: 2+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <5562EF9D.1090403@linaro.org> 2015-05-28 13:55 ` [RFC]: Supporting PIO mode of operation in i2c_msg->flags Vaibhav Hiremath 2015-06-11 19:50 ` Vaibhav Hiremath
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).