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