Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a64138ec authored by Finn Thain's avatar Finn Thain Committed by Geert Uytterhoeven
Browse files

macintosh/via-pmu68k: Initialize PMU driver with setup_arch and arch_initcall



The PMU watchdog will power down the system if the kernel is slow
to start up, e.g. due to unpacking a large initrd. The powerpc
version of this driver (via-pmu.c) has a solution for the same
problem. It uses this call sequence:

setup_arch
	find_via_pmu
		init_pmu
...
arch_initcall
	via_pmu_start

Bring via-pmu68k.c into line with via-pmu.c to fix this issue.

Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Tested-by: default avatarStan Johnson <userm57@yahoo.com>
Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
parent a1eb1cdf
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include <linux/platform_device.h>
#include <linux/adb.h>
#include <linux/cuda.h>
#include <linux/pmu.h>
#include <linux/rtc.h>

#include <asm/setup.h>
@@ -890,6 +891,9 @@ static void __init mac_identify(void)
#ifdef CONFIG_ADB_CUDA
	find_via_cuda();
#endif
#ifdef CONFIG_ADB_PMU68K
	find_via_pmu();
#endif
}

static void __init mac_report_hardware(void)
+61 −28
Original line number Diff line number Diff line
@@ -109,6 +109,7 @@ static int pmu_autopoll(int devs);
void pmu_poll(void);
static int pmu_reset_bus(void);

static int init_pmu(void);
static void pmu_start(void);
static void send_byte(int x);
static void recv_byte(void);
@@ -171,23 +172,76 @@ static s8 pmu_data_len[256][2] = {
/*f8*/	{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
};

int pmu_probe(void)
int __init find_via_pmu(void)
{
	if (macintosh_config->adb_type == MAC_ADB_PB1) {
	switch (macintosh_config->adb_type) {
	case MAC_ADB_PB1:
		pmu_kind = PMU_68K_V1;
	} else if (macintosh_config->adb_type == MAC_ADB_PB2) {
		break;
	case MAC_ADB_PB2:
		pmu_kind = PMU_68K_V2;
	} else {
		break;
	default:
		pmu_kind = PMU_UNKNOWN;
		return -ENODEV;
	}

	pmu_state = idle;

	if (!init_pmu())
		goto fail_init;

	pr_info("adb: PMU 68K driver v0.5 for Unified ADB\n");

	return 1;

fail_init:
	pmu_kind = PMU_UNKNOWN;
	return 0;
}

static int 
pmu_init(void)
static int pmu_probe(void)
{
	if (pmu_kind == PMU_UNKNOWN)
		return -ENODEV;
	return 0;
}

static int pmu_init(void)
{
	if (pmu_kind == PMU_UNKNOWN)
		return -ENODEV;
	return 0;
}

static int __init via_pmu_start(void)
{
	if (pmu_kind == PMU_UNKNOWN)
		return -ENODEV;

	if (request_irq(IRQ_MAC_ADB_SR, pmu_interrupt, 0, "PMU_SR",
			pmu_interrupt)) {
		pr_err("%s: can't get SR irq\n", __func__);
		return -ENODEV;
	}
	if (request_irq(IRQ_MAC_ADB_CL, pmu_interrupt, 0, "PMU_CL",
			pmu_interrupt)) {
		pr_err("%s: can't get CL irq\n", __func__);
		free_irq(IRQ_MAC_ADB_SR, pmu_interrupt);
		return -ENODEV;
	}

	pmu_fully_inited = 1;

	/* Enable backlight */
	pmu_enable_backlight(1);

	return 0;
}

arch_initcall(via_pmu_start);

static int __init init_pmu(void)
{
	int timeout;
	volatile struct adb_request req;
@@ -238,28 +292,7 @@ pmu_init(void)
	bright_req_2.complete = 1;
	bright_req_3.complete = 1;

	if (request_irq(IRQ_MAC_ADB_SR, pmu_interrupt, 0, "pmu-shift",
			pmu_interrupt)) {
		printk(KERN_ERR "pmu_init: can't get irq %d\n",
			IRQ_MAC_ADB_SR);
		return -EAGAIN;
	}
	if (request_irq(IRQ_MAC_ADB_CL, pmu_interrupt, 0, "pmu-clock",
			pmu_interrupt)) {
		printk(KERN_ERR "pmu_init: can't get irq %d\n",
			IRQ_MAC_ADB_CL);
		free_irq(IRQ_MAC_ADB_SR, pmu_interrupt);
		return -EAGAIN;
	}

	pmu_fully_inited = 1;
	
	/* Enable backlight */
	pmu_enable_backlight(1);

	printk("adb: PMU 68K driver v0.5 for Unified ADB.\n");

	return 0;
	return 1;
}

int