|
@@ -306,3 +306,202 @@ static void __init gsia18s_pcf_leds_init(void)
|
|
{
|
|
{
|
|
platform_device_register(&pcf_leds1);
|
|
platform_device_register(&pcf_leds1);
|
|
platform_device_register(&pcf_leds2);
|
|
platform_device_register(&pcf_leds2);
|
|
|
|
+ platform_device_register(&pcf_leds3);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * SPI busses.
|
|
|
|
+ */
|
|
|
|
+static struct spi_board_info gsia18s_spi_devices[] = {
|
|
|
|
+ { /* User accessible spi0, cs0 used for communication with MSP RTC */
|
|
|
|
+ .modalias = "spidev",
|
|
|
|
+ .bus_num = 0,
|
|
|
|
+ .chip_select = 0,
|
|
|
|
+ .max_speed_hz = 580000,
|
|
|
|
+ .mode = SPI_MODE_1,
|
|
|
|
+ },
|
|
|
|
+ { /* User accessible spi1, cs0 used for communication with int. DSP */
|
|
|
|
+ .modalias = "spidev",
|
|
|
|
+ .bus_num = 1,
|
|
|
|
+ .chip_select = 0,
|
|
|
|
+ .max_speed_hz = 5600000,
|
|
|
|
+ .mode = SPI_MODE_0,
|
|
|
|
+ },
|
|
|
|
+ { /* User accessible spi1, cs1 used for communication with ext. DSP */
|
|
|
|
+ .modalias = "spidev",
|
|
|
|
+ .bus_num = 1,
|
|
|
|
+ .chip_select = 1,
|
|
|
|
+ .max_speed_hz = 5600000,
|
|
|
|
+ .mode = SPI_MODE_0,
|
|
|
|
+ },
|
|
|
|
+ { /* User accessible spi1, cs2 used for communication with ext. DSP */
|
|
|
|
+ .modalias = "spidev",
|
|
|
|
+ .bus_num = 1,
|
|
|
|
+ .chip_select = 2,
|
|
|
|
+ .max_speed_hz = 5600000,
|
|
|
|
+ .mode = SPI_MODE_0,
|
|
|
|
+ },
|
|
|
|
+ { /* User accessible spi1, cs3 used for communication with ext. DSP */
|
|
|
|
+ .modalias = "spidev",
|
|
|
|
+ .bus_num = 1,
|
|
|
|
+ .chip_select = 3,
|
|
|
|
+ .max_speed_hz = 5600000,
|
|
|
|
+ .mode = SPI_MODE_0,
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * GPI Buttons
|
|
|
|
+ */
|
|
|
|
+static struct gpio_keys_button buttons[] = {
|
|
|
|
+ {
|
|
|
|
+ .gpio = GPIO_TRIG_NET_IN,
|
|
|
|
+ .code = BTN_1,
|
|
|
|
+ .desc = "TRIG_NET_IN",
|
|
|
|
+ .type = EV_KEY,
|
|
|
|
+ .active_low = 0,
|
|
|
|
+ .wakeup = 1,
|
|
|
|
+ },
|
|
|
|
+ { /* SW80 on the GS_IA18_S-MN board*/
|
|
|
|
+ .gpio = GPIO_CARD_UNMOUNT_0,
|
|
|
|
+ .code = BTN_2,
|
|
|
|
+ .desc = "Card umount 0",
|
|
|
|
+ .type = EV_KEY,
|
|
|
|
+ .active_low = 1,
|
|
|
|
+ .wakeup = 1,
|
|
|
|
+ },
|
|
|
|
+ { /* SW79 on the GS_IA18_S-MN board*/
|
|
|
|
+ .gpio = GPIO_CARD_UNMOUNT_1,
|
|
|
|
+ .code = BTN_3,
|
|
|
|
+ .desc = "Card umount 1",
|
|
|
|
+ .type = EV_KEY,
|
|
|
|
+ .active_low = 1,
|
|
|
|
+ .wakeup = 1,
|
|
|
|
+ },
|
|
|
|
+ { /* SW280 on the GS_IA18-CB board*/
|
|
|
|
+ .gpio = GPIO_KEY_POWER,
|
|
|
|
+ .code = KEY_POWER,
|
|
|
|
+ .desc = "Power Off Button",
|
|
|
|
+ .type = EV_KEY,
|
|
|
|
+ .active_low = 0,
|
|
|
|
+ .wakeup = 1,
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct gpio_keys_platform_data button_data = {
|
|
|
|
+ .buttons = buttons,
|
|
|
|
+ .nbuttons = ARRAY_SIZE(buttons),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct platform_device button_device = {
|
|
|
|
+ .name = "gpio-keys",
|
|
|
|
+ .id = -1,
|
|
|
|
+ .num_resources = 0,
|
|
|
|
+ .dev = {
|
|
|
|
+ .platform_data = &button_data,
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static void __init gsia18s_add_device_buttons(void)
|
|
|
|
+{
|
|
|
|
+ at91_set_gpio_input(GPIO_TRIG_NET_IN, 1);
|
|
|
|
+ at91_set_deglitch(GPIO_TRIG_NET_IN, 1);
|
|
|
|
+ at91_set_gpio_input(GPIO_CARD_UNMOUNT_0, 1);
|
|
|
|
+ at91_set_deglitch(GPIO_CARD_UNMOUNT_0, 1);
|
|
|
|
+ at91_set_gpio_input(GPIO_CARD_UNMOUNT_1, 1);
|
|
|
|
+ at91_set_deglitch(GPIO_CARD_UNMOUNT_1, 1);
|
|
|
|
+ at91_set_gpio_input(GPIO_KEY_POWER, 0);
|
|
|
|
+ at91_set_deglitch(GPIO_KEY_POWER, 1);
|
|
|
|
+
|
|
|
|
+ platform_device_register(&button_device);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * I2C
|
|
|
|
+ */
|
|
|
|
+static int pcf8574x_0x20_setup(struct i2c_client *client, int gpio,
|
|
|
|
+ unsigned int ngpio, void *context)
|
|
|
|
+{
|
|
|
|
+ int status;
|
|
|
|
+
|
|
|
|
+ status = gpio_request(gpio + PCF_GPIO_ETH_DETECT, "eth_det");
|
|
|
|
+ if (status < 0) {
|
|
|
|
+ pr_err("error: can't request GPIO%d\n",
|
|
|
|
+ gpio + PCF_GPIO_ETH_DETECT);
|
|
|
|
+ return status;
|
|
|
|
+ }
|
|
|
|
+ status = gpio_direction_input(gpio + PCF_GPIO_ETH_DETECT);
|
|
|
|
+ if (status < 0) {
|
|
|
|
+ pr_err("error: can't setup GPIO%d as input\n",
|
|
|
|
+ gpio + PCF_GPIO_ETH_DETECT);
|
|
|
|
+ return status;
|
|
|
|
+ }
|
|
|
|
+ status = gpio_export(gpio + PCF_GPIO_ETH_DETECT, false);
|
|
|
|
+ if (status < 0) {
|
|
|
|
+ pr_err("error: can't export GPIO%d\n",
|
|
|
|
+ gpio + PCF_GPIO_ETH_DETECT);
|
|
|
|
+ return status;
|
|
|
|
+ }
|
|
|
|
+ status = gpio_sysfs_set_active_low(gpio + PCF_GPIO_ETH_DETECT, 1);
|
|
|
|
+ if (status < 0) {
|
|
|
|
+ pr_err("error: gpio_sysfs_set active_low(GPIO%d, 1)\n",
|
|
|
|
+ gpio + PCF_GPIO_ETH_DETECT);
|
|
|
|
+ return status;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int pcf8574x_0x20_teardown(struct i2c_client *client, int gpio,
|
|
|
|
+ unsigned ngpio, void *context)
|
|
|
|
+{
|
|
|
|
+ gpio_free(gpio + PCF_GPIO_ETH_DETECT);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct pcf857x_platform_data pcf20_pdata = {
|
|
|
|
+ .gpio_base = GS_IA18_S_PCF_GPIO_BASE0,
|
|
|
|
+ .n_latch = (1 << 4),
|
|
|
|
+ .setup = pcf8574x_0x20_setup,
|
|
|
|
+ .teardown = pcf8574x_0x20_teardown,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct pcf857x_platform_data pcf22_pdata = {
|
|
|
|
+ .gpio_base = GS_IA18_S_PCF_GPIO_BASE1,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct pcf857x_platform_data pcf24_pdata = {
|
|
|
|
+ .gpio_base = GS_IA18_S_PCF_GPIO_BASE2,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct i2c_board_info __initdata gsia18s_i2c_devices[] = {
|
|
|
|
+ { /* U1 on the GS_IA18-CB_V3 board */
|
|
|
|
+ I2C_BOARD_INFO("pcf8574", 0x20),
|
|
|
|
+ .platform_data = &pcf20_pdata,
|
|
|
|
+ },
|
|
|
|
+ { /* U1 on the GS_2G_OPT1-A_V0 board (Alarm) */
|
|
|
|
+ I2C_BOARD_INFO("pcf8574", 0x22),
|
|
|
|
+ .platform_data = &pcf22_pdata,
|
|
|
|
+ },
|
|
|
|
+ { /* U1 on the GS_2G-OPT23-A_V0 board (Modem) */
|
|
|
|
+ I2C_BOARD_INFO("pcf8574", 0x24),
|
|
|
|
+ .platform_data = &pcf24_pdata,
|
|
|
|
+ },
|
|
|
|
+ { /* U161 on the GS_IA18_S-MN board */
|
|
|
|
+ I2C_BOARD_INFO("24c1024", 0x50),
|
|
|
|
+ },
|
|
|
|
+ { /* U162 on the GS_IA18_S-MN board */
|
|
|
|
+ I2C_BOARD_INFO("24c01", 0x53),
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Compact Flash
|
|
|
|
+ */
|
|
|
|
+static struct at91_cf_data __initdata gsia18s_cf1_data = {
|
|
|
|
+ .irq_pin = AT91_PIN_PA27,
|
|
|
|
+ .det_pin = AT91_PIN_PB30,
|
|
|
|
+ .vcc_pin = -EINVAL,
|
|
|
|
+ .rst_pin = AT91_PIN_PB31,
|
|
|
|
+ .chipselect = 5,
|
|
|
|
+ .flags = AT91_CF_TRUE_IDE,
|