[PATCH 7/8] ARM: OMAP: convert I2C driver to PM QoS for latency constraints

Jean Pihet jean.pihet at newoldbits.com
Wed Sep 19 14:34:19 EDT 2012


Hi!

On Wed, Sep 19, 2012 at 8:11 PM, Shubhrajyoti <shubhrajyoti at ti.com> wrote:
> On Tuesday 18 September 2012 02:22 PM, Jean Pihet wrote:
>> Convert the driver from the outdated omap_pm_set_max_mpu_wakeup_lat
>> API to the new PM QoS API.
>> Since the constraint is on the MPU subsystem, use the PM_QOS_CPU_DMA_LATENCY
>> class of PM QoS. The resulting MPU constraints are used by cpuidle to
>> decide the next power state of the MPU subsystem.
>>
>> The I2C device latency timing is derived from the FIFO size and the
>> clock speed and so is applicable to all OMAP SoCs.
> agree
> thanks,

The I2C patch will be rebased and submitted separately.

Thanks!
Jean

>>
>> Signed-off-by: Jean Pihet <j-pihet at ti.com>
>> ---
>>  arch/arm/plat-omap/i2c.c      |   21 ---------------------
>>  drivers/i2c/busses/i2c-omap.c |   28 +++++++++++++++++-----------
>>  include/linux/i2c-omap.h      |    1 -
>>  3 files changed, 17 insertions(+), 33 deletions(-)
>>
>> diff --git a/arch/arm/plat-omap/i2c.c b/arch/arm/plat-omap/i2c.c
>> index db071bc..dba8338 100644
>> --- a/arch/arm/plat-omap/i2c.c
>> +++ b/arch/arm/plat-omap/i2c.c
>> @@ -26,7 +26,6 @@
>>  #include <linux/kernel.h>
>>  #include <linux/platform_device.h>
>>  #include <linux/i2c.h>
>> -#include <linux/i2c-omap.h>
>>  #include <linux/slab.h>
>>  #include <linux/err.h>
>>  #include <linux/clk.h>
>> @@ -34,7 +33,6 @@
>>  #include <mach/irqs.h>
>>  #include <plat/mux.h>
>>  #include <plat/i2c.h>
>> -#include <plat/omap-pm.h>
>>  #include <plat/omap_device.h>
>>
>>  #define OMAP_I2C_SIZE                0x3f
>> @@ -129,16 +127,6 @@ static inline int omap1_i2c_add_bus(int bus_id)
>>
>>
>>  #ifdef CONFIG_ARCH_OMAP2PLUS
>> -/*
>> - * XXX This function is a temporary compatibility wrapper - only
>> - * needed until the I2C driver can be converted to call
>> - * omap_pm_set_max_dev_wakeup_lat() and handle a return code.
>> - */
>> -static void omap_pm_set_max_mpu_wakeup_lat_compat(struct device *dev, long t)
>> -{
>> -     omap_pm_set_max_mpu_wakeup_lat(dev, t);
>> -}
>> -
>>  static inline int omap2_i2c_add_bus(int bus_id)
>>  {
>>       int l;
>> @@ -170,15 +158,6 @@ static inline int omap2_i2c_add_bus(int bus_id)
>>       dev_attr = (struct omap_i2c_dev_attr *)oh->dev_attr;
>>       pdata->flags = dev_attr->flags;
>>
>> -     /*
>> -      * When waiting for completion of a i2c transfer, we need to
>> -      * set a wake up latency constraint for the MPU. This is to
>> -      * ensure quick enough wakeup from idle, when transfer
>> -      * completes.
>> -      * Only omap3 has support for constraints
>> -      */
>> -     if (cpu_is_omap34xx())
>> -             pdata->set_mpu_wkup_lat = omap_pm_set_max_mpu_wakeup_lat_compat;
>>       pdev = omap_device_build(name, bus_id, oh, pdata,
>>                       sizeof(struct omap_i2c_bus_platform_data),
>>                       NULL, 0, 0);
>> diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
>> index 5d19a49..bd45cee 100644
>> --- a/drivers/i2c/busses/i2c-omap.c
>> +++ b/drivers/i2c/busses/i2c-omap.c
>> @@ -43,6 +43,7 @@
>>  #include <linux/slab.h>
>>  #include <linux/i2c-omap.h>
>>  #include <linux/pm_runtime.h>
>> +#include <linux/pm_qos.h>
>>
>>  /* I2C controller revisions */
>>  #define OMAP_I2C_OMAP1_REV_2         0x20
>> @@ -183,8 +184,7 @@ struct omap_i2c_dev {
>>       struct completion       cmd_complete;
>>       struct resource         *ioarea;
>>       u32                     latency;        /* maximum mpu wkup latency */
>> -     void                    (*set_mpu_wkup_lat)(struct device *dev,
>> -                                                 long latency);
>> +     struct pm_qos_request   pm_qos_request;
>>       u32                     speed;          /* Speed of bus in kHz */
>>       u32                     dtrev;          /* extra revision from DT */
>>       u32                     flags;
>> @@ -590,8 +590,16 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
>>       if (r < 0)
>>               goto out;
>>
>> -     if (dev->set_mpu_wkup_lat != NULL)
>> -             dev->set_mpu_wkup_lat(dev->dev, dev->latency);
>> +     /*
>> +      * When waiting for completion of a i2c transfer, we need to
>> +      * set a wake up latency constraint for the MPU. This is to
>> +      * ensure quick enough wakeup from idle, when transfer
>> +      * completes.
>> +      */
>> +     if (dev->latency)
>> +             pm_qos_add_request(&dev->pm_qos_request,
>> +                                PM_QOS_CPU_DMA_LATENCY,
>> +                                dev->latency);
>>
>>       for (i = 0; i < num; i++) {
>>               r = omap_i2c_xfer_msg(adap, &msgs[i], (i == (num - 1)));
>> @@ -599,8 +607,8 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
>>                       break;
>>       }
>>
>> -     if (dev->set_mpu_wkup_lat != NULL)
>> -             dev->set_mpu_wkup_lat(dev->dev, -1);
>> +     if (dev->latency)
>> +             pm_qos_remove_request(&dev->pm_qos_request);
>>
>>       if (r == 0)
>>               r = num;
>> @@ -989,7 +997,6 @@ omap_i2c_probe(struct platform_device *pdev)
>>       } else if (pdata != NULL) {
>>               dev->speed = pdata->clkrate;
>>               dev->flags = pdata->flags;
>> -             dev->set_mpu_wkup_lat = pdata->set_mpu_wkup_lat;
>>               dev->dtrev = pdata->rev;
>>       }
>>
>> @@ -1046,10 +1053,9 @@ omap_i2c_probe(struct platform_device *pdev)
>>               else
>>                       dev->b_hw = 1; /* Enable hardware fixes */
>>
>> -             /* calculate wakeup latency constraint for MPU */
>> -             if (dev->set_mpu_wkup_lat != NULL)
>> -                     dev->latency = (1000000 * dev->fifo_size) /
>> -                                    (1000 * dev->speed / 8);
>> +             /* calculate wakeup latency constraint */
>> +             dev->latency = (1000000 * dev->fifo_size) /
>> +                            (1000 * dev->speed / 8);
>>       }
>>
>>       /* reset ASAP, clearing any IRQs */
>> diff --git a/include/linux/i2c-omap.h b/include/linux/i2c-omap.h
>> index 92a0dc7..df804ba 100644
>> --- a/include/linux/i2c-omap.h
>> +++ b/include/linux/i2c-omap.h
>> @@ -34,7 +34,6 @@ struct omap_i2c_bus_platform_data {
>>       u32             clkrate;
>>       u32             rev;
>>       u32             flags;
>> -     void            (*set_mpu_wkup_lat)(struct device *dev, long set);
>>  };
>>
>>  #endif
>



More information about the linux-arm-kernel mailing list