Merge branch 'for-linus' of ssh://master.kernel.org/pub/scm/linux/kernel/git/ieee1394...
[pandora-kernel.git] / arch / powerpc / kernel / lparcfg.c
index 3ce3a2d..89486b6 100644 (file)
@@ -182,8 +182,14 @@ static unsigned int h_get_ppp(unsigned long *entitled,
                              unsigned long *resource)
 {
        unsigned long rc;
-       rc = plpar_hcall_4out(H_GET_PPP, 0, 0, 0, 0, entitled, unallocated,
-                             aggregation, resource);
+       unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+
+       rc = plpar_hcall(H_GET_PPP, retbuf);
+
+       *entitled = retbuf[0];
+       *unallocated = retbuf[1];
+       *aggregation = retbuf[2];
+       *resource = retbuf[3];
 
        log_plpar_hcall_return(rc, "H_GET_PPP");
 
@@ -193,8 +199,12 @@ static unsigned int h_get_ppp(unsigned long *entitled,
 static void h_pic(unsigned long *pool_idle_time, unsigned long *num_procs)
 {
        unsigned long rc;
-       unsigned long dummy;
-       rc = plpar_hcall(H_PIC, 0, 0, 0, 0, pool_idle_time, num_procs, &dummy);
+       unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+
+       rc = plpar_hcall(H_PIC, retbuf);
+
+       *pool_idle_time = retbuf[0];
+       *num_procs = retbuf[1];
 
        if (rc != H_AUTHORITY)
                log_plpar_hcall_return(rc, "H_PIC");
@@ -429,6 +439,10 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf,
 
        ssize_t retval = -ENOMEM;
 
+       if (!firmware_has_feature(FW_FEATURE_SPLPAR) ||
+                       firmware_has_feature(FW_FEATURE_ISERIES))
+               return -EINVAL;
+
        kbuf = kmalloc(count, GFP_KERNEL);
        if (!kbuf)
                goto out;
@@ -507,7 +521,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
 static ssize_t lparcfg_write(struct file *file, const char __user * buf,
                             size_t count, loff_t * off)
 {
-       return count;
+       return -EINVAL;
 }
 
 #endif                         /* CONFIG_PPC_PSERIES */
@@ -557,9 +571,10 @@ static int lparcfg_open(struct inode *inode, struct file *file)
        return single_open(file, lparcfg_data, NULL);
 }
 
-struct file_operations lparcfg_fops = {
+const struct file_operations lparcfg_fops = {
        .owner          = THIS_MODULE,
        .read           = seq_read,
+       .write          = lparcfg_write,
        .open           = lparcfg_open,
        .release        = single_release,
 };
@@ -571,10 +586,8 @@ int __init lparcfg_init(void)
 
        /* Allow writing if we have FW_FEATURE_SPLPAR */
        if (firmware_has_feature(FW_FEATURE_SPLPAR) &&
-                       !firmware_has_feature(FW_FEATURE_ISERIES)) {
-               lparcfg_fops.write = lparcfg_write;
+                       !firmware_has_feature(FW_FEATURE_ISERIES))
                mode |= S_IWUSR;
-       }
 
        ent = create_proc_entry("ppc64/lparcfg", mode, NULL);
        if (ent) {