diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-12 17:27:24 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-12 17:27:24 -0500 |
commit | 09cea96caa59fabab3030c53bd698b9b568d959a (patch) | |
tree | a991cdc0c887fdcda37f4b751ee98d3db9559f4e /drivers/macintosh | |
parent | 6eb7365db6f3a4a9d8d9922bb0b800f9cbaad641 (diff) | |
parent | e090aa80321b64c3b793f3b047e31ecf1af9538d (diff) |
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (151 commits)
powerpc: Fix usage of 64-bit instruction in 32-bit altivec code
MAINTAINERS: Add PowerPC patterns
powerpc/pseries: Track previous CPPR values to correctly EOI interrupts
powerpc/pseries: Correct pseries/dlpar.c build break without CONFIG_SMP
powerpc: Make "intspec" pointers in irq_host->xlate() const
powerpc/8xx: DTLB Miss cleanup
powerpc/8xx: Remove DIRTY pte handling in DTLB Error.
powerpc/8xx: Start using dcbX instructions in various copy routines
powerpc/8xx: Restore _PAGE_WRITETHRU
powerpc/8xx: Add missing Guarded setting in DTLB Error.
powerpc/8xx: Fixup DAR from buggy dcbX instructions.
powerpc/8xx: Tag DAR with 0x00f0 to catch buggy instructions.
powerpc/8xx: Update TLB asm so it behaves as linux mm expects.
powerpc/8xx: Invalidate non present TLBs
powerpc/pseries: Serialize cpu hotplug operations during deactivate Vs deallocate
pseries/pseries: Add code to online/offline CPUs of a DLPAR node
powerpc: stop_this_cpu: remove the cpu from the online map.
powerpc/pseries: Add kernel based CPU DLPAR handling
sysfs/cpu: Add probe/release files
powerpc/pseries: Kernel DLPAR Infrastructure
...
Diffstat (limited to 'drivers/macintosh')
-rw-r--r-- | drivers/macintosh/macio_asic.c | 52 | ||||
-rw-r--r-- | drivers/macintosh/mediabay.c | 328 | ||||
-rw-r--r-- | drivers/macintosh/nvram.c | 11 | ||||
-rw-r--r-- | drivers/macintosh/therm_adt746x.c | 15 | ||||
-rw-r--r-- | drivers/macintosh/via-pmu.c | 160 | ||||
-rw-r--r-- | drivers/macintosh/windfarm_smu_controls.c | 2 |
6 files changed, 282 insertions, 286 deletions
diff --git a/drivers/macintosh/macio_asic.c b/drivers/macintosh/macio_asic.c index 588a5b0bc4b5..26a303a1d1ab 100644 --- a/drivers/macintosh/macio_asic.c +++ b/drivers/macintosh/macio_asic.c | |||
@@ -379,6 +379,11 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip, | |||
379 | dev->ofdev.dev.parent = parent; | 379 | dev->ofdev.dev.parent = parent; |
380 | dev->ofdev.dev.bus = &macio_bus_type; | 380 | dev->ofdev.dev.bus = &macio_bus_type; |
381 | dev->ofdev.dev.release = macio_release_dev; | 381 | dev->ofdev.dev.release = macio_release_dev; |
382 | dev->ofdev.dev.dma_parms = &dev->dma_parms; | ||
383 | |||
384 | /* Standard DMA paremeters */ | ||
385 | dma_set_max_seg_size(&dev->ofdev.dev, 65536); | ||
386 | dma_set_seg_boundary(&dev->ofdev.dev, 0xffffffff); | ||
382 | 387 | ||
383 | #ifdef CONFIG_PCI | 388 | #ifdef CONFIG_PCI |
384 | /* Set the DMA ops to the ones from the PCI device, this could be | 389 | /* Set the DMA ops to the ones from the PCI device, this could be |
@@ -538,6 +543,42 @@ void macio_unregister_driver(struct macio_driver *drv) | |||
538 | driver_unregister(&drv->driver); | 543 | driver_unregister(&drv->driver); |
539 | } | 544 | } |
540 | 545 | ||
546 | /* Managed MacIO resources */ | ||
547 | struct macio_devres { | ||
548 | u32 res_mask; | ||
549 | }; | ||
550 | |||
551 | static void maciom_release(struct device *gendev, void *res) | ||
552 | { | ||
553 | struct macio_dev *dev = to_macio_device(gendev); | ||
554 | struct macio_devres *dr = res; | ||
555 | int i, max; | ||
556 | |||
557 | max = min(dev->n_resources, 32); | ||
558 | for (i = 0; i < max; i++) { | ||
559 | if (dr->res_mask & (1 << i)) | ||
560 | macio_release_resource(dev, i); | ||
561 | } | ||
562 | } | ||
563 | |||
564 | int macio_enable_devres(struct macio_dev *dev) | ||
565 | { | ||
566 | struct macio_devres *dr; | ||
567 | |||
568 | dr = devres_find(&dev->ofdev.dev, maciom_release, NULL, NULL); | ||
569 | if (!dr) { | ||
570 | dr = devres_alloc(maciom_release, sizeof(*dr), GFP_KERNEL); | ||
571 | if (!dr) | ||
572 | return -ENOMEM; | ||
573 | } | ||
574 | return devres_get(&dev->ofdev.dev, dr, NULL, NULL) != NULL; | ||
575 | } | ||
576 | |||
577 | static struct macio_devres * find_macio_dr(struct macio_dev *dev) | ||
578 | { | ||
579 | return devres_find(&dev->ofdev.dev, maciom_release, NULL, NULL); | ||
580 | } | ||
581 | |||
541 | /** | 582 | /** |
542 | * macio_request_resource - Request an MMIO resource | 583 | * macio_request_resource - Request an MMIO resource |
543 | * @dev: pointer to the device holding the resource | 584 | * @dev: pointer to the device holding the resource |
@@ -555,6 +596,8 @@ void macio_unregister_driver(struct macio_driver *drv) | |||
555 | int macio_request_resource(struct macio_dev *dev, int resource_no, | 596 | int macio_request_resource(struct macio_dev *dev, int resource_no, |
556 | const char *name) | 597 | const char *name) |
557 | { | 598 | { |
599 | struct macio_devres *dr = find_macio_dr(dev); | ||
600 | |||
558 | if (macio_resource_len(dev, resource_no) == 0) | 601 | if (macio_resource_len(dev, resource_no) == 0) |
559 | return 0; | 602 | return 0; |
560 | 603 | ||
@@ -562,6 +605,9 @@ int macio_request_resource(struct macio_dev *dev, int resource_no, | |||
562 | macio_resource_len(dev, resource_no), | 605 | macio_resource_len(dev, resource_no), |
563 | name)) | 606 | name)) |
564 | goto err_out; | 607 | goto err_out; |
608 | |||
609 | if (dr && resource_no < 32) | ||
610 | dr->res_mask |= 1 << resource_no; | ||
565 | 611 | ||
566 | return 0; | 612 | return 0; |
567 | 613 | ||
@@ -582,10 +628,14 @@ err_out: | |||
582 | */ | 628 | */ |
583 | void macio_release_resource(struct macio_dev *dev, int resource_no) | 629 | void macio_release_resource(struct macio_dev *dev, int resource_no) |
584 | { | 630 | { |
631 | struct macio_devres *dr = find_macio_dr(dev); | ||
632 | |||
585 | if (macio_resource_len(dev, resource_no) == 0) | 633 | if (macio_resource_len(dev, resource_no) == 0) |
586 | return; | 634 | return; |
587 | release_mem_region(macio_resource_start(dev, resource_no), | 635 | release_mem_region(macio_resource_start(dev, resource_no), |
588 | macio_resource_len(dev, resource_no)); | 636 | macio_resource_len(dev, resource_no)); |
637 | if (dr && resource_no < 32) | ||
638 | dr->res_mask &= ~(1 << resource_no); | ||
589 | } | 639 | } |
590 | 640 | ||
591 | /** | 641 | /** |
@@ -744,3 +794,5 @@ EXPORT_SYMBOL(macio_request_resource); | |||
744 | EXPORT_SYMBOL(macio_release_resource); | 794 | EXPORT_SYMBOL(macio_release_resource); |
745 | EXPORT_SYMBOL(macio_request_resources); | 795 | EXPORT_SYMBOL(macio_request_resources); |
746 | EXPORT_SYMBOL(macio_release_resources); | 796 | EXPORT_SYMBOL(macio_release_resources); |
797 | EXPORT_SYMBOL(macio_enable_devres); | ||
798 | |||
diff --git a/drivers/macintosh/mediabay.c b/drivers/macintosh/mediabay.c index 029ad8ce8a7e..08002b88f342 100644 --- a/drivers/macintosh/mediabay.c +++ b/drivers/macintosh/mediabay.c | |||
@@ -33,15 +33,6 @@ | |||
33 | #include <linux/adb.h> | 33 | #include <linux/adb.h> |
34 | #include <linux/pmu.h> | 34 | #include <linux/pmu.h> |
35 | 35 | ||
36 | |||
37 | #define MB_DEBUG | ||
38 | |||
39 | #ifdef MB_DEBUG | ||
40 | #define MBDBG(fmt, arg...) printk(KERN_INFO fmt , ## arg) | ||
41 | #else | ||
42 | #define MBDBG(fmt, arg...) do { } while (0) | ||
43 | #endif | ||
44 | |||
45 | #define MB_FCR32(bay, r) ((bay)->base + ((r) >> 2)) | 36 | #define MB_FCR32(bay, r) ((bay)->base + ((r) >> 2)) |
46 | #define MB_FCR8(bay, r) (((volatile u8 __iomem *)((bay)->base)) + (r)) | 37 | #define MB_FCR8(bay, r) (((volatile u8 __iomem *)((bay)->base)) + (r)) |
47 | 38 | ||
@@ -76,28 +67,14 @@ struct media_bay_info { | |||
76 | int index; | 67 | int index; |
77 | int cached_gpio; | 68 | int cached_gpio; |
78 | int sleeping; | 69 | int sleeping; |
70 | int user_lock; | ||
79 | struct mutex lock; | 71 | struct mutex lock; |
80 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
81 | ide_hwif_t *cd_port; | ||
82 | void __iomem *cd_base; | ||
83 | int cd_irq; | ||
84 | int cd_retry; | ||
85 | #endif | ||
86 | #if defined(CONFIG_BLK_DEV_IDE_PMAC) | ||
87 | int cd_index; | ||
88 | #endif | ||
89 | }; | 72 | }; |
90 | 73 | ||
91 | #define MAX_BAYS 2 | 74 | #define MAX_BAYS 2 |
92 | 75 | ||
93 | static struct media_bay_info media_bays[MAX_BAYS]; | 76 | static struct media_bay_info media_bays[MAX_BAYS]; |
94 | int media_bay_count = 0; | 77 | static int media_bay_count = 0; |
95 | |||
96 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
97 | /* check the busy bit in the media-bay ide interface | ||
98 | (assumes the media-bay contains an ide device) */ | ||
99 | #define MB_IDE_READY(i) ((readb(media_bays[i].cd_base + 0x70) & 0x80) == 0) | ||
100 | #endif | ||
101 | 78 | ||
102 | /* | 79 | /* |
103 | * Wait that number of ms between each step in normal polling mode | 80 | * Wait that number of ms between each step in normal polling mode |
@@ -130,21 +107,11 @@ int media_bay_count = 0; | |||
130 | 107 | ||
131 | /* | 108 | /* |
132 | * Wait this many ticks after an IDE device (e.g. CD-ROM) is inserted | 109 | * Wait this many ticks after an IDE device (e.g. CD-ROM) is inserted |
133 | * (or until the device is ready) before waiting for busy bit to disappear | 110 | * (or until the device is ready) before calling into the driver |
134 | */ | 111 | */ |
135 | #define MB_IDE_WAIT 1000 | 112 | #define MB_IDE_WAIT 1000 |
136 | 113 | ||
137 | /* | 114 | /* |
138 | * Timeout waiting for busy bit of an IDE device to go down | ||
139 | */ | ||
140 | #define MB_IDE_TIMEOUT 5000 | ||
141 | |||
142 | /* | ||
143 | * Max retries of the full power up/down sequence for an IDE device | ||
144 | */ | ||
145 | #define MAX_CD_RETRIES 3 | ||
146 | |||
147 | /* | ||
148 | * States of a media bay | 115 | * States of a media bay |
149 | */ | 116 | */ |
150 | enum { | 117 | enum { |
@@ -153,7 +120,6 @@ enum { | |||
153 | mb_enabling_bay, /* enable bits set, waiting MB_RESET_DELAY */ | 120 | mb_enabling_bay, /* enable bits set, waiting MB_RESET_DELAY */ |
154 | mb_resetting, /* reset bit unset, waiting MB_SETUP_DELAY */ | 121 | mb_resetting, /* reset bit unset, waiting MB_SETUP_DELAY */ |
155 | mb_ide_resetting, /* IDE reset bit unser, waiting MB_IDE_WAIT */ | 122 | mb_ide_resetting, /* IDE reset bit unser, waiting MB_IDE_WAIT */ |
156 | mb_ide_waiting, /* Waiting for BUSY bit to go away until MB_IDE_TIMEOUT */ | ||
157 | mb_up, /* Media bay full */ | 123 | mb_up, /* Media bay full */ |
158 | mb_powering_down /* Powering down (avoid too fast down/up) */ | 124 | mb_powering_down /* Powering down (avoid too fast down/up) */ |
159 | }; | 125 | }; |
@@ -373,12 +339,12 @@ static inline void set_mb_power(struct media_bay_info* bay, int onoff) | |||
373 | if (onoff) { | 339 | if (onoff) { |
374 | bay->ops->power(bay, 1); | 340 | bay->ops->power(bay, 1); |
375 | bay->state = mb_powering_up; | 341 | bay->state = mb_powering_up; |
376 | MBDBG("mediabay%d: powering up\n", bay->index); | 342 | pr_debug("mediabay%d: powering up\n", bay->index); |
377 | } else { | 343 | } else { |
378 | /* Make sure everything is powered down & disabled */ | 344 | /* Make sure everything is powered down & disabled */ |
379 | bay->ops->power(bay, 0); | 345 | bay->ops->power(bay, 0); |
380 | bay->state = mb_powering_down; | 346 | bay->state = mb_powering_down; |
381 | MBDBG("mediabay%d: powering down\n", bay->index); | 347 | pr_debug("mediabay%d: powering down\n", bay->index); |
382 | } | 348 | } |
383 | bay->timer = msecs_to_jiffies(MB_POWER_DELAY); | 349 | bay->timer = msecs_to_jiffies(MB_POWER_DELAY); |
384 | } | 350 | } |
@@ -387,107 +353,118 @@ static void poll_media_bay(struct media_bay_info* bay) | |||
387 | { | 353 | { |
388 | int id = bay->ops->content(bay); | 354 | int id = bay->ops->content(bay); |
389 | 355 | ||
390 | if (id == bay->last_value) { | 356 | static char *mb_content_types[] = { |
391 | if (id != bay->content_id) { | 357 | "a floppy drive", |
392 | bay->value_count += msecs_to_jiffies(MB_POLL_DELAY); | 358 | "a floppy drive", |
393 | if (bay->value_count >= msecs_to_jiffies(MB_STABLE_DELAY)) { | 359 | "an unsuported audio device", |
394 | /* If the device type changes without going thru | 360 | "an ATA device", |
395 | * "MB_NO", we force a pass by "MB_NO" to make sure | 361 | "an unsupported PCI device", |
396 | * things are properly reset | 362 | "an unknown device", |
397 | */ | 363 | }; |
398 | if ((id != MB_NO) && (bay->content_id != MB_NO)) { | 364 | |
399 | id = MB_NO; | 365 | if (id != bay->last_value) { |
400 | MBDBG("mediabay%d: forcing MB_NO\n", bay->index); | ||
401 | } | ||
402 | MBDBG("mediabay%d: switching to %d\n", bay->index, id); | ||
403 | set_mb_power(bay, id != MB_NO); | ||
404 | bay->content_id = id; | ||
405 | if (id == MB_NO) { | ||
406 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
407 | bay->cd_retry = 0; | ||
408 | #endif | ||
409 | printk(KERN_INFO "media bay %d is empty\n", bay->index); | ||
410 | } | ||
411 | } | ||
412 | } | ||
413 | } else { | ||
414 | bay->last_value = id; | 366 | bay->last_value = id; |
415 | bay->value_count = 0; | 367 | bay->value_count = 0; |
368 | return; | ||
369 | } | ||
370 | if (id == bay->content_id) | ||
371 | return; | ||
372 | |||
373 | bay->value_count += msecs_to_jiffies(MB_POLL_DELAY); | ||
374 | if (bay->value_count >= msecs_to_jiffies(MB_STABLE_DELAY)) { | ||
375 | /* If the device type changes without going thru | ||
376 | * "MB_NO", we force a pass by "MB_NO" to make sure | ||
377 | * things are properly reset | ||
378 | */ | ||
379 | if ((id != MB_NO) && (bay->content_id != MB_NO)) { | ||
380 | id = MB_NO; | ||
381 | pr_debug("mediabay%d: forcing MB_NO\n", bay->index); | ||
382 | } | ||
383 | pr_debug("mediabay%d: switching to %d\n", bay->index, id); | ||
384 | set_mb_power(bay, id != MB_NO); | ||
385 | bay->content_id = id; | ||
386 | if (id >= MB_NO || id < 0) | ||
387 | printk(KERN_INFO "mediabay%d: Bay is now empty\n", bay->index); | ||
388 | else | ||
389 | printk(KERN_INFO "mediabay%d: Bay contains %s\n", | ||
390 | bay->index, mb_content_types[id]); | ||
416 | } | 391 | } |
417 | } | 392 | } |
418 | 393 | ||
419 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | 394 | int check_media_bay(struct macio_dev *baydev) |
420 | int check_media_bay(struct device_node *which_bay, int what) | ||
421 | { | 395 | { |
422 | int i; | 396 | struct media_bay_info* bay; |
397 | int id; | ||
423 | 398 | ||
424 | for (i=0; i<media_bay_count; i++) | 399 | if (baydev == NULL) |
425 | if (media_bays[i].mdev && which_bay == media_bays[i].mdev->ofdev.node) { | 400 | return MB_NO; |
426 | if ((what == media_bays[i].content_id) && media_bays[i].state == mb_up) | 401 | |
427 | return 0; | 402 | /* This returns an instant snapshot, not locking, sine |
428 | media_bays[i].cd_index = -1; | 403 | * we may be called with the bay lock held. The resulting |
429 | return -EINVAL; | 404 | * fuzzyness of the result if called at the wrong time is |
430 | } | 405 | * not actually a huge deal |
431 | return -ENODEV; | 406 | */ |
407 | bay = macio_get_drvdata(baydev); | ||
408 | if (bay == NULL) | ||
409 | return MB_NO; | ||
410 | id = bay->content_id; | ||
411 | if (bay->state != mb_up) | ||
412 | return MB_NO; | ||
413 | if (id == MB_FD1) | ||
414 | return MB_FD; | ||
415 | return id; | ||
432 | } | 416 | } |
433 | EXPORT_SYMBOL(check_media_bay); | 417 | EXPORT_SYMBOL_GPL(check_media_bay); |
434 | 418 | ||
435 | int check_media_bay_by_base(unsigned long base, int what) | 419 | void lock_media_bay(struct macio_dev *baydev) |
436 | { | 420 | { |
437 | int i; | 421 | struct media_bay_info* bay; |
438 | |||
439 | for (i=0; i<media_bay_count; i++) | ||
440 | if (media_bays[i].mdev && base == (unsigned long) media_bays[i].cd_base) { | ||
441 | if ((what == media_bays[i].content_id) && media_bays[i].state == mb_up) | ||
442 | return 0; | ||
443 | media_bays[i].cd_index = -1; | ||
444 | return -EINVAL; | ||
445 | } | ||
446 | 422 | ||
447 | return -ENODEV; | 423 | if (baydev == NULL) |
424 | return; | ||
425 | bay = macio_get_drvdata(baydev); | ||
426 | if (bay == NULL) | ||
427 | return; | ||
428 | mutex_lock(&bay->lock); | ||
429 | bay->user_lock = 1; | ||
448 | } | 430 | } |
449 | EXPORT_SYMBOL_GPL(check_media_bay_by_base); | 431 | EXPORT_SYMBOL_GPL(lock_media_bay); |
450 | 432 | ||
451 | int media_bay_set_ide_infos(struct device_node* which_bay, unsigned long base, | 433 | void unlock_media_bay(struct macio_dev *baydev) |
452 | int irq, ide_hwif_t *hwif) | ||
453 | { | 434 | { |
454 | int i; | 435 | struct media_bay_info* bay; |
455 | 436 | ||
456 | for (i=0; i<media_bay_count; i++) { | 437 | if (baydev == NULL) |
457 | struct media_bay_info* bay = &media_bays[i]; | 438 | return; |
458 | 439 | bay = macio_get_drvdata(baydev); | |
459 | if (bay->mdev && which_bay == bay->mdev->ofdev.node) { | 440 | if (bay == NULL) |
460 | int timeout = 5000, index = hwif->index; | 441 | return; |
461 | 442 | if (bay->user_lock) { | |
462 | mutex_lock(&bay->lock); | 443 | bay->user_lock = 0; |
463 | 444 | mutex_unlock(&bay->lock); | |
464 | bay->cd_port = hwif; | ||
465 | bay->cd_base = (void __iomem *) base; | ||
466 | bay->cd_irq = irq; | ||
467 | |||
468 | if ((MB_CD != bay->content_id) || bay->state != mb_up) { | ||
469 | mutex_unlock(&bay->lock); | ||
470 | return 0; | ||
471 | } | ||
472 | printk(KERN_DEBUG "Registered ide%d for media bay %d\n", index, i); | ||
473 | do { | ||
474 | if (MB_IDE_READY(i)) { | ||
475 | bay->cd_index = index; | ||
476 | mutex_unlock(&bay->lock); | ||
477 | return 0; | ||
478 | } | ||
479 | mdelay(1); | ||
480 | } while(--timeout); | ||
481 | printk(KERN_DEBUG "Timeount waiting IDE in bay %d\n", i); | ||
482 | mutex_unlock(&bay->lock); | ||
483 | return -ENODEV; | ||
484 | } | ||
485 | } | 445 | } |
446 | } | ||
447 | EXPORT_SYMBOL_GPL(unlock_media_bay); | ||
486 | 448 | ||
487 | return -ENODEV; | 449 | static int mb_broadcast_hotplug(struct device *dev, void *data) |
450 | { | ||
451 | struct media_bay_info* bay = data; | ||
452 | struct macio_dev *mdev; | ||
453 | struct macio_driver *drv; | ||
454 | int state; | ||
455 | |||
456 | if (dev->bus != &macio_bus_type) | ||
457 | return 0; | ||
458 | |||
459 | state = bay->state == mb_up ? bay->content_id : MB_NO; | ||
460 | if (state == MB_FD1) | ||
461 | state = MB_FD; | ||
462 | mdev = to_macio_device(dev); | ||
463 | drv = to_macio_driver(dev->driver); | ||
464 | if (dev->driver && drv->mediabay_event) | ||
465 | drv->mediabay_event(mdev, state); | ||
466 | return 0; | ||
488 | } | 467 | } |
489 | EXPORT_SYMBOL_GPL(media_bay_set_ide_infos); | ||
490 | #endif /* CONFIG_BLK_DEV_IDE_PMAC */ | ||
491 | 468 | ||
492 | static void media_bay_step(int i) | 469 | static void media_bay_step(int i) |
493 | { | 470 | { |
@@ -497,8 +474,8 @@ static void media_bay_step(int i) | |||
497 | if (bay->state != mb_powering_down) | 474 | if (bay->state != mb_powering_down) |
498 | poll_media_bay(bay); | 475 | poll_media_bay(bay); |
499 | 476 | ||
500 | /* If timer expired or polling IDE busy, run state machine */ | 477 | /* If timer expired run state machine */ |
501 | if ((bay->state != mb_ide_waiting) && (bay->timer != 0)) { | 478 | if (bay->timer != 0) { |
502 | bay->timer -= msecs_to_jiffies(MB_POLL_DELAY); | 479 | bay->timer -= msecs_to_jiffies(MB_POLL_DELAY); |
503 | if (bay->timer > 0) | 480 | if (bay->timer > 0) |
504 | return; | 481 | return; |
@@ -508,100 +485,50 @@ static void media_bay_step(int i) | |||
508 | switch(bay->state) { | 485 | switch(bay->state) { |
509 | case mb_powering_up: | 486 | case mb_powering_up: |
510 | if (bay->ops->setup_bus(bay, bay->last_value) < 0) { | 487 | if (bay->ops->setup_bus(bay, bay->last_value) < 0) { |
511 | MBDBG("mediabay%d: device not supported (kind:%d)\n", i, bay->content_id); | 488 | pr_debug("mediabay%d: device not supported (kind:%d)\n", |
489 | i, bay->content_id); | ||
512 | set_mb_power(bay, 0); | 490 | set_mb_power(bay, 0); |
513 | break; | 491 | break; |
514 | } | 492 | } |
515 | bay->timer = msecs_to_jiffies(MB_RESET_DELAY); | 493 | bay->timer = msecs_to_jiffies(MB_RESET_DELAY); |
516 | bay->state = mb_enabling_bay; | 494 | bay->state = mb_enabling_bay; |
517 | MBDBG("mediabay%d: enabling (kind:%d)\n", i, bay->content_id); | 495 | pr_debug("mediabay%d: enabling (kind:%d)\n", i, bay->content_id); |
518 | break; | 496 | break; |
519 | case mb_enabling_bay: | 497 | case mb_enabling_bay: |
520 | bay->ops->un_reset(bay); | 498 | bay->ops->un_reset(bay); |
521 | bay->timer = msecs_to_jiffies(MB_SETUP_DELAY); | 499 | bay->timer = msecs_to_jiffies(MB_SETUP_DELAY); |
522 | bay->state = mb_resetting; | 500 | bay->state = mb_resetting; |
523 | MBDBG("mediabay%d: waiting reset (kind:%d)\n", i, bay->content_id); | 501 | pr_debug("mediabay%d: releasing bay reset (kind:%d)\n", |
502 | i, bay->content_id); | ||
524 | break; | 503 | break; |
525 | case mb_resetting: | 504 | case mb_resetting: |
526 | if (bay->content_id != MB_CD) { | 505 | if (bay->content_id != MB_CD) { |
527 | MBDBG("mediabay%d: bay is up (kind:%d)\n", i, bay->content_id); | 506 | pr_debug("mediabay%d: bay is up (kind:%d)\n", i, |
507 | bay->content_id); | ||
528 | bay->state = mb_up; | 508 | bay->state = mb_up; |
509 | device_for_each_child(&bay->mdev->ofdev.dev, | ||
510 | bay, mb_broadcast_hotplug); | ||
529 | break; | 511 | break; |
530 | } | 512 | } |
531 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | 513 | pr_debug("mediabay%d: releasing ATA reset (kind:%d)\n", |
532 | MBDBG("mediabay%d: waiting IDE reset (kind:%d)\n", i, bay->content_id); | 514 | i, bay->content_id); |
533 | bay->ops->un_reset_ide(bay); | 515 | bay->ops->un_reset_ide(bay); |
534 | bay->timer = msecs_to_jiffies(MB_IDE_WAIT); | 516 | bay->timer = msecs_to_jiffies(MB_IDE_WAIT); |
535 | bay->state = mb_ide_resetting; | 517 | bay->state = mb_ide_resetting; |
536 | #else | ||
537 | printk(KERN_DEBUG "media-bay %d is ide (not compiled in kernel)\n", i); | ||
538 | set_mb_power(bay, 0); | ||
539 | #endif /* CONFIG_BLK_DEV_IDE_PMAC */ | ||
540 | break; | 518 | break; |
541 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | 519 | |
542 | case mb_ide_resetting: | 520 | case mb_ide_resetting: |
543 | bay->timer = msecs_to_jiffies(MB_IDE_TIMEOUT); | 521 | pr_debug("mediabay%d: bay is up (kind:%d)\n", i, bay->content_id); |
544 | bay->state = mb_ide_waiting; | 522 | bay->state = mb_up; |
545 | MBDBG("mediabay%d: waiting IDE ready (kind:%d)\n", i, bay->content_id); | 523 | device_for_each_child(&bay->mdev->ofdev.dev, |
524 | bay, mb_broadcast_hotplug); | ||
546 | break; | 525 | break; |
547 | case mb_ide_waiting: | 526 | |
548 | if (bay->cd_base == NULL) { | ||
549 | bay->timer = 0; | ||
550 | bay->state = mb_up; | ||
551 | MBDBG("mediabay%d: up before IDE init\n", i); | ||
552 | break; | ||
553 | } else if (MB_IDE_READY(i)) { | ||
554 | bay->timer = 0; | ||
555 | bay->state = mb_up; | ||
556 | if (bay->cd_index < 0) { | ||
557 | printk("mediabay %d, registering IDE...\n", i); | ||
558 | pmu_suspend(); | ||
559 | ide_port_scan(bay->cd_port); | ||
560 | if (bay->cd_port->present) | ||
561 | bay->cd_index = bay->cd_port->index; | ||
562 | pmu_resume(); | ||
563 | } | ||
564 | if (bay->cd_index == -1) { | ||
565 | /* We eventually do a retry */ | ||
566 | bay->cd_retry++; | ||
567 | printk("IDE register error\n"); | ||
568 | set_mb_power(bay, 0); | ||
569 | } else { | ||
570 | printk(KERN_DEBUG "media-bay %d is ide%d\n", i, bay->cd_index); | ||
571 | MBDBG("mediabay %d IDE ready\n", i); | ||
572 | } | ||
573 | break; | ||
574 | } else if (bay->timer > 0) | ||
575 | bay->timer -= msecs_to_jiffies(MB_POLL_DELAY); | ||
576 | if (bay->timer <= 0) { | ||
577 | printk("\nIDE Timeout in bay %d !, IDE state is: 0x%02x\n", | ||
578 | i, readb(bay->cd_base + 0x70)); | ||
579 | MBDBG("mediabay%d: nIDE Timeout !\n", i); | ||
580 | set_mb_power(bay, 0); | ||
581 | bay->timer = 0; | ||
582 | } | ||
583 | break; | ||
584 | #endif /* CONFIG_BLK_DEV_IDE_PMAC */ | ||
585 | case mb_powering_down: | 527 | case mb_powering_down: |
586 | bay->state = mb_empty; | 528 | bay->state = mb_empty; |
587 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | 529 | device_for_each_child(&bay->mdev->ofdev.dev, |
588 | if (bay->cd_index >= 0) { | 530 | bay, mb_broadcast_hotplug); |
589 | printk(KERN_DEBUG "Unregistering mb %d ide, index:%d\n", i, | 531 | pr_debug("mediabay%d: end of power down\n", i); |
590 | bay->cd_index); | ||
591 | ide_port_unregister_devices(bay->cd_port); | ||
592 | bay->cd_index = -1; | ||
593 | } | ||
594 | if (bay->cd_retry) { | ||
595 | if (bay->cd_retry > MAX_CD_RETRIES) { | ||
596 | /* Should add an error sound (sort of beep in dmasound) */ | ||
597 | printk("\nmedia-bay %d, IDE device badly inserted or unrecognised\n", i); | ||
598 | } else { | ||
599 | /* Force a new power down/up sequence */ | ||
600 | bay->content_id = MB_NO; | ||
601 | } | ||
602 | } | ||
603 | #endif /* CONFIG_BLK_DEV_IDE_PMAC */ | ||
604 | MBDBG("mediabay%d: end of power down\n", i); | ||
605 | break; | 532 | break; |
606 | } | 533 | } |
607 | } | 534 | } |
@@ -676,11 +603,6 @@ static int __devinit media_bay_attach(struct macio_dev *mdev, const struct of_de | |||
676 | bay->last_value = bay->ops->content(bay); | 603 | bay->last_value = bay->ops->content(bay); |
677 | bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY); | 604 | bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY); |
678 | bay->state = mb_empty; | 605 | bay->state = mb_empty; |
679 | do { | ||
680 | msleep(MB_POLL_DELAY); | ||
681 | media_bay_step(i); | ||
682 | } while((bay->state != mb_empty) && | ||
683 | (bay->state != mb_up)); | ||
684 | 606 | ||
685 | /* Mark us ready by filling our mdev data */ | 607 | /* Mark us ready by filling our mdev data */ |
686 | macio_set_drvdata(mdev, bay); | 608 | macio_set_drvdata(mdev, bay); |
@@ -725,7 +647,7 @@ static int media_bay_resume(struct macio_dev *mdev) | |||
725 | set_mb_power(bay, 0); | 647 | set_mb_power(bay, 0); |
726 | msleep(MB_POWER_DELAY); | 648 | msleep(MB_POWER_DELAY); |
727 | if (bay->ops->content(bay) != bay->content_id) { | 649 | if (bay->ops->content(bay) != bay->content_id) { |
728 | printk("mediabay%d: content changed during sleep...\n", bay->index); | 650 | printk("mediabay%d: Content changed during sleep...\n", bay->index); |
729 | mutex_unlock(&bay->lock); | 651 | mutex_unlock(&bay->lock); |
730 | return 0; | 652 | return 0; |
731 | } | 653 | } |
@@ -733,9 +655,6 @@ static int media_bay_resume(struct macio_dev *mdev) | |||
733 | bay->last_value = bay->content_id; | 655 | bay->last_value = bay->content_id; |
734 | bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY); | 656 | bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY); |
735 | bay->timer = msecs_to_jiffies(MB_POWER_DELAY); | 657 | bay->timer = msecs_to_jiffies(MB_POWER_DELAY); |
736 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
737 | bay->cd_retry = 0; | ||
738 | #endif | ||
739 | do { | 658 | do { |
740 | msleep(MB_POLL_DELAY); | 659 | msleep(MB_POLL_DELAY); |
741 | media_bay_step(bay->index); | 660 | media_bay_step(bay->index); |
@@ -823,9 +742,6 @@ static int __init media_bay_init(void) | |||
823 | for (i=0; i<MAX_BAYS; i++) { | 742 | for (i=0; i<MAX_BAYS; i++) { |
824 | memset((char *)&media_bays[i], 0, sizeof(struct media_bay_info)); | 743 | memset((char *)&media_bays[i], 0, sizeof(struct media_bay_info)); |
825 | media_bays[i].content_id = -1; | 744 | media_bays[i].content_id = -1; |
826 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
827 | media_bays[i].cd_index = -1; | ||
828 | #endif | ||
829 | } | 745 | } |
830 | if (!machine_is(powermac)) | 746 | if (!machine_is(powermac)) |
831 | return 0; | 747 | return 0; |
diff --git a/drivers/macintosh/nvram.c b/drivers/macintosh/nvram.c index b195d753d2ed..c876349c32de 100644 --- a/drivers/macintosh/nvram.c +++ b/drivers/macintosh/nvram.c | |||
@@ -13,7 +13,6 @@ | |||
13 | #include <linux/fcntl.h> | 13 | #include <linux/fcntl.h> |
14 | #include <linux/nvram.h> | 14 | #include <linux/nvram.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/smp_lock.h> | ||
17 | #include <asm/uaccess.h> | 16 | #include <asm/uaccess.h> |
18 | #include <asm/nvram.h> | 17 | #include <asm/nvram.h> |
19 | 18 | ||
@@ -21,7 +20,6 @@ | |||
21 | 20 | ||
22 | static loff_t nvram_llseek(struct file *file, loff_t offset, int origin) | 21 | static loff_t nvram_llseek(struct file *file, loff_t offset, int origin) |
23 | { | 22 | { |
24 | lock_kernel(); | ||
25 | switch (origin) { | 23 | switch (origin) { |
26 | case 1: | 24 | case 1: |
27 | offset += file->f_pos; | 25 | offset += file->f_pos; |
@@ -30,12 +28,10 @@ static loff_t nvram_llseek(struct file *file, loff_t offset, int origin) | |||
30 | offset += NVRAM_SIZE; | 28 | offset += NVRAM_SIZE; |
31 | break; | 29 | break; |
32 | } | 30 | } |
33 | if (offset < 0) { | 31 | if (offset < 0) |
34 | unlock_kernel(); | ||
35 | return -EINVAL; | 32 | return -EINVAL; |
36 | } | 33 | |
37 | file->f_pos = offset; | 34 | file->f_pos = offset; |
38 | unlock_kernel(); | ||
39 | return file->f_pos; | 35 | return file->f_pos; |
40 | } | 36 | } |
41 | 37 | ||
@@ -76,8 +72,7 @@ static ssize_t write_nvram(struct file *file, const char __user *buf, | |||
76 | return p - buf; | 72 | return p - buf; |
77 | } | 73 | } |
78 | 74 | ||
79 | static int nvram_ioctl(struct inode *inode, struct file *file, | 75 | static long nvram_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
80 | unsigned int cmd, unsigned long arg) | ||
81 | { | 76 | { |
82 | switch(cmd) { | 77 | switch(cmd) { |
83 | case PMAC_NVRAM_GET_OFFSET: | 78 | case PMAC_NVRAM_GET_OFFSET: |
diff --git a/drivers/macintosh/therm_adt746x.c b/drivers/macintosh/therm_adt746x.c index 556f0feaa4df..5ff47ba7f2d0 100644 --- a/drivers/macintosh/therm_adt746x.c +++ b/drivers/macintosh/therm_adt746x.c | |||
@@ -79,6 +79,7 @@ struct thermostat { | |||
79 | u8 limits[3]; | 79 | u8 limits[3]; |
80 | int last_speed[2]; | 80 | int last_speed[2]; |
81 | int last_var[2]; | 81 | int last_var[2]; |
82 | int pwm_inv[2]; | ||
82 | }; | 83 | }; |
83 | 84 | ||
84 | static enum {ADT7460, ADT7467} therm_type; | 85 | static enum {ADT7460, ADT7467} therm_type; |
@@ -229,19 +230,23 @@ static void write_fan_speed(struct thermostat *th, int speed, int fan) | |||
229 | 230 | ||
230 | if (speed >= 0) { | 231 | if (speed >= 0) { |
231 | manual = read_reg(th, MANUAL_MODE[fan]); | 232 | manual = read_reg(th, MANUAL_MODE[fan]); |
233 | manual &= ~INVERT_MASK; | ||
232 | write_reg(th, MANUAL_MODE[fan], | 234 | write_reg(th, MANUAL_MODE[fan], |
233 | (manual|MANUAL_MASK) & (~INVERT_MASK)); | 235 | manual | MANUAL_MASK | th->pwm_inv[fan]); |
234 | write_reg(th, FAN_SPD_SET[fan], speed); | 236 | write_reg(th, FAN_SPD_SET[fan], speed); |
235 | } else { | 237 | } else { |
236 | /* back to automatic */ | 238 | /* back to automatic */ |
237 | if(therm_type == ADT7460) { | 239 | if(therm_type == ADT7460) { |
238 | manual = read_reg(th, | 240 | manual = read_reg(th, |
239 | MANUAL_MODE[fan]) & (~MANUAL_MASK); | 241 | MANUAL_MODE[fan]) & (~MANUAL_MASK); |
240 | 242 | manual &= ~INVERT_MASK; | |
243 | manual |= th->pwm_inv[fan]; | ||
241 | write_reg(th, | 244 | write_reg(th, |
242 | MANUAL_MODE[fan], manual|REM_CONTROL[fan]); | 245 | MANUAL_MODE[fan], manual|REM_CONTROL[fan]); |
243 | } else { | 246 | } else { |
244 | manual = read_reg(th, MANUAL_MODE[fan]); | 247 | manual = read_reg(th, MANUAL_MODE[fan]); |
248 | manual &= ~INVERT_MASK; | ||
249 | manual |= th->pwm_inv[fan]; | ||
245 | write_reg(th, MANUAL_MODE[fan], manual&(~AUTO_MASK)); | 250 | write_reg(th, MANUAL_MODE[fan], manual&(~AUTO_MASK)); |
246 | } | 251 | } |
247 | } | 252 | } |
@@ -387,7 +392,7 @@ static int probe_thermostat(struct i2c_client *client, | |||
387 | i2c_set_clientdata(client, th); | 392 | i2c_set_clientdata(client, th); |
388 | th->clt = client; | 393 | th->clt = client; |
389 | 394 | ||
390 | rc = read_reg(th, 0); | 395 | rc = read_reg(th, CONFIG_REG); |
391 | if (rc < 0) { | 396 | if (rc < 0) { |
392 | dev_err(&client->dev, "Thermostat failed to read config!\n"); | 397 | dev_err(&client->dev, "Thermostat failed to read config!\n"); |
393 | kfree(th); | 398 | kfree(th); |
@@ -418,6 +423,10 @@ static int probe_thermostat(struct i2c_client *client, | |||
418 | 423 | ||
419 | thermostat = th; | 424 | thermostat = th; |
420 | 425 | ||
426 | /* record invert bit status because fw can corrupt it after suspend */ | ||
427 | th->pwm_inv[0] = read_reg(th, MANUAL_MODE[0]) & INVERT_MASK; | ||
428 | th->pwm_inv[1] = read_reg(th, MANUAL_MODE[1]) & INVERT_MASK; | ||
429 | |||
421 | /* be sure to really write fan speed the first time */ | 430 | /* be sure to really write fan speed the first time */ |
422 | th->last_speed[0] = -2; | 431 | th->last_speed[0] = -2; |
423 | th->last_speed[1] = -2; | 432 | th->last_speed[1] = -2; |
diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c index 6f308a4757ee..db379c381432 100644 --- a/drivers/macintosh/via-pmu.c +++ b/drivers/macintosh/via-pmu.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/spinlock.h> | 36 | #include <linux/spinlock.h> |
37 | #include <linux/pm.h> | 37 | #include <linux/pm.h> |
38 | #include <linux/proc_fs.h> | 38 | #include <linux/proc_fs.h> |
39 | #include <linux/seq_file.h> | ||
39 | #include <linux/init.h> | 40 | #include <linux/init.h> |
40 | #include <linux/interrupt.h> | 41 | #include <linux/interrupt.h> |
41 | #include <linux/device.h> | 42 | #include <linux/device.h> |
@@ -186,17 +187,11 @@ static int init_pmu(void); | |||
186 | static void pmu_start(void); | 187 | static void pmu_start(void); |
187 | static irqreturn_t via_pmu_interrupt(int irq, void *arg); | 188 | static irqreturn_t via_pmu_interrupt(int irq, void *arg); |
188 | static irqreturn_t gpio1_interrupt(int irq, void *arg); | 189 | static irqreturn_t gpio1_interrupt(int irq, void *arg); |
189 | static int proc_get_info(char *page, char **start, off_t off, | 190 | static const struct file_operations pmu_info_proc_fops; |
190 | int count, int *eof, void *data); | 191 | static const struct file_operations pmu_irqstats_proc_fops; |
191 | static int proc_get_irqstats(char *page, char **start, off_t off, | ||
192 | int count, int *eof, void *data); | ||
193 | static void pmu_pass_intr(unsigned char *data, int len); | 192 | static void pmu_pass_intr(unsigned char *data, int len); |
194 | static int proc_get_batt(char *page, char **start, off_t off, | 193 | static const struct file_operations pmu_battery_proc_fops; |
195 | int count, int *eof, void *data); | 194 | static const struct file_operations pmu_options_proc_fops; |
196 | static int proc_read_options(char *page, char **start, off_t off, | ||
197 | int count, int *eof, void *data); | ||
198 | static int proc_write_options(struct file *file, const char __user *buffer, | ||
199 | unsigned long count, void *data); | ||
200 | 195 | ||
201 | #ifdef CONFIG_ADB | 196 | #ifdef CONFIG_ADB |
202 | struct adb_driver via_pmu_driver = { | 197 | struct adb_driver via_pmu_driver = { |
@@ -507,19 +502,15 @@ static int __init via_pmu_dev_init(void) | |||
507 | for (i=0; i<pmu_battery_count; i++) { | 502 | for (i=0; i<pmu_battery_count; i++) { |
508 | char title[16]; | 503 | char title[16]; |
509 | sprintf(title, "battery_%ld", i); | 504 | sprintf(title, "battery_%ld", i); |
510 | proc_pmu_batt[i] = create_proc_read_entry(title, 0, proc_pmu_root, | 505 | proc_pmu_batt[i] = proc_create_data(title, 0, proc_pmu_root, |
511 | proc_get_batt, (void *)i); | 506 | &pmu_battery_proc_fops, (void *)i); |
512 | } | 507 | } |
513 | 508 | ||
514 | proc_pmu_info = create_proc_read_entry("info", 0, proc_pmu_root, | 509 | proc_pmu_info = proc_create("info", 0, proc_pmu_root, &pmu_info_proc_fops); |
515 | proc_get_info, NULL); | 510 | proc_pmu_irqstats = proc_create("interrupts", 0, proc_pmu_root, |
516 | proc_pmu_irqstats = create_proc_read_entry("interrupts", 0, proc_pmu_root, | 511 | &pmu_irqstats_proc_fops); |
517 | proc_get_irqstats, NULL); | 512 | proc_pmu_options = proc_create("options", 0600, proc_pmu_root, |
518 | proc_pmu_options = create_proc_entry("options", 0600, proc_pmu_root); | 513 | &pmu_options_proc_fops); |
519 | if (proc_pmu_options) { | ||
520 | proc_pmu_options->read_proc = proc_read_options; | ||
521 | proc_pmu_options->write_proc = proc_write_options; | ||
522 | } | ||
523 | } | 514 | } |
524 | return 0; | 515 | return 0; |
525 | } | 516 | } |
@@ -799,27 +790,33 @@ query_battery_state(void) | |||
799 | 2, PMU_SMART_BATTERY_STATE, pmu_cur_battery+1); | 790 | 2, PMU_SMART_BATTERY_STATE, pmu_cur_battery+1); |
800 | } | 791 | } |
801 | 792 | ||
802 | static int | 793 | static int pmu_info_proc_show(struct seq_file *m, void *v) |
803 | proc_get_info(char *page, char **start, off_t off, | ||
804 | int count, int *eof, void *data) | ||
805 | { | 794 | { |
806 | char* p = page; | 795 | seq_printf(m, "PMU driver version : %d\n", PMU_DRIVER_VERSION); |
807 | 796 | seq_printf(m, "PMU firmware version : %02x\n", pmu_version); | |
808 | p += sprintf(p, "PMU driver version : %d\n", PMU_DRIVER_VERSION); | 797 | seq_printf(m, "AC Power : %d\n", |
809 | p += sprintf(p, "PMU firmware version : %02x\n", pmu_version); | ||
810 | p += sprintf(p, "AC Power : %d\n", | ||
811 | ((pmu_power_flags & PMU_PWR_AC_PRESENT) != 0) || pmu_battery_count == 0); | 798 | ((pmu_power_flags & PMU_PWR_AC_PRESENT) != 0) || pmu_battery_count == 0); |
812 | p += sprintf(p, "Battery count : %d\n", pmu_battery_count); | 799 | seq_printf(m, "Battery count : %d\n", pmu_battery_count); |
800 | |||
801 | return 0; | ||
802 | } | ||
813 | 803 | ||
814 | return p - page; | 804 | static int pmu_info_proc_open(struct inode *inode, struct file *file) |
805 | { | ||
806 | return single_open(file, pmu_info_proc_show, NULL); | ||
815 | } | 807 | } |
816 | 808 | ||
817 | static int | 809 | static const struct file_operations pmu_info_proc_fops = { |
818 | proc_get_irqstats(char *page, char **start, off_t off, | 810 | .owner = THIS_MODULE, |
819 | int count, int *eof, void *data) | 811 | .open = pmu_info_proc_open, |
812 | .read = seq_read, | ||
813 | .llseek = seq_lseek, | ||
814 | .release = single_release, | ||
815 | }; | ||
816 | |||
817 | static int pmu_irqstats_proc_show(struct seq_file *m, void *v) | ||
820 | { | 818 | { |
821 | int i; | 819 | int i; |
822 | char* p = page; | ||
823 | static const char *irq_names[] = { | 820 | static const char *irq_names[] = { |
824 | "Total CB1 triggered events", | 821 | "Total CB1 triggered events", |
825 | "Total GPIO1 triggered events", | 822 | "Total GPIO1 triggered events", |
@@ -835,60 +832,76 @@ proc_get_irqstats(char *page, char **start, off_t off, | |||
835 | }; | 832 | }; |
836 | 833 | ||
837 | for (i=0; i<11; i++) { | 834 | for (i=0; i<11; i++) { |
838 | p += sprintf(p, " %2u: %10u (%s)\n", | 835 | seq_printf(m, " %2u: %10u (%s)\n", |
839 | i, pmu_irq_stats[i], irq_names[i]); | 836 | i, pmu_irq_stats[i], irq_names[i]); |
840 | } | 837 | } |
841 | return p - page; | 838 | return 0; |
842 | } | 839 | } |
843 | 840 | ||
844 | static int | 841 | static int pmu_irqstats_proc_open(struct inode *inode, struct file *file) |
845 | proc_get_batt(char *page, char **start, off_t off, | ||
846 | int count, int *eof, void *data) | ||
847 | { | 842 | { |
848 | long batnum = (long)data; | 843 | return single_open(file, pmu_irqstats_proc_show, NULL); |
849 | char *p = page; | 844 | } |
845 | |||
846 | static const struct file_operations pmu_irqstats_proc_fops = { | ||
847 | .owner = THIS_MODULE, | ||
848 | .open = pmu_irqstats_proc_open, | ||
849 | .read = seq_read, | ||
850 | .llseek = seq_lseek, | ||
851 | .release = single_release, | ||
852 | }; | ||
853 | |||
854 | static int pmu_battery_proc_show(struct seq_file *m, void *v) | ||
855 | { | ||
856 | long batnum = (long)m->private; | ||
850 | 857 | ||
851 | p += sprintf(p, "\n"); | 858 | seq_putc(m, '\n'); |
852 | p += sprintf(p, "flags : %08x\n", | 859 | seq_printf(m, "flags : %08x\n", pmu_batteries[batnum].flags); |
853 | pmu_batteries[batnum].flags); | 860 | seq_printf(m, "charge : %d\n", pmu_batteries[batnum].charge); |
854 | p += sprintf(p, "charge : %d\n", | 861 | seq_printf(m, "max_charge : %d\n", pmu_batteries[batnum].max_charge); |
855 | pmu_batteries[batnum].charge); | 862 | seq_printf(m, "current : %d\n", pmu_batteries[batnum].amperage); |
856 | p += sprintf(p, "max_charge : %d\n", | 863 | seq_printf(m, "voltage : %d\n", pmu_batteries[batnum].voltage); |
857 | pmu_batteries[batnum].max_charge); | 864 | seq_printf(m, "time rem. : %d\n", pmu_batteries[batnum].time_remaining); |
858 | p += sprintf(p, "current : %d\n", | 865 | return 0; |
859 | pmu_batteries[batnum].amperage); | ||
860 | p += sprintf(p, "voltage : %d\n", | ||
861 | pmu_batteries[batnum].voltage); | ||
862 | p += sprintf(p, "time rem. : %d\n", | ||
863 | pmu_batteries[batnum].time_remaining); | ||
864 | |||
865 | return p - page; | ||
866 | } | 866 | } |
867 | 867 | ||
868 | static int | 868 | static int pmu_battery_proc_open(struct inode *inode, struct file *file) |
869 | proc_read_options(char *page, char **start, off_t off, | ||
870 | int count, int *eof, void *data) | ||
871 | { | 869 | { |
872 | char *p = page; | 870 | return single_open(file, pmu_battery_proc_show, PDE(inode)->data); |
871 | } | ||
873 | 872 | ||
873 | static const struct file_operations pmu_battery_proc_fops = { | ||
874 | .owner = THIS_MODULE, | ||
875 | .open = pmu_battery_proc_open, | ||
876 | .read = seq_read, | ||
877 | .llseek = seq_lseek, | ||
878 | .release = single_release, | ||
879 | }; | ||
880 | |||
881 | static int pmu_options_proc_show(struct seq_file *m, void *v) | ||
882 | { | ||
874 | #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32) | 883 | #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32) |
875 | if (pmu_kind == PMU_KEYLARGO_BASED && | 884 | if (pmu_kind == PMU_KEYLARGO_BASED && |
876 | pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0) | 885 | pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0) |
877 | p += sprintf(p, "lid_wakeup=%d\n", option_lid_wakeup); | 886 | seq_printf(m, "lid_wakeup=%d\n", option_lid_wakeup); |
878 | #endif | 887 | #endif |
879 | if (pmu_kind == PMU_KEYLARGO_BASED) | 888 | if (pmu_kind == PMU_KEYLARGO_BASED) |
880 | p += sprintf(p, "server_mode=%d\n", option_server_mode); | 889 | seq_printf(m, "server_mode=%d\n", option_server_mode); |
881 | 890 | ||
882 | return p - page; | 891 | return 0; |
883 | } | 892 | } |
884 | 893 | ||
885 | static int | 894 | static int pmu_options_proc_open(struct inode *inode, struct file *file) |
886 | proc_write_options(struct file *file, const char __user *buffer, | 895 | { |
887 | unsigned long count, void *data) | 896 | return single_open(file, pmu_options_proc_show, NULL); |
897 | } | ||
898 | |||
899 | static ssize_t pmu_options_proc_write(struct file *file, | ||
900 | const char __user *buffer, size_t count, loff_t *pos) | ||
888 | { | 901 | { |
889 | char tmp[33]; | 902 | char tmp[33]; |
890 | char *label, *val; | 903 | char *label, *val; |
891 | unsigned long fcount = count; | 904 | size_t fcount = count; |
892 | 905 | ||
893 | if (!count) | 906 | if (!count) |
894 | return -EINVAL; | 907 | return -EINVAL; |
@@ -927,6 +940,15 @@ proc_write_options(struct file *file, const char __user *buffer, | |||
927 | return fcount; | 940 | return fcount; |
928 | } | 941 | } |
929 | 942 | ||
943 | static const struct file_operations pmu_options_proc_fops = { | ||
944 | .owner = THIS_MODULE, | ||
945 | .open = pmu_options_proc_open, | ||
946 | .read = seq_read, | ||
947 | .llseek = seq_lseek, | ||
948 | .release = single_release, | ||
949 | .write = pmu_options_proc_write, | ||
950 | }; | ||
951 | |||
930 | #ifdef CONFIG_ADB | 952 | #ifdef CONFIG_ADB |
931 | /* Send an ADB command */ | 953 | /* Send an ADB command */ |
932 | static int pmu_send_request(struct adb_request *req, int sync) | 954 | static int pmu_send_request(struct adb_request *req, int sync) |
diff --git a/drivers/macintosh/windfarm_smu_controls.c b/drivers/macintosh/windfarm_smu_controls.c index 961fa0e7c2cf..6c68b9e5f5c4 100644 --- a/drivers/macintosh/windfarm_smu_controls.c +++ b/drivers/macintosh/windfarm_smu_controls.c | |||
@@ -202,6 +202,8 @@ static struct smu_fan_control *smu_fan_create(struct device_node *node, | |||
202 | fct->ctrl.name = "cpu-front-fan-1"; | 202 | fct->ctrl.name = "cpu-front-fan-1"; |
203 | else if (!strcmp(l, "CPU A PUMP")) | 203 | else if (!strcmp(l, "CPU A PUMP")) |
204 | fct->ctrl.name = "cpu-pump-0"; | 204 | fct->ctrl.name = "cpu-pump-0"; |
205 | else if (!strcmp(l, "CPU B PUMP")) | ||
206 | fct->ctrl.name = "cpu-pump-1"; | ||
205 | else if (!strcmp(l, "Slots Fan") || !strcmp(l, "Slots fan") || | 207 | else if (!strcmp(l, "Slots Fan") || !strcmp(l, "Slots fan") || |
206 | !strcmp(l, "EXPANSION SLOTS INTAKE")) | 208 | !strcmp(l, "EXPANSION SLOTS INTAKE")) |
207 | fct->ctrl.name = "slots-fan"; | 209 | fct->ctrl.name = "slots-fan"; |