# 플랫폼 드라이버: 장치와 구현이 만나는 매칭 순서

v6.18.37 / drivers/base/platform.c

SoC 내부 장치는 PCI처럼 하드웨어 스스로 모든 정보를 알려주지 못하는 경우가 많습니다. platform 장치 모델은 Device Tree·ACPI·보드 정보 등으로 만들어진 장치를 드라이버와 연결합니다. platform_match 전체는 override, OF, ACPI, id 표와 이름 비교가 어떤 순서로 적용되는지 보여 줍니다. 매칭 결과는 probe를 시도할 근거이지 자원 설정 성공의 증거는 아닙니다.

## platform_match

```c

static int platform_match(struct device *dev, const struct device_driver *drv)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct platform_driver *pdrv = to_platform_driver(drv);
	int ret;

	/* When driver_override is set, only bind to the matching driver */
	ret = device_match_driver_override(dev, drv);
	if (ret >= 0)
		return ret;

	/* Attempt an OF style match first */
	if (of_driver_match_device(dev, drv))
		return 1;

	/* Then try ACPI style match */
	if (acpi_driver_match_device(dev, drv))
		return 1;

	/* Then try to match against the id table */
	if (pdrv->id_table)
		return platform_match_id(pdrv->id_table, pdev) != NULL;

	/* fall-back to driver name match */
	return (strcmp(pdev->name, drv->name) == 0);
}

```

### 1305행

```c

static int platform_match(struct device *dev, const struct device_driver *drv)

```

공통 장치와 드라이버가 platform 규칙에 따라 맞는지 정수로 판정합니다.

### 1307행

```c

	struct platform_device *pdev = to_platform_device(dev);

```

포함된 공통 device를 바탕으로 이를 감싼 platform_device를 얻습니다. 새 장치를 만드는 할당은 아닙니다.

### 1308행

```c

	struct platform_driver *pdrv = to_platform_driver(drv);

```

공통 device_driver에서 platform_driver를 얻어 id 표 등을 볼 수 있게 합니다.

### 1309행

```c

	int ret;

```

override 검사 결과를 저장합니다.

### 1312행

```c

	ret = device_match_driver_override(dev, drv);

```

장치가 특정 드라이버로 강제 지정됐는지와 일치 여부를 확인합니다.

### 1313행

```c

	if (ret >= 0)

```

override 처리에서 이미 판정 가능한 0 이상의 결과가 나왔는지 확인합니다.

### 1314행

```c

		return ret;

```

override 판정이 있으면 일반 매칭보다 우선하여 바로 반환합니다.

### 1317행

```c

	if (of_driver_match_device(dev, drv))

```

Device Tree의 호환성 정보로 이 장치와 드라이버가 맞는지 검사합니다.

### 1318행

```c

		return 1;

```

OF 정보가 맞으면 일치값 1을 반환합니다.

### 1321행

```c

	if (acpi_driver_match_device(dev, drv))

```

OF에서 결정되지 않았으면 ACPI 방식의 매칭을 시도합니다.

### 1322행

```c

		return 1;

```

ACPI 정보가 맞으면 일치값을 반환합니다.

### 1325행

```c

	if (pdrv->id_table)

```

드라이버가 platform id 표를 제공하는지 확인합니다.

### 1326행

```c

		return platform_match_id(pdrv->id_table, pdev) != NULL;

```

id 표에 장치 이름이 있으면 참, 없으면 거짓을 바로 반환합니다. 표가 있는 경우 여기서 판정이 끝납니다.

### 1329행

```c

	return (strcmp(pdev->name, drv->name) == 0);

```

별도 id 표도 없을 때 장치와 드라이버 이름의 완전 일치를 마지막 기준으로 사용합니다. strcmp의 0을 참으로 바꾸어 반환합니다.

