X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmacintosh%2Fsmu.c;fp=drivers%2Fmacintosh%2Fsmu.c;h=db2ae71d07ef08511f480c5f6b7978b68772daaa;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=4586eb3d4ba2be50f1e9108d199abf6b1eca5887;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/drivers/macintosh/smu.c b/drivers/macintosh/smu.c index 4586eb3d4..db2ae71d0 100644 --- a/drivers/macintosh/smu.c +++ b/drivers/macintosh/smu.c @@ -19,6 +19,7 @@ * the userland interface */ +#include #include #include #include @@ -34,7 +35,6 @@ #include #include #include -#include #include #include @@ -75,11 +75,9 @@ struct smu_device { struct of_device *of_dev; int doorbell; /* doorbell gpio */ u32 __iomem *db_buf; /* doorbell buffer */ - struct device_node *db_node; - unsigned int db_irq; + int db_irq; int msg; - struct device_node *msg_node; - unsigned int msg_irq; + int msg_irq; struct smu_cmd_buf *cmd_buf; /* command buffer virtual */ u32 cmd_buf_abs; /* command buffer absolute */ struct list_head cmd_list; @@ -94,8 +92,7 @@ struct smu_device { * for now, just hard code that */ static struct smu_device *smu; -static DEFINE_MUTEX(smu_part_access); -static int smu_irq_inited; +static DECLARE_MUTEX(smu_part_access); static void smu_i2c_retry(unsigned long data); @@ -260,10 +257,6 @@ int smu_queue_cmd(struct smu_cmd *cmd) smu_start_cmd(); spin_unlock_irqrestore(&smu->lock, flags); - /* Workaround for early calls when irq isn't available */ - if (!smu_irq_inited || smu->db_irq == NO_IRQ) - smu_spinwait_cmd(cmd); - return 0; } EXPORT_SYMBOL(smu_queue_cmd); @@ -485,15 +478,14 @@ int __init smu_init (void) smu->cmd_buf_abs = (u32)smu_cmdbuf_abs; smu->cmd_buf = (struct smu_cmd_buf *)abs_to_virt(smu_cmdbuf_abs); - smu->db_node = of_find_node_by_name(NULL, "smu-doorbell"); - if (smu->db_node == NULL) { + np = of_find_node_by_name(NULL, "smu-doorbell"); + if (np == NULL) { printk(KERN_ERR "SMU: Can't find doorbell GPIO !\n"); goto fail; } - data = (u32 *)get_property(smu->db_node, "reg", NULL); + data = (u32 *)get_property(np, "reg", NULL); if (data == NULL) { - of_node_put(smu->db_node); - smu->db_node = NULL; + of_node_put(np); printk(KERN_ERR "SMU: Can't find doorbell GPIO address !\n"); goto fail; } @@ -505,21 +497,27 @@ int __init smu_init (void) smu->doorbell = *data; if (smu->doorbell < 0x50) smu->doorbell += 0x50; + if (np->n_intrs > 0) + smu->db_irq = np->intrs[0].line; + + of_node_put(np); /* Now look for the smu-interrupt GPIO */ do { - smu->msg_node = of_find_node_by_name(NULL, "smu-interrupt"); - if (smu->msg_node == NULL) + np = of_find_node_by_name(NULL, "smu-interrupt"); + if (np == NULL) break; - data = (u32 *)get_property(smu->msg_node, "reg", NULL); + data = (u32 *)get_property(np, "reg", NULL); if (data == NULL) { - of_node_put(smu->msg_node); - smu->msg_node = NULL; + of_node_put(np); break; } smu->msg = *data; if (smu->msg < 0x50) smu->msg += 0x50; + if (np->n_intrs > 0) + smu->msg_irq = np->intrs[0].line; + of_node_put(np); } while(0); /* Doorbell buffer is currently hard-coded, I didn't find a proper @@ -551,26 +549,13 @@ static int smu_late_init(void) smu->i2c_timer.function = smu_i2c_retry; smu->i2c_timer.data = (unsigned long)smu; - if (smu->db_node) { - smu->db_irq = irq_of_parse_and_map(smu->db_node, 0); - if (smu->db_irq == NO_IRQ) - printk(KERN_ERR "smu: failed to map irq for node %s\n", - smu->db_node->full_name); - } - if (smu->msg_node) { - smu->msg_irq = irq_of_parse_and_map(smu->msg_node, 0); - if (smu->msg_irq == NO_IRQ) - printk(KERN_ERR "smu: failed to map irq for node %s\n", - smu->msg_node->full_name); - } - /* * Try to request the interrupts */ if (smu->db_irq != NO_IRQ) { if (request_irq(smu->db_irq, smu_db_intr, - IRQF_SHARED, "SMU doorbell", smu) < 0) { + SA_SHIRQ, "SMU doorbell", smu) < 0) { printk(KERN_WARNING "SMU: can't " "request interrupt %d\n", smu->db_irq); @@ -580,7 +565,7 @@ static int smu_late_init(void) if (smu->msg_irq != NO_IRQ) { if (request_irq(smu->msg_irq, smu_msg_intr, - IRQF_SHARED, "SMU message", smu) < 0) { + SA_SHIRQ, "SMU message", smu) < 0) { printk(KERN_WARNING "SMU: can't " "request interrupt %d\n", smu->msg_irq); @@ -588,7 +573,6 @@ static int smu_late_init(void) } } - smu_irq_inited = 1; return 0; } /* This has to be before arch_initcall as the low i2c stuff relies on the @@ -645,6 +629,8 @@ static struct of_platform_driver smu_of_platform_driver = static int __init smu_init_sysfs(void) { + int rc; + /* * Due to sysfs bogosity, a sysdev is not a real device, so * we should in fact create both if we want sysdev semantics @@ -653,7 +639,7 @@ static int __init smu_init_sysfs(void) * I'm a bit too far from figuring out how that works with those * new chipsets, but that will come back and bite us */ - of_register_driver(&smu_of_platform_driver); + rc = of_register_driver(&smu_of_platform_driver); return 0; } @@ -760,11 +746,6 @@ static void smu_i2c_low_completion(struct smu_cmd *scmd, void *misc) if (fail && --cmd->retries > 0) { DPRINTK("SMU: i2c failure, starting timer...\n"); BUG_ON(cmd != smu->cmd_i2c_cur); - if (!smu_irq_inited) { - mdelay(5); - smu_i2c_retry(0); - return; - } mod_timer(&smu->i2c_timer, jiffies + msecs_to_jiffies(5)); return; } @@ -870,7 +851,7 @@ int smu_queue_i2c(struct smu_i2c_cmd *cmd) static int smu_read_datablock(u8 *dest, unsigned int addr, unsigned int len) { - DECLARE_COMPLETION_ONSTACK(comp); + DECLARE_COMPLETION(comp); unsigned int chunk; struct smu_cmd cmd; int rc; @@ -917,7 +898,7 @@ static int smu_read_datablock(u8 *dest, unsigned int addr, unsigned int len) static struct smu_sdbp_header *smu_create_sdb_partition(int id) { - DECLARE_COMPLETION_ONSTACK(comp); + DECLARE_COMPLETION(comp); struct smu_simple_cmd cmd; unsigned int addr, len, tlen; struct smu_sdbp_header *hdr; @@ -997,11 +978,11 @@ struct smu_sdbp_header *__smu_get_sdb_partition(int id, unsigned int *size, if (interruptible) { int rc; - rc = mutex_lock_interruptible(&smu_part_access); + rc = down_interruptible(&smu_part_access); if (rc) return ERR_PTR(rc); } else - mutex_lock(&smu_part_access); + down(&smu_part_access); part = (struct smu_sdbp_header *)get_property(smu->of_node, pname, size); @@ -1011,7 +992,7 @@ struct smu_sdbp_header *__smu_get_sdb_partition(int id, unsigned int *size, if (part != NULL && size) *size = part->len << 2; } - mutex_unlock(&smu_part_access); + up(&smu_part_access); return part; }