All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tony Lindgren <tony@atomide.com>
To: David Brownell <david-b@pacbell.net>
Cc: linux-omap@vger.kernel.org, Samuel Ortiz <sameo@openedhand.com>
Subject: Re: [patch/rft 2.6.28-rc3-omap] twl4030-core simplification
Date: Thu, 13 Nov 2008 14:26:27 -0800	[thread overview]
Message-ID: <20081113222626.GM3106@atomide.com> (raw)
In-Reply-To: <200811071645.15687.david-b@pacbell.net>

* David Brownell <david-b@pacbell.net> [081107 16:45]:
> From: David Brownell <dbrownell@users.sourceforge.net>
> 
> Minor cleanup to twl4030-core: define a helper function to populate
> a single child node, and use it to replace six inconsistent versions
> of the same logic.  Both object and source code shrink.
> 
> As part of this, some devices now have more IRQ resources:  battery
> charger, keypad, ADC, and USB transceiver.  That will help to remove
> some irq #defines that prevent this code from compiling on non-OMAP
> platforms.

Pushing to linux-omap tree while waiting for this to fall down from
mainline tree via Samuel's queue.

Tony

> Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
> ---
> Boots fine on two boards that use GPIO, RTC, and USB.  Which means
> charger, keypad, and ADC deserve sanity testing.  (The diff looks
> nasty, but that's just inability to see "add a function and replace
> the interior of six 'if' blocks" as the relevant change.)
> 
>  drivers/mfd/twl4030-core.c |  297 +++++++++++--------------------------------
>  1 file changed, 82 insertions(+), 215 deletions(-)
> 
> --- a/drivers/mfd/twl4030-core.c
> +++ b/drivers/mfd/twl4030-core.c
> @@ -360,261 +360,128 @@ EXPORT_SYMBOL(twl4030_i2c_read_u8);
>  
>  /*----------------------------------------------------------------------*/
>  
> -/*
> - * NOTE:  We know the first 8 IRQs after pdata->base_irq are
> - * for the PIH, and the next are for the PWR_INT SIH, since
> - * that's how twl_init_irq() sets things up.
> - */
> -
> -static int add_children(struct twl4030_platform_data *pdata)
> +static int add_child(unsigned chip, const char *name,
> +		void *pdata, unsigned pdata_len,
> +		bool can_wakeup, int irq0, int irq1)
>  {
> -	struct platform_device	*pdev = NULL;
> -	struct twl4030_client	*twl = NULL;
> -	int			status = 0;
> -
> -	if (twl_has_bci() && pdata->bci) {
> -		twl = &twl4030_modules[3];
> -
> -		pdev = platform_device_alloc("twl4030_bci", -1);
> -		if (!pdev) {
> -			pr_debug("%s: can't alloc bci dev\n", DRIVER_NAME);
> -			status = -ENOMEM;
> -			goto err;
> -		}
> -
> -		if (status == 0) {
> -			pdev->dev.parent = &twl->client->dev;
> -			status = platform_device_add_data(pdev, pdata->bci,
> -					sizeof(*pdata->bci));
> -			if (status < 0) {
> -				dev_dbg(&twl->client->dev,
> -					"can't add bci data, %d\n",
> -					status);
> -				goto err;
> -			}
> -		}
> -
> -		if (status == 0) {
> -			struct resource r = {
> -				.start = pdata->irq_base + 8 + 1,
> -				.flags = IORESOURCE_IRQ,
> -			};
> +	struct platform_device	*pdev;
> +	struct twl4030_client	*twl = &twl4030_modules[chip];
> +	int			status;
>  
> -			status = platform_device_add_resources(pdev, &r, 1);
> -		}
> +	pdev = platform_device_alloc(name, -1);
> +	if (!pdev) {
> +		dev_dbg(&twl->client->dev, "can't alloc dev\n");
> +		status = -ENOMEM;
> +		goto err;
> +	}
>  
> -		if (status == 0)
> -			status = platform_device_add(pdev);
> +	device_init_wakeup(&pdev->dev, can_wakeup);
> +	pdev->dev.parent = &twl->client->dev;
>  
> +	if (pdata) {
> +		status = platform_device_add_data(pdev, pdata, pdata_len);
>  		if (status < 0) {
> -			platform_device_put(pdev);
> -			dev_dbg(&twl->client->dev,
> -					"can't create bci dev, %d\n",
> -					status);
> +			dev_dbg(&pdev->dev, "can't add platform_data\n");
>  			goto err;
>  		}
>  	}
>  
> -	if (twl_has_gpio() && pdata->gpio) {
> -		twl = &twl4030_modules[1];
> +	if (irq0) {
> +		struct resource r[2] = {
> +			{ .start = irq0, .flags = IORESOURCE_IRQ, },
> +			{ .start = irq1, .flags = IORESOURCE_IRQ, },
> +		};
>  
> -		pdev = platform_device_alloc("twl4030_gpio", -1);
> -		if (!pdev) {
> -			pr_debug("%s: can't alloc gpio dev\n", DRIVER_NAME);
> -			status = -ENOMEM;
> +		status = platform_device_add_resources(pdev, r, irq1 ? 2 : 1);
> +		if (status < 0) {
> +			dev_dbg(&pdev->dev, "can't add irqs\n");
>  			goto err;
>  		}
> +	}
>  
> -		/* more driver model init */
> -		if (status == 0) {
> -			pdev->dev.parent = &twl->client->dev;
> -			/* device_init_wakeup(&pdev->dev, 1); */
> +	status = platform_device_add(pdev);
>  
> -			status = platform_device_add_data(pdev, pdata->gpio,
> -					sizeof(*pdata->gpio));
> -			if (status < 0) {
> -				dev_dbg(&twl->client->dev,
> -					"can't add gpio data, %d\n",
> -					status);
> -				goto err;
> -			}
> -		}
> +err:
> +	if (status < 0) {
> +		platform_device_put(pdev);
> +		dev_err(&twl->client->dev, "can't add %s dev\n", name);
> +	}
> +	return status;
> +}
>  
> -		/* GPIO module IRQ */
> -		if (status == 0) {
> -			struct resource	r = {
> -				.start = pdata->irq_base + 0,
> -				.flags = IORESOURCE_IRQ,
> -			};
> +/*
> + * NOTE:  We know the first 8 IRQs after pdata->base_irq are
> + * for the PIH, and the next are for the PWR_INT SIH, since
> + * that's how twl_init_irq() sets things up.
> + */
>  
> -			status = platform_device_add_resources(pdev, &r, 1);
> -		}
> +static int add_children(struct twl4030_platform_data *pdata)
> +{
> +	int			status;
>  
> -		if (status == 0)
> -			status = platform_device_add(pdev);
> +	if (twl_has_bci() && pdata->bci) {
> +		status = add_child(3, "twl4030_bci",
> +				pdata->bci, sizeof(*pdata->bci),
> +				false,
> +				/* irq0 = CHG_PRES, irq1 = BCI */
> +				pdata->irq_base + 8 + 1, pdata->irq_base + 2);
> +		if (status < 0)
> +			return status;
> +	}
>  
> -		if (status < 0) {
> -			platform_device_put(pdev);
> -			dev_dbg(&twl->client->dev,
> -					"can't create gpio dev, %d\n",
> -					status);
> -			goto err;
> -		}
> +	if (twl_has_gpio() && pdata->gpio) {
> +		status = add_child(1, "twl4030_gpio",
> +				pdata->gpio, sizeof(*pdata->gpio),
> +				false, pdata->irq_base + 0, 0);
> +		if (status < 0)
> +			return status;
>  	}
>  
>  	if (twl_has_keypad() && pdata->keypad) {
> -		pdev = platform_device_alloc("twl4030_keypad", -1);
> -		if (pdev) {
> -			twl = &twl4030_modules[2];
> -			pdev->dev.parent = &twl->client->dev;
> -			device_init_wakeup(&pdev->dev, 1);
> -			status = platform_device_add_data(pdev, pdata->keypad,
> -					sizeof(*pdata->keypad));
> -			if (status < 0) {
> -				dev_dbg(&twl->client->dev,
> -					"can't add keypad data, %d\n",
> -					status);
> -				platform_device_put(pdev);
> -				goto err;
> -			}
> -			status = platform_device_add(pdev);
> -			if (status < 0) {
> -				platform_device_put(pdev);
> -				dev_dbg(&twl->client->dev,
> -						"can't create keypad dev, %d\n",
> -						status);
> -				goto err;
> -			}
> -		} else {
> -			pr_debug("%s: can't alloc keypad dev\n", DRIVER_NAME);
> -			status = -ENOMEM;
> -			goto err;
> -		}
> +		status = add_child(2, "twl4030_keypad",
> +				pdata->keypad, sizeof(*pdata->keypad),
> +				true, pdata->irq_base + 1, 0);
> +		if (status < 0)
> +			return status;
>  	}
>  
>  	if (twl_has_madc() && pdata->madc) {
> -		pdev = platform_device_alloc("twl4030_madc", -1);
> -		if (pdev) {
> -			twl = &twl4030_modules[2];
> -			pdev->dev.parent = &twl->client->dev;
> -			device_init_wakeup(&pdev->dev, 1);
> -			status = platform_device_add_data(pdev, pdata->madc,
> -					sizeof(*pdata->madc));
> -			if (status < 0) {
> -				platform_device_put(pdev);
> -				dev_dbg(&twl->client->dev,
> -					"can't add madc data, %d\n",
> -					status);
> -				goto err;
> -			}
> -			status = platform_device_add(pdev);
> -			if (status < 0) {
> -				platform_device_put(pdev);
> -				dev_dbg(&twl->client->dev,
> -						"can't create madc dev, %d\n",
> -						status);
> -				goto err;
> -			}
> -		} else {
> -			pr_debug("%s: can't alloc madc dev\n", DRIVER_NAME);
> -			status = -ENOMEM;
> -			goto err;
> -		}
> +		status = add_child(2, "twl4030_madc",
> +				pdata->madc, sizeof(*pdata->madc),
> +				true, pdata->irq_base + 3, 0);
> +		if (status < 0)
> +			return status;
>  	}
>  
>  	if (twl_has_power() && pdata->power)
>  		twl4030_power_init(pdata->power);
>  
>  	if (twl_has_rtc()) {
> -		twl = &twl4030_modules[3];
> -
> -		pdev = platform_device_alloc("twl4030_rtc", -1);
> -		if (!pdev) {
> -			pr_debug("%s: can't alloc rtc dev\n", DRIVER_NAME);
> -			status = -ENOMEM;
> -		} else {
> -			pdev->dev.parent = &twl->client->dev;
> -			device_init_wakeup(&pdev->dev, 1);
> -		}
> -
>  		/*
> -		 * REVISIT platform_data here currently might use of
> +		 * REVISIT platform_data here currently might expose the
>  		 * "msecure" line ... but for now we just expect board
> -		 * setup to tell the chip "we are secure" at all times.
> +		 * setup to tell the chip "it's always ok to SET_TIME".
>  		 * Eventually, Linux might become more aware of such
>  		 * HW security concerns, and "least privilege".
>  		 */
> -
> -		/* RTC module IRQ */
> -		if (status == 0) {
> -			struct resource	r = {
> -				.start = pdata->irq_base + 8 + 3,
> -				.flags = IORESOURCE_IRQ,
> -			};
> -
> -			status = platform_device_add_resources(pdev, &r, 1);
> -		}
> -
> -		if (status == 0)
> -			status = platform_device_add(pdev);
> -
> -		if (status < 0) {
> -			platform_device_put(pdev);
> -			dev_dbg(&twl->client->dev,
> -					"can't create rtc dev, %d\n",
> -					status);
> -			goto err;
> -		}
> +		status = add_child(3, "twl4030_rtc",
> +				NULL, 0,
> +				true, pdata->irq_base + 8 + 3, 0);
> +		if (status < 0)
> +			return status;
>  	}
>  
>  	if (twl_has_usb() && pdata->usb) {
> -		twl = &twl4030_modules[0];
> -
> -		pdev = platform_device_alloc("twl4030_usb", -1);
> -		if (!pdev) {
> -			pr_debug("%s: can't alloc usb dev\n", DRIVER_NAME);
> -			status = -ENOMEM;
> -			goto err;
> -		}
> -
> -		if (status == 0) {
> -			pdev->dev.parent = &twl->client->dev;
> -			device_init_wakeup(&pdev->dev, 1);
> -			status = platform_device_add_data(pdev, pdata->usb,
> -					sizeof(*pdata->usb));
> -			if (status < 0) {
> -				platform_device_put(pdev);
> -				dev_dbg(&twl->client->dev,
> -					"can't add usb data, %d\n",
> -					status);
> -				goto err;
> -			}
> -		}
> -
> -		if (status == 0) {
> -			struct resource r = {
> -				.start = pdata->irq_base + 8 + 2,
> -				.flags = IORESOURCE_IRQ,
> -			};
> -
> -			status = platform_device_add_resources(pdev, &r, 1);
> -		}
> -
> -		if (status == 0)
> -			status = platform_device_add(pdev);
> -
> -		if (status < 0) {
> -			platform_device_put(pdev);
> -			dev_dbg(&twl->client->dev,
> -					"can't create usb dev, %d\n",
> -					status);
> -		}
> +		status = add_child(0, "twl4030_usb",
> +				pdata->usb, sizeof(*pdata->usb),
> +				true,
> +				/* irq0 = USB_PRES, irq1 = USB */
> +				pdata->irq_base + 8 + 2, pdata->irq_base + 4);
> +		if (status < 0)
> +			return status;
>  	}
>  
> -err:
> -	if (status)
> -		pr_err("failed to add twl4030's children (status %d)\n", status);
> -	return status;
> +	return 0;
>  }
>  
>  /*----------------------------------------------------------------------*/
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2008-11-13 22:26 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-11-08  0:45 [patch/rft 2.6.28-rc3-omap] twl4030-core simplification David Brownell
2008-11-13 22:26 ` Tony Lindgren [this message]
2008-11-14  0:15   ` David Brownell
2008-11-14  0:35     ` Felipe Balbi
2008-11-14  0:42       ` Tony Lindgren
2008-11-14  0:52         ` Felipe Balbi
2008-11-14  1:00         ` Tony Lindgren
2008-11-14  1:05           ` David Brownell
2008-11-14  1:30             ` Tony Lindgren
2008-11-14  1:00         ` David Brownell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20081113222626.GM3106@atomide.com \
    --to=tony@atomide.com \
    --cc=david-b@pacbell.net \
    --cc=linux-omap@vger.kernel.org \
    --cc=sameo@openedhand.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.