Commit b8961b1e authored by Arnd Bergmann's avatar Arnd Bergmann

Merge tag 'davinci-for-v5.1/soc-part2' of...

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: default avatarArnd Bergmann <arnd@arndb.de>
parents ad75174f 23fa70e4
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/platform_data/pcf857x.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/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
...@@ -52,62 +52,19 @@ static const short da830_evm_usb11_pins[] = { ...@@ -52,62 +52,19 @@ static const short da830_evm_usb11_pins[] = {
-1 -1
}; };
static da8xx_ocic_handler_t da830_evm_usb_ocic_handler; static struct gpiod_lookup_table da830_evm_usb_gpio_lookup = {
.dev_id = "ohci-da8xx",
static int da830_evm_usb_set_power(unsigned port, int on) .table = {
{ GPIO_LOOKUP("davinci_gpio", ON_BD_USB_DRV, "vbus", 0),
gpio_set_value(ON_BD_USB_DRV, on); GPIO_LOOKUP("davinci_gpio", ON_BD_USB_OVC, "oc", 0),
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 da8xx_ohci_root_hub da830_evm_usb11_pdata = { 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 */ /* TPS2065 switch @ 5V */
.potpgt = (3 + 1) / 2, /* 3 ms max */ .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) static __init void da830_evm_usb_init(void)
{ {
int ret; int ret;
...@@ -142,21 +99,7 @@ static __init void da830_evm_usb_init(void) ...@@ -142,21 +99,7 @@ static __init void da830_evm_usb_init(void)
return; return;
} }
ret = gpio_request(ON_BD_USB_DRV, "ON_BD_USB_DRV"); gpiod_add_lookup_table(&da830_evm_usb_gpio_lookup);
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);
ret = da8xx_register_usb11(&da830_evm_usb11_pdata); ret = da8xx_register_usb11(&da830_evm_usb11_pdata);
if (ret) if (ret)
...@@ -457,12 +400,9 @@ static struct nvmem_cell_lookup da830_evm_nvmem_cell_lookup = { ...@@ -457,12 +400,9 @@ static struct nvmem_cell_lookup da830_evm_nvmem_cell_lookup = {
.con_id = "mac-address", .con_id = "mac-address",
}; };
static struct at24_platform_data da830_evm_i2c_eeprom_info = { static const struct property_entry da830_evm_i2c_eeprom_properties[] = {
.byte_len = SZ_256K / 8, PROPERTY_ENTRY_U32("pagesize", 64),
.page_size = 64, { }
.flags = AT24_FLAG_ADDR16,
.setup = davinci_get_mac_addr,
.context = (void *)0x7f00,
}; };
static int __init da830_evm_ui_expander_setup(struct i2c_client *client, 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 = { ...@@ -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[] = { static struct i2c_board_info __initdata da830_evm_i2c_devices[] = {
{ {
I2C_BOARD_INFO("24c256", 0x50), I2C_BOARD_INFO("24c256", 0x50),
.platform_data = &da830_evm_i2c_eeprom_info, .properties = da830_evm_i2c_eeprom_properties,
}, },
{ {
I2C_BOARD_INFO("tlv320aic3x", 0x18), I2C_BOARD_INFO("tlv320aic3x", 0x18),
......
...@@ -150,32 +150,6 @@ static struct spi_board_info da850evm_spi_info[] = { ...@@ -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[] = { static struct mtd_partition da850_evm_norflash_partition[] = {
{ {
.name = "bootloaders + env", .name = "bootloaders + env",
...@@ -1064,6 +1038,17 @@ static const short da850_evm_rmii_pins[] = { ...@@ -1064,6 +1038,17 @@ static const short da850_evm_rmii_pins[] = {
-1 -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) static int __init da850_evm_config_emac(void)
{ {
void __iomem *cfg_chip3_base; void __iomem *cfg_chip3_base;
...@@ -1102,14 +1087,9 @@ static int __init da850_evm_config_emac(void) ...@@ -1102,14 +1087,9 @@ static int __init da850_evm_config_emac(void)
if (ret) if (ret)
pr_warn("%s:GPIO(2,6) mux setup failed\n", __func__); pr_warn("%s:GPIO(2,6) mux setup failed\n", __func__);
ret = gpio_request(DA850_MII_MDIO_CLKEN_PIN, "mdio_clk_en"); da850_evm_emac_gpio_hogs[0].dflags = rmii_en ? GPIOD_OUT_HIGH
if (ret) { : GPIOD_OUT_LOW;
pr_warn("Cannot open GPIO %d\n", DA850_MII_MDIO_CLKEN_PIN); gpiod_add_hogs(da850_evm_emac_gpio_hogs);
return ret;
}
/* Enable/Disable MII MDIO clock */
gpio_direction_output(DA850_MII_MDIO_CLKEN_PIN, rmii_en);
soc_info->emac_pdata->phy_id = DA850_EVM_PHY_ID; soc_info->emac_pdata->phy_id = DA850_EVM_PHY_ID;
...@@ -1494,8 +1474,6 @@ static __init void da850_evm_init(void) ...@@ -1494,8 +1474,6 @@ static __init void da850_evm_init(void)
if (ret) if (ret)
pr_warn("%s: SATA registration failed: %d\n", __func__, ret); pr_warn("%s: SATA registration failed: %d\n", __func__, ret);
da850_evm_setup_mac_addr();
ret = da8xx_register_rproc(); ret = da8xx_register_rproc();
if (ret) if (ret)
pr_warn("%s: dsp/rproc registration failed: %d\n", pr_warn("%s: dsp/rproc registration failed: %d\n",
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/platform_data/at24.h> #include <linux/property.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
...@@ -225,18 +225,15 @@ static struct nvmem_cell_lookup davinci_nvmem_cell_lookup = { ...@@ -225,18 +225,15 @@ static struct nvmem_cell_lookup davinci_nvmem_cell_lookup = {
.con_id = "mac-address", .con_id = "mac-address",
}; };
static struct at24_platform_data eeprom_info = { static const struct property_entry eeprom_properties[] = {
.byte_len = (256*1024) / 8, PROPERTY_ENTRY_U32("pagesize", 64),
.page_size = 64, { }
.flags = AT24_FLAG_ADDR16,
.setup = davinci_get_mac_addr,
.context = (void *)0x7f00,
}; };
static struct i2c_board_info i2c_info[] = { static struct i2c_board_info i2c_info[] = {
{ {
I2C_BOARD_INFO("24c256", 0x50), I2C_BOARD_INFO("24c256", 0x50),
.platform_data = &eeprom_info, .properties = eeprom_properties,
}, },
{ {
I2C_BOARD_INFO("tlv320aic3x", 0x18), I2C_BOARD_INFO("tlv320aic3x", 0x18),
......
...@@ -16,8 +16,8 @@ ...@@ -16,8 +16,8 @@
#include <linux/gpio/machine.h> #include <linux/gpio/machine.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/platform_data/pcf857x.h> #include <linux/platform_data/pcf857x.h>
#include <linux/platform_data/at24.h>
#include <linux/platform_data/gpio-davinci.h> #include <linux/platform_data/gpio-davinci.h>
#include <linux/property.h>
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/rawnand.h> #include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
...@@ -532,12 +532,9 @@ static struct nvmem_cell_lookup dm644evm_nvmem_cell_lookup = { ...@@ -532,12 +532,9 @@ static struct nvmem_cell_lookup dm644evm_nvmem_cell_lookup = {
.con_id = "mac-address", .con_id = "mac-address",
}; };
static struct at24_platform_data eeprom_info = { static const struct property_entry eeprom_properties[] = {
.byte_len = (256*1024) / 8, PROPERTY_ENTRY_U32("pagesize", 64),
.page_size = 64, { }
.flags = AT24_FLAG_ADDR16,
.setup = davinci_get_mac_addr,
.context = (void *)0x7f00,
}; };
/* /*
...@@ -647,7 +644,7 @@ static struct i2c_board_info __initdata i2c_info[] = { ...@@ -647,7 +644,7 @@ static struct i2c_board_info __initdata i2c_info[] = {
}, },
{ {
I2C_BOARD_INFO("24c256", 0x50), I2C_BOARD_INFO("24c256", 0x50),
.platform_data = &eeprom_info, .properties = eeprom_properties,
}, },
{ {
I2C_BOARD_INFO("tlv320aic33", 0x1b), I2C_BOARD_INFO("tlv320aic33", 0x1b),
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c.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/pcf857x.h>
#include <linux/platform_data/ti-aemif.h> #include <linux/platform_data/ti-aemif.h>
...@@ -364,12 +364,9 @@ static struct nvmem_cell_lookup dm646x_evm_nvmem_cell_lookup = { ...@@ -364,12 +364,9 @@ static struct nvmem_cell_lookup dm646x_evm_nvmem_cell_lookup = {
.con_id = "mac-address", .con_id = "mac-address",
}; };
static struct at24_platform_data eeprom_info = { static const struct property_entry eeprom_properties[] = {
.byte_len = (256*1024) / 8, PROPERTY_ENTRY_U32("pagesize", 64),
.page_size = 64, { }
.flags = AT24_FLAG_ADDR16,
.setup = davinci_get_mac_addr,
.context = (void *)0x7f00,
}; };
#endif #endif
...@@ -440,7 +437,7 @@ static void evm_init_cpld(void) ...@@ -440,7 +437,7 @@ static void evm_init_cpld(void)
static struct i2c_board_info __initdata i2c_info[] = { static struct i2c_board_info __initdata i2c_info[] = {
{ {
I2C_BOARD_INFO("24c256", 0x50), I2C_BOARD_INFO("24c256", 0x50),
.platform_data = &eeprom_info, .properties = eeprom_properties,
}, },
{ {
I2C_BOARD_INFO("pcf8574a", 0x38), I2C_BOARD_INFO("pcf8574a", 0x38),
......
...@@ -14,11 +14,13 @@ ...@@ -14,11 +14,13 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/console.h> #include <linux/console.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/notifier.h>
#include <linux/nvmem-consumer.h>
#include <linux/nvmem-provider.h> #include <linux/nvmem-provider.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/platform_data/at24.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/flash.h> #include <linux/spi/flash.h>
...@@ -117,11 +119,15 @@ static void mityomapl138_cpufreq_init(const char *partnum) ...@@ -117,11 +119,15 @@ static void mityomapl138_cpufreq_init(const char *partnum)
static void mityomapl138_cpufreq_init(const char *partnum) { } static void mityomapl138_cpufreq_init(const char *partnum) { }
#endif #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; int ret;
const char *partnum = NULL; 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)) { if (!IS_BUILTIN(CONFIG_NVMEM)) {
pr_warn("Factory Config not available without CONFIG_NVMEM\n"); 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) ...@@ -147,21 +153,20 @@ static void read_factory_config(struct nvmem_device *nvmem, void *context)
goto bad_config; 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; partnum = factory_config.partnum;
pr_info("Part Number = %s\n", partnum); pr_info("Part Number = %s\n", partnum);
bad_config: bad_config:
/* default maximum speed is valid for all platforms */ /* default maximum speed is valid for all platforms */
mityomapl138_cpufreq_init(partnum); 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 * We don't define a cell for factory config as it will be accessed from the
* board file using the nvmem notifier chain. * board file using the nvmem notifier chain.
...@@ -187,12 +192,10 @@ static struct nvmem_cell_lookup mityomapl138_nvmem_cell_lookup = { ...@@ -187,12 +192,10 @@ static struct nvmem_cell_lookup mityomapl138_nvmem_cell_lookup = {
.con_id = "mac-address", .con_id = "mac-address",
}; };
static struct at24_platform_data mityomapl138_fd_chip = { static const struct property_entry mityomapl138_fd_chip_properties[] = {
.byte_len = 256, PROPERTY_ENTRY_U32("pagesize", 8),
.page_size = 8, PROPERTY_ENTRY_BOOL("read-only"),
.flags = AT24_FLAG_READONLY | AT24_FLAG_IRUGO, { }
.setup = read_factory_config,
.context = NULL,
}; };
static struct davinci_i2c_platform_data mityomap_i2c_0_pdata = { static struct davinci_i2c_platform_data mityomap_i2c_0_pdata = {
...@@ -321,7 +324,7 @@ static struct i2c_board_info __initdata mityomap_tps65023_info[] = { ...@@ -321,7 +324,7 @@ static struct i2c_board_info __initdata mityomap_tps65023_info[] = {
}, },
{ {
I2C_BOARD_INFO("24c02", 0x50), 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) ...@@ -569,6 +572,7 @@ static void __init mityomapl138_init(void)
davinci_serial_init(da8xx_serial_device); davinci_serial_init(da8xx_serial_device);
nvmem_register_notifier(&mityomapl138_nvmem_notifier);
nvmem_add_cell_table(&mityomapl138_nvmem_cell_table); nvmem_add_cell_table(&mityomapl138_nvmem_cell_table);
nvmem_add_cell_lookups(&mityomapl138_nvmem_cell_lookup, 1); nvmem_add_cell_lookups(&mityomapl138_nvmem_cell_lookup, 1);
......
...@@ -294,66 +294,24 @@ static int omapl138_hawk_register_aemif(void) ...@@ -294,66 +294,24 @@ static int omapl138_hawk_register_aemif(void)
return platform_device_register(&omapl138_hawk_aemif_device); 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[] = { static const short da850_hawk_usb11_pins[] = {
DA850_GPIO2_4, DA850_GPIO6_13, DA850_GPIO2_4, DA850_GPIO6_13,
-1 -1
}; };
static int hawk_usb_set_power(unsigned port, int on) static struct gpiod_lookup_table hawk_usb_gpio_lookup = {
{ .dev_id = "ohci-da8xx",
gpio_set_value(DA850_USB1_VBUS_PIN, on); .table = {
return 0; GPIO_LOOKUP("davinci_gpio", DA850_USB1_VBUS_PIN, "vbus", 0),
} GPIO_LOOKUP("davinci_gpio", DA850_USB1_OC_PIN, "oc", 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 da8xx_ohci_root_hub omapl138_hawk_usb11_pdata = { 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 */ /* TPS2087 switch @ 5V */
.potpgt = (3 + 1) / 2, /* 3 ms max */ .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) static __init void omapl138_hawk_usb_init(void)
{ {
int ret; int ret;
...@@ -374,34 +332,13 @@ static __init void omapl138_hawk_usb_init(void) ...@@ -374,34 +332,13 @@ static __init void omapl138_hawk_usb_init(void)
pr_warn("%s: USB PHY registration failed: %d\n", pr_warn("%s: USB PHY registration failed: %d\n",
__func__, ret); __func__, ret);
ret = gpio_request_one(DA850_USB1_VBUS_PIN, gpiod_add_lookup_table(&hawk_usb_gpio_lookup);
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;
}
ret = da8xx_register_usb11(&omapl138_hawk_usb11_pdata); ret = da8xx_register_usb11(&omapl138_hawk_usb11_pdata);
if (ret) { if (ret)
pr_warn("%s: USB 1.1 registration failed: %d\n", __func__, ret); pr_warn("%s: USB 1.1 registration failed: %d\n", __func__, ret);
goto usb11_setup_fail;
}
return; 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) static __init void omapl138_hawk_init(void)
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/platform_data/at24.h> #include <linux/property.h>
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/rawnand.h> #include <linux/mtd/rawnand.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
...@@ -92,16 +92,15 @@ static struct platform_device davinci_sffsdr_nandflash_device = { ...@@ -92,16 +92,15 @@ static struct platform_device davinci_sffsdr_nandflash_device = {
.resource = davinci_sffsdr_nandflash_resource, .resource = davinci_sffsdr_nandflash_resource,
}; };
static struct at24_platform_data eeprom_info = { static const struct property_entry eeprom_properties[] = {
.byte_len = (64*1024) / 8, PROPERTY_ENTRY_U32("pagesize", 32),
.page_size = 32, { }
.flags = AT24_FLAG_ADDR16,
}; };
static struct i2c_board_info __initdata i2c_info[] = { static struct i2c_board_info __initdata i2c_info[] = {
{ {
I2C_BOARD_INFO("24lc64", 0x50), I2C_BOARD_INFO("24c64", 0x50),
.platform_data = &eeprom_info, .properties = eeprom_properties,
}, },
/* Other I2C devices: /* Other I2C devices:
* MSP430, addr 0x23 (not used) * MSP430, addr 0x23 (not used)
......
...@@ -26,21 +26,6 @@ EXPORT_SYMBOL(davinci_soc_info); ...@@ -26,21 +26,6 @@ EXPORT_SYMBOL(davinci_soc_info);
void __iomem *davinci_intc_base; void __iomem *davinci_intc_base;
int davinci_intc_type; 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) static int __init davinci_init_id(struct davinci_soc_info *soc_info)
{ {
int i; int i;
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
*/ */
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/gpio/consumer.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
...@@ -40,6 +41,8 @@ struct da8xx_ohci_hcd { ...@@ -40,6 +41,8 @@ struct da8xx_ohci_hcd {
struct regulator *vbus_reg; struct regulator *vbus_reg;
struct notifier_block nb; struct notifier_block nb;
unsigned int reg_enabled; 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) #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) ...@@ -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) static int ohci_da8xx_set_power(struct usb_hcd *hcd, int on)
{ {
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd); struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
struct device *dev = hcd->self.controller; struct device *dev = hcd->self.controller;
struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
int ret; int ret;
if (hub && hub->set_power) if (da8xx_ohci->vbus_gpio) {
return hub->set_power(1, on); gpiod_set_value_cansleep(da8xx_ohci->vbus_gpio, on);
return 0;
}
if (!da8xx_ohci->vbus_reg) if (!da8xx_ohci->vbus_reg)
return 0; return 0;
...@@ -119,11 +123,9 @@ static int ohci_da8xx_set_power(struct usb_hcd *hcd, int on) ...@@ -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) static int ohci_da8xx_get_power(struct usb_hcd *hcd)
{ {
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(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) if (da8xx_ohci->vbus_gpio)
return hub->get_power(1); return gpiod_get_value_cansleep(da8xx_ohci->vbus_gpio);
if (da8xx_ohci->vbus_reg) if (da8xx_ohci->vbus_reg)
return regulator_is_enabled(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) ...@@ -134,13 +136,11 @@ static int ohci_da8xx_get_power(struct usb_hcd *hcd)
static int ohci_da8xx_get_oci(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 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; unsigned int flags;
int ret; int ret;
if (hub && hub->get_oci) if (da8xx_ohci->oc_gpio)
return hub->get_oci(1); return gpiod_get_value_cansleep(da8xx_ohci->oc_gpio);
if (!da8xx_ohci->vbus_reg) if (!da8xx_ohci->vbus_reg)
return 0; return 0;
...@@ -158,10 +158,8 @@ static int ohci_da8xx_get_oci(struct usb_hcd *hcd) ...@@ -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) static int ohci_da8xx_has_set_power(struct usb_hcd *hcd)
{ {
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(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; return 1;
if (da8xx_ohci->vbus_reg) if (da8xx_ohci->vbus_reg)
...@@ -173,10 +171,8 @@ static int ohci_da8xx_has_set_power(struct usb_hcd *hcd) ...@@ -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) static int ohci_da8xx_has_oci(struct usb_hcd *hcd)
{ {
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(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; return 1;
if (da8xx_ohci->vbus_reg) if (da8xx_ohci->vbus_reg)
...@@ -196,19 +192,6 @@ static int ohci_da8xx_has_potpgt(struct usb_hcd *hcd) ...@@ -196,19 +192,6 @@ static int ohci_da8xx_has_potpgt(struct usb_hcd *hcd)
return 0; 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, static int ohci_da8xx_regulator_event(struct notifier_block *nb,
unsigned long event, void *data) unsigned long event, void *data)
{ {
...@@ -223,16 +206,23 @@ static int ohci_da8xx_regulator_event(struct notifier_block *nb, ...@@ -223,16 +206,23 @@ static int ohci_da8xx_regulator_event(struct notifier_block *nb,
return 0; 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) static int ohci_da8xx_register_notify(struct usb_hcd *hcd)
{ {
struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd); struct da8xx_ohci_hcd *da8xx_ohci = to_da8xx_ohci(hcd);
struct device *dev = hcd->self.controller; struct device *dev = hcd->self.controller;
struct da8xx_ohci_root_hub *hub = dev_get_platdata(dev);
int ret = 0; int ret = 0;
if (hub && hub->ocic_notify) { if (!da8xx_ohci->oc_gpio && da8xx_ohci->vbus_reg) {
ret = hub->ocic_notify(ohci_da8xx_ocic_handler);
} else if (da8xx_ohci->vbus_reg) {
da8xx_ohci->nb.notifier_call = ohci_da8xx_regulator_event; da8xx_ohci->nb.notifier_call = ohci_da8xx_regulator_event;
ret = devm_regulator_register_notifier(da8xx_ohci->vbus_reg, ret = devm_regulator_register_notifier(da8xx_ohci->vbus_reg,
&da8xx_ohci->nb); &da8xx_ohci->nb);
...@@ -244,15 +234,6 @@ static int ohci_da8xx_register_notify(struct usb_hcd *hcd) ...@@ -244,15 +234,6 @@ static int ohci_da8xx_register_notify(struct usb_hcd *hcd)
return ret; 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) static int ohci_da8xx_reset(struct usb_hcd *hcd)
{ {
struct device *dev = hcd->self.controller; struct device *dev = hcd->self.controller;
...@@ -402,34 +383,35 @@ MODULE_DEVICE_TABLE(of, da8xx_ohci_ids); ...@@ -402,34 +383,35 @@ MODULE_DEVICE_TABLE(of, da8xx_ohci_ids);
static int ohci_da8xx_probe(struct platform_device *pdev) static int ohci_da8xx_probe(struct platform_device *pdev)
{ {
struct da8xx_ohci_hcd *da8xx_ohci; struct da8xx_ohci_hcd *da8xx_ohci;
struct device *dev = &pdev->dev;
int error, hcd_irq, oc_irq;
struct usb_hcd *hcd; struct usb_hcd *hcd;
struct resource *mem; struct resource *mem;
int error, irq;
hcd = usb_create_hcd(&ohci_da8xx_hc_driver, &pdev->dev, hcd = usb_create_hcd(&ohci_da8xx_hc_driver, dev, dev_name(dev));
dev_name(&pdev->dev));
if (!hcd) if (!hcd)
return -ENOMEM; return -ENOMEM;
da8xx_ohci = to_da8xx_ohci(hcd); da8xx_ohci = to_da8xx_ohci(hcd);
da8xx_ohci->hcd = 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)) { if (IS_ERR(da8xx_ohci->usb11_clk)) {
error = PTR_ERR(da8xx_ohci->usb11_clk); error = PTR_ERR(da8xx_ohci->usb11_clk);
if (error != -EPROBE_DEFER) if (error != -EPROBE_DEFER)
dev_err(&pdev->dev, "Failed to get clock.\n"); dev_err(dev, "Failed to get clock.\n");
goto err; 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)) { if (IS_ERR(da8xx_ohci->usb11_phy)) {
error = PTR_ERR(da8xx_ohci->usb11_phy); error = PTR_ERR(da8xx_ohci->usb11_phy);
if (error != -EPROBE_DEFER) if (error != -EPROBE_DEFER)
dev_err(&pdev->dev, "Failed to get phy.\n"); dev_err(dev, "Failed to get phy.\n");
goto err; 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)) { if (IS_ERR(da8xx_ohci->vbus_reg)) {
error = PTR_ERR(da8xx_ohci->vbus_reg); error = PTR_ERR(da8xx_ohci->vbus_reg);
if (error == -ENODEV) { if (error == -ENODEV) {
...@@ -437,13 +419,34 @@ static int ohci_da8xx_probe(struct platform_device *pdev) ...@@ -437,13 +419,34 @@ static int ohci_da8xx_probe(struct platform_device *pdev)
} else if (error == -EPROBE_DEFER) { } else if (error == -EPROBE_DEFER) {
goto err; goto err;
} else { } else {
dev_err(&pdev->dev, "Failed to get regulator\n"); dev_err(dev, "Failed to get regulator\n");
goto err; 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); 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)) { if (IS_ERR(hcd->regs)) {
error = PTR_ERR(hcd->regs); error = PTR_ERR(hcd->regs);
goto err; goto err;
...@@ -451,13 +454,13 @@ static int ohci_da8xx_probe(struct platform_device *pdev) ...@@ -451,13 +454,13 @@ static int ohci_da8xx_probe(struct platform_device *pdev)
hcd->rsrc_start = mem->start; hcd->rsrc_start = mem->start;
hcd->rsrc_len = resource_size(mem); hcd->rsrc_len = resource_size(mem);
irq = platform_get_irq(pdev, 0); hcd_irq = platform_get_irq(pdev, 0);
if (irq < 0) { if (hcd_irq < 0) {
error = -ENODEV; error = -ENODEV;
goto err; goto err;
} }
error = usb_add_hcd(hcd, irq, 0); error = usb_add_hcd(hcd, hcd_irq, 0);
if (error) if (error)
goto err; goto err;
...@@ -480,7 +483,6 @@ static int ohci_da8xx_remove(struct platform_device *pdev) ...@@ -480,7 +483,6 @@ static int ohci_da8xx_remove(struct platform_device *pdev)
{ {
struct usb_hcd *hcd = platform_get_drvdata(pdev); struct usb_hcd *hcd = platform_get_drvdata(pdev);
ohci_da8xx_unregister_notify(hcd);
usb_remove_hcd(hcd); usb_remove_hcd(hcd);
usb_put_hcd(hcd); usb_put_hcd(hcd);
......
...@@ -46,5 +46,4 @@ enum { ...@@ -46,5 +46,4 @@ enum {
EMAC_VERSION_2, /* DM646x */ EMAC_VERSION_2, /* DM646x */
}; };
void davinci_get_mac_addr(struct nvmem_device *nvmem, void *context);
#endif #endif
...@@ -11,22 +11,8 @@ ...@@ -11,22 +11,8 @@
#ifndef __ASM_ARCH_USB_H #ifndef __ASM_ARCH_USB_H
#define __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 */ /* Passed as the platform data to the OHCI driver */
struct da8xx_ohci_root_hub { 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) */ /* Time from power on to power good (in 2 ms units) */
u8 potpgt; u8 potpgt;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment