|
@@ -224,7 +224,7 @@ int get_gpio_by_name(const char *name)
|
|
if (!strncmp(name, pentry->pin_name, SFI_NAME_LEN))
|
|
if (!strncmp(name, pentry->pin_name, SFI_NAME_LEN))
|
|
return pentry->pin_no;
|
|
return pentry->pin_no;
|
|
}
|
|
}
|
|
- return -1;
|
|
|
|
|
|
+ return -EINVAL;
|
|
}
|
|
}
|
|
|
|
|
|
void __init intel_scu_device_register(struct platform_device *pdev)
|
|
void __init intel_scu_device_register(struct platform_device *pdev)
|
|
@@ -250,7 +250,7 @@ static void __init intel_scu_spi_device_register(struct spi_board_info *sdev)
|
|
sdev->modalias);
|
|
sdev->modalias);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- memcpy(new_dev, sdev, sizeof(*sdev));
|
|
|
|
|
|
+ *new_dev = *sdev;
|
|
|
|
|
|
spi_devs[spi_next_dev++] = new_dev;
|
|
spi_devs[spi_next_dev++] = new_dev;
|
|
}
|
|
}
|
|
@@ -271,7 +271,7 @@ static void __init intel_scu_i2c_device_register(int bus,
|
|
idev->type);
|
|
idev->type);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- memcpy(new_dev, idev, sizeof(*idev));
|
|
|
|
|
|
+ *new_dev = *idev;
|
|
|
|
|
|
i2c_bus[i2c_next_dev] = bus;
|
|
i2c_bus[i2c_next_dev] = bus;
|
|
i2c_devs[i2c_next_dev++] = new_dev;
|
|
i2c_devs[i2c_next_dev++] = new_dev;
|
|
@@ -337,6 +337,8 @@ static void __init sfi_handle_ipc_dev(struct sfi_device_table_entry *pentry,
|
|
pr_debug("IPC bus, name = %16.16s, irq = 0x%2x\n",
|
|
pr_debug("IPC bus, name = %16.16s, irq = 0x%2x\n",
|
|
pentry->name, pentry->irq);
|
|
pentry->name, pentry->irq);
|
|
pdata = intel_mid_sfi_get_pdata(dev, pentry);
|
|
pdata = intel_mid_sfi_get_pdata(dev, pentry);
|
|
|
|
+ if (IS_ERR(pdata))
|
|
|
|
+ return;
|
|
|
|
|
|
pdev = platform_device_alloc(pentry->name, 0);
|
|
pdev = platform_device_alloc(pentry->name, 0);
|
|
if (pdev == NULL) {
|
|
if (pdev == NULL) {
|
|
@@ -370,6 +372,8 @@ static void __init sfi_handle_spi_dev(struct sfi_device_table_entry *pentry,
|
|
spi_info.chip_select);
|
|
spi_info.chip_select);
|
|
|
|
|
|
pdata = intel_mid_sfi_get_pdata(dev, &spi_info);
|
|
pdata = intel_mid_sfi_get_pdata(dev, &spi_info);
|
|
|
|
+ if (IS_ERR(pdata))
|
|
|
|
+ return;
|
|
|
|
|
|
spi_info.platform_data = pdata;
|
|
spi_info.platform_data = pdata;
|
|
if (dev->delay)
|
|
if (dev->delay)
|
|
@@ -395,6 +399,8 @@ static void __init sfi_handle_i2c_dev(struct sfi_device_table_entry *pentry,
|
|
i2c_info.addr);
|
|
i2c_info.addr);
|
|
pdata = intel_mid_sfi_get_pdata(dev, &i2c_info);
|
|
pdata = intel_mid_sfi_get_pdata(dev, &i2c_info);
|
|
i2c_info.platform_data = pdata;
|
|
i2c_info.platform_data = pdata;
|
|
|
|
+ if (IS_ERR(pdata))
|
|
|
|
+ return;
|
|
|
|
|
|
if (dev->delay)
|
|
if (dev->delay)
|
|
intel_scu_i2c_device_register(pentry->host_num, &i2c_info);
|
|
intel_scu_i2c_device_register(pentry->host_num, &i2c_info);
|
|
@@ -443,13 +449,35 @@ static int __init sfi_parse_devs(struct sfi_table_header *table)
|
|
* so we have to enable them one by one here
|
|
* so we have to enable them one by one here
|
|
*/
|
|
*/
|
|
ioapic = mp_find_ioapic(irq);
|
|
ioapic = mp_find_ioapic(irq);
|
|
- irq_attr.ioapic = ioapic;
|
|
|
|
- irq_attr.ioapic_pin = irq;
|
|
|
|
- irq_attr.trigger = 1;
|
|
|
|
- irq_attr.polarity = 1;
|
|
|
|
- io_apic_set_pci_routing(NULL, irq, &irq_attr);
|
|
|
|
- } else
|
|
|
|
|
|
+ if (ioapic >= 0) {
|
|
|
|
+ irq_attr.ioapic = ioapic;
|
|
|
|
+ irq_attr.ioapic_pin = irq;
|
|
|
|
+ irq_attr.trigger = 1;
|
|
|
|
+ if (intel_mid_identify_cpu() ==
|
|
|
|
+ INTEL_MID_CPU_CHIP_TANGIER) {
|
|
|
|
+ if (!strncmp(pentry->name,
|
|
|
|
+ "r69001-ts-i2c", 13))
|
|
|
|
+ /* active low */
|
|
|
|
+ irq_attr.polarity = 1;
|
|
|
|
+ else if (!strncmp(pentry->name,
|
|
|
|
+ "synaptics_3202", 14))
|
|
|
|
+ /* active low */
|
|
|
|
+ irq_attr.polarity = 1;
|
|
|
|
+ else if (irq == 41)
|
|
|
|
+ /* fast_int_1 */
|
|
|
|
+ irq_attr.polarity = 1;
|
|
|
|
+ else
|
|
|
|
+ /* active high */
|
|
|
|
+ irq_attr.polarity = 0;
|
|
|
|
+ } else {
|
|
|
|
+ /* PNW and CLV go with active low */
|
|
|
|
+ irq_attr.polarity = 1;
|
|
|
|
+ }
|
|
|
|
+ io_apic_set_pci_routing(NULL, irq, &irq_attr);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
irq = 0; /* No irq */
|
|
irq = 0; /* No irq */
|
|
|
|
+ }
|
|
|
|
|
|
dev = get_device_id(pentry->type, pentry->name);
|
|
dev = get_device_id(pentry->type, pentry->name);
|
|
|
|
|