diff options
Diffstat (limited to 'arch/powerpc/platforms/powermac/low_i2c.c')
-rw-r--r-- | arch/powerpc/platforms/powermac/low_i2c.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/arch/powerpc/platforms/powermac/low_i2c.c b/arch/powerpc/platforms/powermac/low_i2c.c index f3f39e8e337a..606e0ed13731 100644 --- a/arch/powerpc/platforms/powermac/low_i2c.c +++ b/arch/powerpc/platforms/powermac/low_i2c.c | |||
@@ -36,7 +36,7 @@ | |||
36 | 36 | ||
37 | #ifdef DEBUG | 37 | #ifdef DEBUG |
38 | #define DBG(x...) do {\ | 38 | #define DBG(x...) do {\ |
39 | printk(KERN_DEBUG "KW:" x); \ | 39 | printk(KERN_DEBUG "low_i2c:" x); \ |
40 | } while(0) | 40 | } while(0) |
41 | #else | 41 | #else |
42 | #define DBG(x...) | 42 | #define DBG(x...) |
@@ -342,7 +342,7 @@ static int keywest_low_i2c_func(struct low_i2c_host *host, u8 addr, u8 subaddr, | |||
342 | static void keywest_low_i2c_add(struct device_node *np) | 342 | static void keywest_low_i2c_add(struct device_node *np) |
343 | { | 343 | { |
344 | struct low_i2c_host *host = find_low_i2c_host(NULL); | 344 | struct low_i2c_host *host = find_low_i2c_host(NULL); |
345 | u32 *psteps, *prate, steps, aoffset = 0; | 345 | u32 *psteps, *prate, *addrp, steps; |
346 | struct device_node *parent; | 346 | struct device_node *parent; |
347 | 347 | ||
348 | if (host == NULL) { | 348 | if (host == NULL) { |
@@ -352,6 +352,16 @@ static void keywest_low_i2c_add(struct device_node *np) | |||
352 | } | 352 | } |
353 | memset(host, 0, sizeof(*host)); | 353 | memset(host, 0, sizeof(*host)); |
354 | 354 | ||
355 | /* Apple is kind enough to provide a valid AAPL,address property | ||
356 | * on all i2c keywest nodes so far ... we would have to fallback | ||
357 | * to macio parsing if that wasn't the case | ||
358 | */ | ||
359 | addrp = (u32 *)get_property(np, "AAPL,address", NULL); | ||
360 | if (addrp == NULL) { | ||
361 | printk(KERN_ERR "low_i2c: Can't find address for %s\n", | ||
362 | np->full_name); | ||
363 | return; | ||
364 | } | ||
355 | init_MUTEX(&host->mutex); | 365 | init_MUTEX(&host->mutex); |
356 | host->np = of_node_get(np); | 366 | host->np = of_node_get(np); |
357 | psteps = (u32 *)get_property(np, "AAPL,address-step", NULL); | 367 | psteps = (u32 *)get_property(np, "AAPL,address-step", NULL); |
@@ -360,12 +370,10 @@ static void keywest_low_i2c_add(struct device_node *np) | |||
360 | steps >>= 1; | 370 | steps >>= 1; |
361 | parent = of_get_parent(np); | 371 | parent = of_get_parent(np); |
362 | host->num_channels = 1; | 372 | host->num_channels = 1; |
363 | if (parent && parent->name[0] == 'u') { | 373 | if (parent && parent->name[0] == 'u') |
364 | host->num_channels = 2; | 374 | host->num_channels = 2; |
365 | aoffset = 3; | ||
366 | } | ||
367 | /* Select interface rate */ | 375 | /* Select interface rate */ |
368 | host->speed = KW_I2C_MODE_100KHZ; | 376 | host->speed = KW_I2C_MODE_25KHZ; |
369 | prate = (u32 *)get_property(np, "AAPL,i2c-rate", NULL); | 377 | prate = (u32 *)get_property(np, "AAPL,i2c-rate", NULL); |
370 | if (prate) switch(*prate) { | 378 | if (prate) switch(*prate) { |
371 | case 100: | 379 | case 100: |
@@ -379,9 +387,12 @@ static void keywest_low_i2c_add(struct device_node *np) | |||
379 | break; | 387 | break; |
380 | } | 388 | } |
381 | 389 | ||
390 | printk(KERN_INFO "low_i2c: Bus %s found at 0x%08x, %d channels," | ||
391 | " speed = %d KHz\n", | ||
392 | np->full_name, *addrp, host->num_channels, prate ? *prate : 25); | ||
393 | |||
382 | host->mode = pmac_low_i2c_mode_std; | 394 | host->mode = pmac_low_i2c_mode_std; |
383 | host->base = ioremap(np->addrs[0].address + aoffset, | 395 | host->base = ioremap((*addrp), 0x1000); |
384 | np->addrs[0].size); | ||
385 | host->func = keywest_low_i2c_func; | 396 | host->func = keywest_low_i2c_func; |
386 | } | 397 | } |
387 | 398 | ||