diff options
| -rw-r--r-- | arch/arm/mach-omap1/board-h2.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap1/board-h3.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/clock2430_data.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/clock3xxx_data.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/devices.c | 5 | ||||
| -rw-r--r-- | drivers/mfd/twl-core.c | 56 | 
6 files changed, 39 insertions, 26 deletions
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 44a4ab195fb..fe79c56b2dc 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c @@ -31,6 +31,7 @@  #include <linux/i2c/tps65010.h>  #include <linux/smc91x.h>  #include <linux/omapfb.h> +#include <linux/platform_data/gpio-omap.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 86cb5a04a40..6c46f33894f 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c @@ -31,6 +31,7 @@  #include <linux/i2c/tps65010.h>  #include <linux/smc91x.h>  #include <linux/omapfb.h> +#include <linux/platform_data/gpio-omap.h>  #include <asm/setup.h>  #include <asm/page.h> diff --git a/arch/arm/mach-omap2/clock2430_data.c b/arch/arm/mach-omap2/clock2430_data.c index 02fe1f28aff..7ea91398217 100644 --- a/arch/arm/mach-omap2/clock2430_data.c +++ b/arch/arm/mach-omap2/clock2430_data.c @@ -1856,6 +1856,7 @@ static struct omap_clk omap2430_clks[] = {  	CLK(NULL,	"func_32k_ck",	&func_32k_ck,	CK_243X),  	CLK(NULL,	"secure_32k_ck", &secure_32k_ck, CK_243X),  	CLK(NULL,	"osc_ck",	&osc_ck,	CK_243X), +	CLK("twl",	"fck",		&osc_ck,	CK_243X),  	CLK(NULL,	"sys_ck",	&sys_ck,	CK_243X),  	CLK(NULL,	"alt_ck",	&alt_ck,	CK_243X),  	CLK(NULL,	"mcbsp_clks",	&mcbsp_clks,	CK_243X), diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c index 10a2398e173..700317a1bd1 100644 --- a/arch/arm/mach-omap2/clock3xxx_data.c +++ b/arch/arm/mach-omap2/clock3xxx_data.c @@ -3226,6 +3226,7 @@ static struct omap_clk omap3xxx_clks[] = {  	CLK(NULL,	"virt_26000000_ck",	&virt_26000000_ck,	CK_3XXX),  	CLK(NULL,	"virt_38_4m_ck", &virt_38_4m_ck, CK_3XXX),  	CLK(NULL,	"osc_sys_ck",	&osc_sys_ck,	CK_3XXX), +	CLK("twl",	"fck",		&osc_sys_ck,	CK_3XXX),  	CLK(NULL,	"sys_ck",	&sys_ck,	CK_3XXX),  	CLK(NULL,	"sys_altclk",	&sys_altclk,	CK_3XXX),  	CLK(NULL,	"mcbsp_clks",	&mcbsp_clks,	CK_3XXX), diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 6f6893e38ff..f6cbcdcb3c1 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -17,6 +17,7 @@  #include <linux/err.h>  #include <linux/slab.h>  #include <linux/of.h> +#include <linux/pinctrl/machine.h>  #include <linux/platform_data/omap4-keypad.h>  #include <asm/mach-types.h> @@ -627,6 +628,10 @@ static inline void omap_init_vout(void) {}  static int __init omap2_init_devices(void)  { +	/* Enable dummy states for those platforms without pinctrl support */ +	if (!of_have_populated_dt()) +		pinctrl_provide_dummies(); +  	/*  	 * please keep these calls, and their implementations above,  	 * in alphabetical order so they're easier to sort through. diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index f462ff226c8..9d3a0bc1a65 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -46,8 +46,6 @@  #include <linux/i2c.h>  #include <linux/i2c/twl.h> -#include <plat/cpu.h> -  #include "twl-core.h"  /* @@ -1134,12 +1132,7 @@ static void clocks_init(struct device *dev,  	u32 rate;  	u8 ctrl = HFCLK_FREQ_26_MHZ; -#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) -	if (cpu_is_omap2430()) -		osc = clk_get(dev, "osc_ck"); -	else -		osc = clk_get(dev, "osc_sys_ck"); - +	osc = clk_get(dev, "fck");  	if (IS_ERR(osc)) {  		printk(KERN_WARNING "Skipping twl internal clock init and "  				"using bootloader value (unknown osc rate)\n"); @@ -1149,18 +1142,6 @@ static void clocks_init(struct device *dev,  	rate = clk_get_rate(osc);  	clk_put(osc); -#else -	/* REVISIT for non-OMAP systems, pass the clock rate from -	 * board init code, using platform_data. -	 */ -	osc = ERR_PTR(-EIO); - -	printk(KERN_WARNING "Skipping twl internal clock init and " -	       "using bootloader value (unknown osc rate)\n"); - -	return; -#endif -  	switch (rate) {  	case 19200000:  		ctrl = HFCLK_FREQ_19p2_MHZ; @@ -1222,10 +1203,23 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id)  {  	struct twl4030_platform_data	*pdata = client->dev.platform_data;  	struct device_node		*node = client->dev.of_node; +	struct platform_device		*pdev;  	int				irq_base = 0;  	int				status;  	unsigned			i, num_slaves; +	pdev = platform_device_alloc(DRIVER_NAME, -1); +	if (!pdev) { +		dev_err(&client->dev, "can't alloc pdev\n"); +		return -ENOMEM; +	} + +	status = platform_device_add(pdev); +	if (status) { +		platform_device_put(pdev); +		return status; +	} +  	if (node && !pdata) {  		/*  		 * XXX: Temporary pdata until the information is correctly @@ -1234,23 +1228,30 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id)  		pdata = devm_kzalloc(&client->dev,  				     sizeof(struct twl4030_platform_data),  				     GFP_KERNEL); -		if (!pdata) -			return -ENOMEM; +		if (!pdata) { +			status = -ENOMEM; +			goto free; +		}  	}  	if (!pdata) {  		dev_dbg(&client->dev, "no platform data?\n"); -		return -EINVAL; +		status = -EINVAL; +		goto free;  	} +	platform_set_drvdata(pdev, pdata); +  	if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) {  		dev_dbg(&client->dev, "can't talk I2C?\n"); -		return -EIO; +		status = -EIO; +		goto free;  	}  	if (inuse) {  		dev_dbg(&client->dev, "driver is already in use\n"); -		return -EBUSY; +		status = -EBUSY; +		goto free;  	}  	if ((id->driver_data) & TWL6030_CLASS) { @@ -1285,7 +1286,7 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id)  	inuse = true;  	/* setup clock framework */ -	clocks_init(&client->dev, pdata->clock); +	clocks_init(&pdev->dev, pdata->clock);  	/* read TWL IDCODE Register */  	if (twl_id == TWL4030_CLASS_ID) { @@ -1335,6 +1336,9 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id)  fail:  	if (status < 0)  		twl_remove(client); +free: +	if (status < 0) +		platform_device_unregister(pdev);  	return status;  }  |