diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-bcm2835.c')
-rw-r--r-- | drivers/i2c/busses/i2c-bcm2835.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c index 512c63871bd3..67752f7b0371 100644 --- a/drivers/i2c/busses/i2c-bcm2835.c +++ b/drivers/i2c/busses/i2c-bcm2835.c @@ -154,15 +154,18 @@ static const struct clk_ops clk_bcm2835_i2c_ops = { }; static struct clk *bcm2835_i2c_register_div(struct device *dev, - const char *mclk_name, + struct clk *mclk, struct bcm2835_i2c_dev *i2c_dev) { struct clk_init_data init; struct clk_bcm2835_i2c *priv; char name[32]; + const char *mclk_name; snprintf(name, sizeof(name), "%s_div", dev_name(dev)); + mclk_name = __clk_get_name(mclk); + init.ops = &clk_bcm2835_i2c_ops; init.name = name; init.parent_names = (const char* []) { mclk_name }; @@ -400,8 +403,8 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) struct resource *mem, *irq; int ret; struct i2c_adapter *adap; - const char *mclk_name; struct clk *bus_clk; + struct clk *mclk; u32 bus_clk_rate; i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); @@ -416,9 +419,14 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) if (IS_ERR(i2c_dev->regs)) return PTR_ERR(i2c_dev->regs); - mclk_name = of_clk_get_parent_name(pdev->dev.of_node, 0); + mclk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(mclk)) { + if (PTR_ERR(mclk) != -EPROBE_DEFER) + dev_err(&pdev->dev, "Could not get clock\n"); + return PTR_ERR(mclk); + } - bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk_name, i2c_dev); + bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk, i2c_dev); if (IS_ERR(bus_clk)) { dev_err(&pdev->dev, "Could not register clock\n"); |