Re: [PATCH 1/1] twl4030_charger: Make the driver atomic notifier safe

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Feb 25, 2011 at 1:56 PM, Heikki Krogerus
<heikki.krogerus@xxxxxxxxx> wrote:
> This queues work from the otg notification where the
> i2c operations can be safely made. Needed for atomic otg
> notifiers.
>
> Signed-off-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxx>
> Cc: Grazvydas Ignotas <notasas@xxxxxxxxx>
> Cc: Anton Vorontsov <cbouatmailru@xxxxxxxxx>

seems to work fine.
Tested-by: Grazvydas Ignotas <notasas@xxxxxxxxx>

> ---
>  drivers/power/twl4030_charger.c |   25 +++++++++++++++++++------
>  1 files changed, 19 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c
> index ff1f423..92c16e1 100644
> --- a/drivers/power/twl4030_charger.c
> +++ b/drivers/power/twl4030_charger.c
> @@ -71,8 +71,11 @@ struct twl4030_bci {
>        struct power_supply     usb;
>        struct otg_transceiver  *transceiver;
>        struct notifier_block   otg_nb;
> +       struct work_struct      work;
>        int                     irq_chg;
>        int                     irq_bci;
> +
> +       unsigned long           event;
>  };
>
>  /*
> @@ -258,14 +261,11 @@ static irqreturn_t twl4030_bci_interrupt(int irq, void *arg)
>        return IRQ_HANDLED;
>  }
>
> -static int twl4030_bci_usb_ncb(struct notifier_block *nb, unsigned long val,
> -                              void *priv)
> +static void twl4030_bci_usb_work(struct work_struct *data)
>  {
> -       struct twl4030_bci *bci = container_of(nb, struct twl4030_bci, otg_nb);
> +       struct twl4030_bci *bci = container_of(data, struct twl4030_bci, work);
>
> -       dev_dbg(bci->dev, "OTG notify %lu\n", val);
> -
> -       switch (val) {
> +       switch (bci->event) {
>        case USB_EVENT_VBUS:
>        case USB_EVENT_CHARGER:
>                twl4030_charger_enable_usb(bci, true);
> @@ -274,6 +274,17 @@ static int twl4030_bci_usb_ncb(struct notifier_block *nb, unsigned long val,
>                twl4030_charger_enable_usb(bci, false);
>                break;
>        }
> +}
> +
> +static int twl4030_bci_usb_ncb(struct notifier_block *nb, unsigned long val,
> +                              void *priv)
> +{
> +       struct twl4030_bci *bci = container_of(nb, struct twl4030_bci, otg_nb);
> +
> +       dev_dbg(bci->dev, "OTG notify %lu\n", val);
> +
> +       bci->event = val;
> +       schedule_work(&bci->work);
>
>        return NOTIFY_OK;
>  }
> @@ -466,6 +477,8 @@ static int __init twl4030_bci_probe(struct platform_device *pdev)
>                goto fail_bci_irq;
>        }
>
> +       INIT_WORK(&bci->work, twl4030_bci_usb_work);
> +
>        bci->transceiver = otg_get_transceiver();
>        if (bci->transceiver != NULL) {
>                bci->otg_nb.notifier_call = twl4030_bci_usb_ncb;
> --
> 1.7.1
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux