Lines Matching refs:gmux_data

105 static u8 gmux_pio_read8(struct apple_gmux_data *gmux_data, int port)  in gmux_pio_read8()  argument
107 return inb(gmux_data->iostart + port); in gmux_pio_read8()
110 static void gmux_pio_write8(struct apple_gmux_data *gmux_data, int port, in gmux_pio_write8() argument
113 outb(val, gmux_data->iostart + port); in gmux_pio_write8()
116 static u32 gmux_pio_read32(struct apple_gmux_data *gmux_data, int port) in gmux_pio_read32() argument
118 return inl(gmux_data->iostart + port); in gmux_pio_read32()
121 static void gmux_pio_write32(struct apple_gmux_data *gmux_data, int port, in gmux_pio_write32() argument
129 outb(tmpval, gmux_data->iostart + port + i); in gmux_pio_write32()
133 static int gmux_index_wait_ready(struct apple_gmux_data *gmux_data) in gmux_index_wait_ready() argument
136 u8 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_wait_ready()
139 inb(gmux_data->iostart + GMUX_PORT_READ); in gmux_index_wait_ready()
140 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_wait_ready()
148 static int gmux_index_wait_complete(struct apple_gmux_data *gmux_data) in gmux_index_wait_complete() argument
151 u8 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_wait_complete()
154 gwr = inb(gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_wait_complete()
160 inb(gmux_data->iostart + GMUX_PORT_READ); in gmux_index_wait_complete()
165 static u8 gmux_index_read8(struct apple_gmux_data *gmux_data, int port) in gmux_index_read8() argument
169 mutex_lock(&gmux_data->index_lock); in gmux_index_read8()
170 gmux_index_wait_ready(gmux_data); in gmux_index_read8()
171 outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ); in gmux_index_read8()
172 gmux_index_wait_complete(gmux_data); in gmux_index_read8()
173 val = inb(gmux_data->iostart + GMUX_PORT_VALUE); in gmux_index_read8()
174 mutex_unlock(&gmux_data->index_lock); in gmux_index_read8()
179 static void gmux_index_write8(struct apple_gmux_data *gmux_data, int port, in gmux_index_write8() argument
182 mutex_lock(&gmux_data->index_lock); in gmux_index_write8()
183 outb(val, gmux_data->iostart + GMUX_PORT_VALUE); in gmux_index_write8()
184 gmux_index_wait_ready(gmux_data); in gmux_index_write8()
185 outb(port & 0xff, gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_write8()
186 gmux_index_wait_complete(gmux_data); in gmux_index_write8()
187 mutex_unlock(&gmux_data->index_lock); in gmux_index_write8()
190 static u32 gmux_index_read32(struct apple_gmux_data *gmux_data, int port) in gmux_index_read32() argument
194 mutex_lock(&gmux_data->index_lock); in gmux_index_read32()
195 gmux_index_wait_ready(gmux_data); in gmux_index_read32()
196 outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ); in gmux_index_read32()
197 gmux_index_wait_complete(gmux_data); in gmux_index_read32()
198 val = inl(gmux_data->iostart + GMUX_PORT_VALUE); in gmux_index_read32()
199 mutex_unlock(&gmux_data->index_lock); in gmux_index_read32()
204 static void gmux_index_write32(struct apple_gmux_data *gmux_data, int port, in gmux_index_write32() argument
210 mutex_lock(&gmux_data->index_lock); in gmux_index_write32()
214 outb(tmpval, gmux_data->iostart + GMUX_PORT_VALUE + i); in gmux_index_write32()
217 gmux_index_wait_ready(gmux_data); in gmux_index_write32()
218 outb(port & 0xff, gmux_data->iostart + GMUX_PORT_WRITE); in gmux_index_write32()
219 gmux_index_wait_complete(gmux_data); in gmux_index_write32()
220 mutex_unlock(&gmux_data->index_lock); in gmux_index_write32()
223 static u8 gmux_read8(struct apple_gmux_data *gmux_data, int port) in gmux_read8() argument
225 if (gmux_data->indexed) in gmux_read8()
226 return gmux_index_read8(gmux_data, port); in gmux_read8()
228 return gmux_pio_read8(gmux_data, port); in gmux_read8()
231 static void gmux_write8(struct apple_gmux_data *gmux_data, int port, u8 val) in gmux_write8() argument
233 if (gmux_data->indexed) in gmux_write8()
234 gmux_index_write8(gmux_data, port, val); in gmux_write8()
236 gmux_pio_write8(gmux_data, port, val); in gmux_write8()
239 static u32 gmux_read32(struct apple_gmux_data *gmux_data, int port) in gmux_read32() argument
241 if (gmux_data->indexed) in gmux_read32()
242 return gmux_index_read32(gmux_data, port); in gmux_read32()
244 return gmux_pio_read32(gmux_data, port); in gmux_read32()
247 static void gmux_write32(struct apple_gmux_data *gmux_data, int port, in gmux_write32() argument
250 if (gmux_data->indexed) in gmux_write32()
251 gmux_index_write32(gmux_data, port, val); in gmux_write32()
253 gmux_pio_write32(gmux_data, port, val); in gmux_write32()
256 static bool gmux_is_indexed(struct apple_gmux_data *gmux_data) in gmux_is_indexed() argument
260 outb(0xaa, gmux_data->iostart + 0xcc); in gmux_is_indexed()
261 outb(0x55, gmux_data->iostart + 0xcd); in gmux_is_indexed()
262 outb(0x00, gmux_data->iostart + 0xce); in gmux_is_indexed()
264 val = inb(gmux_data->iostart + 0xcc) | in gmux_is_indexed()
265 (inb(gmux_data->iostart + 0xcd) << 8); in gmux_is_indexed()
289 struct apple_gmux_data *gmux_data = bl_get_data(bd); in gmux_get_brightness() local
290 return gmux_read32(gmux_data, GMUX_PORT_BRIGHTNESS) & in gmux_get_brightness()
296 struct apple_gmux_data *gmux_data = bl_get_data(bd); in gmux_update_status() local
302 gmux_write32(gmux_data, GMUX_PORT_BRIGHTNESS, brightness); in gmux_update_status()
389 static void gmux_read_switch_state(struct apple_gmux_data *gmux_data) in gmux_read_switch_state() argument
391 if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_DDC) == 1) in gmux_read_switch_state()
392 gmux_data->switch_state_ddc = VGA_SWITCHEROO_IGD; in gmux_read_switch_state()
394 gmux_data->switch_state_ddc = VGA_SWITCHEROO_DIS; in gmux_read_switch_state()
396 if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_DISPLAY) == 2) in gmux_read_switch_state()
397 gmux_data->switch_state_display = VGA_SWITCHEROO_IGD; in gmux_read_switch_state()
399 gmux_data->switch_state_display = VGA_SWITCHEROO_DIS; in gmux_read_switch_state()
401 if (gmux_read8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL) == 2) in gmux_read_switch_state()
402 gmux_data->switch_state_external = VGA_SWITCHEROO_IGD; in gmux_read_switch_state()
404 gmux_data->switch_state_external = VGA_SWITCHEROO_DIS; in gmux_read_switch_state()
407 static void gmux_write_switch_state(struct apple_gmux_data *gmux_data) in gmux_write_switch_state() argument
409 if (gmux_data->switch_state_ddc == VGA_SWITCHEROO_IGD) in gmux_write_switch_state()
410 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DDC, 1); in gmux_write_switch_state()
412 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DDC, 2); in gmux_write_switch_state()
414 if (gmux_data->switch_state_display == VGA_SWITCHEROO_IGD) in gmux_write_switch_state()
415 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DISPLAY, 2); in gmux_write_switch_state()
417 gmux_write8(gmux_data, GMUX_PORT_SWITCH_DISPLAY, 3); in gmux_write_switch_state()
419 if (gmux_data->switch_state_external == VGA_SWITCHEROO_IGD) in gmux_write_switch_state()
420 gmux_write8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 2); in gmux_write_switch_state()
422 gmux_write8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 3); in gmux_write_switch_state()
464 static int gmux_set_discrete_state(struct apple_gmux_data *gmux_data, in gmux_set_discrete_state() argument
467 reinit_completion(&gmux_data->powerchange_done); in gmux_set_discrete_state()
470 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 1); in gmux_set_discrete_state()
471 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 3); in gmux_set_discrete_state()
474 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 1); in gmux_set_discrete_state()
475 gmux_write8(gmux_data, GMUX_PORT_DISCRETE_POWER, 0); in gmux_set_discrete_state()
479 gmux_data->power_state = state; in gmux_set_discrete_state()
481 if (gmux_data->gpe >= 0 && in gmux_set_discrete_state()
482 !wait_for_completion_interruptible_timeout(&gmux_data->powerchange_done, in gmux_set_discrete_state()
536 static inline void gmux_disable_interrupts(struct apple_gmux_data *gmux_data) in gmux_disable_interrupts() argument
538 gmux_write8(gmux_data, GMUX_PORT_INTERRUPT_ENABLE, in gmux_disable_interrupts()
542 static inline void gmux_enable_interrupts(struct apple_gmux_data *gmux_data) in gmux_enable_interrupts() argument
544 gmux_write8(gmux_data, GMUX_PORT_INTERRUPT_ENABLE, in gmux_enable_interrupts()
548 static inline u8 gmux_interrupt_get_status(struct apple_gmux_data *gmux_data) in gmux_interrupt_get_status() argument
550 return gmux_read8(gmux_data, GMUX_PORT_INTERRUPT_STATUS); in gmux_interrupt_get_status()
553 static void gmux_clear_interrupts(struct apple_gmux_data *gmux_data) in gmux_clear_interrupts() argument
558 status = gmux_interrupt_get_status(gmux_data); in gmux_clear_interrupts()
559 gmux_write8(gmux_data, GMUX_PORT_INTERRUPT_STATUS, status); in gmux_clear_interrupts()
566 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp); in gmux_notify_handler() local
568 status = gmux_interrupt_get_status(gmux_data); in gmux_notify_handler()
569 gmux_disable_interrupts(gmux_data); in gmux_notify_handler()
572 gmux_clear_interrupts(gmux_data); in gmux_notify_handler()
573 gmux_enable_interrupts(gmux_data); in gmux_notify_handler()
576 complete(&gmux_data->powerchange_done); in gmux_notify_handler()
582 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp); in gmux_suspend() local
584 gmux_disable_interrupts(gmux_data); in gmux_suspend()
591 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp); in gmux_resume() local
593 gmux_enable_interrupts(gmux_data); in gmux_resume()
594 gmux_write_switch_state(gmux_data); in gmux_resume()
595 if (gmux_data->power_state == VGA_SWITCHEROO_OFF) in gmux_resume()
596 gmux_set_discrete_state(gmux_data, gmux_data->power_state); in gmux_resume()
607 struct apple_gmux_data *gmux_data; in gmux_probe() local
619 gmux_data = kzalloc(sizeof(*gmux_data), GFP_KERNEL); in gmux_probe()
620 if (!gmux_data) in gmux_probe()
622 pnp_set_drvdata(pnp, gmux_data); in gmux_probe()
630 gmux_data->iostart = res->start; in gmux_probe()
631 gmux_data->iolen = res->end - res->start; in gmux_probe()
633 if (gmux_data->iolen < GMUX_MIN_IO_LEN) { in gmux_probe()
635 gmux_data->iolen, GMUX_MIN_IO_LEN); in gmux_probe()
639 if (!request_region(gmux_data->iostart, gmux_data->iolen, in gmux_probe()
651 ver_major = gmux_read8(gmux_data, GMUX_PORT_VERSION_MAJOR); in gmux_probe()
652 ver_minor = gmux_read8(gmux_data, GMUX_PORT_VERSION_MINOR); in gmux_probe()
653 ver_release = gmux_read8(gmux_data, GMUX_PORT_VERSION_RELEASE); in gmux_probe()
655 if (gmux_is_indexed(gmux_data)) { in gmux_probe()
657 mutex_init(&gmux_data->index_lock); in gmux_probe()
658 gmux_data->indexed = true; in gmux_probe()
659 version = gmux_read32(gmux_data, in gmux_probe()
671 ver_release, (gmux_data->indexed ? "indexed" : "classic")); in gmux_probe()
675 props.max_brightness = gmux_read32(gmux_data, GMUX_PORT_MAX_BRIGHTNESS); in gmux_probe()
687 gmux_data, &gmux_bl_ops, &props); in gmux_probe()
693 gmux_data->bdev = bdev; in gmux_probe()
706 gmux_data->power_state = VGA_SWITCHEROO_ON; in gmux_probe()
708 gmux_data->dhandle = ACPI_HANDLE(&pnp->dev); in gmux_probe()
709 if (!gmux_data->dhandle) { in gmux_probe()
716 status = acpi_evaluate_integer(gmux_data->dhandle, "GMGP", NULL, &gpe); in gmux_probe()
718 gmux_data->gpe = (int)gpe; in gmux_probe()
720 status = acpi_install_notify_handler(gmux_data->dhandle, in gmux_probe()
730 status = acpi_enable_gpe(NULL, gmux_data->gpe); in gmux_probe()
738 gmux_data->gpe = -1; in gmux_probe()
745 gmux_data->external_switchable = in gmux_probe()
747 if (!gmux_data->external_switchable) in gmux_probe()
748 gmux_write8(gmux_data, GMUX_PORT_SWITCH_EXTERNAL, 3); in gmux_probe()
750 apple_gmux_data = gmux_data; in gmux_probe()
751 init_completion(&gmux_data->powerchange_done); in gmux_probe()
752 gmux_enable_interrupts(gmux_data); in gmux_probe()
753 gmux_read_switch_state(gmux_data); in gmux_probe()
762 if (gmux_data->indexed) in gmux_probe()
776 gmux_disable_interrupts(gmux_data); in gmux_probe()
778 if (gmux_data->gpe >= 0) in gmux_probe()
779 acpi_disable_gpe(NULL, gmux_data->gpe); in gmux_probe()
781 if (gmux_data->gpe >= 0) in gmux_probe()
782 acpi_remove_notify_handler(gmux_data->dhandle, in gmux_probe()
788 release_region(gmux_data->iostart, gmux_data->iolen); in gmux_probe()
790 kfree(gmux_data); in gmux_probe()
796 struct apple_gmux_data *gmux_data = pnp_get_drvdata(pnp); in gmux_remove() local
799 gmux_disable_interrupts(gmux_data); in gmux_remove()
800 if (gmux_data->gpe >= 0) { in gmux_remove()
801 acpi_disable_gpe(NULL, gmux_data->gpe); in gmux_remove()
802 acpi_remove_notify_handler(gmux_data->dhandle, in gmux_remove()
807 backlight_device_unregister(gmux_data->bdev); in gmux_remove()
809 release_region(gmux_data->iostart, gmux_data->iolen); in gmux_remove()
811 kfree(gmux_data); in gmux_remove()