[PATCH] parisc: add uevent helper for parisc bus

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

 



[PATCH] parisc: add uevent helper for parisc bus
udev device-driver auto detection was failing to work on the GSC bus, sinceudev didn't knew wich driver to load due to a missing MODALIAS environmentvariable from kernel.
This patch fixes this by adding the MODALIAS environment variable to the uevent kernel notifications.Since modalias_show() generated the modalias string already, I splitted thisout and created a new static function make_modalias() which is now used bymodalias_show() and the new parisc_uevent() function.
Tested on 715/64 and c3000.
Signed-off-by: Helge Deller <deller@xxxxxx>
diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.cindex 884b7ce..994bcd9 100644--- a/arch/parisc/kernel/drivers.c+++ b/arch/parisc/kernel/drivers.c@@ -549,6 +549,38 @@ static int parisc_generic_match(struct device *dev, struct device_driver *drv) 	return match_device(to_parisc_driver(drv), to_parisc_device(dev)); } +static ssize_t make_modalias(struct device *dev, char *buf)+{+	const struct parisc_device *padev = to_parisc_device(dev);+	const struct parisc_device_id *id = &padev->id;++	return sprintf(buf, "parisc:t%02Xhv%04Xrev%02Xsv%08X\n",+		(u8)id->hw_type, (u16)id->hversion, (u8)id->hversion_rev,+		(u32)id->sversion);+}++static int parisc_uevent(struct device *dev, struct kobj_uevent_env *env)+{+	const struct parisc_device *padev;+	char modalias[40];++	if (!dev)+		return -ENODEV;++	padev = to_parisc_device(dev);+	if (!padev)+		return -ENODEV;++	if (add_uevent_var(env, "PARISC_NAME=%s", padev->name))+		return -ENOMEM;++	make_modalias(dev, modalias);+	if (add_uevent_var(env, "MODALIAS=%s", modalias))+		return -ENOMEM;++	return 0;+}+ #define pa_dev_attr(name, field, format_string)				\ static ssize_t name##_show(struct device *dev, struct device_attribute *attr, char *buf)		\ {									\@@ -566,12 +598,7 @@ pa_dev_attr_id(sversion, "0x%05x\n");  static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf) {-	struct parisc_device *padev = to_parisc_device(dev);-	struct parisc_device_id *id = &padev->id;--	return sprintf(buf, "parisc:t%02Xhv%04Xrev%02Xsv%08X\n",-		(u8)id->hw_type, (u16)id->hversion, (u8)id->hversion_rev,-		(u32)id->sversion);+	return make_modalias(dev, buf); }  static struct device_attribute parisc_device_attrs[] = {@@ -587,6 +614,7 @@ static struct device_attribute parisc_device_attrs[] = { struct bus_type parisc_bus_type = { 	.name = "parisc", 	.match = parisc_generic_match,+	.uevent = parisc_uevent, 	.dev_attrs = parisc_device_attrs, 	.probe = parisc_driver_probe, 	.remove = parisc_driver_remove,ÿôèº{.nÇ+?·?®?­?+%?Ëÿ±éݶ¥?wÿº{.nÇ+?·¥?{±þ?«?Çÿ?{ayºÊ?Ú?ë,j­¢f£¢·h??ï?êÿ?êçz_è®(­é???Ý¢j"?ú¶m§ÿÿ¾«þG«?éÿ¢¸??¨è­Ú&£ø§~?á


[Index of Archives]     [Linux SoC]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux