Files
beagleconnect-freedom/sw/linux/0005-mikrobus-fix-mikrobus-id-rescan.patch
Vaishnav M A 853d3461e1 sw: linux: add mikrobus driver update patches
mikrobus driver works within buildroot but the click
device drivers are not being probed correctly:
in host /opt/gbridge.sh a hack for continously blinking the
led on the SensorTag/Launchpad is added(this background
transaction happening continously prevents some of the greybus
pm suspend events happening, which might have been the cause
for the kernel panic, with this continous background transfer
the kernel panic is not seen and qemu machine does not crash)

changes were tested using ATUSB, CC1352R SensorTag

Welcome to Buildroot
buildroot login: root
Password:
IFLP=`ifconfig | grep lowpan`
ip link set wpan0 down
iwpan phy phy0 set channel 0 26
iwpan dev wpan0 set pan_id 0xabcd
  ip link add link wpan0 name lowpan0 type lowpan
  ip link set lowpan0 up
ip link set wpan0 up
ip -6 addr add 2001:db8::2/64 dev lowpan0
sleep 1

killall -9 gbridge
sleep 1

sleep 5

gbridge > /dev/null 2&1 &
sleep 5
for i in `seq 1 100000`; do gpioset 0 6=1; gpioset 0 6=0; \
                         sleep 1; done

greybus 1-2.2: GMP VID=0x00000126, PID=0x00000126
greybus 1-2.2: DDBL1 Manufacturer=0x00000126, Product=0x00000126
greybus 1-2.2: excess descriptors in interface manifest
mikrobus:mikrobus_port_gb_register: mikrobus gb_probe , num cports= 3, manifest_size 252
mikrobus:mikrobus_port_gb_register: protocol added 11
mikrobus:mikrobus_port_gb_register: protocol added 3
mikrobus:mikrobus_port_gb_register: protocol added 2
mikrobus:mikrobus_port_register: registering port mikrobus-0
mikrobus_manifest:mikrobus_manifest_attach_device: parsed device 1, driver=bme280, protocol=3, reg=76
mikrobus_manifest:mikrobus_manifest_attach_device: parsed device 2, driver=opt3001, protocol=3, reg=44
mikrobus_manifest:mikrobus_manifest_attach_device: parsed device 3, driver=ams-iaq-core, protocol=3, reg=5a
mikrobus_manifest:mikrobus_manifest_parse:  Greybus Service Sample Application manifest parsed with 3 devices
mikrobus mikrobus-0: registering device : bme280
mikrobus mikrobus-0: registering device : opt3001
mikrobus mikrobus-0: registering device : ams-iaq-core

0-0044  0-005a  0-0076  i2c-0

