* [PATCH v2 0/4] i2c: davinci: Add power management features
@ 2009-12-08 10:13 Chaithrika U S
[not found] ` <1260267218-19406-1-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org>
0 siblings, 1 reply; 11+ messages in thread
From: Chaithrika U S @ 2009-12-08 10:13 UTC (permalink / raw)
To: linux-i2c-u79uwXL29TY76Z2rM5mHXA
Cc: davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/,
khilman-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR, Chaithrika U S
Add suspend/resume and cpufreq features to DaVinci I2C driver
All patches apply to Linus' kernel tree.
Testing of these features was done on DA850/OMAP-L138 EVM.
Chaithrika U S (4):
i2c: davinci: Remove MOD_REG_BIT and IO_ADDRESS usage
i2c: davinci: Add helper functions
i2c: davinci: Add suspend/resume support
i2c: davinci: Add cpufreq support
drivers/i2c/busses/i2c-davinci.c | 224 ++++++++++++++++++++++++++++----------
1 files changed, 168 insertions(+), 56 deletions(-)
^ permalink raw reply [flat|nested] 11+ messages in thread[parent not found: <1260267218-19406-1-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org>]
* [PATCH v2 1/4] i2c: davinci: Remove MOD_REG_BIT and IO_ADDRESS usage [not found] ` <1260267218-19406-1-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org> @ 2009-12-08 10:13 ` Chaithrika U S [not found] ` <1260267218-19406-2-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org> 2009-12-15 12:57 ` [PATCH v2 0/4] i2c: davinci: Add power management features Chaithrika U S 1 sibling, 1 reply; 11+ messages in thread From: Chaithrika U S @ 2009-12-08 10:13 UTC (permalink / raw) To: linux-i2c-u79uwXL29TY76Z2rM5mHXA Cc: davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/, khilman-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR, Chaithrika U S Cleanup the DaVinci I2C driver. Remove MOD_REG_BIT macro. Also use ioremap instead of IO_ADDRESS macro. Signed-off-by: Chaithrika U S <chaithrika-l0cyMroinI0@public.gmane.org> --- drivers/i2c/busses/i2c-davinci.c | 77 +++++++++++++++++++------------------- 1 files changed, 38 insertions(+), 39 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index c89687a..44a3cb3 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -37,7 +37,6 @@ #include <linux/io.h> #include <mach/hardware.h> - #include <mach/i2c.h> /* ----- global defines ----------------------------------------------- */ @@ -71,37 +70,29 @@ #define DAVINCI_I2C_IVR_NACK 0x02 #define DAVINCI_I2C_IVR_AL 0x01 -#define DAVINCI_I2C_STR_BB (1 << 12) -#define DAVINCI_I2C_STR_RSFULL (1 << 11) -#define DAVINCI_I2C_STR_SCD (1 << 5) -#define DAVINCI_I2C_STR_ARDY (1 << 2) -#define DAVINCI_I2C_STR_NACK (1 << 1) -#define DAVINCI_I2C_STR_AL (1 << 0) - -#define DAVINCI_I2C_MDR_NACK (1 << 15) -#define DAVINCI_I2C_MDR_STT (1 << 13) -#define DAVINCI_I2C_MDR_STP (1 << 11) -#define DAVINCI_I2C_MDR_MST (1 << 10) -#define DAVINCI_I2C_MDR_TRX (1 << 9) -#define DAVINCI_I2C_MDR_XA (1 << 8) -#define DAVINCI_I2C_MDR_RM (1 << 7) -#define DAVINCI_I2C_MDR_IRS (1 << 5) - -#define DAVINCI_I2C_IMR_AAS (1 << 6) -#define DAVINCI_I2C_IMR_SCD (1 << 5) -#define DAVINCI_I2C_IMR_XRDY (1 << 4) -#define DAVINCI_I2C_IMR_RRDY (1 << 3) -#define DAVINCI_I2C_IMR_ARDY (1 << 2) -#define DAVINCI_I2C_IMR_NACK (1 << 1) -#define DAVINCI_I2C_IMR_AL (1 << 0) - -#define MOD_REG_BIT(val, mask, set) do { \ - if (set) { \ - val |= mask; \ - } else { \ - val &= ~mask; \ - } \ -} while (0) +#define DAVINCI_I2C_STR_BB BIT(12) +#define DAVINCI_I2C_STR_RSFULL BIT(11) +#define DAVINCI_I2C_STR_SCD BIT(5) +#define DAVINCI_I2C_STR_ARDY BIT(2) +#define DAVINCI_I2C_STR_NACK BIT(1) +#define DAVINCI_I2C_STR_AL BIT(0) + +#define DAVINCI_I2C_MDR_NACK BIT(15) +#define DAVINCI_I2C_MDR_STT BIT(13) +#define DAVINCI_I2C_MDR_STP BIT(11) +#define DAVINCI_I2C_MDR_MST BIT(10) +#define DAVINCI_I2C_MDR_TRX BIT(9) +#define DAVINCI_I2C_MDR_XA BIT(8) +#define DAVINCI_I2C_MDR_RM BIT(7) +#define DAVINCI_I2C_MDR_IRS BIT(5) + +#define DAVINCI_I2C_IMR_AAS BIT(6) +#define DAVINCI_I2C_IMR_SCD BIT(5) +#define DAVINCI_I2C_IMR_XRDY BIT(4) +#define DAVINCI_I2C_IMR_RRDY BIT(3) +#define DAVINCI_I2C_IMR_ARDY BIT(2) +#define DAVINCI_I2C_IMR_NACK BIT(1) +#define DAVINCI_I2C_IMR_AL BIT(0) struct davinci_i2c_dev { struct device *dev; @@ -154,7 +145,7 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) /* put I2C into reset */ w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); - MOD_REG_BIT(w, DAVINCI_I2C_MDR_IRS, 0); + w &= ~DAVINCI_I2C_MDR_IRS; davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); /* NOTE: I2C Clock divider programming info @@ -204,7 +195,7 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) /* Take the I2C module out of reset: */ w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); - MOD_REG_BIT(w, DAVINCI_I2C_MDR_IRS, 1); + w |= DAVINCI_I2C_MDR_IRS; davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); /* Enable interrupts */ @@ -284,9 +275,9 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop) /* Enable receive or transmit interrupts */ w = davinci_i2c_read_reg(dev, DAVINCI_I2C_IMR_REG); if (msg->flags & I2C_M_RD) - MOD_REG_BIT(w, DAVINCI_I2C_IMR_RRDY, 1); + w |= DAVINCI_I2C_IMR_RRDY; else - MOD_REG_BIT(w, DAVINCI_I2C_IMR_XRDY, 1); + w |= DAVINCI_I2C_IMR_XRDY; davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, w); dev->terminate = 0; @@ -333,7 +324,7 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop) return msg->len; if (stop) { w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); - MOD_REG_BIT(w, DAVINCI_I2C_MDR_STP, 1); + w |= DAVINCI_I2C_MDR_STP; davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); } return -EREMOTEIO; @@ -461,7 +452,7 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) w = davinci_i2c_read_reg(dev, DAVINCI_I2C_IMR_REG); - MOD_REG_BIT(w, DAVINCI_I2C_IMR_XRDY, 0); + w &= ~DAVINCI_I2C_IMR_XRDY; davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, w); @@ -540,7 +531,12 @@ static int davinci_i2c_probe(struct platform_device *pdev) } clk_enable(dev->clk); - dev->base = (void __iomem *)IO_ADDRESS(mem->start); + dev->base = ioremap(mem->start, resource_size(mem)); + if (!dev->base) { + r = -EBUSY; + goto err_mem_ioremap; + } + i2c_davinci_init(dev); r = request_irq(dev->irq, i2c_davinci_isr, 0, pdev->name, dev); @@ -570,6 +566,8 @@ static int davinci_i2c_probe(struct platform_device *pdev) err_free_irq: free_irq(dev->irq, dev); err_unuse_clocks: + iounmap(dev->base); +err_mem_ioremap: clk_disable(dev->clk); clk_put(dev->clk); dev->clk = NULL; @@ -598,6 +596,7 @@ static int davinci_i2c_remove(struct platform_device *pdev) davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, 0); free_irq(IRQ_I2C, dev); + iounmap(dev->base); kfree(dev); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); -- 1.5.6 ^ permalink raw reply related [flat|nested] 11+ messages in thread
[parent not found: <1260267218-19406-2-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org>]
* [PATCH v2 2/4] i2c: davinci: Add helper functions [not found] ` <1260267218-19406-2-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org> @ 2009-12-08 10:13 ` Chaithrika U S [not found] ` <1260267218-19406-3-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org> 0 siblings, 1 reply; 11+ messages in thread From: Chaithrika U S @ 2009-12-08 10:13 UTC (permalink / raw) To: linux-i2c-u79uwXL29TY76Z2rM5mHXA Cc: davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/, khilman-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR, Chaithrika U S Add i2c reset control and clock divider calculation functions which will be useful for power management features. Signed-off-by: Chaithrika U S <chaithrika-l0cyMroinI0@public.gmane.org> --- drivers/i2c/busses/i2c-davinci.c | 56 +++++++++++++++++++++++++------------- 1 files changed, 37 insertions(+), 19 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index 44a3cb3..81c1049 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -124,12 +124,21 @@ static inline u16 davinci_i2c_read_reg(struct davinci_i2c_dev *i2c_dev, int reg) return __raw_readw(i2c_dev->base + reg); } -/* - * This functions configures I2C and brings I2C out of reset. - * This function is called during I2C init function. This function - * also gets called if I2C encounters any errors. - */ -static int i2c_davinci_init(struct davinci_i2c_dev *dev) +static inline void davinci_i2c_reset_ctrl(struct davinci_i2c_dev *i2c_dev, + int val) +{ + u16 w; + + w = davinci_i2c_read_reg(i2c_dev, DAVINCI_I2C_MDR_REG); + if (!val) /* put I2C into reset */ + w &= ~DAVINCI_I2C_MDR_IRS; + else /* take I2C out of reset */ + w |= DAVINCI_I2C_MDR_IRS; + + davinci_i2c_write_reg(i2c_dev, DAVINCI_I2C_MDR_REG, w); +} + +static void i2c_davinci_calc_clk_dividers(struct davinci_i2c_dev *dev) { struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; u16 psc; @@ -138,15 +147,6 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) u32 clkh; u32 clkl; u32 input_clock = clk_get_rate(dev->clk); - u16 w; - - if (!pdata) - pdata = &davinci_i2c_platform_data_default; - - /* put I2C into reset */ - w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); - w &= ~DAVINCI_I2C_MDR_IRS; - davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); /* NOTE: I2C Clock divider programming info * As per I2C specs the following formulas provide prescaler @@ -178,12 +178,32 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKH_REG, clkh); davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKL_REG, clkl); + dev_dbg(dev->dev, "input_clock = %d, CLK = %d\n", input_clock, clk); +} + +/* + * This function configures I2C and brings I2C out of reset. + * This function is called during I2C init function. This function + * also gets called if I2C encounters any errors. + */ +static int i2c_davinci_init(struct davinci_i2c_dev *dev) +{ + struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; + + if (!pdata) + pdata = &davinci_i2c_platform_data_default; + + /* put I2C into reset */ + davinci_i2c_reset_ctrl(dev, 0); + + /* compute clock dividers */ + i2c_davinci_calc_clk_dividers(dev); + /* Respond at reserved "SMBus Host" slave address" (and zero); * we seem to have no option to not respond... */ davinci_i2c_write_reg(dev, DAVINCI_I2C_OAR_REG, 0x08); - dev_dbg(dev->dev, "input_clock = %d, CLK = %d\n", input_clock, clk); dev_dbg(dev->dev, "PSC = %d\n", davinci_i2c_read_reg(dev, DAVINCI_I2C_PSC_REG)); dev_dbg(dev->dev, "CLKL = %d\n", @@ -194,9 +214,7 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) pdata->bus_freq, pdata->bus_delay); /* Take the I2C module out of reset: */ - w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); - w |= DAVINCI_I2C_MDR_IRS; - davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); + davinci_i2c_reset_ctrl(dev, 1); /* Enable interrupts */ davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, I2C_DAVINCI_INTR_ALL); -- 1.5.6 ^ permalink raw reply related [flat|nested] 11+ messages in thread
[parent not found: <1260267218-19406-3-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org>]
* [PATCH v2 3/4] i2c: davinci: Add suspend/resume support [not found] ` <1260267218-19406-3-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org> @ 2009-12-08 10:13 ` Chaithrika U S [not found] ` <1260267218-19406-4-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org> 2009-12-08 11:24 ` [PATCH v2 2/4] i2c: davinci: Add helper functions Sergei Shtylyov 1 sibling, 1 reply; 11+ messages in thread From: Chaithrika U S @ 2009-12-08 10:13 UTC (permalink / raw) To: linux-i2c-u79uwXL29TY76Z2rM5mHXA Cc: davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/, khilman-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR, Chaithrika U S Add suspend and resume callbacks to DaVinci I2C driver. This has been tested on DA850/OMAP-L138 EVM. The SoC specific suspend-to-RAM support patch series [1] is needed to test this feature. [1] http://linux.davincidsp.com/pipermail/davinci-linux-open-source/ 2009-November/016958.html Signed-off-by: Chaithrika U S <chaithrika-l0cyMroinI0@public.gmane.org> --- drivers/i2c/busses/i2c-davinci.c | 32 ++++++++++++++++++++++++++++++++ 1 files changed, 32 insertions(+), 0 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index 81c1049..c1c2909 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -622,6 +622,36 @@ static int davinci_i2c_remove(struct platform_device *pdev) return 0; } +#ifdef CONFIG_PM +static int davinci_i2c_suspend(struct platform_device *pdev, pm_message_t state) +{ + struct davinci_i2c_dev *dev = platform_get_drvdata(pdev); + + /* put I2C into reset */ + davinci_i2c_reset_ctrl(dev, 0); + + clk_disable(dev->clk); + + return 0; +} + +static int davinci_i2c_resume(struct platform_device *pdev) +{ + struct davinci_i2c_dev *dev = platform_get_drvdata(pdev); + + clk_enable(dev->clk); + + /* take I2C out of reset */ + davinci_i2c_reset_ctrl(dev, 1); + + return 0; +} + +#else +#define davinci_i2c_suspend NULL +#define davinci_i2c_resume NULL +#endif + /* work with hotplug and coldplug */ MODULE_ALIAS("platform:i2c_davinci"); @@ -632,6 +662,8 @@ static struct platform_driver davinci_i2c_driver = { .name = "i2c_davinci", .owner = THIS_MODULE, }, + .suspend = davinci_i2c_suspend, + .resume = davinci_i2c_resume, }; /* I2C may be needed to bring up other drivers */ -- 1.5.6 ^ permalink raw reply related [flat|nested] 11+ messages in thread
[parent not found: <1260267218-19406-4-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org>]
* [PATCH v2 4/4] i2c: davinci: Add cpufreq support [not found] ` <1260267218-19406-4-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org> @ 2009-12-08 10:13 ` Chaithrika U S 2010-01-05 22:56 ` [PATCH v2 3/4] i2c: davinci: Add suspend/resume support Kevin Hilman 1 sibling, 0 replies; 11+ messages in thread From: Chaithrika U S @ 2009-12-08 10:13 UTC (permalink / raw) To: linux-i2c-u79uwXL29TY76Z2rM5mHXA Cc: davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/, khilman-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR, Chaithrika U S Add cpufreq support for DaVinci I2C driver. Tested on DA850/OMAP-L138 EVM. For the purpose of testing, the patches which add cpufreq support [1] for this SoC are needed. [1]http://linux.davincidsp.com/pipermail/davinci-linux-open-source/ 2009-September/016118.html Signed-off-by: Chaithrika U S <chaithrika-l0cyMroinI0@public.gmane.org> --- drivers/i2c/busses/i2c-davinci.c | 63 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 63 insertions(+), 0 deletions(-) diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index c1c2909..0eed4d6 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -35,6 +35,7 @@ #include <linux/interrupt.h> #include <linux/platform_device.h> #include <linux/io.h> +#include <linux/cpufreq.h> #include <mach/hardware.h> #include <mach/i2c.h> @@ -105,6 +106,10 @@ struct davinci_i2c_dev { int irq; u8 terminate; struct i2c_adapter adapter; +#ifdef CONFIG_CPU_FREQ + struct completion xfr_complete; + struct notifier_block freq_transition; +#endif }; /* default platform data to use if not supplied in the platform_device */ @@ -375,6 +380,11 @@ i2c_davinci_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) if (ret < 0) return ret; } + +#ifdef CONFIG_CPU_FREQ + complete(&dev->xfr_complete); +#endif + return num; } @@ -499,6 +509,48 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id) return count ? IRQ_HANDLED : IRQ_NONE; } +#ifdef CONFIG_CPU_FREQ +static int i2c_davinci_cpufreq_transition(struct notifier_block *nb, + unsigned long val, void *data) +{ + struct davinci_i2c_dev *dev; + + dev = container_of(nb, struct davinci_i2c_dev, freq_transition); + if (val == CPUFREQ_PRECHANGE) { + wait_for_completion(&dev->xfr_complete); + davinci_i2c_reset_ctrl(dev, 0); + } else if (val == CPUFREQ_POSTCHANGE) { + i2c_davinci_calc_clk_dividers(dev); + davinci_i2c_reset_ctrl(dev, 1); + } + + return 0; +} + +static inline int i2c_davinci_cpufreq_register(struct davinci_i2c_dev *dev) +{ + dev->freq_transition.notifier_call = i2c_davinci_cpufreq_transition; + + return cpufreq_register_notifier(&dev->freq_transition, + CPUFREQ_TRANSITION_NOTIFIER); +} + +static inline void i2c_davinci_cpufreq_deregister(struct davinci_i2c_dev *dev) +{ + cpufreq_unregister_notifier(&dev->freq_transition, + CPUFREQ_TRANSITION_NOTIFIER); +} +#else +static inline int i2c_davinci_cpufreq_register(struct davinci_i2c_dev *dev) +{ + return 0; +} + +static inline void i2c_davinci_cpufreq_deregister(struct davinci_i2c_dev *dev) +{ +} +#endif + static struct i2c_algorithm i2c_davinci_algo = { .master_xfer = i2c_davinci_xfer, .functionality = i2c_davinci_func, @@ -538,6 +590,9 @@ static int davinci_i2c_probe(struct platform_device *pdev) } init_completion(&dev->cmd_complete); +#ifdef CONFIG_CPU_FREQ + init_completion(&dev->xfr_complete); +#endif dev->dev = get_device(&pdev->dev); dev->irq = irq->start; platform_set_drvdata(pdev, dev); @@ -563,6 +618,12 @@ static int davinci_i2c_probe(struct platform_device *pdev) goto err_unuse_clocks; } + r = i2c_davinci_cpufreq_register(dev); + if (r) { + dev_err(&pdev->dev, "failed to register cpufreq\n"); + goto err_free_irq; + } + adap = &dev->adapter; i2c_set_adapdata(adap, dev); adap->owner = THIS_MODULE; @@ -604,6 +665,8 @@ static int davinci_i2c_remove(struct platform_device *pdev) struct davinci_i2c_dev *dev = platform_get_drvdata(pdev); struct resource *mem; + i2c_davinci_cpufreq_deregister(dev); + platform_set_drvdata(pdev, NULL); i2c_del_adapter(&dev->adapter); put_device(&pdev->dev); -- 1.5.6 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v2 3/4] i2c: davinci: Add suspend/resume support [not found] ` <1260267218-19406-4-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org> 2009-12-08 10:13 ` [PATCH v2 4/4] i2c: davinci: Add cpufreq support Chaithrika U S @ 2010-01-05 22:56 ` Kevin Hilman [not found] ` <87vdfgrwib.fsf-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR@public.gmane.org> 1 sibling, 1 reply; 11+ messages in thread From: Kevin Hilman @ 2010-01-05 22:56 UTC (permalink / raw) To: Chaithrika U S Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/ Chaithrika U S <chaithrika-l0cyMroinI0@public.gmane.org> writes: > Add suspend and resume callbacks to DaVinci I2C driver. > This has been tested on DA850/OMAP-L138 EVM. The SoC specific > suspend-to-RAM support patch series [1] is needed to test this feature. > > [1] http://linux.davincidsp.com/pipermail/davinci-linux-open-source/ > 2009-November/016958.html > > Signed-off-by: Chaithrika U S <chaithrika-l0cyMroinI0@public.gmane.org> > --- > drivers/i2c/busses/i2c-davinci.c | 32 ++++++++++++++++++++++++++++++++ > 1 files changed, 32 insertions(+), 0 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c > index 81c1049..c1c2909 100644 > --- a/drivers/i2c/busses/i2c-davinci.c > +++ b/drivers/i2c/busses/i2c-davinci.c > @@ -622,6 +622,36 @@ static int davinci_i2c_remove(struct platform_device *pdev) > return 0; > } > > +#ifdef CONFIG_PM > +static int davinci_i2c_suspend(struct platform_device *pdev, pm_message_t state) > +{ > + struct davinci_i2c_dev *dev = platform_get_drvdata(pdev); > + > + /* put I2C into reset */ > + davinci_i2c_reset_ctrl(dev, 0); > + > + clk_disable(dev->clk); > + > + return 0; > +} > + > +static int davinci_i2c_resume(struct platform_device *pdev) > +{ > + struct davinci_i2c_dev *dev = platform_get_drvdata(pdev); > + > + clk_enable(dev->clk); > + > + /* take I2C out of reset */ > + davinci_i2c_reset_ctrl(dev, 1); > + > + return 0; > +} > + > +#else > +#define davinci_i2c_suspend NULL > +#define davinci_i2c_resume NULL > +#endif > + > /* work with hotplug and coldplug */ > MODULE_ALIAS("platform:i2c_davinci"); > > @@ -632,6 +662,8 @@ static struct platform_driver davinci_i2c_driver = { > .name = "i2c_davinci", > .owner = THIS_MODULE, > }, > + .suspend = davinci_i2c_suspend, > + .resume = davinci_i2c_resume, Rather than adding these to the platform_driver, you should use dev_pm_ops. Something like the patch below on top of your PATCH 3/4 should work. Other than this, I'm OK with this series, feel free to add my signoff and resend to linux-i2c and LKML. linux-i2c has had very slow response to embedded patches lately. Kevin ^ permalink raw reply [flat|nested] 11+ messages in thread
[parent not found: <87vdfgrwib.fsf-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR@public.gmane.org>]
* RE: [PATCH v2 3/4] i2c: davinci: Add suspend/resume support [not found] ` <87vdfgrwib.fsf-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR@public.gmane.org> @ 2010-01-06 4:56 ` Chaithrika U S 0 siblings, 0 replies; 11+ messages in thread From: Chaithrika U S @ 2010-01-06 4:56 UTC (permalink / raw) To: 'Kevin Hilman' Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/ On Wed, Jan 06, 2010 at 04:26:44, Kevin Hilman wrote: > Chaithrika U S <chaithrika-l0cyMroinI0@public.gmane.org> writes: > > > Add suspend and resume callbacks to DaVinci I2C driver. > > This has been tested on DA850/OMAP-L138 EVM. The SoC specific > > suspend-to-RAM support patch series [1] is needed to test this feature. > > > > [1] http://linux.davincidsp.com/pipermail/davinci-linux-open-source/ > > 2009-November/016958.html > > > > Signed-off-by: Chaithrika U S <chaithrika-l0cyMroinI0@public.gmane.org> > > --- > > drivers/i2c/busses/i2c-davinci.c | 32 ++++++++++++++++++++++++++++++++ > > 1 files changed, 32 insertions(+), 0 deletions(-) > > > > diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c > > index 81c1049..c1c2909 100644 > > --- a/drivers/i2c/busses/i2c-davinci.c > > +++ b/drivers/i2c/busses/i2c-davinci.c > > @@ -622,6 +622,36 @@ static int davinci_i2c_remove(struct platform_device *pdev) > > return 0; > > } > > > > +#ifdef CONFIG_PM > > +static int davinci_i2c_suspend(struct platform_device *pdev, pm_message_t state) > > +{ > > + struct davinci_i2c_dev *dev = platform_get_drvdata(pdev); > > + > > + /* put I2C into reset */ > > + davinci_i2c_reset_ctrl(dev, 0); > > + > > + clk_disable(dev->clk); > > + > > + return 0; > > +} > > + > > +static int davinci_i2c_resume(struct platform_device *pdev) > > +{ > > + struct davinci_i2c_dev *dev = platform_get_drvdata(pdev); > > + > > + clk_enable(dev->clk); > > + > > + /* take I2C out of reset */ > > + davinci_i2c_reset_ctrl(dev, 1); > > + > > + return 0; > > +} > > + > > +#else > > +#define davinci_i2c_suspend NULL > > +#define davinci_i2c_resume NULL > > +#endif > > + > > /* work with hotplug and coldplug */ > > MODULE_ALIAS("platform:i2c_davinci"); > > > > @@ -632,6 +662,8 @@ static struct platform_driver davinci_i2c_driver = { > > .name = "i2c_davinci", > > .owner = THIS_MODULE, > > }, > > + .suspend = davinci_i2c_suspend, > > + .resume = davinci_i2c_resume, > > Rather than adding these to the platform_driver, you should use dev_pm_ops. > > Something like the patch below on top of your PATCH 3/4 should work. > > Other than this, I'm OK with this series, feel free to add my signoff > and resend to linux-i2c and LKML. linux-i2c has had very slow > response to embedded patches lately. > > Kevin > OK. I will post updated patches soon. Thanks & Regards, Chaithrika ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/4] i2c: davinci: Add helper functions [not found] ` <1260267218-19406-3-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org> 2009-12-08 10:13 ` [PATCH v2 3/4] i2c: davinci: Add suspend/resume support Chaithrika U S @ 2009-12-08 11:24 ` Sergei Shtylyov [not found] ` <4B1E376F.1030808-hkdhdckH98+B+jHODAdFcQ@public.gmane.org> 1 sibling, 1 reply; 11+ messages in thread From: Sergei Shtylyov @ 2009-12-08 11:24 UTC (permalink / raw) To: Chaithrika U S Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/ Hello. Chaithrika U S wrote: > Add i2c reset control and clock divider calculation functions > which will be useful for power management features. > > Signed-off-by: Chaithrika U S <chaithrika-l0cyMroinI0@public.gmane.org> > [...] > @@ -138,15 +147,6 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) > u32 clkh; > u32 clkl; > u32 input_clock = clk_get_rate(dev->clk); > - u16 w; > - > - if (!pdata) > - pdata = &davinci_i2c_platform_data_default; > - > - /* put I2C into reset */ > - w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); > - w &= ~DAVINCI_I2C_MDR_IRS; > - davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); > > /* NOTE: I2C Clock divider programming info > * As per I2C specs the following formulas provide prescaler > @@ -178,12 +178,32 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) > davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKH_REG, clkh); > davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKL_REG, clkl); > > + dev_dbg(dev->dev, "input_clock = %d, CLK = %d\n", input_clock, clk); > +} > + > +/* > + * This function configures I2C and brings I2C out of reset. > + * This function is called during I2C init function. This function > + * also gets called if I2C encounters any errors. > + */ > +static int i2c_davinci_init(struct davinci_i2c_dev *dev) > +{ > + struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; > + > + if (!pdata) > + pdata = &davinci_i2c_platform_data_default; > The very idea of "default" platform data seems doubtful. Could we remove it? WBR, Sergei ^ permalink raw reply [flat|nested] 11+ messages in thread
[parent not found: <4B1E376F.1030808-hkdhdckH98+B+jHODAdFcQ@public.gmane.org>]
* RE: [PATCH v2 2/4] i2c: davinci: Add helper functions [not found] ` <4B1E376F.1030808-hkdhdckH98+B+jHODAdFcQ@public.gmane.org> @ 2009-12-10 11:15 ` Chaithrika U S 2009-12-10 13:02 ` Sergei Shtylyov 0 siblings, 1 reply; 11+ messages in thread From: Chaithrika U S @ 2009-12-10 11:15 UTC (permalink / raw) To: 'Sergei Shtylyov' Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/ On Tue, Dec 08, 2009 at 16:54:31, Sergei Shtylyov wrote: > Hello. > > Chaithrika U S wrote: > > > Add i2c reset control and clock divider calculation functions > > which will be useful for power management features. > > > > Signed-off-by: Chaithrika U S <chaithrika-l0cyMroinI0@public.gmane.org> > > > > [...] > > > @@ -138,15 +147,6 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) > > u32 clkh; > > u32 clkl; > > u32 input_clock = clk_get_rate(dev->clk); > > - u16 w; > > - > > - if (!pdata) > > - pdata = &davinci_i2c_platform_data_default; > > - > > - /* put I2C into reset */ > > - w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); > > - w &= ~DAVINCI_I2C_MDR_IRS; > > - davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); > > > > /* NOTE: I2C Clock divider programming info > > * As per I2C specs the following formulas provide prescaler > > @@ -178,12 +178,32 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) > > davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKH_REG, clkh); > > davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKL_REG, clkl); > > > > + dev_dbg(dev->dev, "input_clock = %d, CLK = %d\n", input_clock, clk); > > +} > > + > > +/* > > + * This function configures I2C and brings I2C out of reset. > > + * This function is called during I2C init function. This function > > + * also gets called if I2C encounters any errors. > > + */ > > +static int i2c_davinci_init(struct davinci_i2c_dev *dev) > > +{ > > + struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; > > + > > + if (!pdata) > > + pdata = &davinci_i2c_platform_data_default; > > > > The very idea of "default" platform data seems doubtful. Could we > remove it? > This platform data is used to set the default parameters in case the platform is not specifying it. I am not too sure of why it is different from other drivers where an error is raised if the platform data is missing. May be this update can be made as a separate patch out of this series. Regards, Chaithrika ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/4] i2c: davinci: Add helper functions 2009-12-10 11:15 ` Chaithrika U S @ 2009-12-10 13:02 ` Sergei Shtylyov 0 siblings, 0 replies; 11+ messages in thread From: Sergei Shtylyov @ 2009-12-10 13:02 UTC (permalink / raw) To: Chaithrika U S Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/ Hello. Chaithrika U S wrote: >> Hello. >> >> Chaithrika U S wrote: >> >> >>> Add i2c reset control and clock divider calculation functions >>> which will be useful for power management features. >>> >>> Signed-off-by: Chaithrika U S <chaithrika-l0cyMroinI0@public.gmane.org> >>> >>> >> [...] >> >> >>> @@ -138,15 +147,6 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) >>> u32 clkh; >>> u32 clkl; >>> u32 input_clock = clk_get_rate(dev->clk); >>> - u16 w; >>> - >>> - if (!pdata) >>> - pdata = &davinci_i2c_platform_data_default; >>> - >>> - /* put I2C into reset */ >>> - w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); >>> - w &= ~DAVINCI_I2C_MDR_IRS; >>> - davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); >>> >>> /* NOTE: I2C Clock divider programming info >>> * As per I2C specs the following formulas provide prescaler >>> @@ -178,12 +178,32 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) >>> davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKH_REG, clkh); >>> davinci_i2c_write_reg(dev, DAVINCI_I2C_CLKL_REG, clkl); >>> >>> + dev_dbg(dev->dev, "input_clock = %d, CLK = %d\n", input_clock, clk); >>> +} >>> + >>> +/* >>> + * This function configures I2C and brings I2C out of reset. >>> + * This function is called during I2C init function. This function >>> + * also gets called if I2C encounters any errors. >>> + */ >>> +static int i2c_davinci_init(struct davinci_i2c_dev *dev) >>> +{ >>> + struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; >>> + >>> + if (!pdata) >>> + pdata = &davinci_i2c_platform_data_default; >>> >>> >> The very idea of "default" platform data seems doubtful. Could we >> remove it? > This platform data is used to set the default parameters in case the > platform is not specifying it. I am not too sure of why it is different > from other drivers where an error is raised if the platform data is missing. > May be this update can be made as a separate patch out of this series. > FWIW, we have removed this stuff in the internal tree... > Regards, > Chaithrika WBR, Sergei ^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH v2 0/4] i2c: davinci: Add power management features [not found] ` <1260267218-19406-1-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org> 2009-12-08 10:13 ` [PATCH v2 1/4] i2c: davinci: Remove MOD_REG_BIT and IO_ADDRESS usage Chaithrika U S @ 2009-12-15 12:57 ` Chaithrika U S 1 sibling, 0 replies; 11+ messages in thread From: Chaithrika U S @ 2009-12-15 12:57 UTC (permalink / raw) To: 'Chaithrika U S', linux-i2c-u79uwXL29TY76Z2rM5mHXA Cc: davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/, khilman-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR, ben-linux-elnMNo+KYs3YtjvyW6yDsg Hi All, Do you have any review comments/suggestions for this patch series? Regards, Chaithrika On Tue, Dec 08, 2009 at 15:43:34, Chaithrika U S wrote: > Add suspend/resume and cpufreq features to DaVinci I2C driver > All patches apply to Linus' kernel tree. > Testing of these features was done on DA850/OMAP-L138 EVM. > > Chaithrika U S (4): > i2c: davinci: Remove MOD_REG_BIT and IO_ADDRESS usage > i2c: davinci: Add helper functions > i2c: davinci: Add suspend/resume support > i2c: davinci: Add cpufreq support > > drivers/i2c/busses/i2c-davinci.c | 224 ++++++++++++++++++++++++++++---------- > 1 files changed, 168 insertions(+), 56 deletions(-) > ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2010-01-06 4:56 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-08 10:13 [PATCH v2 0/4] i2c: davinci: Add power management features Chaithrika U S
[not found] ` <1260267218-19406-1-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org>
2009-12-08 10:13 ` [PATCH v2 1/4] i2c: davinci: Remove MOD_REG_BIT and IO_ADDRESS usage Chaithrika U S
[not found] ` <1260267218-19406-2-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org>
2009-12-08 10:13 ` [PATCH v2 2/4] i2c: davinci: Add helper functions Chaithrika U S
[not found] ` <1260267218-19406-3-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org>
2009-12-08 10:13 ` [PATCH v2 3/4] i2c: davinci: Add suspend/resume support Chaithrika U S
[not found] ` <1260267218-19406-4-git-send-email-chaithrika-l0cyMroinI0@public.gmane.org>
2009-12-08 10:13 ` [PATCH v2 4/4] i2c: davinci: Add cpufreq support Chaithrika U S
2010-01-05 22:56 ` [PATCH v2 3/4] i2c: davinci: Add suspend/resume support Kevin Hilman
[not found] ` <87vdfgrwib.fsf-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR@public.gmane.org>
2010-01-06 4:56 ` Chaithrika U S
2009-12-08 11:24 ` [PATCH v2 2/4] i2c: davinci: Add helper functions Sergei Shtylyov
[not found] ` <4B1E376F.1030808-hkdhdckH98+B+jHODAdFcQ@public.gmane.org>
2009-12-10 11:15 ` Chaithrika U S
2009-12-10 13:02 ` Sergei Shtylyov
2009-12-15 12:57 ` [PATCH v2 0/4] i2c: davinci: Add power management features Chaithrika U S
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).