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