Mem: 29624K used, 471572K free, 84K shrd, 624K buff, 5152K cached
CPU:   7% usr   4% sys   0% nic  86% idle   0% io   0% irq   1% sirq
Load average: 0.22 0.10 0.03 1/56 378
  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
  193   178 root     S    16060   3%   1% gbridge 2
  178   174 root     S     3744   1%   1% {gbridge.sh} /bin/sh -xv /opt/gbridge.
  312   174 root     R     1532   0%   1% top
   47     2 root     IW       0   0%   1% [kworker/0:3-eve]
   10     2 root     IW       0   0%   0% [rcu_sched]
    9     2 root     SW       0   0%   0% [ksoftirqd/0]
  173     1 root     S     3744   1%   0% /usr/sbin/iiod -D
  165     1 avahi    S     1924   0%   0% avahi-daemon: running [buildroot.local
  174     1 root     S     1548   0%   0% -sh
    1     0 root     S     1532   0%   0% init
  175     1 root     S     1528   0%   0% /sbin/getty -L tty1 0 vt100
  150     1 root     S     1528   0%   0% udhcpc -R -n -O search -p /var/run/udh
   64     1 root     S     1524   0%   0% /sbin/syslogd -n
   68     1 root     S     1520   0%   0% /sbin/klogd -n
  378   178 root     S     1520   0%   0% sleep 1
  115     1 dbus     S     1492   0%   0% dbus-daemon --system
  169     1 root     S     1080   0%   0% /usr/sbin/dropbear -R
   29     2 root     IW       0   0%   0% [kworker/u2:1-fl]
    7     2 root     IW       0   0%   0% [kworker/u2:0-gr]
   13     2 root     SW       0   0%   0% [kdevtmpfs]

Signed-off-by: Vaishnav M A <vaishnav@beagleboard.org>
2021-01-13 13:33:35 +05:30

131 lines
4.7 KiB
Diff

From 28de88fd656dbd5c2df80f67c87dfbb8ca401469 Mon Sep 17 00:00:00 2001
From: Vaishnav M A <vaishnav@beagleboard.org>
Date: Tue, 12 Jan 2021 03:53:09 +0530
Subject: [PATCH 2/4] mikrobus: fix mikrobus id rescan
Signed-off-by: Vaishnav M A <vaishnav@beagleboard.org>
---
drivers/misc/mikrobus/mikrobus_core.c | 47 +++++++++++++++------------
1 file changed, 26 insertions(+), 21 deletions(-)
diff --git a/drivers/misc/mikrobus/mikrobus_core.c b/drivers/misc/mikrobus/mikrobus_core.c
index 4c6ca2036fe6..bbf8f541d19a 100644
--- a/drivers/misc/mikrobus/mikrobus_core.c
+++ b/drivers/misc/mikrobus/mikrobus_core.c
@@ -181,7 +181,7 @@ static ssize_t rescan_store(struct device *dev, struct device_attribute *attr,
return -EBUSY;
}
- if (!port->eeprom){
+ if (!port->w1_master){
return mikrobus_port_id_eeprom_probe(port);
}
/* Enter ID Mode */
@@ -228,7 +228,7 @@ static ssize_t idmode_store(struct device *dev, struct device_attribute *attr,
return -EBUSY;
}
- if (!port->eeprom){
+ if (!port->w1_master){
return mikrobus_port_id_eeprom_probe(port);
}
/* Enter ID Mode */
@@ -556,7 +556,8 @@ static int mikrobus_device_register(struct mikrobus_port *port,
clk_register_fixed_rate(&spi->dev, dev->clocks[i].name, devname, 0, *val);
}
}
- dev->dev_client = (void *) spi_add_device(spi);
+ spi_add_device(spi);
+ dev->dev_client = (void *) spi;
break;
case GREYBUS_PROTOCOL_I2C:
i2c = kzalloc(sizeof(*i2c), GFP_KERNEL);
@@ -667,23 +668,29 @@ void mikrobus_board_unregister(struct mikrobus_port *port, struct addon_board_in
}
EXPORT_SYMBOL_GPL(mikrobus_board_unregister);
-static struct w1_gpio_platform_data mikrobus_id_eeprom_w1_pdata = {
- .pullup_gpiod = NULL,
-};
-
-static struct platform_device mikrobus_id_eeprom_w1_device = {
- .name = "w1-gpio",
- .dev.platform_data = &mikrobus_id_eeprom_w1_pdata,
-};
-
static int mikrobus_port_id_eeprom_probe(struct mikrobus_port *port)
{
struct w1_bus_master *bm;
struct gpiod_lookup_table *lookup;
+ struct platform_device *mikrobus_id_eeprom_w1_device;
+ static struct w1_gpio_platform_data *mikrobus_id_eeprom_w1_pdata;
char devname[MIKROBUS_NAME_SIZE];
+ char drvname[MIKROBUS_NAME_SIZE] = "w1-gpio";
int retval;
int i;
+ mikrobus_id_eeprom_w1_device = kzalloc(sizeof(*mikrobus_id_eeprom_w1_device), GFP_KERNEL);
+ if (!mikrobus_id_eeprom_w1_device)
+ return -ENOMEM;
+
+ mikrobus_id_eeprom_w1_pdata = kzalloc(sizeof(*mikrobus_id_eeprom_w1_pdata), GFP_KERNEL);
+ if (!mikrobus_id_eeprom_w1_pdata)
+ return -ENOMEM;
+
+ mikrobus_id_eeprom_w1_pdata->pullup_gpiod = NULL;
+ mikrobus_id_eeprom_w1_device->name = kmemdup(drvname, MIKROBUS_NAME_SIZE, GFP_KERNEL);
+ mikrobus_id_eeprom_w1_device->dev.platform_data = mikrobus_id_eeprom_w1_pdata;
+
sprintf(port->pinctrl_selected[MIKROBUS_PINCTRL_SPI], "%s_%s",
MIKROBUS_PINCTRL_STR[MIKROBUS_PINCTRL_SPI], MIKROBUS_PINCTRL_STATE_GPIO);
@@ -705,9 +712,9 @@ static int mikrobus_port_id_eeprom_probe(struct mikrobus_port *port)
if (!lookup)
return -ENOMEM;
snprintf(devname, sizeof(devname), "%s.%u",
- mikrobus_id_eeprom_w1_device.name,
+ mikrobus_id_eeprom_w1_device->name,
port->id);
- mikrobus_id_eeprom_w1_device.id = port->id;
+ mikrobus_id_eeprom_w1_device->id = port->id;
lookup->dev_id = kmemdup(devname, MIKROBUS_NAME_SIZE, GFP_KERNEL);
lookup->table[0].key = mikrobus_gpio_chip_name_get(port,
MIKROBUS_PIN_CS);
@@ -715,9 +722,9 @@ static int mikrobus_port_id_eeprom_probe(struct mikrobus_port *port)
lookup->table[0].chip_hwnum = mikrobus_gpio_hwnum_get(port,
MIKROBUS_PIN_CS);
gpiod_add_lookup_table(lookup);
- platform_device_register(&mikrobus_id_eeprom_w1_device);
- port->w1_gpio = &mikrobus_id_eeprom_w1_device;
- bm = (struct w1_bus_master *) platform_get_drvdata(&mikrobus_id_eeprom_w1_device);
+ platform_device_register(mikrobus_id_eeprom_w1_device);
+ port->w1_gpio = mikrobus_id_eeprom_w1_device;
+ bm = (struct w1_bus_master *) platform_get_drvdata(mikrobus_id_eeprom_w1_device);
if(bm) {
port->w1_master = w1_find_master_device(bm);
if(!port->w1_master){
@@ -727,10 +734,6 @@ static int mikrobus_port_id_eeprom_probe(struct mikrobus_port *port)
kfree(lookup);
return -ENODEV;
}
- mutex_lock(&port->w1_master->mutex);
- port->w1_master->max_slave_count = 1;
- clear_bit(W1_WARN_MAX_COUNT, &port->w1_master->flags);
- mutex_unlock(&port->w1_master->mutex);
}
return 0;
}
@@ -782,7 +785,9 @@ int mikrobus_port_register(struct mikrobus_port *port)
if (!port->w1_master) {
dev_info(&port->dev, "mikrobus port %d eeprom empty probing default eeprom\n",
port->id);
+ mutex_lock(&core_lock);
retval = mikrobus_port_id_eeprom_probe(port);
+ mutex_unlock(&core_lock);
}
return retval;
}
--
2.25.1