[RFC PATCH 0/3] devicetree, qcomm PMIC: fix node name conflict

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




An issue with the path of SPMI nodes under /sys/bus/... was reported in
https://lkml.org/lkml/2014/4/23/312.  The symptom is that two different
grandchild nodes of the spmi with the same node-name@unit-address will
result in attempting to create duplicate links at
/sys/bus/platform/devices/unit-address.node-name.  It turns out that the
specific example provided might not be an expected configuration for
current hardware, but the reported trap remains an issue.

I have been poking at the problem, trying to figure out how to cleanly
fix the issue without breaking devicetree device creation.

The first patch in the series is the one that may be a very bad idea.  Or
it may help show the way forward to deal with what I think is the major
underlying problem.  I have not finished investigating the possible negative
side effects.  And I am still thinking whether this is a conceptually good
approach, or whether it is simply an expediant hack that hides the underlying
problem.  But I am throwing this out prematurely because I have mentioned
it to several people, and I want to make it visible to everyone involved.

The underlying architectural problem (in my opinion) is that a lot of devices
are created by the device tree infrastructure as platform devices, when they
truly should not be platform devices.  They should not be platform devices
because they are not physically on a platform bus, they are instead somewhere
below some other bus.  The first patch in this series is a hack which
results in the devices still being represented by "struct platform_device"
objects, but with a link to their parent's "struct bus_type" instead of
to &platform_bus_type.

The second patch does not require the first patch.  The second patch provides
a mechanism to allow subsystems to provide a method of naming devices to
avoid name collisions.

The third patch provides an example of a subsystem using the new feature
provided by the second patch.

The resulting device naming and soft links from applying all three patches,
or just the second and third patches are:


=====  no patches applied:

$ ls /sys/devices/
ARMv7 Krait  cpu-pmu.1    platform     software     tracepoint
breakpoint   cpus.0       soc.2        system       virtual

$ ls /sys/devices/soc.2/
f9000000.interrupt-controller  fc4281d0.qcom,mpm
f9011000.smem                  fc4ab000.restart
f9012000.regulator             fc4cf000.qcom,spmi
f9020000.timer                 fd484000.hwlock
f9088000.clock-controller      fd510000.pinctrl
f9098000.clock-controller      fd8c0000.clock-controller
f90a8000.clock-controller      gpio_keys.5
f90b8000.clock-controller      iio-thermal.4
f9824900.sdhc                  modalias
f991e000.serial                power
f9924000.i2c2                  subsystem
f9928000.i2c6                  timer.3
f9bff000.rng                   uevent
fc400000.clock-controller

$ ls /sys/devices/soc.2/fc4cf000.qcom,spmi/
driver     modalias   power      spmi-0     subsystem  uevent

$ ls /sys/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/
0-00       0-01       0-04       power      subsystem  uevent

$ ls /sys/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-00/
100.qcom,revid            driver                    subsystem
3100.qcom,pm8x41-adc-usr  gpios.18                  uevent
6000.qcom,rtc             power



$ ls /sys/bus/platform/devices/soc.2/
f9000000.interrupt-controller  fc4281d0.qcom,mpm
f9011000.smem                  fc4ab000.restart
f9012000.regulator             fc4cf000.qcom,spmi
f9020000.timer                 fd484000.hwlock
f9088000.clock-controller      fd510000.pinctrl
f9098000.clock-controller      fd8c0000.clock-controller
f90a8000.clock-controller      gpio_keys.5
f90b8000.clock-controller      iio-thermal.4
f9824900.sdhc                  modalias
f991e000.serial                power
f9924000.i2c2                  subsystem
f9928000.i2c6                  timer.3
f9bff000.rng                   uevent
fc400000.clock-controller

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/
driver     modalias   power      spmi-0     subsystem  uevent

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/
0-00       0-01       0-04       power      subsystem  uevent

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-00/
100.qcom,revid            driver                    subsystem
3100.qcom,pm8x41-adc-usr  gpios.18                  uevent
6000.qcom,rtc             power

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-01/
b040.pm8xxx-pwm      driver               uevent
d000.pm8xxx-pwm-led  power
d800.pm8xxx-wled     subsystem

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-04/
driver     power      subsystem  uevent



$ ls /sys/bus/spmi/devices/
0-00    0-01    0-04    spmi-0

