Lines Matching defs:gmux_data

86 	u8 (*read8)(struct apple_gmux_data *gmux_data, int port);
87 void (*write8)(struct apple_gmux_data *gmux_data, int port, u8 val);
88 u32 (*read32)(struct apple_gmux_data *gmux_data, int port);
89 void (*write32)(struct apple_gmux_data *gmux_data, int port, u32 val);
110 static u8 gmux_pio_read8(struct apple_gmux_data *gmux_data, int port)
112 return inb(gmux_data->iostart + port);
115 static void gmux_pio_write8(struct apple_gmux_data *gmux_data, int port,
118 outb(val, gmux_data->iostart + port);
121 static u32 gmux_pio_read32(struct apple_gmux_data *gmux_data, int port)
123 return inl(gmux_data->iostart + port);
126 static void gmux_pio_write32(struct apple_gmux_data *gmux_data, int port,
134 outb(tmpval, gmux_data->iostart + port + i);
138 static int gmux_index_wait_ready(struct apple_gmux_data *gmux_data)
141 u8 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE);
144 inb(gmux_data->iostart + GMUX_PORT_READ);
145 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE);
153 static int gmux_index_wait_complete(struct apple_gmux_data *gmux_data)
156 u8 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE);
159 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE);
165 inb(gmux_data->iostart + GMUX_PORT_READ);
170 static u8 gmux_index_read8(struct apple_gmux_data *gmux_data, int port)
174 mutex_lock(&gmux_data->index_lock);
175 gmux_index_wait_ready(gmux_data);
176 outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ);
177 gmux_index_wait_complete(gmux_data);
178 val = inb(gmux_data->iostart + GMUX_PORT_VALUE);
179 mutex_unlock(&gmux_data->index_lock);
184 static void gmux_index_write8(struct apple_gmux_data *gmux_data, int port,
187 mutex_lock(&gmux_data->index_lock);
188 outb(val, gmux_data->iostart + GMUX_PORT_VALUE);
189 gmux_index_wait_ready(gmux_data);
190 outb(port & 0xff, gmux_data->iostart + GMUX_PORT_WRITE);
191 gmux_index_wait_complete(gmux_data);
192 mutex_unlock(&gmux_data->index_lock);
195 static u32 gmux_index_read32(struct apple_gmux_data *gmux_data, int port)
199 mutex_lock(&gmux_data->index_lock);
200 gmux_index_wait_ready(gmux_data);
201 outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ);
202 gmux_index_wait_complete(gmux_data);
203 val = inl(gmux_data->iostart + GMUX_PORT_VALUE);
204 mutex_unlock(&gmux_data->index_lock);
209 static void gmux_index_write32(struct apple_gmux_data *gmux_data, int port,
215 mutex_lock(&gmux_data->index_lock);
219 outb(tmpval, gmux_data->iostart + GMUX_PORT_VALUE + i);
222 gmux_index_wait_ready(gmux_data);
223 outb(port & 0xff, gmux_data->iostart + GMUX_PORT_WRITE);
224 gmux_index_wait_complete(gmux_data);
225 mutex_unlock(&gmux_data->index_lock);
228 static int gmux_mmio_wait(struct apple_gmux_data *gmux_data)
231 u8 gwr = ioread8(gmux_data->iomem_base + GMUX_MMIO_COMMAND_SEND);
234 gwr = ioread8(gmux_data->iomem_base + GMUX_MMIO_COMMAND_SEND);
242 static u8 gmux_mmio_read8(struct apple_gmux_data *gmux_data, int port)
246 mutex_lock(&gmux_data->index_lock);
247 gmux_mmio_wait(gmux_data);
248 iowrite8((port & 0xff), gmux_data->iomem_base + GMUX_MMIO_PORT_SELECT);
250 gmux_data->iomem_base + GMUX_MMIO_COMMAND_SEND);
251 gmux_mmio_wait(gmux_data);
252 val = ioread8(gmux_data->iomem_base);
253 mutex_unlock(&gmux_data->index_lock);
258 static void gmux_mmio_write8(struct apple_gmux_data *gmux_data, int port,
261 mutex_lock(&gmux_data->index_lock);
262 gmux_mmio_wait(gmux_data);
263 iowrite8(val, gmux_data->iomem_base);
265 iowrite8(port & 0xff, gmux_data->iomem_base + GMUX_MMIO_PORT_SELECT);
267 gmux_data->iomem_base + GMUX_MMIO_COMMAND_SEND);
269 gmux_mmio_wait(gmux_data);
270 mutex_unlock(&gmux_data->index_lock);
273 static u32 gmux_mmio_read32(struct apple_gmux_data *gmux_data, int port)
277 mutex_lock(&gmux_data->index_lock);
278 gmux_mmio_wait(gmux_data);
279 iowrite8((port & 0xff), gmux_data->iomem_base + GMUX_MMIO_PORT_SELECT);
281 gmux_data->iomem_base + GMUX_MMIO_COMMAND_SEND);
282 gmux_mmio_wait(gmux_data);
283 val = ioread32be(gmux_data->iomem_base);
284 mutex_unlock(&gmux_data->index_lock);
289 static void gmux_mmio_write32(struct apple_gmux_data *gmux_data, int port,
292 mutex_lock(&gmux_data->index_lock);
293 iowrite32be(val, gmux_data->iomem_base);
294 iowrite8(port & 0xff, gmux_data->iomem_base + GMUX_MMIO_PORT_SELECT);
296 gmux_data->iomem_base + GMUX_MMIO_COMMAND_SEND);
297 gmux_mmio_wait(gmux_data);
298 mutex_unlock(&gmux_data->index_lock);
301 static u8 gmux_read8(struct apple_gmux_data *gmux_data, int port)
303 return gmux_data->config->read8(gmux_data, port);
306 static void gmux_write8(struct apple_gmux_data *gmux_data, int port, u8 val)
308 return gmux_data->config->write8(gmux_data, port, val);
311 static u32 gmux_read32(struct apple_gmux_data *gmux_data, int port)
313 return gmux_data->config->read32(gmux_data, port);
316 static void gmux_write32(struct apple_gmux_data *gmux_data, int port,
319 return gmux_data->config->write32(gmux_data, port, val);
338 struct apple_gmux_data *gmux_data = bl_get_data(bd);
339 return gmux_read32(gmux_data, GMUX_PORT_BRIGHTNESS) &
345 struct apple_gmux_data *gmux_data = bl_get_data(bd);
348 gmux_write32(gmux_data, GMUX_PORT_BRIGHTNESS, brightness);
435 static void gmux_read_switch_state(struct apple_gmux_data *gmux_data)
437 if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_DDC) == 1)
438 gmux_data->switch_state_ddc = VGA_SWITCHEROO_IGD;
440 gmux_data->switch_state_ddc = VGA_SWITCHEROO_DIS;
442 if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_DISPLAY) & 1)
443 gmux_data->switch_state_display = VGA_SWITCHEROO_DIS;
445 gmux_data->switch_state_display = VGA_SWITCHEROO_IGD;
447 if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL) == 2)
448 gmux_data->switch_state_external = VGA_SWITCHEROO_IGD;
450 gmux_data->switch_state_external = VGA_SWITCHEROO_DIS;
453 static void gmux_write_switch_state(struct apple_gmux_data *gmux_data)
455 if (gmux_data->switch_state_ddc == VGA_SWITCHEROO_IGD)
456 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DDC, 1);
458 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DDC, 2);
460 if (gmux_data->switch_state_display == VGA_SWITCHEROO_IGD)
461 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DISPLAY, 2);
463 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DISPLAY, 3);
465 if (gmux_data->switch_state_external == VGA_SWITCHEROO_IGD)
466 gmux_write8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 2);
468 gmux_write8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 3);
510 static int gmux_set_discrete_state(struct apple_gmux_data *gmux_data,
513 reinit_completion(&gmux_data->powerchange_done);
516 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 1);
517 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 3);
520 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 1);
521 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 0);
525 gmux_data->power_state = state;
527 if (gmux_data->gpe >= 0 &&
528 !wait_for_completion_interruptible_timeout(&gmux_data->powerchange_done,
634 static inline void gmux_disable_interrupts(struct apple_gmux_data *gmux_data)
636 gmux_write8(gmux_data, GMUX_PORT_INTERRUPT_ENABLE,
640 static inline void gmux_enable_interrupts(struct apple_gmux_data *gmux_data)
642 gmux_write8(gmux_data, GMUX_PORT_INTERRUPT_ENABLE,
646 static inline u8 gmux_interrupt_get_status(struct apple_gmux_data *gmux_data)
648 return gmux_read8(gmux_data, GMUX_PORT_INTERRUPT_STATUS);
651 static void gmux_clear_interrupts(struct apple_gmux_data *gmux_data)
656 status = gmux_interrupt_get_status(gmux_data);
657 gmux_write8(gmux_data, GMUX_PORT_INTERRUPT_STATUS, status);
659 if (gmux_data->config == &apple_gmux_mmio)
660 acpi_execute_simple_method(gmux_data->dhandle, "GMSP", 0);
667 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp);
669 status = gmux_interrupt_get_status(gmux_data);
670 gmux_disable_interrupts(gmux_data);
673 gmux_clear_interrupts(gmux_data);
674 gmux_enable_interrupts(gmux_data);
677 complete(&gmux_data->powerchange_done);
697 struct apple_gmux_data *gmux_data = file->private_data;
708 gmux_write8(gmux_data, gmux_data->selected_port, data);
715 gmux_write32(gmux_data, gmux_data->selected_port, data);
725 struct apple_gmux_data *gmux_data = file->private_data;
728 data = gmux_read32(gmux_data, gmux_data->selected_port);
739 static void gmux_init_debugfs(struct apple_gmux_data *gmux_data)
741 gmux_data->debug_dentry = debugfs_create_dir(KBUILD_MODNAME, NULL);
743 debugfs_create_u8("selected_port", 0644, gmux_data->debug_dentry,
744 &gmux_data->selected_port);
745 debugfs_create_file("selected_port_data", 0644, gmux_data->debug_dentry,
746 gmux_data, &gmux_port_data_ops);
749 static void gmux_fini_debugfs(struct apple_gmux_data *gmux_data)
751 debugfs_remove_recursive(gmux_data->debug_dentry);
757 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp);
759 gmux_disable_interrupts(gmux_data);
766 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp);
768 gmux_enable_interrupts(gmux_data);
769 gmux_write_switch_state(gmux_data);
770 if (gmux_data->power_state == VGA_SWITCHEROO_OFF)
771 gmux_set_discrete_state(gmux_data, gmux_data->power_state);
782 struct apple_gmux_data *gmux_data;
802 gmux_data = kzalloc(sizeof(*gmux_data), GFP_KERNEL);
803 if (!gmux_data)
805 pnp_set_drvdata(pnp, gmux_data);
809 gmux_data->config = &apple_gmux_mmio;
810 mutex_init(&gmux_data->index_lock);
813 gmux_data->iostart = res->start;
815 gmux_data->iolen = 16;
816 if (!request_mem_region(gmux_data->iostart, gmux_data->iolen,
821 gmux_data->iomem_base = ioremap(gmux_data->iostart, gmux_data->iolen);
822 if (!gmux_data->iomem_base) {
828 gmux_data->config = &apple_gmux_index;
829 mutex_init(&gmux_data->index_lock);
832 gmux_data->config = &apple_gmux_pio;
837 gmux_data->iostart = res->start;
838 gmux_data->iolen = resource_size(res);
840 if (!request_region(gmux_data->iostart, gmux_data->iolen,
847 if (gmux_data->config->read_version_as_u32) {
848 version = gmux_read32(gmux_data, GMUX_PORT_VERSION_MAJOR);
853 ver_major = gmux_read8(gmux_data, GMUX_PORT_VERSION_MAJOR);
854 ver_minor = gmux_read8(gmux_data, GMUX_PORT_VERSION_MINOR);
855 ver_release = gmux_read8(gmux_data, GMUX_PORT_VERSION_RELEASE);
858 ver_release, gmux_data->config->name);
872 props.max_brightness = gmux_read32(gmux_data, GMUX_PORT_MAX_BRIGHTNESS);
888 gmux_data, &gmux_bl_ops, &props);
894 gmux_data->bdev = bdev;
899 gmux_data->power_state = VGA_SWITCHEROO_ON;
901 gmux_data->dhandle = ACPI_HANDLE(&pnp->dev);
902 if (!gmux_data->dhandle) {
909 status = acpi_evaluate_integer(gmux_data->dhandle, "GMGP", NULL, &gpe);
911 gmux_data->gpe = (int)gpe;
913 status = acpi_install_notify_handler(gmux_data->dhandle,
923 status = acpi_enable_gpe(NULL, gmux_data->gpe);
931 gmux_data->gpe = -1;
938 gmux_data->external_switchable =
940 if (!gmux_data->external_switchable)
941 gmux_write8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 3);
943 apple_gmux_data = gmux_data;
944 init_completion(&gmux_data->powerchange_done);
945 gmux_enable_interrupts(gmux_data);
946 gmux_read_switch_state(gmux_data);
955 ret = vga_switcheroo_register_handler(gmux_data->config->gmux_handler,
956 gmux_data->config->handler_flags);
962 gmux_init_debugfs(gmux_data);
966 gmux_disable_interrupts(gmux_data);
968 if (gmux_data->gpe >= 0)
969 acpi_disable_gpe(NULL, gmux_data->gpe);
971 if (gmux_data->gpe >= 0)
972 acpi_remove_notify_handler(gmux_data->dhandle,
978 if (gmux_data->iomem_base)
979 iounmap(gmux_data->iomem_base);
981 if (gmux_data->config->resource_type == IORESOURCE_MEM)
982 release_mem_region(gmux_data->iostart, gmux_data->iolen);
984 release_region(gmux_data->iostart, gmux_data->iolen);
986 kfree(gmux_data);
992 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp);
994 gmux_fini_debugfs(gmux_data);
996 gmux_disable_interrupts(gmux_data);
997 if (gmux_data->gpe >= 0) {
998 acpi_disable_gpe(NULL, gmux_data->gpe);
999 acpi_remove_notify_handler(gmux_data->dhandle,
1004 backlight_device_unregister(gmux_data->bdev);
1006 if (gmux_data->iomem_base) {
1007 iounmap(gmux_data->iomem_base);
1008 release_mem_region(gmux_data->iostart, gmux_data->iolen);
1010 release_region(gmux_data->iostart, gmux_data->iolen);
1012 kfree(gmux_data);