Skip to content

Commit 9de93b0

Browse files
mcdermjWolfram Sang
authored andcommitted
i2c: bcm2835: Ensure clock exists when probing
Probe function fails to recognize that upstream clock actually doesn't yet exist because clock driver has not been initialized. Actually try to go get the clock and test for its existence before trying to set up a downstream clock based upon it. This fixes a bug that causes the i2c driver not to work with monolithic kernels. Fixes: bebff81 ("i2c: bcm2835: Model Divider in CCF") Signed-off-by: Annaliese McDermond <[email protected]> Acked-by: Stefan Wahren <[email protected]> Signed-off-by: Wolfram Sang <[email protected]>
1 parent 4a5cfa3 commit 9de93b0

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

drivers/i2c/busses/i2c-bcm2835.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,18 @@ static const struct clk_ops clk_bcm2835_i2c_ops = {
154154
};
155155

156156
static struct clk *bcm2835_i2c_register_div(struct device *dev,
157-
const char *mclk_name,
157+
struct clk *mclk,
158158
struct bcm2835_i2c_dev *i2c_dev)
159159
{
160160
struct clk_init_data init;
161161
struct clk_bcm2835_i2c *priv;
162162
char name[32];
163+
const char *mclk_name;
163164

164165
snprintf(name, sizeof(name), "%s_div", dev_name(dev));
165166

167+
mclk_name = __clk_get_name(mclk);
168+
166169
init.ops = &clk_bcm2835_i2c_ops;
167170
init.name = name;
168171
init.parent_names = (const char* []) { mclk_name };
@@ -400,8 +403,8 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
400403
struct resource *mem, *irq;
401404
int ret;
402405
struct i2c_adapter *adap;
403-
const char *mclk_name;
404406
struct clk *bus_clk;
407+
struct clk *mclk;
405408
u32 bus_clk_rate;
406409

407410
i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL);
@@ -416,9 +419,14 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
416419
if (IS_ERR(i2c_dev->regs))
417420
return PTR_ERR(i2c_dev->regs);
418421

419-
mclk_name = of_clk_get_parent_name(pdev->dev.of_node, 0);
422+
mclk = devm_clk_get(&pdev->dev, NULL);
423+
if (IS_ERR(mclk)) {
424+
if (PTR_ERR(mclk) != -EPROBE_DEFER)
425+
dev_err(&pdev->dev, "Could not get clock\n");
426+
return PTR_ERR(mclk);
427+
}
420428

421-
bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk_name, i2c_dev);
429+
bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk, i2c_dev);
422430

423431
if (IS_ERR(bus_clk)) {
424432
dev_err(&pdev->dev, "Could not register clock\n");

0 commit comments

Comments
 (0)