Re: [PATCH 5/7] genirq: Add devm_request_any_context_irq()

2013-12-15 Thread Dmitry Torokhov
On Tue, Dec 10, 2013 at 03:43:14PM -0800, Stephen Boyd wrote:
 Some drivers use request_any_context_irq() but there isn't a
 devm_* function for it. Add one so that these drivers don't need
 to explicitly free the irq on driver detach.
 
 Cc: Thomas Gleixner t...@linutronix.de

Thomas, would it be OK with me picking this patch through my tree if you
do not have issues with it?

Thanks.

 Signed-off-by: Stephen Boyd sb...@codeaurora.org
 ---
  include/linux/interrupt.h |  5 +
  kernel/irq/devres.c   | 45 +
  2 files changed, 50 insertions(+)
 
 diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
 index c9e831d..8334f9b 100644
 --- a/include/linux/interrupt.h
 +++ b/include/linux/interrupt.h
 @@ -160,6 +160,11 @@ devm_request_irq(struct device *dev, unsigned int irq, 
 irq_handler_t handler,
devname, dev_id);
  }
  
 +extern int __must_check
 +devm_request_any_context_irq(struct device *dev, unsigned int irq,
 +  irq_handler_t handler, unsigned long irqflags,
 +  const char *devname, void *dev_id);
 +
  extern void devm_free_irq(struct device *dev, unsigned int irq, void 
 *dev_id);
  
  /*
 diff --git a/kernel/irq/devres.c b/kernel/irq/devres.c
 index bd8e788..f71e9ff 100644
 --- a/kernel/irq/devres.c
 +++ b/kernel/irq/devres.c
 @@ -73,6 +73,51 @@ int devm_request_threaded_irq(struct device *dev, unsigned 
 int irq,
  EXPORT_SYMBOL(devm_request_threaded_irq);
  
  /**
 + *   devm_request_any_context_irq - allocate an interrupt line for a managed 
 device
 + *   @dev: device to request interrupt for
 + *   @irq: Interrupt line to allocate
 + *   @handler: Function to be called when the IRQ occurs
 + *   @thread_fn: function to be called in a threaded interrupt context. NULL
 + *   for devices which handle everything in @handler
 + *   @irqflags: Interrupt type flags
 + *   @devname: An ascii name for the claiming device
 + *   @dev_id: A cookie passed back to the handler function
 + *
 + *   Except for the extra @dev argument, this function takes the
 + *   same arguments and performs the same function as
 + *   request_any_context_irq().  IRQs requested with this function will be
 + *   automatically freed on driver detach.
 + *
 + *   If an IRQ allocated with this function needs to be freed
 + *   separately, devm_free_irq() must be used.
 + */
 +int devm_request_any_context_irq(struct device *dev, unsigned int irq,
 +   irq_handler_t handler, unsigned long irqflags,
 +   const char *devname, void *dev_id)
 +{
 + struct irq_devres *dr;
 + int rc;
 +
 + dr = devres_alloc(devm_irq_release, sizeof(struct irq_devres),
 +   GFP_KERNEL);
 + if (!dr)
 + return -ENOMEM;
 +
 + rc = request_any_context_irq(irq, handler, irqflags, devname, dev_id);
 + if (rc) {
 + devres_free(dr);
 + return rc;
 + }
 +
 + dr-irq = irq;
 + dr-dev_id = dev_id;
 + devres_add(dev, dr);
 +
 + return 0;
 +}
 +EXPORT_SYMBOL(devm_request_any_context_irq);
 +
 +/**
   *   devm_free_irq - free an interrupt
   *   @dev: device to free interrupt for
   *   @irq: Interrupt line to free
 -- 
 The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
 hosted by The Linux Foundation
 

-- 
Dmitry
--
To unsubscribe from this list: send the line unsubscribe linux-arm-msm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/7] Input: pmic8xxx-pwrkey - Migrate to regmap APIs

2013-12-15 Thread Dmitry Torokhov
On Tue, Dec 10, 2013 at 03:43:11PM -0800, Stephen Boyd wrote:
 Use the regmap APIs for this driver instead of custom pm8xxx
 APIs. This breaks this driver's dependency on the pm8xxx APIs and
 allows us to easily port it to other bus protocols in the future.
 
 Signed-off-by: Stephen Boyd sb...@codeaurora.org
 ---
  drivers/input/misc/pmic8xxx-pwrkey.c | 13 +
  1 file changed, 9 insertions(+), 4 deletions(-)
 
 diff --git a/drivers/input/misc/pmic8xxx-pwrkey.c 
 b/drivers/input/misc/pmic8xxx-pwrkey.c
 index 233b216..a4de105 100644
 --- a/drivers/input/misc/pmic8xxx-pwrkey.c
 +++ b/drivers/input/misc/pmic8xxx-pwrkey.c
 @@ -18,9 +18,9 @@
  #include linux/input.h
  #include linux/interrupt.h
  #include linux/platform_device.h
 +#include linux/regmap.h
  #include linux/log2.h
  
 -#include linux/mfd/pm8xxx/core.h
  #include linux/input/pmic8xxx-pwrkey.h
  
  #define PON_CNTL_1 0x1C
 @@ -83,7 +83,8 @@ static int pmic8xxx_pwrkey_probe(struct platform_device 
 *pdev)
   int key_press_irq = platform_get_irq(pdev, 1);
   int err;
   unsigned int delay;
 - u8 pon_cntl;
 + unsigned int pon_cntl;
 + struct regmap *regmap;
   struct pmic8xxx_pwrkey *pwrkey;
   const struct pm8xxx_pwrkey_platform_data *pdata =
   dev_get_platdata(pdev-dev);
 @@ -108,6 +109,10 @@ static int pmic8xxx_pwrkey_probe(struct platform_device 
 *pdev)
   err = -ENOMEM;
   }
  
 + regmap = dev_get_regmap(pdev-dev.parent, NULL);
 + if (!regmap)
 + return -ENODEV;

And you are leaking memory here...

 +
   input_set_capability(pwr, EV_KEY, KEY_POWER);
  
   pwr-name = pmic8xxx_pwrkey;
 @@ -116,7 +121,7 @@ static int pmic8xxx_pwrkey_probe(struct platform_device 
 *pdev)
   delay = (pdata-kpd_trigger_delay_us  10) / USEC_PER_SEC;
   delay = 1 + ilog2(delay);
  
 - err = pm8xxx_readb(pdev-dev.parent, PON_CNTL_1, pon_cntl);
 + err = regmap_read(regmap, PON_CNTL_1, pon_cntl);
   if (err  0) {
   dev_err(pdev-dev, failed reading PON_CNTL_1 err=%d\n, err);
   return err;
 @@ -129,7 +134,7 @@ static int pmic8xxx_pwrkey_probe(struct platform_device 
 *pdev)
   else
   pon_cntl = ~PON_CNTL_PULL_UP;
  
 - err = pm8xxx_writeb(pdev-dev.parent, PON_CNTL_1, pon_cntl);
 + err = regmap_write(regmap, PON_CNTL_1, pon_cntl);
   if (err  0) {
   dev_err(pdev-dev, failed writing PON_CNTL_1 err=%d\n, err);
   return err;
 -- 
 The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
 hosted by The Linux Foundation
 

-- 
Dmitry
--
To unsubscribe from this list: send the line unsubscribe linux-arm-msm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html