Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit defa6be1 authored by Tony Lindgren's avatar Tony Lindgren
Browse files

mfd: Fix compile for twl-core.c by removing cpu_is_omap usage



Commit 7d7e1eba (ARM: OMAP2+: Prepare for irqs.h removal) broke
compile for non-omap as include plat/cpu.h was added. This header
was indirectly included earlier when SPARSE_IRQ was not set, but
does not exist on most platforms.

Fix the problem by removing the cpu_is_omap usage that should
not exist in drivers at all. We can do this by adding proper
clock aliases for the twl-core.c drivers, and drop separate
handling for cases when clock framework is not available as
the behaviour will stay the same.

Note that we need to add a platform device to avoid using the
i2c provided names that may be different on various omaps.

Reported-by: default avatarFengguang Wu <fengguang.wu@intel.com>
Reported-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
Cc: Paul Walmsley <paul@pwsan.com>
Acked-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
Cc: Olof Johansson <olof@lixom.net>
Cc: Felipe Balbi <balbi@ti.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 68cb700c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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),
+1 −0
Original line number Diff line number Diff line
@@ -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),
+30 −26
Original line number Diff line number Diff line
@@ -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;
}