diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c index 29ec67fe5e2f1..6af4014a37f2c 100644 --- a/drivers/i2c/busses/i2c-bcm2835.c +++ b/drivers/i2c/busses/i2c-bcm2835.c @@ -236,15 +236,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 }; @@ -497,8 +500,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); @@ -513,9 +516,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");