diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-12 00:55:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-12 00:55:47 -0400 |
commit | e86908614f2c7fec401827e5cefd7a6ea9407f85 (patch) | |
tree | fcb5d9e52422b37bdaf0e647126ebdfc1680f162 /drivers/char | |
parent | 547307420931344a868275bd7ea7a30f117a15a9 (diff) | |
parent | 9b4b8feb962f4b3e74768b7205f1f8f6cce87238 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (408 commits)
[POWERPC] Add memchr() to the bootwrapper
[POWERPC] Implement logging of unhandled signals
[POWERPC] Add legacy serial support for OPB with flattened device tree
[POWERPC] Use 1TB segments
[POWERPC] XilinxFB: Allow fixed framebuffer base address
[POWERPC] XilinxFB: Add support for custom screen resolution
[POWERPC] XilinxFB: Use pdata to pass around framebuffer parameters
[POWERPC] PCI: Add 64-bit physical address support to setup_indirect_pci
[POWERPC] 4xx: Kilauea defconfig file
[POWERPC] 4xx: Kilauea DTS
[POWERPC] 4xx: Add AMCC Kilauea eval board support to platforms/40x
[POWERPC] 4xx: Add AMCC 405EX support to cputable.c
[POWERPC] Adjust TASK_SIZE on ppc32 systems to 3GB that are capable
[POWERPC] Use PAGE_OFFSET to tell if an address is user/kernel in SW TLB handlers
[POWERPC] 85xx: Enable FP emulation in MPC8560 ADS defconfig
[POWERPC] 85xx: Killed <asm/mpc85xx.h>
[POWERPC] 85xx: Add cpm nodes for 8541/8555 CDS
[POWERPC] 85xx: Convert mpc8560ads to the new CPM binding.
[POWERPC] mpc8272ads: Remove muram from the CPM reg property.
[POWERPC] Make clockevents work on PPC601 processors
...
Fixed up conflict in Documentation/powerpc/booting-without-of.txt manually.
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/hvc_beat.c | 4 | ||||
-rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 6 | ||||
-rw-r--r-- | drivers/char/viotape.c | 125 |
3 files changed, 23 insertions, 112 deletions
diff --git a/drivers/char/hvc_beat.c b/drivers/char/hvc_beat.c index 6f019f19be71..e74bb949c289 100644 --- a/drivers/char/hvc_beat.c +++ b/drivers/char/hvc_beat.c | |||
@@ -97,7 +97,7 @@ static int hvc_beat_config(char *p) | |||
97 | return 0; | 97 | return 0; |
98 | } | 98 | } |
99 | 99 | ||
100 | static int hvc_beat_console_init(void) | 100 | static int __init hvc_beat_console_init(void) |
101 | { | 101 | { |
102 | if (hvc_beat_useit && machine_is_compatible("Beat")) { | 102 | if (hvc_beat_useit && machine_is_compatible("Beat")) { |
103 | hvc_instantiate(0, 0, &hvc_beat_get_put_ops); | 103 | hvc_instantiate(0, 0, &hvc_beat_get_put_ops); |
@@ -106,7 +106,7 @@ static int hvc_beat_console_init(void) | |||
106 | } | 106 | } |
107 | 107 | ||
108 | /* temp */ | 108 | /* temp */ |
109 | static int hvc_beat_init(void) | 109 | static int __init hvc_beat_init(void) |
110 | { | 110 | { |
111 | struct hvc_struct *hp; | 111 | struct hvc_struct *hp; |
112 | 112 | ||
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 7901d5f218ec..a2894d425153 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -2253,19 +2253,19 @@ static int __devinit ipmi_of_probe(struct of_device *dev, | |||
2253 | return ret; | 2253 | return ret; |
2254 | } | 2254 | } |
2255 | 2255 | ||
2256 | regsize = get_property(np, "reg-size", &proplen); | 2256 | regsize = of_get_property(np, "reg-size", &proplen); |
2257 | if (regsize && proplen != 4) { | 2257 | if (regsize && proplen != 4) { |
2258 | dev_warn(&dev->dev, PFX "invalid regsize from OF\n"); | 2258 | dev_warn(&dev->dev, PFX "invalid regsize from OF\n"); |
2259 | return -EINVAL; | 2259 | return -EINVAL; |
2260 | } | 2260 | } |
2261 | 2261 | ||
2262 | regspacing = get_property(np, "reg-spacing", &proplen); | 2262 | regspacing = of_get_property(np, "reg-spacing", &proplen); |
2263 | if (regspacing && proplen != 4) { | 2263 | if (regspacing && proplen != 4) { |
2264 | dev_warn(&dev->dev, PFX "invalid regspacing from OF\n"); | 2264 | dev_warn(&dev->dev, PFX "invalid regspacing from OF\n"); |
2265 | return -EINVAL; | 2265 | return -EINVAL; |
2266 | } | 2266 | } |
2267 | 2267 | ||
2268 | regshift = get_property(np, "reg-shift", &proplen); | 2268 | regshift = of_get_property(np, "reg-shift", &proplen); |
2269 | if (regshift && proplen != 4) { | 2269 | if (regshift && proplen != 4) { |
2270 | dev_warn(&dev->dev, PFX "invalid regshift from OF\n"); | 2270 | dev_warn(&dev->dev, PFX "invalid regshift from OF\n"); |
2271 | return -EINVAL; | 2271 | return -EINVAL; |
diff --git a/drivers/char/viotape.c b/drivers/char/viotape.c index e12275df6ea2..f1d60f0cef8f 100644 --- a/drivers/char/viotape.c +++ b/drivers/char/viotape.c | |||
@@ -92,47 +92,6 @@ struct viot_devinfo_struct { | |||
92 | #define VIOTAPOP_SETPART 14 | 92 | #define VIOTAPOP_SETPART 14 |
93 | #define VIOTAPOP_UNLOAD 15 | 93 | #define VIOTAPOP_UNLOAD 15 |
94 | 94 | ||
95 | struct viotapelpevent { | ||
96 | struct HvLpEvent event; | ||
97 | u32 reserved; | ||
98 | u16 version; | ||
99 | u16 sub_type_result; | ||
100 | u16 tape; | ||
101 | u16 flags; | ||
102 | u32 token; | ||
103 | u64 len; | ||
104 | union { | ||
105 | struct { | ||
106 | u32 tape_op; | ||
107 | u32 count; | ||
108 | } op; | ||
109 | struct { | ||
110 | u32 type; | ||
111 | u32 resid; | ||
112 | u32 dsreg; | ||
113 | u32 gstat; | ||
114 | u32 erreg; | ||
115 | u32 file_no; | ||
116 | u32 block_no; | ||
117 | } get_status; | ||
118 | struct { | ||
119 | u32 block_no; | ||
120 | } get_pos; | ||
121 | } u; | ||
122 | }; | ||
123 | |||
124 | enum viotapesubtype { | ||
125 | viotapeopen = 0x0001, | ||
126 | viotapeclose = 0x0002, | ||
127 | viotaperead = 0x0003, | ||
128 | viotapewrite = 0x0004, | ||
129 | viotapegetinfo = 0x0005, | ||
130 | viotapeop = 0x0006, | ||
131 | viotapegetpos = 0x0007, | ||
132 | viotapesetpos = 0x0008, | ||
133 | viotapegetstatus = 0x0009 | ||
134 | }; | ||
135 | |||
136 | enum viotaperc { | 95 | enum viotaperc { |
137 | viotape_InvalidRange = 0x0601, | 96 | viotape_InvalidRange = 0x0601, |
138 | viotape_InvalidToken = 0x0602, | 97 | viotape_InvalidToken = 0x0602, |
@@ -223,14 +182,11 @@ static const struct vio_error_entry viotape_err_table[] = { | |||
223 | #define VIOT_WRITING 2 | 182 | #define VIOT_WRITING 2 |
224 | 183 | ||
225 | /* Our info on the tapes */ | 184 | /* Our info on the tapes */ |
226 | struct tape_descr { | 185 | static struct { |
227 | char rsrcname[10]; | 186 | const char *rsrcname; |
228 | char type[4]; | 187 | const char *type; |
229 | char model[3]; | 188 | const char *model; |
230 | }; | 189 | } viotape_unitinfo[VIOTAPE_MAX_TAPE]; |
231 | |||
232 | static struct tape_descr *viotape_unitinfo; | ||
233 | static dma_addr_t viotape_unitinfo_token; | ||
234 | 190 | ||
235 | static struct mtget viomtget[VIOTAPE_MAX_TAPE]; | 191 | static struct mtget viomtget[VIOTAPE_MAX_TAPE]; |
236 | 192 | ||
@@ -381,53 +337,6 @@ int tape_rc_to_errno(int tape_rc, char *operation, int tapeno) | |||
381 | return -err->errno; | 337 | return -err->errno; |
382 | } | 338 | } |
383 | 339 | ||
384 | /* Get info on all tapes from OS/400 */ | ||
385 | static int get_viotape_info(void) | ||
386 | { | ||
387 | HvLpEvent_Rc hvrc; | ||
388 | int i; | ||
389 | size_t len = sizeof(*viotape_unitinfo) * VIOTAPE_MAX_TAPE; | ||
390 | struct op_struct *op = get_op_struct(); | ||
391 | |||
392 | if (op == NULL) | ||
393 | return -ENOMEM; | ||
394 | |||
395 | viotape_unitinfo = dma_alloc_coherent(iSeries_vio_dev, len, | ||
396 | &viotape_unitinfo_token, GFP_ATOMIC); | ||
397 | if (viotape_unitinfo == NULL) { | ||
398 | free_op_struct(op); | ||
399 | return -ENOMEM; | ||
400 | } | ||
401 | |||
402 | memset(viotape_unitinfo, 0, len); | ||
403 | |||
404 | hvrc = HvCallEvent_signalLpEventFast(viopath_hostLp, | ||
405 | HvLpEvent_Type_VirtualIo, | ||
406 | viomajorsubtype_tape | viotapegetinfo, | ||
407 | HvLpEvent_AckInd_DoAck, HvLpEvent_AckType_ImmediateAck, | ||
408 | viopath_sourceinst(viopath_hostLp), | ||
409 | viopath_targetinst(viopath_hostLp), | ||
410 | (u64) (unsigned long) op, VIOVERSION << 16, | ||
411 | viotape_unitinfo_token, len, 0, 0); | ||
412 | if (hvrc != HvLpEvent_Rc_Good) { | ||
413 | printk(VIOTAPE_KERN_WARN "hv error on op %d\n", | ||
414 | (int)hvrc); | ||
415 | free_op_struct(op); | ||
416 | return -EIO; | ||
417 | } | ||
418 | |||
419 | wait_for_completion(&op->com); | ||
420 | |||
421 | free_op_struct(op); | ||
422 | |||
423 | for (i = 0; | ||
424 | ((i < VIOTAPE_MAX_TAPE) && (viotape_unitinfo[i].rsrcname[0])); | ||
425 | i++) | ||
426 | viotape_numdev++; | ||
427 | return 0; | ||
428 | } | ||
429 | |||
430 | |||
431 | /* Write */ | 340 | /* Write */ |
432 | static ssize_t viotap_write(struct file *file, const char *buf, | 341 | static ssize_t viotap_write(struct file *file, const char *buf, |
433 | size_t count, loff_t * ppos) | 342 | size_t count, loff_t * ppos) |
@@ -899,7 +808,6 @@ static void vioHandleTapeEvent(struct HvLpEvent *event) | |||
899 | tapeminor = event->xSubtype & VIOMINOR_SUBTYPE_MASK; | 808 | tapeminor = event->xSubtype & VIOMINOR_SUBTYPE_MASK; |
900 | op = (struct op_struct *)event->xCorrelationToken; | 809 | op = (struct op_struct *)event->xCorrelationToken; |
901 | switch (tapeminor) { | 810 | switch (tapeminor) { |
902 | case viotapegetinfo: | ||
903 | case viotapeopen: | 811 | case viotapeopen: |
904 | case viotapeclose: | 812 | case viotapeclose: |
905 | op->rc = tevent->sub_type_result; | 813 | op->rc = tevent->sub_type_result; |
@@ -942,11 +850,23 @@ static int viotape_probe(struct vio_dev *vdev, const struct vio_device_id *id) | |||
942 | { | 850 | { |
943 | int i = vdev->unit_address; | 851 | int i = vdev->unit_address; |
944 | int j; | 852 | int j; |
853 | struct device_node *node = vdev->dev.archdata.of_node; | ||
945 | 854 | ||
946 | if (i >= viotape_numdev) | 855 | if (i > VIOTAPE_MAX_TAPE) |
856 | return -ENODEV; | ||
857 | if (!node) | ||
947 | return -ENODEV; | 858 | return -ENODEV; |
948 | 859 | ||
860 | if (i >= viotape_numdev) | ||
861 | viotape_numdev = i + 1; | ||
862 | |||
949 | tape_device[i] = &vdev->dev; | 863 | tape_device[i] = &vdev->dev; |
864 | viotape_unitinfo[i].rsrcname = of_get_property(node, | ||
865 | "linux,vio_rsrcname", NULL); | ||
866 | viotape_unitinfo[i].type = of_get_property(node, "linux,vio_type", | ||
867 | NULL); | ||
868 | viotape_unitinfo[i].model = of_get_property(node, "linux,vio_model", | ||
869 | NULL); | ||
950 | 870 | ||
951 | state[i].cur_part = 0; | 871 | state[i].cur_part = 0; |
952 | for (j = 0; j < MAX_PARTITIONS; ++j) | 872 | for (j = 0; j < MAX_PARTITIONS; ++j) |
@@ -1044,11 +964,6 @@ int __init viotap_init(void) | |||
1044 | goto unreg_chrdev; | 964 | goto unreg_chrdev; |
1045 | } | 965 | } |
1046 | 966 | ||
1047 | if ((ret = get_viotape_info()) < 0) { | ||
1048 | printk(VIOTAPE_KERN_WARN "Unable to obtain virtual device information"); | ||
1049 | goto unreg_class; | ||
1050 | } | ||
1051 | |||
1052 | ret = vio_register_driver(&viotape_driver); | 967 | ret = vio_register_driver(&viotape_driver); |
1053 | if (ret) | 968 | if (ret) |
1054 | goto unreg_class; | 969 | goto unreg_class; |
@@ -1102,10 +1017,6 @@ static void __exit viotap_exit(void) | |||
1102 | vio_unregister_driver(&viotape_driver); | 1017 | vio_unregister_driver(&viotape_driver); |
1103 | class_destroy(tape_class); | 1018 | class_destroy(tape_class); |
1104 | unregister_chrdev(VIOTAPE_MAJOR, "viotape"); | 1019 | unregister_chrdev(VIOTAPE_MAJOR, "viotape"); |
1105 | if (viotape_unitinfo) | ||
1106 | dma_free_coherent(iSeries_vio_dev, | ||
1107 | sizeof(viotape_unitinfo[0]) * VIOTAPE_MAX_TAPE, | ||
1108 | viotape_unitinfo, viotape_unitinfo_token); | ||
1109 | viopath_close(viopath_hostLp, viomajorsubtype_tape, VIOTAPE_MAXREQ + 2); | 1020 | viopath_close(viopath_hostLp, viomajorsubtype_tape, VIOTAPE_MAXREQ + 2); |
1110 | vio_clearHandler(viomajorsubtype_tape); | 1021 | vio_clearHandler(viomajorsubtype_tape); |
1111 | clear_op_struct_pool(); | 1022 | clear_op_struct_pool(); |