$ ls /sys/bus/platform/devices/
100.qcom,revid                 fc4cf000.qcom,spmi
3100.qcom,pm8x41-adc-usr       fd484000.hwlock
6000.qcom,rtc                  fd510000.pinctrl
alarmtimer                     fd8c0000.clock-controller
b040.pm8xxx-pwm                gpio_keys.5
cpu-pmu.1                      gpios.18
cpus.0                         iio-thermal.4
d000.pm8xxx-pwm-led            pm8841-s1.6
d800.pm8xxx-wled               pm8841-s2.7
f9000000.interrupt-controller  pm8941-l3.11
f9011000.smem                  pm8941-l6.12
f9012000.regulator             reg-dummy
f9020000.timer                 regulator-l11.14
f9088000.clock-controller      regulator-l19.15
f9098000.clock-controller      regulator-l20.16
f90a8000.clock-controller      regulator-l22.17
f90b8000.clock-controller      regulator-l9.13
f9824900.sdhc                  regulator-s1.8
f991e000.serial                regulator-s2.9
f9924000.i2c2                  regulator-s3.10
f9928000.i2c6                  regulatory.0
f9bff000.rng                   snd-soc-dummy
fc400000.clock-controller      soc.2
fc4281d0.qcom,mpm              timer.3
fc4ab000.restart


=====  all three patches applied:

$ ls /sys/devices/
ARMv7 Krait  cpu-pmu.1    platform     software     tracepoint
breakpoint   cpus.0       soc.2        system       virtual

$ ls /sys/devices/soc.2/
f9000000.interrupt-controller  fc4281d0.qcom,mpm
f9011000.smem                  fc4ab000.restart
f9012000.regulator             fc4cf000.qcom,spmi
f9020000.timer                 fd484000.hwlock
f9088000.clock-controller      fd510000.pinctrl
f9098000.clock-controller      fd8c0000.clock-controller
f90a8000.clock-controller      gpio_keys.5
f90b8000.clock-controller      iio-thermal.4
f9824900.sdhc                  modalias
f991e000.serial                power
f9924000.i2c2                  subsystem
f9928000.i2c6                  timer.3
f9bff000.rng                   uevent
fc400000.clock-controller

$ ls /sys/devices/soc.2/fc4cf000.qcom,spmi/
driver     modalias   power      spmi-0     subsystem  uevent

$ ls /sys/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/
0-00       0-01       0-04       power      subsystem  uevent

$ ls /sys/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-00/
0-00:100.qcom,revid            driver
0-00:3100.qcom,pm8x41-adc-usr  power
0-00:6000.qcom,rtc             subsystem
0-00:gpios                     uevent
 
 

$ ls /sys/bus/platform/devices/soc.2/
f9000000.interrupt-controller  fc4281d0.qcom,mpm
f9011000.smem                  fc4ab000.restart
f9012000.regulator             fc4cf000.qcom,spmi
f9020000.timer                 fd484000.hwlock
f9088000.clock-controller      fd510000.pinctrl
f9098000.clock-controller      fd8c0000.clock-controller
f90a8000.clock-controller      gpio_keys.5
f90b8000.clock-controller      iio-thermal.4
f9824900.sdhc                  modalias
f991e000.serial                power
f9924000.i2c2                  subsystem
f9928000.i2c6                  timer.3
f9bff000.rng                   uevent
fc400000.clock-controller

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/
driver     modalias   power      spmi-0     subsystem  uevent

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/
0-00       0-01       0-04       power      subsystem  uevent

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-00/
0-00:100.qcom,revid            driver
0-00:3100.qcom,pm8x41-adc-usr  power
0-00:6000.qcom,rtc             subsystem
0-00:gpios                     uevent

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-01/
0-01:b040.pm8xxx-pwm      driver                    uevent
0-01:d000.pm8xxx-pwm-led  power
0-01:d800.pm8xxx-wled     subsystem

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-04/
0-04:100.qcom,revid  power                uevent
driver               subsystem



$ ls /sys/bus/spmi/devices/
0-00                           0-01:b040.pm8xxx-pwm
0-00:100.qcom,revid            0-01:d000.pm8xxx-pwm-led
0-00:3100.qcom,pm8x41-adc-usr  0-01:d800.pm8xxx-wled
0-00:6000.qcom,rtc             0-04
0-00:gpios                     0-04:100.qcom,revid
0-01                           spmi-0

$ ls /sys/bus/platform/devices/
alarmtimer                     f9bff000.rng
cpu-pmu.1                      fc400000.clock-controller
cpus.0                         fc4281d0.qcom,mpm
f9000000.interrupt-controller  fc4ab000.restart
f9011000.smem                  fc4cf000.qcom,spmi
f9012000.regulator             fd484000.hwlock
f9020000.timer                 fd510000.pinctrl
f9088000.clock-controller      fd8c0000.clock-controller
f9098000.clock-controller      gpio_keys.5
f90a8000.clock-controller      iio-thermal.4
f90b8000.clock-controller      reg-dummy
f9824900.sdhc                  regulatory.0
f991e000.serial                snd-soc-dummy
f9924000.i2c2                  soc.2
f9928000.i2c6                  timer.3


