Merge tag 'davinci-for-v5.1/soc-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci into arm/fixes
DaVinci SoC updates for v5.1 (part 2) This pull request contains changes needed to help get rid of hard-coded GPIO base value passed from DaVinci platform data. The OHCI related changes also help by moving over-current support from board-files to OHCI driver making future DT-coversion easy. The OHCI parts are acked by its maintainer. * tag 'davinci-for-v5.1/soc-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci: usb: ohci-da8xx: remove unused callbacks from platform data ARM: davinci: da830-evm: remove legacy usb helpers ARM: davinci: omapl138-hawk: remove legacy usb helpers usb: ohci-da8xx: add vbus and overcurrent gpios ARM: davinci: da830-evm: use gpio lookup entries for usb gpios ARM: davinci: omapl138-hawk: use gpio lookup entries for usb gpios usb: ohci-da8xx: add a helper pointer to &pdev->dev usb: ohci-da8xx: add a new line after local variables ARM: davinci: da850-evm: use GPIO hogs instead of the legacy API ARM: davinci: mityomapl138: use device properties for at24 eeprom ARM: davinci: mityomapl138: use nvmem notifiers ARM: davinci: remove dead code related to MAC address reading ARM: davinci: sffsdr: use device properties for at24 eeprom ARM: davinci: sffsdr: fix the at24 eeprom device name ARM: davinci: dm646x-evm: use device properties for at24 eeprom ARM: davinci: dm644x-evm: use device properties for at24 eeprom ARM: davinci: da830-evm: use device properties for at24 eeprom ARM: davinci: dm365-evm: use device properties for at24 eeprom ARM: davinci: mityomapl138: don't read the MAC address from machine code ARM: davinci: da850-evm: remove dead MTD code Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
b8961b1eb7
|
@ -18,7 +18,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_data/pcf857x.h>
|
||||
#include <linux/platform_data/at24.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
@ -52,62 +52,19 @@ static const short da830_evm_usb11_pins[] = {
|
|||
-1
|
||||
};
|
||||
|
||||
static da8xx_ocic_handler_t da830_evm_usb_ocic_handler;
|
||||
|
||||
static int da830_evm_usb_set_power(unsigned port, int on)
|
||||
{
|
||||
gpio_set_value(ON_BD_USB_DRV, on);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int da830_evm_usb_get_power(unsigned port)
|
||||
{
|
||||
return gpio_get_value(ON_BD_USB_DRV);
|
||||
}
|
||||
|
||||
static int da830_evm_usb_get_oci(unsigned port)
|
||||
{
|
||||
return !gpio_get_value(ON_BD_USB_OVC);
|
||||
}
|
||||
|
||||
static irqreturn_t da830_evm_usb_ocic_irq(int, void *);
|
||||
|
||||
static int da830_evm_usb_ocic_notify(da8xx_ocic_handler_t handler)
|
||||
{
|
||||
int irq = gpio_to_irq(ON_BD_USB_OVC);
|
||||
int error = 0;
|
||||
|
||||
if (handler != NULL) {
|
||||
da830_evm_usb_ocic_handler = handler;
|
||||
|
||||
error = request_irq(irq, da830_evm_usb_ocic_irq,
|
||||
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
|
||||
"OHCI over-current indicator", NULL);
|
||||
if (error)
|
||||
pr_err("%s: could not request IRQ to watch over-current indicator changes\n",
|
||||
__func__);
|
||||
} else
|
||||
free_irq(irq, NULL);
|
||||
|
||||
return error;
|
||||
}
|
||||
static struct gpiod_lookup_table da830_evm_usb_gpio_lookup = {
|
||||
.dev_id = "ohci-da8xx",
|
||||
.table = {
|
||||
GPIO_LOOKUP("davinci_gpio", ON_BD_USB_DRV, "vbus", 0),
|
||||
GPIO_LOOKUP("davinci_gpio", ON_BD_USB_OVC, "oc", 0),
|
||||
},
|
||||
};
|
||||
|
||||
static struct da8xx_ohci_root_hub da830_evm_usb11_pdata = {
|
||||
.set_power = da830_evm_usb_set_power,
|
||||
.get_power = da830_evm_usb_get_power,
|
||||
.get_oci = da830_evm_usb_get_oci,
|
||||
.ocic_notify = da830_evm_usb_ocic_notify,
|
||||
|
||||
/* TPS2065 switch @ 5V */
|
||||
.potpgt = (3 + 1) / 2, /* 3 ms max */
|
||||
};
|
||||
|
||||
static irqreturn_t da830_evm_usb_ocic_irq(int irq, void *dev_id)
|
||||
{
|
||||
da830_evm_usb_ocic_handler(&da830_evm_usb11_pdata, 1);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static __init void da830_evm_usb_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
@ -142,21 +99,7 @@ static __init void da830_evm_usb_init(void)
|
|||
return;
|
||||
}
|
||||
|
||||
ret = gpio_request(ON_BD_USB_DRV, "ON_BD_USB_DRV");
|
||||
if (ret) {
|
||||
pr_err("%s: failed to request GPIO for USB 1.1 port power control: %d\n",
|
||||
__func__, ret);
|
||||
return;
|
||||
}
|
||||
gpio_direction_output(ON_BD_USB_DRV, 0);
|
||||
|
||||
ret = gpio_request(ON_BD_USB_OVC, "ON_BD_USB_OVC");
|
||||
if (ret) {
|
||||
pr_err("%s: failed to request GPIO for USB 1.1 port over-current indicator: %d\n",
|
||||
__func__, ret);
|
||||
return;
|
||||
}
|
||||
gpio_direction_input(ON_BD_USB_OVC);
|
||||
gpiod_add_lookup_table(&da830_evm_usb_gpio_lookup);
|
||||
|
||||
ret = da8xx_register_usb11(&da830_evm_usb11_pdata);
|
||||
if (ret)
|
||||
|
@ -457,12 +400,9 @@ static struct nvmem_cell_lookup da830_evm_nvmem_cell_lookup = {
|
|||
.con_id = "mac-address",
|
||||
};
|
||||
|
||||
static struct at24_platform_data da830_evm_i2c_eeprom_info = {
|
||||
.byte_len = SZ_256K / 8,
|
||||
.page_size = 64,
|
||||
.flags = AT24_FLAG_ADDR16,
|
||||
.setup = davinci_get_mac_addr,
|
||||
.context = (void *)0x7f00,
|
||||
static const struct property_entry da830_evm_i2c_eeprom_properties[] = {
|
||||
PROPERTY_ENTRY_U32("pagesize", 64),
|
||||
{ }
|
||||
};
|
||||
|
||||
static int __init da830_evm_ui_expander_setup(struct i2c_client *client,
|
||||
|
@ -496,7 +436,7 @@ static struct pcf857x_platform_data __initdata da830_evm_ui_expander_info = {
|
|||
static struct i2c_board_info __initdata da830_evm_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("24c256", 0x50),
|
||||
.platform_data = &da830_evm_i2c_eeprom_info,
|
||||
.properties = da830_evm_i2c_eeprom_properties,
|
||||
},
|
||||
{
|
||||
I2C_BOARD_INFO("tlv320aic3x", 0x18),
|
||||
|
|
|
@ -150,32 +150,6 @@ static struct spi_board_info da850evm_spi_info[] = {
|
|||
},
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MTD
|
||||
static void da850_evm_m25p80_notify_add(struct mtd_info *mtd)
|
||||
{
|
||||
char *mac_addr = davinci_soc_info.emac_pdata->mac_addr;
|
||||
size_t retlen;
|
||||
|
||||
if (!strcmp(mtd->name, "MAC-Address")) {
|
||||
mtd_read(mtd, 0, ETH_ALEN, &retlen, mac_addr);
|
||||
if (retlen == ETH_ALEN)
|
||||
pr_info("Read MAC addr from SPI Flash: %pM\n",
|
||||
mac_addr);
|
||||
}
|
||||
}
|
||||
|
||||
static struct mtd_notifier da850evm_spi_notifier = {
|
||||
.add = da850_evm_m25p80_notify_add,
|
||||
};
|
||||
|
||||
static void da850_evm_setup_mac_addr(void)
|
||||
{
|
||||
register_mtd_user(&da850evm_spi_notifier);
|
||||
}
|
||||
#else
|
||||
static void da850_evm_setup_mac_addr(void) { }
|
||||
#endif
|
||||
|
||||
static struct mtd_partition da850_evm_norflash_partition[] = {
|
||||
{
|
||||
.name = "bootloaders + env",
|
||||
|
@ -1064,6 +1038,17 @@ static const short da850_evm_rmii_pins[] = {
|
|||
-1
|
||||
};
|
||||
|
||||
static struct gpiod_hog da850_evm_emac_gpio_hogs[] = {
|
||||
{
|
||||
.chip_label = "davinci_gpio",
|
||||
.chip_hwnum = DA850_MII_MDIO_CLKEN_PIN,
|
||||
.line_name = "mdio_clk_en",
|
||||
.lflags = 0,
|
||||
/* dflags set in da850_evm_config_emac() */
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
static int __init da850_evm_config_emac(void)
|
||||
{
|
||||
void __iomem *cfg_chip3_base;
|
||||
|
@ -1102,14 +1087,9 @@ static int __init da850_evm_config_emac(void)
|
|||
if (ret)
|
||||
pr_warn("%s:GPIO(2,6) mux setup failed\n", __func__);
|
||||
|
||||
ret = gpio_request(DA850_MII_MDIO_CLKEN_PIN, "mdio_clk_en");
|
||||
if (ret) {
|
||||
pr_warn("Cannot open GPIO %d\n", DA850_MII_MDIO_CLKEN_PIN);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Enable/Disable MII MDIO clock */
|
||||
gpio_direction_output(DA850_MII_MDIO_CLKEN_PIN, rmii_en);
|
||||
da850_evm_emac_gpio_hogs[0].dflags = rmii_en ? GPIOD_OUT_HIGH
|
||||
: GPIOD_OUT_LOW;
|
||||
gpiod_add_hogs(da850_evm_emac_gpio_hogs);
|
||||
|
||||
soc_info->emac_pdata->phy_id = DA850_EVM_PHY_ID;
|
||||
|
||||
|
@ -1494,8 +1474,6 @@ static __init void da850_evm_init(void)
|
|||
if (ret)
|
||||
pr_warn("%s: SATA registration failed: %d\n", __func__, ret);
|
||||
|
||||
da850_evm_setup_mac_addr();
|
||||
|
||||
ret = da8xx_register_rproc();
|
||||
if (ret)
|
||||
pr_warn("%s: dsp/rproc registration failed: %d\n",
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/platform_data/at24.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
@ -225,18 +225,15 @@ static struct nvmem_cell_lookup davinci_nvmem_cell_lookup = {
|
|||
.con_id = "mac-address",
|
||||
};
|
||||
|
||||
static struct at24_platform_data eeprom_info = {
|
||||
.byte_len = (256*1024) / 8,
|
||||
.page_size = 64,
|
||||
.flags = AT24_FLAG_ADDR16,
|
||||
.setup = davinci_get_mac_addr,
|
||||
.context = (void *)0x7f00,
|
||||
static const struct property_entry eeprom_properties[] = {
|
||||
PROPERTY_ENTRY_U32("pagesize", 64),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct i2c_board_info i2c_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("24c256", 0x50),
|
||||
.platform_data = &eeprom_info,
|
||||
.properties = eeprom_properties,
|
||||
},
|
||||
{
|
||||
I2C_BOARD_INFO("tlv320aic3x", 0x18),
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
#include <linux/gpio/machine.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_data/pcf857x.h>
|
||||
#include <linux/platform_data/at24.h>
|
||||
#include <linux/platform_data/gpio-davinci.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/rawnand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
@ -532,12 +532,9 @@ static struct nvmem_cell_lookup dm644evm_nvmem_cell_lookup = {
|
|||
.con_id = "mac-address",
|
||||
};
|
||||
|
||||
static struct at24_platform_data eeprom_info = {
|
||||
.byte_len = (256*1024) / 8,
|
||||
.page_size = 64,
|
||||
.flags = AT24_FLAG_ADDR16,
|
||||
.setup = davinci_get_mac_addr,
|
||||
.context = (void *)0x7f00,
|
||||
static const struct property_entry eeprom_properties[] = {
|
||||
PROPERTY_ENTRY_U32("pagesize", 64),
|
||||
{ }
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -647,7 +644,7 @@ static struct i2c_board_info __initdata i2c_info[] = {
|
|||
},
|
||||
{
|
||||
I2C_BOARD_INFO("24c256", 0x50),
|
||||
.platform_data = &eeprom_info,
|
||||
.properties = eeprom_properties,
|
||||
},
|
||||
{
|
||||
I2C_BOARD_INFO("tlv320aic33", 0x1b),
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include <linux/gpio.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_data/at24.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/platform_data/pcf857x.h>
|
||||
#include <linux/platform_data/ti-aemif.h>
|
||||
|
||||
|
@ -364,12 +364,9 @@ static struct nvmem_cell_lookup dm646x_evm_nvmem_cell_lookup = {
|
|||
.con_id = "mac-address",
|
||||
};
|
||||
|
||||
static struct at24_platform_data eeprom_info = {
|
||||
.byte_len = (256*1024) / 8,
|
||||
.page_size = 64,
|
||||
.flags = AT24_FLAG_ADDR16,
|
||||
.setup = davinci_get_mac_addr,
|
||||
.context = (void *)0x7f00,
|
||||
static const struct property_entry eeprom_properties[] = {
|
||||
PROPERTY_ENTRY_U32("pagesize", 64),
|
||||
{ }
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@ -440,7 +437,7 @@ static void evm_init_cpld(void)
|
|||
static struct i2c_board_info __initdata i2c_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("24c256", 0x50),
|
||||
.platform_data = &eeprom_info,
|
||||
.properties = eeprom_properties,
|
||||
},
|
||||
{
|
||||
I2C_BOARD_INFO("pcf8574a", 0x38),
|
||||
|
|
|
@ -14,11 +14,13 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/nvmem-consumer.h>
|
||||
#include <linux/nvmem-provider.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_data/at24.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
|
@ -117,11 +119,15 @@ static void mityomapl138_cpufreq_init(const char *partnum)
|
|||
static void mityomapl138_cpufreq_init(const char *partnum) { }
|
||||
#endif
|
||||
|
||||
static void read_factory_config(struct nvmem_device *nvmem, void *context)
|
||||
static int read_factory_config(struct notifier_block *nb,
|
||||
unsigned long event, void *data)
|
||||
{
|
||||
int ret;
|
||||
const char *partnum = NULL;
|
||||
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
||||
struct nvmem_device *nvmem = data;
|
||||
|
||||
if (strcmp(nvmem_dev_name(nvmem), "1-00500") != 0)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (!IS_BUILTIN(CONFIG_NVMEM)) {
|
||||
pr_warn("Factory Config not available without CONFIG_NVMEM\n");
|
||||
|
@ -147,21 +153,20 @@ static void read_factory_config(struct nvmem_device *nvmem, void *context)
|
|||
goto bad_config;
|
||||
}
|
||||
|
||||
pr_info("Found MAC = %pM\n", factory_config.mac);
|
||||
if (is_valid_ether_addr(factory_config.mac))
|
||||
memcpy(soc_info->emac_pdata->mac_addr,
|
||||
factory_config.mac, ETH_ALEN);
|
||||
else
|
||||
pr_warn("Invalid MAC found in factory config block\n");
|
||||
|
||||
partnum = factory_config.partnum;
|
||||
pr_info("Part Number = %s\n", partnum);
|
||||
|
||||
bad_config:
|
||||
/* default maximum speed is valid for all platforms */
|
||||
mityomapl138_cpufreq_init(partnum);
|
||||
|
||||
return NOTIFY_STOP;
|
||||
}
|
||||
|
||||
static struct notifier_block mityomapl138_nvmem_notifier = {
|
||||
.notifier_call = read_factory_config,
|
||||
};
|
||||
|
||||
/*
|
||||
* We don't define a cell for factory config as it will be accessed from the
|
||||
* board file using the nvmem notifier chain.
|
||||
|
@ -187,12 +192,10 @@ static struct nvmem_cell_lookup mityomapl138_nvmem_cell_lookup = {
|
|||
.con_id = "mac-address",
|
||||
};
|
||||
|
||||
static struct at24_platform_data mityomapl138_fd_chip = {
|
||||
.byte_len = 256,
|
||||
.page_size = 8,
|
||||
.flags = AT24_FLAG_READONLY | AT24_FLAG_IRUGO,
|
||||
.setup = read_factory_config,
|
||||
.context = NULL,
|
||||
static const struct property_entry mityomapl138_fd_chip_properties[] = {
|
||||
PROPERTY_ENTRY_U32("pagesize", 8),
|
||||
PROPERTY_ENTRY_BOOL("read-only"),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct davinci_i2c_platform_data mityomap_i2c_0_pdata = {
|
||||
|
@ -321,7 +324,7 @@ static struct i2c_board_info __initdata mityomap_tps65023_info[] = {
|
|||
},
|
||||
{
|
||||
I2C_BOARD_INFO("24c02", 0x50),
|
||||
.platform_data = &mityomapl138_fd_chip,
|
||||
.properties = mityomapl138_fd_chip_properties,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -569,6 +572,7 @@ static void __init mityomapl138_init(void)
|
|||
|
||||
davinci_serial_init(da8xx_serial_device);
|
||||
|
||||
nvmem_register_notifier(&mityomapl138_nvmem_notifier);
|
||||
nvmem_add_cell_table(&mityomapl138_nvmem_cell_table);
|
||||
nvmem_add_cell_lookups(&mityomapl138_nvmem_cell_lookup, 1);
|
||||
|
||||
|
|
|
@ -294,66 +294,24 @@ static int omapl138_hawk_register_aemif(void)
|
|||
return platform_device_register(&omapl138_hawk_aemif_device);
|
||||
}
|
||||
|
||||
static irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id);
|
||||
static da8xx_ocic_handler_t hawk_usb_ocic_handler;
|
||||
|
||||
static const short da850_hawk_usb11_pins[] = {
|
||||
DA850_GPIO2_4, DA850_GPIO6_13,
|
||||
-1
|
||||
};
|
||||
|
||||
static int hawk_usb_set_power(unsigned port, int on)
|
||||
{
|
||||
gpio_set_value(DA850_USB1_VBUS_PIN, on);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hawk_usb_get_power(unsigned port)
|
||||
{
|
||||
return gpio_get_value(DA850_USB1_VBUS_PIN);
|
||||
}
|
||||
|
||||
static int hawk_usb_get_oci(unsigned port)
|
||||
{
|
||||
return !gpio_get_value(DA850_USB1_OC_PIN);
|
||||
}
|
||||
|
||||
static int hawk_usb_ocic_notify(da8xx_ocic_handler_t handler)
|
||||
{
|
||||
int irq = gpio_to_irq(DA850_USB1_OC_PIN);
|
||||
int error = 0;
|
||||
|
||||
if (handler != NULL) {
|
||||
hawk_usb_ocic_handler = handler;
|
||||
|
||||
error = request_irq(irq, omapl138_hawk_usb_ocic_irq,
|
||||
IRQF_TRIGGER_RISING |
|
||||
IRQF_TRIGGER_FALLING,
|
||||
"OHCI over-current indicator", NULL);
|
||||
if (error)
|
||||
pr_err("%s: could not request IRQ to watch "
|
||||
"over-current indicator changes\n", __func__);
|
||||
} else {
|
||||
free_irq(irq, NULL);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
static struct gpiod_lookup_table hawk_usb_gpio_lookup = {
|
||||
.dev_id = "ohci-da8xx",
|
||||
.table = {
|
||||
GPIO_LOOKUP("davinci_gpio", DA850_USB1_VBUS_PIN, "vbus", 0),
|
||||
GPIO_LOOKUP("davinci_gpio", DA850_USB1_OC_PIN, "oc", 0),
|
||||
},
|
||||
};
|
||||
|
||||
static struct da8xx_ohci_root_hub omapl138_hawk_usb11_pdata = {
|
||||
.set_power = hawk_usb_set_power,
|
||||
.get_power = hawk_usb_get_power,
|
||||
.get_oci = hawk_usb_get_oci,
|
||||
.ocic_notify = hawk_usb_ocic_notify,
|
||||
/* TPS2087 switch @ 5V */
|
||||
.potpgt = (3 + 1) / 2, /* 3 ms max */
|
||||
};
|
||||
|
||||
static irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id)
|
||||
{
|
||||
hawk_usb_ocic_handler(&omapl138_hawk_usb11_pdata, 1);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static __init void omapl138_hawk_usb_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
@ -374,34 +332,13 @@ static __init void omapl138_hawk_usb_init(void)
|
|||
pr_warn("%s: USB PHY registration failed: %d\n",
|
||||
__func__, ret);
|
||||
|
||||
ret = gpio_request_one(DA850_USB1_VBUS_PIN,
|
||||
GPIOF_DIR_OUT, "USB1 VBUS");
|
||||
if (ret < 0) {
|
||||
pr_err("%s: failed to request GPIO for USB 1.1 port "
|
||||
"power control: %d\n", __func__, ret);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = gpio_request_one(DA850_USB1_OC_PIN,
|
||||
GPIOF_DIR_IN, "USB1 OC");
|
||||
if (ret < 0) {
|
||||
pr_err("%s: failed to request GPIO for USB 1.1 port "
|
||||
"over-current indicator: %d\n", __func__, ret);
|
||||
goto usb11_setup_oc_fail;
|
||||
}
|
||||
gpiod_add_lookup_table(&hawk_usb_gpio_lookup);
|
||||
|
||||
ret = da8xx_register_usb11(&omapl138_hawk_usb11_pdata);
|
||||
if (ret) {
|
||||
if (ret)
|
||||
pr_warn("%s: USB 1.1 registration failed: %d\n", __func__, ret);
|
||||
goto usb11_setup_fail;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
usb11_setup_fail:
|
||||
gpio_free(DA850_USB1_OC_PIN);
|
||||
usb11_setup_oc_fail:
|
||||
gpio_free(DA850_USB1_VBUS_PIN);
|
||||
}
|
||||
|
||||
static __init void omapl138_hawk_init(void)
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_data/at24.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/rawnand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
@ -92,16 +92,15 @@ static struct platform_device davinci_sffsdr_nandflash_device = {
|
|||
.resource = davinci_sffsdr_nandflash_resource,
|
||||
};
|
||||
|
||||
static struct at24_platform_data eeprom_info = {
|
||||
.byte_len = (64*1024) / 8,
|
||||
.page_size = 32,
|
||||
.flags = AT24_FLAG_ADDR16,
|
||||
static const struct property_entry eeprom_properties[] = {
|
||||
PROPERTY_ENTRY_U32("pagesize", 32),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata i2c_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("24lc64", 0x50),
|
||||
.platform_data = &eeprom_info,
|
||||
I2C_BOARD_INFO("24c64", 0x50),
|
||||
.properties = eeprom_properties,
|
||||
},
|
||||
/* Other I2C devices:
|
||||
* MSP430, addr 0x23 (not used)
|
||||
|
|
|
@ -26,21 +26,6 @@ EXPORT_SYMBOL(davinci_soc_info);
|
|||
void __iomem *davinci_intc_base;
|
||||
int davinci_intc_type;
|
||||
|
||||
void davinci_get_mac_addr(struct nvmem_device *nvmem, void *context)
|
||||
{
|
||||
char *mac_addr = davinci_soc_info.emac_pdata->mac_addr;
|
||||
off_t offset = (off_t)context;
|
||||
|
||||
if (!IS_BUILTIN(CONFIG_NVMEM)) {
|
||||
pr_warn("Cannot read MAC addr from EEPROM without CONFIG_NVMEM\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Read MAC addr from EEPROM */
|
||||
if (nvmem_device_read(nvmem, offset, ETH_ALEN, mac_addr) == ETH_ALEN)
|
||||
pr_info("Read MAC addr from EEPROM: %pM\n", mac_addr);
|
||||
}
|
||||
|
||||
static int __init davinci_init_id(struct davinci_soc_info *soc_info)
|
||||
{
|
||||
int i;
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
@ -40,6 +41,8 @@ struct da8xx_ohci_hcd {
|
|||
struct regulator *vbus_reg;
|
||||
struct notifier_block nb;
|
||||
unsigned int reg_enabled;
|
||||
struct gpio_desc *vbus_gpio;
|
||||
struct gpio_desc *oc_gpio;
|
||||
};
|
||||
|
||||
#define to_da8xx_ohci(hcd) (struct da8xx_ohci_hcd *)(hcd_to_ohci(hcd)->priv)
|
||||
|
@ -86,12 +89,13 @@ static void ohci_da8xx_disable(struct usb_hcd *hcd)
|
|||
static int ohci_da8xx_set_power(struct usb_hcd *hcd, int on)
|
||||
{
|
||||
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
|
||||
struct device *dev = hcd->self.controller;
|
||||
struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
|
||||
struct device *dev = hcd->self.controller;
|
||||
int ret;
|
||||
|
||||
if (hub && hub->set_power)
|
||||
return hub->set_power(1, on);
|
||||
if (da8xx_ohci->vbus_gpio) {
|
||||
gpiod_set_value_cansleep(da8xx_ohci->vbus_gpio, on);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!da8xx_ohci->vbus_reg)
|
||||
return 0;
|
||||
|
@ -119,11 +123,9 @@ static int ohci_da8xx_set_power(struct usb_hcd *hcd, int on)
|
|||
static int ohci_da8xx_get_power(struct usb_hcd *hcd)
|
||||
{
|
||||
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
|
||||
struct device *dev = hcd->self.controller;
|
||||
struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
|
||||
|
||||
if (hub && hub->get_power)
|
||||
return hub->get_power(1);
|
||||
if (da8xx_ohci->vbus_gpio)
|
||||
return gpiod_get_value_cansleep(da8xx_ohci->vbus_gpio);
|
||||
|
||||
if (da8xx_ohci->vbus_reg)
|
||||
return regulator_is_enabled(da8xx_ohci->vbus_reg);
|
||||
|
@ -134,13 +136,11 @@ static int ohci_da8xx_get_power(struct usb_hcd *hcd)
|
|||
static int ohci_da8xx_get_oci(struct usb_hcd *hcd)
|
||||
{
|
||||
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
|
||||
struct device *dev = hcd->self.controller;
|
||||
struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
|
||||
unsigned int flags;
|
||||
int ret;
|
||||
|
||||
if (hub && hub->get_oci)
|
||||
return hub->get_oci(1);
|
||||
if (da8xx_ohci->oc_gpio)
|
||||
return gpiod_get_value_cansleep(da8xx_ohci->oc_gpio);
|
||||
|
||||
if (!da8xx_ohci->vbus_reg)
|
||||
return 0;
|
||||
|
@ -158,10 +158,8 @@ static int ohci_da8xx_get_oci(struct usb_hcd *hcd)
|
|||
static int ohci_da8xx_has_set_power(struct usb_hcd *hcd)
|
||||
{
|
||||
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
|
||||
struct device *dev = hcd->self.controller;
|
||||
struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
|
||||
|
||||
if (hub && hub->set_power)
|
||||
if (da8xx_ohci->vbus_gpio)
|
||||
return 1;
|
||||
|
||||
if (da8xx_ohci->vbus_reg)
|
||||
|
@ -173,10 +171,8 @@ static int ohci_da8xx_has_set_power(struct usb_hcd *hcd)
|
|||
static int ohci_da8xx_has_oci(struct usb_hcd *hcd)
|
||||
{
|
||||
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
|
||||
struct device *dev = hcd->self.controller;
|
||||
struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
|
||||
|
||||
if (hub && hub->get_oci)
|
||||
if (da8xx_ohci->oc_gpio)
|
||||
return 1;
|
||||
|
||||
if (da8xx_ohci->vbus_reg)
|
||||
|
@ -196,19 +192,6 @@ static int ohci_da8xx_has_potpgt(struct usb_hcd *hcd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle the port over-current indicator change.
|
||||
*/
|
||||
static void ohci_da8xx_ocic_handler(struct da8xx_ohci_root_hub *hub,
|
||||
unsigned port)
|
||||
{
|
||||
ocic_mask |= 1 << port;
|
||||
|
||||
/* Once over-current is detected, the port needs to be powered down */
|
||||
if (hub->get_oci(port) > 0)
|
||||
hub->set_power(port, 0);
|
||||
}
|
||||
|
||||
static int ohci_da8xx_regulator_event(struct notifier_block *nb,
|
||||
unsigned long event, void *data)
|
||||
{
|
||||
|
@ -223,16 +206,23 @@ static int ohci_da8xx_regulator_event(struct notifier_block *nb,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t ohci_da8xx_oc_handler(int irq, void *data)
|
||||
{
|
||||
struct da8xx_ohci_hcd *da8xx_ohci = data;
|
||||
|
||||
if (gpiod_get_value(da8xx_ohci->oc_gpio))
|
||||
gpiod_set_value(da8xx_ohci->vbus_gpio, 0);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int ohci_da8xx_register_notify(struct usb_hcd *hcd)
|
||||
{
|
||||
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
|
||||
struct device *dev = hcd->self.controller;
|
||||
struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
|
||||
int ret = 0;
|
||||
|
||||
if (hub && hub->ocic_notify) {
|
||||
ret = hub->ocic_notify(ohci_da8xx_ocic_handler);
|
||||
} else if (da8xx_ohci->vbus_reg) {
|
||||
if (!da8xx_ohci->oc_gpio && da8xx_ohci->vbus_reg) {
|
||||
da8xx_ohci->nb.notifier_call = ohci_da8xx_regulator_event;
|
||||
ret = devm_regulator_register_notifier(da8xx_ohci->vbus_reg,
|
||||
&da8xx_ohci->nb);
|
||||
|
@ -244,15 +234,6 @@ static int ohci_da8xx_register_notify(struct usb_hcd *hcd)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void ohci_da8xx_unregister_notify(struct usb_hcd *hcd)
|
||||
{
|
||||
struct device *dev = hcd->self.controller;
|
||||
struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
|
||||
|
||||
if (hub && hub->ocic_notify)
|
||||
hub->ocic_notify(NULL);
|
||||
}
|
||||
|
||||
static int ohci_da8xx_reset(struct usb_hcd *hcd)
|
||||
{
|
||||
struct device *dev = hcd->self.controller;
|
||||
|
@ -402,34 +383,35 @@ MODULE_DEVICE_TABLE(of, da8xx_ohci_ids);
|
|||
static int ohci_da8xx_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct da8xx_ohci_hcd *da8xx_ohci;
|
||||
struct device *dev = &pdev->dev;
|
||||
int error, hcd_irq, oc_irq;
|
||||
struct usb_hcd *hcd;
|
||||
struct resource *mem;
|
||||
int error, irq;
|
||||
hcd = usb_create_hcd(&ohci_da8xx_hc_driver, &pdev->dev,
|
||||
dev_name(&pdev->dev));
|
||||
|
||||
hcd = usb_create_hcd(&ohci_da8xx_hc_driver, dev, dev_name(dev));
|
||||
if (!hcd)
|
||||
return -ENOMEM;
|
||||
|
||||
da8xx_ohci = to_da8xx_ohci(hcd);
|
||||
da8xx_ohci->hcd = hcd;
|
||||
|
||||
da8xx_ohci->usb11_clk = devm_clk_get(&pdev->dev, NULL);
|
||||
da8xx_ohci->usb11_clk = devm_clk_get(dev, NULL);
|
||||
if (IS_ERR(da8xx_ohci->usb11_clk)) {
|
||||
error = PTR_ERR(da8xx_ohci->usb11_clk);
|
||||
if (error != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Failed to get clock.\n");
|
||||
dev_err(dev, "Failed to get clock.\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
da8xx_ohci->usb11_phy = devm_phy_get(&pdev->dev, "usb-phy");
|
||||
da8xx_ohci->usb11_phy = devm_phy_get(dev, "usb-phy");
|
||||
if (IS_ERR(da8xx_ohci->usb11_phy)) {
|
||||
error = PTR_ERR(da8xx_ohci->usb11_phy);
|
||||
if (error != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "Failed to get phy.\n");
|
||||
dev_err(dev, "Failed to get phy.\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
da8xx_ohci->vbus_reg = devm_regulator_get_optional(&pdev->dev, "vbus");
|
||||
da8xx_ohci->vbus_reg = devm_regulator_get_optional(dev, "vbus");
|
||||
if (IS_ERR(da8xx_ohci->vbus_reg)) {
|
||||
error = PTR_ERR(da8xx_ohci->vbus_reg);
|
||||
if (error == -ENODEV) {
|
||||
|
@ -437,13 +419,34 @@ static int ohci_da8xx_probe(struct platform_device *pdev)
|
|||
} else if (error == -EPROBE_DEFER) {
|
||||
goto err;
|
||||
} else {
|
||||
dev_err(&pdev->dev, "Failed to get regulator\n");
|
||||
dev_err(dev, "Failed to get regulator\n");
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
da8xx_ohci->vbus_gpio = devm_gpiod_get_optional(dev, "vbus",
|
||||
GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(da8xx_ohci->vbus_gpio))
|
||||
goto err;
|
||||
|
||||
da8xx_ohci->oc_gpio = devm_gpiod_get_optional(dev, "oc", GPIOD_IN);
|
||||
if (IS_ERR(da8xx_ohci->oc_gpio))
|
||||
goto err;
|
||||
|
||||
if (da8xx_ohci->oc_gpio) {
|
||||
oc_irq = gpiod_to_irq(da8xx_ohci->oc_gpio);
|
||||
if (oc_irq < 0)
|
||||
goto err;
|
||||
|
||||
error = devm_request_irq(dev, oc_irq, ohci_da8xx_oc_handler,
|
||||
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
|
||||
"OHCI over-current indicator", da8xx_ohci);
|
||||
if (error)
|
||||
goto err;
|
||||
}
|
||||
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
hcd->regs = devm_ioremap_resource(&pdev->dev, mem);
|
||||
hcd->regs = devm_ioremap_resource(dev, mem);
|
||||
if (IS_ERR(hcd->regs)) {
|
||||
error = PTR_ERR(hcd->regs);
|
||||
goto err;
|
||||
|
@ -451,13 +454,13 @@ static int ohci_da8xx_probe(struct platform_device *pdev)
|
|||
hcd->rsrc_start = mem->start;
|
||||
hcd->rsrc_len = resource_size(mem);
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0) {
|
||||
hcd_irq = platform_get_irq(pdev, 0);
|
||||
if (hcd_irq < 0) {
|
||||
error = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
|
||||
error = usb_add_hcd(hcd, irq, 0);
|
||||
error = usb_add_hcd(hcd, hcd_irq, 0);
|
||||
if (error)
|
||||
goto err;
|
||||
|
||||
|
@ -480,7 +483,6 @@ static int ohci_da8xx_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct usb_hcd *hcd = platform_get_drvdata(pdev);
|
||||
|
||||
ohci_da8xx_unregister_notify(hcd);
|
||||
usb_remove_hcd(hcd);
|
||||
usb_put_hcd(hcd);
|
||||
|
||||
|
|
|
@ -46,5 +46,4 @@ enum {
|
|||
EMAC_VERSION_2, /* DM646x */
|
||||
};
|
||||
|
||||
void davinci_get_mac_addr(struct nvmem_device *nvmem, void *context);
|
||||
#endif
|
||||
|
|
|
@ -11,22 +11,8 @@
|
|||
#ifndef __ASM_ARCH_USB_H
|
||||
#define __ASM_ARCH_USB_H
|
||||
|
||||
struct da8xx_ohci_root_hub;
|
||||
|
||||
typedef void (*da8xx_ocic_handler_t)(struct da8xx_ohci_root_hub *hub,
|
||||
unsigned port);
|
||||
|
||||
/* Passed as the platform data to the OHCI driver */
|
||||
struct da8xx_ohci_root_hub {
|
||||
/* Switch the port power on/off */
|
||||
int (*set_power)(unsigned port, int on);
|
||||
/* Read the port power status */
|
||||
int (*get_power)(unsigned port);
|
||||
/* Read the port over-current indicator */
|
||||
int (*get_oci)(unsigned port);
|
||||
/* Over-current indicator change notification (pass NULL to disable) */
|
||||
int (*ocic_notify)(da8xx_ocic_handler_t handler);
|
||||
|
||||
/* Time from power on to power good (in 2 ms units) */
|
||||
u8 potpgt;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue