Hi Kishon, Felipe, If you possible, I'd like you to test or review this patch. And then I'll apply it on extcon-next branch if you could give me a acked or tested message.
- This patch has a depenency on extcon-next branch. Following patchset support devm_extcon_dev_* function. [1] https://lkml.org/lkml/2014/4/21/140 [2] https://lkml.org/lkml/2014/4/21/164 Thanks, Chanwoo Choi On 04/21/2014 09:02 PM, Chanwoo Choi wrote: > This patch use devm_extcon_dev_allocate() to simplify the memory control > of extcon device. > > Cc: Graeme Gregory <g...@slimlogic.co.uk> > Cc: Kishon Vijay Abraham I <kis...@ti.com> > Cc: Felipe Balbi <ba...@ti.com> > Cc: Samuel Ortiz <sa...@linux.intel.com> > Cc: Lee Jones <lee.jo...@linaro.org> > Signed-off-by: Chanwoo Choi <cw00.c...@samsung.com> > --- > drivers/extcon/extcon-palmas.c | 35 ++++++++++++++++++++--------------- > include/linux/mfd/palmas.h | 2 +- > 2 files changed, 21 insertions(+), 16 deletions(-) > > diff --git a/drivers/extcon/extcon-palmas.c b/drivers/extcon/extcon-palmas.c > index 1a770e0..a9299ea 100644 > --- a/drivers/extcon/extcon-palmas.c > +++ b/drivers/extcon/extcon-palmas.c > @@ -57,7 +57,7 @@ static irqreturn_t palmas_vbus_irq_handler(int irq, void > *_palmas_usb) > if (vbus_line_state & PALMAS_INT3_LINE_STATE_VBUS) { > if (palmas_usb->linkstat != PALMAS_USB_STATE_VBUS) { > palmas_usb->linkstat = PALMAS_USB_STATE_VBUS; > - extcon_set_cable_state(&palmas_usb->edev, "USB", true); > + extcon_set_cable_state(palmas_usb->edev, "USB", true); > dev_info(palmas_usb->dev, "USB cable is attached\n"); > } else { > dev_dbg(palmas_usb->dev, > @@ -66,7 +66,7 @@ static irqreturn_t palmas_vbus_irq_handler(int irq, void > *_palmas_usb) > } else if (!(vbus_line_state & PALMAS_INT3_LINE_STATE_VBUS)) { > if (palmas_usb->linkstat == PALMAS_USB_STATE_VBUS) { > palmas_usb->linkstat = PALMAS_USB_STATE_DISCONNECT; > - extcon_set_cable_state(&palmas_usb->edev, "USB", false); > + extcon_set_cable_state(palmas_usb->edev, "USB", false); > dev_info(palmas_usb->dev, "USB cable is detached\n"); > } else { > dev_dbg(palmas_usb->dev, > @@ -93,7 +93,7 @@ static irqreturn_t palmas_id_irq_handler(int irq, void > *_palmas_usb) > PALMAS_USB_ID_INT_LATCH_CLR, > PALMAS_USB_ID_INT_EN_HI_CLR_ID_GND); > palmas_usb->linkstat = PALMAS_USB_STATE_ID; > - extcon_set_cable_state(&palmas_usb->edev, "USB-HOST", true); > + extcon_set_cable_state(palmas_usb->edev, "USB-HOST", true); > dev_info(palmas_usb->dev, "USB-HOST cable is attached\n"); > } else if ((set & PALMAS_USB_ID_INT_SRC_ID_FLOAT) && > (id_src & PALMAS_USB_ID_INT_SRC_ID_FLOAT)) { > @@ -101,17 +101,17 @@ static irqreturn_t palmas_id_irq_handler(int irq, void > *_palmas_usb) > PALMAS_USB_ID_INT_LATCH_CLR, > PALMAS_USB_ID_INT_EN_HI_CLR_ID_FLOAT); > palmas_usb->linkstat = PALMAS_USB_STATE_DISCONNECT; > - extcon_set_cable_state(&palmas_usb->edev, "USB-HOST", false); > + extcon_set_cable_state(palmas_usb->edev, "USB-HOST", false); > dev_info(palmas_usb->dev, "USB-HOST cable is detached\n"); > } else if ((palmas_usb->linkstat == PALMAS_USB_STATE_ID) && > (!(set & PALMAS_USB_ID_INT_SRC_ID_GND))) { > palmas_usb->linkstat = PALMAS_USB_STATE_DISCONNECT; > - extcon_set_cable_state(&palmas_usb->edev, "USB-HOST", false); > + extcon_set_cable_state(palmas_usb->edev, "USB-HOST", false); > dev_info(palmas_usb->dev, "USB-HOST cable is detached\n"); > } else if ((palmas_usb->linkstat == PALMAS_USB_STATE_DISCONNECT) && > (id_src & PALMAS_USB_ID_INT_SRC_ID_GND)) { > palmas_usb->linkstat = PALMAS_USB_STATE_ID; > - extcon_set_cable_state(&palmas_usb->edev, "USB-HOST", true); > + extcon_set_cable_state(palmas_usb->edev, "USB-HOST", true); > dev_info(palmas_usb->dev, " USB-HOST cable is attached\n"); > } > > @@ -187,15 +187,20 @@ static int palmas_usb_probe(struct platform_device > *pdev) > > platform_set_drvdata(pdev, palmas_usb); > > - palmas_usb->edev.supported_cable = palmas_extcon_cable; > - palmas_usb->edev.dev.parent = palmas_usb->dev; > - palmas_usb->edev.name = kstrdup(node->name, GFP_KERNEL); > - palmas_usb->edev.mutually_exclusive = mutually_exclusive; > + palmas_usb->edev = devm_extcon_dev_allocate(&pdev->dev, > + palmas_extcon_cable); > + if (!palmas_usb->edev) { > + dev_err(&pdev->dev, "failed to allocate extcon device\n"); > + return -ENOMEM; > + } > + palmas_usb->edev->name = kstrdup(node->name, GFP_KERNEL); > + palmas_usb->edev->dev.parent = palmas_usb->dev; > + palmas_usb->edev->mutually_exclusive = mutually_exclusive; > > - status = devm_extcon_dev_register(&pdev->dev, &palmas_usb->edev); > + status = devm_extcon_dev_register(&pdev->dev, palmas_usb->edev); > if (status) { > dev_err(&pdev->dev, "failed to register extcon device\n"); > - kfree(palmas_usb->edev.name); > + kfree(palmas_usb->edev->name); > return status; > } > > @@ -209,7 +214,7 @@ static int palmas_usb_probe(struct platform_device *pdev) > if (status < 0) { > dev_err(&pdev->dev, "can't get IRQ %d, err %d\n", > palmas_usb->id_irq, status); > - kfree(palmas_usb->edev.name); > + kfree(palmas_usb->edev->name); > return status; > } > } > @@ -224,7 +229,7 @@ static int palmas_usb_probe(struct platform_device *pdev) > if (status < 0) { > dev_err(&pdev->dev, "can't get IRQ %d, err %d\n", > palmas_usb->vbus_irq, status); > - kfree(palmas_usb->edev.name); > + kfree(palmas_usb->edev->name); > return status; > } > } > @@ -238,7 +243,7 @@ static int palmas_usb_remove(struct platform_device *pdev) > { > struct palmas_usb *palmas_usb = platform_get_drvdata(pdev); > > - kfree(palmas_usb->edev.name); > + kfree(palmas_usb->edev->name); > > return 0; > } > diff --git a/include/linux/mfd/palmas.h b/include/linux/mfd/palmas.h > index 9974e38..b8f87b7 100644 > --- a/include/linux/mfd/palmas.h > +++ b/include/linux/mfd/palmas.h > @@ -415,7 +415,7 @@ struct palmas_usb { > struct palmas *palmas; > struct device *dev; > > - struct extcon_dev edev; > + struct extcon_dev *edev; > > int id_otg_irq; > int id_irq; > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/