=====  patches 2 and 3 applied:

$ ls /sys/devices/
ARMv7 Krait  cpu-pmu.1    platform     software     tracepoint
breakpoint   cpus.0       soc.2        system       virtual

$ ls /sys/devices/soc.2/
f9000000.interrupt-controller  fc4281d0.qcom,mpm
f9011000.smem                  fc4ab000.restart
f9012000.regulator             fc4cf000.qcom,spmi
f9020000.timer                 fd484000.hwlock
f9088000.clock-controller      fd510000.pinctrl
f9098000.clock-controller      fd8c0000.clock-controller
f90a8000.clock-controller      gpio_keys.5
f90b8000.clock-controller      iio-thermal.4
f9824900.sdhc                  modalias
f991e000.serial                power
f9924000.i2c2                  subsystem
f9928000.i2c6                  timer.3
f9bff000.rng                   uevent
fc400000.clock-controller

$ ls /sys/devices/soc.2/fc4cf000.qcom,spmi/
driver     modalias   power      spmi-0     subsystem  uevent

$ ls /sys/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/
0-00       0-01       0-04       power      subsystem  uevent

$ ls /sys/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-00/
0-00:100.qcom,revid            driver
0-00:3100.qcom,pm8x41-adc-usr  power
0-00:6000.qcom,rtc             subsystem
0-00:gpios                     uevent
 
 
$ ls /sys/bus/platform/devices/soc.2/
f9000000.interrupt-controller  fc4281d0.qcom,mpm
f9011000.smem                  fc4ab000.restart
f9012000.regulator             fc4cf000.qcom,spmi
f9020000.timer                 fd484000.hwlock
f9088000.clock-controller      fd510000.pinctrl
f9098000.clock-controller      fd8c0000.clock-controller
f90a8000.clock-controller      gpio_keys.5
f90b8000.clock-controller      iio-thermal.4
f9824900.sdhc                  modalias
f991e000.serial                power
f9924000.i2c2                  subsystem
f9928000.i2c6                  timer.3
f9bff000.rng                   uevent
fc400000.clock-controller

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/
driver     modalias   power      spmi-0     subsystem  uevent

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/
0-00       0-01       0-04       power      subsystem  uevent

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-00/
0-00:100.qcom,revid            driver
0-00:3100.qcom,pm8x41-adc-usr  power
0-00:6000.qcom,rtc             subsystem
0-00:gpios                     uevent

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-01/
0-01:b040.pm8xxx-pwm      driver                    uevent
0-01:d000.pm8xxx-pwm-led  power
0-01:d800.pm8xxx-wled     subsystem

$ ls /sys/bus/platform/devices/soc.2/fc4cf000.qcom,spmi/spmi-0/0-04/
0-04:100.qcom,revid  power                uevent
driver               subsystem
 

$ ls /sys/bus/spmi/devices/
0-00    0-01    0-04    spmi-0

$ ls /sys/bus/platform/devices/
0-00:100.qcom,revid            fc4281d0.qcom,mpm
0-00:3100.qcom,pm8x41-adc-usr  fc4ab000.restart
0-00:6000.qcom,rtc             fc4cf000.qcom,spmi
0-00:gpios                     fd484000.hwlock
0-01:b040.pm8xxx-pwm           fd510000.pinctrl
0-01:d000.pm8xxx-pwm-led       fd8c0000.clock-controller
0-01:d800.pm8xxx-wled          gpio_keys.5
0-04:100.qcom,revid            iio-thermal.4
alarmtimer                     pm8841-s1.6
cpu-pmu.1                      pm8841-s2.7
cpus.0                         pm8941-l3.11
f9000000.interrupt-controller  pm8941-l6.12
f9011000.smem                  reg-dummy
f9012000.regulator             regulator-l11.14
f9020000.timer                 regulator-l19.15
f9088000.clock-controller      regulator-l20.16
f9098000.clock-controller      regulator-l22.17
f90a8000.clock-controller      regulator-l9.13
f90b8000.clock-controller      regulator-s1.8
f9824900.sdhc                  regulator-s2.9
f991e000.serial                regulator-s3.10
f9924000.i2c2                  regulatory.0
f9928000.i2c6                  snd-soc-dummy
f9bff000.rng                   soc.2
fc400000.clock-controller      timer.3


--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux