Lines Matching refs:gmux_data

102 static u8 gmux_pio_read8(struct apple_gmux_data *gmux_data, int port)  in gmux_pio_read8()  argument
104 return inb(gmux_data->iostart + port); in gmux_pio_read8()
107 static void gmux_pio_write8(struct apple_gmux_data *gmux_data, int port, in gmux_pio_write8() argument
110 outb(val, gmux_data->iostart + port); in gmux_pio_write8()
113 static u32 gmux_pio_read32(struct apple_gmux_data *gmux_data, int port) in gmux_pio_read32() argument
115 return inl(gmux_data->iostart + port); in gmux_pio_read32()
118 static void gmux_pio_write32(struct apple_gmux_data *gmux_data, int port, in gmux_pio_write32() argument
126 outb(tmpval, gmux_data->iostart + port + i); in gmux_pio_write32()
130 static int gmux_index_wait_ready(struct apple_gmux_data *gmux_data) in gmux_index_wait_ready() argument
133 u8 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_wait_ready()
136 inb(gmux_data->iostart + GMUX_PORT_READ); in gmux_index_wait_ready()
137 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_wait_ready()
145 static int gmux_index_wait_complete(struct apple_gmux_data *gmux_data) in gmux_index_wait_complete() argument
148 u8 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_wait_complete()
151 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_wait_complete()
157 inb(gmux_data->iostart + GMUX_PORT_READ); in gmux_index_wait_complete()
162 static u8 gmux_index_read8(struct apple_gmux_data *gmux_data, int port) in gmux_index_read8() argument
166 mutex_lock(&gmux_data->index_lock); in gmux_index_read8()
167 gmux_index_wait_ready(gmux_data); in gmux_index_read8()
168 outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ); in gmux_index_read8()
169 gmux_index_wait_complete(gmux_data); in gmux_index_read8()
170 val = inb(gmux_data->iostart + GMUX_PORT_VALUE); in gmux_index_read8()
171 mutex_unlock(&gmux_data->index_lock); in gmux_index_read8()
176 static void gmux_index_write8(struct apple_gmux_data *gmux_data, int port, in gmux_index_write8() argument
179 mutex_lock(&gmux_data->index_lock); in gmux_index_write8()
180 outb(val, gmux_data->iostart + GMUX_PORT_VALUE); in gmux_index_write8()
181 gmux_index_wait_ready(gmux_data); in gmux_index_write8()
182 outb(port & 0xff, gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_write8()
183 gmux_index_wait_complete(gmux_data); in gmux_index_write8()
184 mutex_unlock(&gmux_data->index_lock); in gmux_index_write8()
187 static u32 gmux_index_read32(struct apple_gmux_data *gmux_data, int port) in gmux_index_read32() argument
191 mutex_lock(&gmux_data->index_lock); in gmux_index_read32()
192 gmux_index_wait_ready(gmux_data); in gmux_index_read32()
193 outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ); in gmux_index_read32()
194 gmux_index_wait_complete(gmux_data); in gmux_index_read32()
195 val = inl(gmux_data->iostart + GMUX_PORT_VALUE); in gmux_index_read32()
196 mutex_unlock(&gmux_data->index_lock); in gmux_index_read32()
201 static void gmux_index_write32(struct apple_gmux_data *gmux_data, int port, in gmux_index_write32() argument
207 mutex_lock(&gmux_data->index_lock); in gmux_index_write32()
211 outb(tmpval, gmux_data->iostart + GMUX_PORT_VALUE + i); in gmux_index_write32()
214 gmux_index_wait_ready(gmux_data); in gmux_index_write32()
215 outb(port & 0xff, gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_write32()
216 gmux_index_wait_complete(gmux_data); in gmux_index_write32()
217 mutex_unlock(&gmux_data->index_lock); in gmux_index_write32()
220 static u8 gmux_read8(struct apple_gmux_data *gmux_data, int port) in gmux_read8() argument
222 if (gmux_data->indexed) in gmux_read8()
223 return gmux_index_read8(gmux_data, port); in gmux_read8()
225 return gmux_pio_read8(gmux_data, port); in gmux_read8()
228 static void gmux_write8(struct apple_gmux_data *gmux_data, int port, u8 val) in gmux_write8() argument
230 if (gmux_data->indexed) in gmux_write8()
231 gmux_index_write8(gmux_data, port, val); in gmux_write8()
233 gmux_pio_write8(gmux_data, port, val); in gmux_write8()
236 static u32 gmux_read32(struct apple_gmux_data *gmux_data, int port) in gmux_read32() argument
238 if (gmux_data->indexed) in gmux_read32()
239 return gmux_index_read32(gmux_data, port); in gmux_read32()
241 return gmux_pio_read32(gmux_data, port); in gmux_read32()
244 static void gmux_write32(struct apple_gmux_data *gmux_data, int port, in gmux_write32() argument
247 if (gmux_data->indexed) in gmux_write32()
248 gmux_index_write32(gmux_data, port, val); in gmux_write32()
250 gmux_pio_write32(gmux_data, port, val); in gmux_write32()
253 static bool gmux_is_indexed(struct apple_gmux_data *gmux_data) in gmux_is_indexed() argument
257 outb(0xaa, gmux_data->iostart + 0xcc); in gmux_is_indexed()
258 outb(0x55, gmux_data->iostart + 0xcd); in gmux_is_indexed()
259 outb(0x00, gmux_data->iostart + 0xce); in gmux_is_indexed()
261 val = inb(gmux_data->iostart + 0xcc) | in gmux_is_indexed()
262 (inb(gmux_data->iostart + 0xcd) << 8); in gmux_is_indexed()
286 struct apple_gmux_data *gmux_data = bl_get_data(bd); in gmux_get_brightness() local
287 return gmux_read32(gmux_data, GMUX_PORT_BRIGHTNESS) & in gmux_get_brightness()
293 struct apple_gmux_data *gmux_data = bl_get_data(bd); in gmux_update_status() local
299 gmux_write32(gmux_data, GMUX_PORT_BRIGHTNESS, brightness); in gmux_update_status()
386 static void gmux_read_switch_state(struct apple_gmux_data *gmux_data) in gmux_read_switch_state() argument
388 if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_DDC) == 1) in gmux_read_switch_state()
389 gmux_data->switch_state_ddc = VGA_SWITCHEROO_IGD; in gmux_read_switch_state()
391 gmux_data->switch_state_ddc = VGA_SWITCHEROO_DIS; in gmux_read_switch_state()
393 if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_DISPLAY) == 2) in gmux_read_switch_state()
394 gmux_data->switch_state_display = VGA_SWITCHEROO_IGD; in gmux_read_switch_state()
396 gmux_data->switch_state_display = VGA_SWITCHEROO_DIS; in gmux_read_switch_state()
398 if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL) == 2) in gmux_read_switch_state()
399 gmux_data->switch_state_external = VGA_SWITCHEROO_IGD; in gmux_read_switch_state()
401 gmux_data->switch_state_external = VGA_SWITCHEROO_DIS; in gmux_read_switch_state()
404 static void gmux_write_switch_state(struct apple_gmux_data *gmux_data) in gmux_write_switch_state() argument
406 if (gmux_data->switch_state_ddc == VGA_SWITCHEROO_IGD) in gmux_write_switch_state()
407 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DDC, 1); in gmux_write_switch_state()
409 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DDC, 2); in gmux_write_switch_state()
411 if (gmux_data->switch_state_display == VGA_SWITCHEROO_IGD) in gmux_write_switch_state()
412 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DISPLAY, 2); in gmux_write_switch_state()
414 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DISPLAY, 3); in gmux_write_switch_state()
416 if (gmux_data->switch_state_external == VGA_SWITCHEROO_IGD) in gmux_write_switch_state()
417 gmux_write8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 2); in gmux_write_switch_state()
419 gmux_write8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 3); in gmux_write_switch_state()
461 static int gmux_set_discrete_state(struct apple_gmux_data *gmux_data, in gmux_set_discrete_state() argument
464 reinit_completion(&gmux_data->powerchange_done); in gmux_set_discrete_state()
467 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 1); in gmux_set_discrete_state()
468 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 3); in gmux_set_discrete_state()
471 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 1); in gmux_set_discrete_state()
472 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 0); in gmux_set_discrete_state()
476 gmux_data->power_state = state; in gmux_set_discrete_state()
478 if (gmux_data->gpe >= 0 && in gmux_set_discrete_state()
479 !wait_for_completion_interruptible_timeout(&gmux_data->powerchange_done, in gmux_set_discrete_state()
533 static inline void gmux_disable_interrupts(struct apple_gmux_data *gmux_data) in gmux_disable_interrupts() argument
535 gmux_write8(gmux_data, GMUX_PORT_INTERRUPT_ENABLE, in gmux_disable_interrupts()
539 static inline void gmux_enable_interrupts(struct apple_gmux_data *gmux_data) in gmux_enable_interrupts() argument
541 gmux_write8(gmux_data, GMUX_PORT_INTERRUPT_ENABLE, in gmux_enable_interrupts()
545 static inline u8 gmux_interrupt_get_status(struct apple_gmux_data *gmux_data) in gmux_interrupt_get_status() argument
547 return gmux_read8(gmux_data, GMUX_PORT_INTERRUPT_STATUS); in gmux_interrupt_get_status()
550 static void gmux_clear_interrupts(struct apple_gmux_data *gmux_data) in gmux_clear_interrupts() argument
555 status = gmux_interrupt_get_status(gmux_data); in gmux_clear_interrupts()
556 gmux_write8(gmux_data, GMUX_PORT_INTERRUPT_STATUS, status); in gmux_clear_interrupts()
563 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp); in gmux_notify_handler() local
565 status = gmux_interrupt_get_status(gmux_data); in gmux_notify_handler()
566 gmux_disable_interrupts(gmux_data); in gmux_notify_handler()
569 gmux_clear_interrupts(gmux_data); in gmux_notify_handler()
570 gmux_enable_interrupts(gmux_data); in gmux_notify_handler()
573 complete(&gmux_data->powerchange_done); in gmux_notify_handler()
579 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp); in gmux_suspend() local
581 gmux_disable_interrupts(gmux_data); in gmux_suspend()
588 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp); in gmux_resume() local
590 gmux_enable_interrupts(gmux_data); in gmux_resume()
591 gmux_write_switch_state(gmux_data); in gmux_resume()
592 if (gmux_data->power_state == VGA_SWITCHEROO_OFF) in gmux_resume()
593 gmux_set_discrete_state(gmux_data, gmux_data->power_state); in gmux_resume()
604 struct apple_gmux_data *gmux_data; in gmux_probe() local
616 gmux_data = kzalloc(sizeof(*gmux_data), GFP_KERNEL); in gmux_probe()
617 if (!gmux_data) in gmux_probe()
619 pnp_set_drvdata(pnp, gmux_data); in gmux_probe()
627 gmux_data->iostart = res->start; in gmux_probe()
628 gmux_data->iolen = resource_size(res); in gmux_probe()
630 if (gmux_data->iolen < GMUX_MIN_IO_LEN) { in gmux_probe()
632 gmux_data->iolen, GMUX_MIN_IO_LEN); in gmux_probe()
636 if (!request_region(gmux_data->iostart, gmux_data->iolen, in gmux_probe()
648 ver_major = gmux_read8(gmux_data, GMUX_PORT_VERSION_MAJOR); in gmux_probe()
649 ver_minor = gmux_read8(gmux_data, GMUX_PORT_VERSION_MINOR); in gmux_probe()
650 ver_release = gmux_read8(gmux_data, GMUX_PORT_VERSION_RELEASE); in gmux_probe()
652 if (gmux_is_indexed(gmux_data)) { in gmux_probe()
654 mutex_init(&gmux_data->index_lock); in gmux_probe()
655 gmux_data->indexed = true; in gmux_probe()
656 version = gmux_read32(gmux_data, in gmux_probe()
668 ver_release, (gmux_data->indexed ? "indexed" : "classic")); in gmux_probe()
672 props.max_brightness = gmux_read32(gmux_data, GMUX_PORT_MAX_BRIGHTNESS); in gmux_probe()
684 gmux_data, &gmux_bl_ops, &props); in gmux_probe()
690 gmux_data->bdev = bdev; in gmux_probe()
703 gmux_data->power_state = VGA_SWITCHEROO_ON; in gmux_probe()
705 gmux_data->dhandle = ACPI_HANDLE(&pnp->dev); in gmux_probe()
706 if (!gmux_data->dhandle) { in gmux_probe()
713 status = acpi_evaluate_integer(gmux_data->dhandle, "GMGP", NULL, &gpe); in gmux_probe()
715 gmux_data->gpe = (int)gpe; in gmux_probe()
717 status = acpi_install_notify_handler(gmux_data->dhandle, in gmux_probe()
727 status = acpi_enable_gpe(NULL, gmux_data->gpe); in gmux_probe()
735 gmux_data->gpe = -1; in gmux_probe()
742 gmux_data->external_switchable = in gmux_probe()
744 if (!gmux_data->external_switchable) in gmux_probe()
745 gmux_write8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 3); in gmux_probe()
747 apple_gmux_data = gmux_data; in gmux_probe()
748 init_completion(&gmux_data->powerchange_done); in gmux_probe()
749 gmux_enable_interrupts(gmux_data); in gmux_probe()
750 gmux_read_switch_state(gmux_data); in gmux_probe()
759 if (gmux_data->indexed) in gmux_probe()
773 gmux_disable_interrupts(gmux_data); in gmux_probe()
775 if (gmux_data->gpe >= 0) in gmux_probe()
776 acpi_disable_gpe(NULL, gmux_data->gpe); in gmux_probe()
778 if (gmux_data->gpe >= 0) in gmux_probe()
779 acpi_remove_notify_handler(gmux_data->dhandle, in gmux_probe()
785 release_region(gmux_data->iostart, gmux_data->iolen); in gmux_probe()
787 kfree(gmux_data); in gmux_probe()
793 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp); in gmux_remove() local
796 gmux_disable_interrupts(gmux_data); in gmux_remove()
797 if (gmux_data->gpe >= 0) { in gmux_remove()
798 acpi_disable_gpe(NULL, gmux_data->gpe); in gmux_remove()
799 acpi_remove_notify_handler(gmux_data->dhandle, in gmux_remove()
804 backlight_device_unregister(gmux_data->bdev); in gmux_remove()
806 release_region(gmux_data->iostart, gmux_data->iolen); in gmux_remove()
808 kfree(gmux_data); in gmux_remove()