This patch adds support for Sharp CE-RH2 on Akita and CE-RH1 on C7x0. This patch is a bit ugly: - Device specific functions should be moved to platform infrastructure. - Maybe define generic *_scoopexp functions handling Akita x Spitz differences. Index: linux-2.6.24/drivers/input/keyboard/sharpsl_rc.c =================================================================== --- linux-2.6.24.orig/drivers/input/keyboard/sharpsl_rc.c 2008-03-08 19:29:02.000000000 +0000 +++ linux-2.6.24/drivers/input/keyboard/sharpsl_rc.c 2008-03-08 22:23:35.000000000 +0000 @@ -21,12 +21,10 @@ #include #include -#ifdef CONFIG_MACH_SPITZ +#include #include -#endif -#ifdef CONFIG_MACH_CORGI +#include #include -#endif #include #include @@ -42,12 +40,8 @@ unsigned char key; }; -#ifdef CONFIG_MACH_SPITZ -#define REMOTE_AKIN_PULLUP SPITZ_SCP2_AKIN_PULLUP -#define REMOTE_SCOOP_DEVICE spitzscoop2_device -#define REMOTE_GPIO_INT SPITZ_GPIO_AK_INT -#define REMOTE_IRQ_INT SPITZ_IRQ_GPIO_AK_INT -static struct remote_control_key remote_keys[] = { +static struct remote_control_key remote_keys_spitz[] = { + /* CE-RH2 values */ { 25, 35, KEY_STOPCD}, { 55, 65, KEY_PLAYPAUSE}, { 85, 95, KEY_NEXTSONG}, @@ -56,23 +50,15 @@ { 180, 190, KEY_MUTE}, { 215, 225, KEY_VOLUMEDOWN}, }; -#endif -#ifdef CONFIG_MACH_CORGI -#define REMOTE_AKIN_PULLUP CORGI_SCP_AKIN_PULLUP -#define REMOTE_SCOOP_DEVICE corgiscoop_device -#define REMOTE_GPIO_INT CORGI_GPIO_AK_INT -#define REMOTE_IRQ_INT CORGI_IRQ_GPIO_AK_INT -static struct remote_control_key remote_keys[] = { - //These need to be fixed for the CE-RH1's values - { 25, 35, KEY_STOPCD}, - { 55, 65, KEY_PLAYPAUSE}, - { 85, 95, KEY_NEXTSONG}, - { 115, 125, KEY_VOLUMEUP}, - { 145, 155, KEY_PREVIOUSSONG}, - { 180, 190, KEY_MUTE}, - { 215, 225, KEY_VOLUMEDOWN}, +static struct remote_control_key remote_keys_corgi[] = { + /* CE-RH1 values */ + { 27, 35, KEY_STOPCD}, + { 7, 13, KEY_PLAYPAUSE}, + { 77, 93, KEY_NEXTSONG}, + { 115, 132, KEY_VOLUMEUP}, + { 46, 58, KEY_PREVIOUSSONG}, + { 170, 186, KEY_VOLUMEDOWN}, }; -#endif #define RELEASE_HI 230 #define MAX_EARPHONE 6 @@ -98,9 +84,17 @@ static int get_remocon_raw(void) { int i, val; + struct remote_control_key *remote_keys; + + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) + remote_keys = remote_keys_spitz; + else + remote_keys = remote_keys_corgi; val = sharpsl_pm_pxa_read_max1111(MAX1111_REMCOM); - for (i = 0; i < ARRAY_SIZE(remote_keys); ++i) { + for (i = 0; i < (machine_is_borzoi() || machine_is_spitz() || machine_is_akita() ? + ARRAY_SIZE(remote_keys_spitz) : ARRAY_SIZE(remote_keys_corgi)); + ++i) { if (val >= remote_keys[i].min && val <= remote_keys[i].max) { printk("get_remocon_raw: VAL=%i, KEY=%i\n", val, remote_keys[i].key); @@ -121,8 +115,12 @@ data->state = 0; data->last_key = 0; - reset_scoop_gpio(&REMOTE_SCOOP_DEVICE.dev, REMOTE_AKIN_PULLUP); - + if (machine_is_borzoi() || machine_is_spitz()) + reset_scoop_gpio(platform_scoop_config->devs[1].dev, SPITZ_SCP2_AKIN_PULLUP); + else if (machine_is_akita()) + akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_AKIN_PULLUP); + else + reset_scoop_gpio(platform_scoop_config->devs[0].dev, CORGI_SCP_AKIN_PULLUP); mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS)); } return IRQ_HANDLED; @@ -182,7 +180,12 @@ if (timer) { mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS)); } else { - set_scoop_gpio(&REMOTE_SCOOP_DEVICE.dev, REMOTE_AKIN_PULLUP); + if (machine_is_borzoi() || machine_is_spitz()) + set_scoop_gpio(platform_scoop_config->devs[1].dev, SPITZ_SCP2_AKIN_PULLUP); + else if (machine_is_akita()) + akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_AKIN_PULLUP); + else + set_scoop_gpio(platform_scoop_config->devs[0].dev, CORGI_SCP_AKIN_PULLUP); data->handling_press = 0; } } @@ -192,6 +195,7 @@ struct sharpsl_rc *sharpsl_rc; struct input_dev *input_dev; int i, ret; + struct remote_control_key *remote_keys; dev_dbg(&pdev->dev, "sharpsl_rc_probe\n"); @@ -225,17 +229,32 @@ input_dev->evbit[0] = BIT(EV_KEY); - for (i = 0; i <= ARRAY_SIZE(remote_keys); i++) + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) + remote_keys = remote_keys_spitz; + else + remote_keys = remote_keys_corgi; + for (i = 0; i < (machine_is_borzoi() || machine_is_spitz() || machine_is_akita() ? + ARRAY_SIZE(remote_keys_spitz) : ARRAY_SIZE(remote_keys_corgi)); + ++i) set_bit(remote_keys[i].key, input_dev->keybit); input_register_device(sharpsl_rc->input); - pxa_gpio_mode(REMOTE_GPIO_INT | GPIO_IN); - ret = request_irq(REMOTE_IRQ_INT, - sharpsl_rc_interrupt, - IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED, - "sharpsl_rc", - sharpsl_rc); + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) { + pxa_gpio_mode(SPITZ_GPIO_AK_INT | GPIO_IN); + ret = request_irq(SPITZ_IRQ_GPIO_AK_INT, + sharpsl_rc_interrupt, + IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED, + "sharpsl_rc", + sharpsl_rc); + } else { + pxa_gpio_mode(CORGI_GPIO_AK_INT | GPIO_IN); + ret = request_irq(CORGI_IRQ_GPIO_AK_INT, + sharpsl_rc_interrupt, + IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED, + "sharpsl_rc", + sharpsl_rc); + } if (ret < 0) { dev_dbg(&pdev->dev, "Can't get IRQ: %d!\n", i); kfree(sharpsl_rc); @@ -252,7 +271,10 @@ dev_dbg(&pdev->dev, "sharpsl_rc_remove\n"); - free_irq(REMOTE_IRQ_INT, sharpsl_rc); + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) + free_irq(SPITZ_IRQ_GPIO_AK_INT, sharpsl_rc); + else + free_irq(CORGI_IRQ_GPIO_AK_INT, sharpsl_rc); del_timer_sync(&sharpsl_rc->rctimer); input_unregister_device(sharpsl_rc->input); kfree(sharpsl_rc);